/**
 * twitter.js - Purmaryn adaption
 * 
 * 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: 1,
	autoSwitchPage: true,
	autoSwitchPageDelay: 10000,
	tweetsPerPage: 1,
	boxResize: false,
	ani_T_tweetFade: 1000	
};

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

twitter.page = 1;
twitter.pages = null; // to be set by paginate function
twitter.autoSwitchIntervalId = null;
twitter.hovered = 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');

		this.$tweets_container = $('#twitter .tweets').hover(function() {
			twitter.hovered = true;
			window.clearInterval(twitter.autoSwitchIntervalId);
		}, function(){
			twitter.hovered = false;
			// half the time to make it disappear
			window.clearInterval(twitter.autoSwitchIntervalId);
			if (twitter.options.autoSwitchPage) {
				window.setTimeout(function(){
					twitter.switchPage();
					twitter.activateAutoPageSwitch(twitter.options.autoSwitchPageDelay);
				}, twitter.options.autoSwitchPageDelay/2);
			}
		});

	}
};

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');
			//console.log(json)
			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('<span class="authorMsg"><a href="http://twitter.com/' + tweet.from_user + '" target="_blank"><span class="author">' + tweet.from_user + '</span></a>:\
						<a href="http://twitter.com/' + tweet.from_user + '/status/' + tweet.id_str + '" target="_blank">' + twitter.tweet.parse(tweet.text) + '</a></span><a class="published" href="http://twitter.com/' + tweet.from_user + '/status/' + tweet.id + '">' + twitter.tweet.time(tweet.created_at) + '</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.$tweets.find('.authorMsg').ellipsis();
					
					twitter.paginate();
					
					if (options.autoSwitchPage == true) {
						twitter.activateAutoPageSwitch();
					}

				}
				else {
					twitter.$tweets_container.append('Momenteel geen relevante Tweets gevonden');
				}
			}
			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){
	return 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.numPages = numPages;
	
	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;	
	if (!twitter.ready) { return false; }
	
	
	var $tweets_container = twitter.$tweets_container;
	
	twitter.setReady(false);
	
	// when page arg. not given, assume we want to go to next page
	if (arguments.length == 0) {
		var page = twitter.page + 1;
		if (page > twitter.numPages) {
			page = 1;
			twitter.page = 1;
		}
		else {
			twitter.page = page;
		}
	}
	
	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');
		
		if (twitter.hovered == true) {
			// pause auto-switch
			window.clearInterval(twitter.autoSwitchIntervalId);
		}
	}
	else{
		twitter.ready = false;
		twitter.$container.addClass('busy');
	}
};

twitter.activateAutoPageSwitch = function(delay){
	twitter.autoSwitchIntervalId = window.setInterval(function(){
		twitter.switchPage()
	}, delay || twitter.options.autoSwitchPageDelay);
};


