/**
 * twitter.js
 * 
 * Displays tweets in a container box
 * It's called from an embedded piece of code
 * It places itself at the place the call to putTweets() is made
 * 
 * load: head
 * 
 * Depends
 * 	jQuery (1.4.2)
 * 
 * @author JP | Peppered
 * @author AK | Peppered
 */


var twitter = {};

twitter.options = {
	tweetsPerPage: 2,
	ani_T_boxResize: 300,
	ani_T_tweetFade: 300
};

twitter.$container = {};
twitter.$tweets_container = {};
twitter.$tweets = {};
twitter.$tweetsShown = {};
twitter.$nav = {};
twitter.ready = false;

/**
 * public createContainer
 * 
 */
twitter.createContainer = function(){
	if (this.$container === undefined || !this.$container.length) {
		this.$container = $('\
			<div class="dynContent tweets"></div>\
		');
		var $tmp = $('<div/>').append(this.$container);
		document.write($tmp.html());
		this.$container = $('#twitter').addClass('jsEnh loading');
		this.$tweets_container = $('#twitter .tweets');
	}
};




twitter.putTweets = function(){	
	var options = this.options;
	//twitter.createContainer();
	$.ajax({
		url: options.url,
		dataType: 'json',
		timeout: 8000,
		success: function(json){
			var $ul = $('<ul/>');
			twitter.$container.removeClass('loading');
			
			if (json.results !== undefined) {
				var $results = $.each(json.results, function(i,tweet){
					var $li = $('<li class="tweet"/>');
					if(i == 0 && !isEmpty(options.channel_header)){
						// @todo: each channel own list (& custom header bit)
					}
					$li.append('<h3></h3>\
						<p class="msg">' + twitter.tweet.parse(tweet.text) + '<br /><i class="published">' + twitter.tweet.time(tweet.created_at) + '</i></p>\
						<a href="http://twitter.com/' + tweet.from_user + '" target="_blank"><img width="30" height="30" src="'+tweet.profile_image_url+'" />  <span class="author">' + tweet.from_user + '</span></a>'
					);
					$li.appendTo($ul);
				});
				
				if ($results.length) {
					twitter.$tweets_container
						.append($ul)
						.find('li:first')
							.addClass('tweet-first').end()
						.find('li:last')
							.addClass('tweet-last').end()
						.parent()
							.show()
					;
					twitter.$tweets = twitter.$tweets_container.find('li');
					
					twitter.paginate();
				}
				else {
					twitter.$tweets_container.append('<p>Momenteel geen relevante Tweets gevonden.</p>');
				}
			}
			else {  // this seem to happen sometimes (when search query is valid, but (too) long (jQuery bug?))
				twitter.$tweets_container.append('<p>Geen Tweets kunnen ophalen.</p>');
			}		
			twitter.ready = true;
		
		},
		error: function(){
			twitter.$tweets_container.append('<p>Geen Tweets kunnen ophalen.</p>');
			twitter.$container.removeClass('loading');
		}
	}); // end of $.ajax

};

twitter.tweet = {};

twitter.tweet.time = function(input){
	// Calculate how many hours ago was the tweet posted
	var date_tweet = new Date(input);
	var date_now = new Date();
	var date_diff = date_now - date_tweet;
	var days = Math.round(date_diff/(1000*60*60*24));
	var hours = Math.round(date_diff/(1000*60*60));
	var minutes = Math.round(date_diff/(1000*60));
	var seconds = Math.round(date_diff/(1000));
	if(seconds < 60){
		var time_output = seconds + ' seconden geleden'
	} else if (minutes < 60 && minutes > 1){
		var time_output = minutes + ' minuten geleden'
	} else if (minutes < 60 && minutes < 2){
		var time_output = minutes + ' minuut geleden'	
	} else if (hours < 24){
		var time_output = hours + ' uur geleden'
	} else if (days == 1){
		var time_output = days + ' dag geleden'
	} else {
		var time_output = days + ' dagen geleden'
	}
		
	return time_output;
};

twitter.tweet.parse = function(text){
	var txt = text.replace(
		/(https?:\/\/[-a-z0-9._~:\/?#@!$&\'()*+,;=%]+)/ig,
		'<a target="_blank" href="$1">$1</a>'
	).replace(
 		/@+([_A-Za-z0-9-]+)/ig, 
		'<a target="_blank" href="http://twitter.com/$1">@$1</a>'
	).replace(
		/#+([_A-Za-z0-9-]+)/ig,
		'<a target="_blank" href="http://search.twitter.com/search?q=$1">#$1</a>'
	);
	return txt;
};

/**
 * private paginate
 */
twitter.paginate = function(){
	var twitter = this;	
	var numPages = Math.ceil(this.$tweets.length / this.options.tweetsPerPage);
	
	twitter.$tweets.slice(this.options.tweetsPerPage).addClass('invis');
	twitter.$tweetsShown = twitter.$tweets.slice(0, this.options.tweetsPerPage);
	
	var $ul = $('<ul class="p'+numPages+'"/>');	
	for (var i=1; i<=numPages; i++) {
		$('<li/>')
			.append(
				$('<a href="#" title="toon '+i+'e pagina">'+i+'</a>').click(function(e){
					var $this = $(this);
					if (twitter.ready !== false) {						
						$this.parent().addClass('active').siblings().removeClass('active');
						twitter.switchPage($this.text());
						e.preventDefault();
					}
					else {
						return false;
					}
				})
			)
			.appendTo($ul)
		;
	}	
	var $nav = $('<div class="nav"><h3 class="noscr">Navigatie</h3></div>');
	$ul.children(':first').addClass('first active').end().children(':last').addClass('last').end().appendTo($nav);
	$nav.appendTo(this.$container);
	
	twitter.$nav = $nav;
};

twitter.switchPage = function(page){
	var twitter = this;	
	var $tweets_container = twitter.$tweets_container;
	
	twitter.setReady(false);
	
	var start = this.options.tweetsPerPage * (page - 1);
	var end = start + this.options.tweetsPerPage;
	
	var $tweetsShown = twitter.$tweetsShown;
	var $tweetsToShow = twitter.$tweets
		.slice(start, end)
		.first()
			.addClass('tweet-first').end()
		//.show()
	;
	
	// calculate new height
	var newH = 0;
	$tweetsToShow.each(function(){
		newH += $(this).outerHeight(true);
	});
	
	
	/**
	 * Animation sequence
	 */	
	// fadeOut $tweets_container
	//$tweetsShown.addClass('fading');
	$tweets_container.fadeTo(twitter.options.ani_T_tweetFade, 0, function(){
		
		// resize $tweets_container
		 $tweets_container.animate({height: newH}, twitter.options.ani_T_boxResize, function(){
		 	
		 	// (un)hide tweets
			$tweetsShown.addClass('invis');
			$tweetsToShow.removeClass('invis');
			
		 	// fadeIn $tweets_container
			$tweets_container.fadeTo(twitter.options.ani_T_tweetFade, 1, function(){
				// done
				twitter.$tweetsShown = $tweetsToShow;
				twitter.setReady(true);
			});
		 });
	});
		
};

twitter.setReady = function(ready){
	if (ready) {
		twitter.ready = true;
		twitter.$container.removeClass('busy');
	}
	else{
		twitter.ready = false;
		twitter.$container.addClass('busy');
	}
};

