var cl = function(){

	this.appBar = $('header');
	this.homeCount = $('#homeCount');
	this.mentionsCount = $('#mentionsCount');
	this.activeTweet = false;
	this.sendTweetOpen = false;
	this.charCount = $('#charCount');
	$.scrollTo(0);

	this.openPanel = function(e){
		if(!cl.sendTweetOpen){
			$("div#tweetPanel").animate({
				height: "250px"
			})
			.animate({
				height: "240px"
			}, "fast", null, function(){
				$('#panelToggle').html('Close Panel');
			});
			cl.sendTweetOpen = true;
			e.preventDefault();			
		}
	};
	this.closePanel = function(){
		if(cl.sendTweetOpen){
			$("div#tweetPanel").animate({
				height: "250px"
			})
			.animate({
				height: "0px"
			}, "fast",null,function(){
				$("div#tweetPanel").css('display', 'none');
				$('#panelToggle').html('Send Tweet');
			});
			cl.sendTweetOpen = false;			
		}
	};
	this.openRTPanel = function(e){
		if(!cl.sendRetweetOpen){
			$("div#retweetPanel").animate({
				height: "250px"
			})
			.animate({
				height: "240px"
			}, "fast", null, function(){
				$('#panelToggle').html('Close Panel');
			});
			cl.sendRetweetOpen = true;
			e.preventDefault();
		}
	};
	this.closeRTPanel = function(){
		if(cl.sendRetweetOpen){
			$("div#retweetPanel").animate({
				height: "250px"
			})
			.animate({
				height: "0px"
			}, "fast",null,function(){
				$("div#retweetPanel").css('display', 'none');
				$('#panelToggle').html('Send Tweet');
			});
			cl.sendRetweetOpen = false;
		}
	};

	this.refreshTimeline = function(force){
		if(force == 1)
			var url = "/rpc/request/?type=" + tweetType + "&force=1";
		else var url = "/rpc/request/?type=" + tweetType;
		$.getJSON(url,
			function(msg){
				if(msg.status == 'loggedOut'){
					window.location = 'http://www.crowdlens.com/login/';
				}
				else{
					if(msg.home.count > 0){
						cl.homeCount.html(parseInt(cl.homeCount.html()) + parseInt(msg.home.count));
						if(tweetType == 'home')
							document.title = '('+cl.homeCount.html()+') CrowdLens Home';
					}

					if(msg.mentions.count > 0){
						cl.mentionsCount.html(parseInt(cl.mentionsCount.html()) + msg.mentions.count);
					}

					if(msg.messages.count > 0){
						directMessagesTab.html(parseInt(directMessagesTab.html()) + msg.messages.count);
					}

					if(msg[tweetType].html){
						$('#tweetContainer').append(msg[tweetType].html);
						if(cl.activeTweet.get(0) == $('#tweetGutter').get(0)){
							var findActiveTweet = $('article.new:first');
							if(findActiveTweet.length > 0){
								cl.activeTweet.removeClass('active');
								cl.activeTweet = findActiveTweet;
								cl.activeTweet.addClass('active');
							}
						}
					}
				}
				$('article .tryEmbed').removeClass('tryEmbed').embedly({
					maxWidth: 400,
					wmode: 'transparent',
					method: 'afterParent',
					wrapElement: 'div',
					key:'0c2d175c25eb11e1a6ba4040d3dc5c07'
				});
			}
		);
	};

	$('#panelToggle').click(function(e){
		if(cl.sendTweetOpen)
			cl.closePanel();
		else if(cl.sendRetweetOpen)
			cl.closeRTPanel();
		else cl.openPanel(e);
	});

	/**
	 *	Handle Clicking on Article
	 */
	$('#tweetContainer').click(function(e){
		var target = $(e.target);
		var parentTweet = target.closest(".tweet");

		if(cl.activeTweet)
			cl.activeTweet.removeClass('active');
		cl.activeTweet = parentTweet;
		cl.activeTweet.addClass('active');

		if(target.hasClass('reply')){
			$('#sendTweetReplyTo').val(parentTweet.attr('id'));
			$('#sendTweetText').val(parentTweet.find('.username').text() + ' ');
			$('#sendTweetText').keyup();
			cl.openPanel();
			$('#sendTweetText').focus();
		}
		else if(target.hasClass('rtComment')){
			$('#sendTweetText').val('RT ' + parentTweet.find('.username').text() + ': '+ parentTweet.find('p').text() + ' ');
			$('#sendTweetText').keyup();
			cl.openPanel();
			$('#sendTweetText').focus();
		}
		else if (target.hasClass('rtRecycle')){
			$('#rtArticle').html(parentTweet.find('.tweetContent').html());
			$('#rtArticle .embed').remove();
			$('#retweetId').val(parentTweet.attr('id'));
			cl.openRTPanel();
		}
		else if (target.hasClass('directMessage')){
			$('#sendTweetText').val('D ' + parentTweet.find('.username').text().substring(1) + ' ');
			$('#sendTweetText').keyup();
			cl.openPanel();
			$('#sendTweetText').focus();
		}
		else if (target.hasClass('embedReply')){
			e.preventDefault();
			target.embedly({
				maxWidth: 400,
		        wmode: 'transparent',
		        method: 'afterParent',
		        wrapElement: 'div',
		        key:'0c2d175c25eb11e1a6ba4040d3dc5c07'
			});
		}
	});
	/**
	 *	Clear Read
	 */
	$('#clearReadTweets').click(function(){
		$.scrollTo(0);
		$('article.tweet').not('.new').remove();
	});
	$(document).bind('keydown', 'c', function(){
		$('#clearReadTweets').click();
	});
/**
	 *	Tweet Navigation (keyboard and scrolling)
	 */
	$(window).scroll(function(){
		if(cl.activeTweet != false){
			var firstTweet = cl.activeTweet;
			cl.activeTweet.removeClass('active');
		}
		else var firstTweet = $('.tweet.new:first');

		var lastTweet = false;
		var lastRead = false;
		if(firstTweet.length > 0){
			while(firstTweet.length > 0 && firstTweet.offset().top + firstTweet.height() <= cl.appBar.offset().top + cl.appBar.height()){
				lastTweet = firstTweet;
				firstTweet = lastTweet.next('.tweet');
				if(firstTweet.length < 1)
					firstTweet = $('#tweetGutter');
			}
			cl.activeTweet = firstTweet;
			cl.activeTweet.addClass('active');

			if(firstTweet.get(0) == $('#tweetGutter').get(0)){
				lastRead = $('.tweet.new:last');
				lastRead.prevAll().removeClass('new');
				lastRead.removeClass('new');
			}
			else{
				lastRead = cl.activeTweet.prev('.tweet.new');
				cl.activeTweet.prevAll().removeClass('new');
			}

			if(lastRead.length>0){
				$.ajax({
					type: "GET",
					url: "/rpc/read/?type=" + tweetType + "&id="+lastRead.attr('id'),
					success: function(data){
						$('#' + tweetType + 'Count').html(parseInt(data));
						if(tweetType == 'home')
							document.title = '('+parseInt(data)+') CrowdLens Home';
					}
				});
			}
			delete lastTweet;
		}
	});
	$(document).bind('keydown', 'j', function(){
		if(cl.activeTweet == false){
			var findActiveTweet = $('article.new:first');
			if(findActiveTweet.length > 0){
				cl.activeTweet = findActiveTweet;
				cl.activeTweet.addClass('active');
			}
			else return false;
		}
		var elem = cl.activeTweet.next('.tweet');
		if(elem.length < 1){
			elem = $('#tweetGutter');
		}
		elem.addClass('active');
		$.scrollTo(elem.offset().top - cl.appBar.height(), {'duration':100});
		if(cl.activeTweet != false){
			cl.activeTweet.removeClass('active');
		}
		cl.activeTweet = elem;
	});
	$(document).bind('keydown', 'k', function(){
		if(cl.activeTweet == false){
			return false;
		}
		else if(cl.activeTweet.get(0) == $('#tweetGutter').get(0)){
			var newLast = $('#tweetContainer article:last');
			if(newLast.length > 0){
				var elem = newLast;
				cl.activeTweet.removeClass('active');
			}
		}
		else{
			cl.activeTweet.removeClass('active');
			var elem = cl.activeTweet.prev('.tweet');

		}
		if(elem.length > 0){
			elem.addClass('active');
			cl.activeTweet = elem;
			if(elem.offset().top < cl.appBar.offset().top + cl.appBar.height() + 10){
				$.scrollTo(elem.offset().top - cl.appBar.height(), {'duration':100});
			}
		}

	});
	$(document).bind('keydown', 's', this.openPanel);
	$(document).bind('keydown', 'esc', function(){
		if(cl.sendTweetOpen)
			cl.closePanel();
		else if(cl.sendRetweetOpen)
			cl.closeRTPanel();
	});
	/**
	 *	Refresh
	 */
	$('#refreshTimeline').click(function(e){
		cl.refreshTimeline(1);
		e.stopPropagation();
		e.preventDefault();
	});
	$(document).bind('keydown', 'r', function(){
		cl.refreshTimeline(1);
	});
	
	/**
	 * Embed Objects
	 */

		$('article .tryEmbed').removeClass('tryEmbed').embedly({
			maxWidth: 400,
			wmode: 'transparent',
			method: 'afterParent',
			wrapElement: 'div',
			key:'0c2d175c25eb11e1a6ba4040d3dc5c07'
		});


	/**
	 * Send Tweets
	 */
	$('#sendTweetText').keyup(function(){
		var charLength = $(this).val().length;	
		cl.charCount.html(140 - charLength + ' chars remaining');
		if(charLength > 140 && cl.charCount.hasClass('success'))
			cl.charCount.addClass('error').removeClass('success');
		else if(charLength < 141 && cl.charCount.hasClass('error'))
			cl.charCount.removeClass('error').addClass('success');
	});
	$('#shortenUrls').click(function(){
		$('#sendTweetText').val().replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=#]+/g, function(url) {
			$.getJSON("/rpc/shortenUrl/?url="+escape(url),function(msg){
				var tweetText = $('#sendTweetText');
				tweetText.val(tweetText.val().replace(msg.url,msg.shortUrl));
				tweetText.keyup();
			});
		});
	});
	$('#sendTweetSubmit').click(function(){
		$.ajax({
			type: "POST",
			url: "/rpc/updateStatus/",
			data: {
				type: 'status',
				status: $('#sendTweetText').val(),
				replyTo: $('#sendTweetReplyTo').val(),
				latitude: $('#latitude').val(),
				longitude: $('#longitude').val()
			},
			complete: function(data){
				$('#sendTweetText').val('');
				$('#sendTweetReplyTo').val('');
				cl.closePanel();
			}
		});
	});
	$('#sendRetweetSubmit').click(function(){
		$.ajax({
			type: "POST",
			url: "/rpc/updateStatus/",
			data: {
				type: 'retweet',
				status: $('#retweetId').val(),
			},
			complete: function(data){
				$('#retweetId').val('');
				cl.closeRTPanel();
			}
		});
	});
};

$(function() {
	cl = new cl();

	var autoRefreshHome = setInterval(function(){
		cl.refreshTimeline(0);
	}, 30000);

	$('#tweetGutter').css('height', window.innerHeight);
	$(window).resize(function(){
		$('#tweetGutter').css('height', window.innerHeight);
	});
});
