/*
 * jQuery LiveTwitter 1.4.1
 * - Live updating Twitter plugin for jQuery
 *
 * Copyright (c) 2009-2010 Inge Jørgensen (elektronaut.no)
 * Licensed under the MIT license (MIT-LICENSE.txt)
 *
 * $Date: 2010/01/07$
 */
(function($){
	if(!$.fn.reverse) {
		$.fn.reverse = function() {
			return this.pushStack(this.get().reverse(), arguments);
		};
	}
	$.fn.liveTwitter = function(query, options, callback) {
		var domNode		= this;

		$(this).each(function() {
			var settings = {};

			// Handle changing of options
			if(this.twitter) {
				settings = jQuery.extend(this.twitter.settings, options);
				this.twitter.settings 	= settings;
				if(query) {
					this.twitter.query 	= query;
				}
				this.twitter.limit 		= settings.limit;
				this.twitter.mode  		= settings.mode;
				if(this.twitter.interval) {
					this.twitter.refresh();
				}
				if(callback) {
					this.twitter.callback = callback;
				}

			// ..or create a new twitter object
			} else {
				// Extend settings with the defaults
				settings = jQuery.extend({
					start: 	   0, 
					mode:      'search', // Mode, valid options are: 'search', 'user_timeline'
					rate:      15000,    // Refresh rate in ms
					limit:     5,       // Limit number of results
					refresh:   true
				}, options);

				// Default setting for showAuthor if not provided
				if(typeof settings.showAuthor == "undefined"){
					settings.showAuthor = (settings.mode == 'search') ? true : false;
				}

				// Set up a dummy function for the Twitter API callback
				if(!window.twitter_callback){
					window.twitter_callback = function(){return true;};
				}
				this.twitter = {
					settings:      settings,
					query:         query,
					limit:         settings.limit,
					mode:          settings.mode,
					interval:      false,
					container:     this,
					lastTimeStamp: 0,
					callback:      callback,

					// Convert the time stamp to a more human readable format
					relativeTime: function(timeString) {
						var parsedDate = Date.parse(timeString);
						var delta = (Date.parse(Date()) - parsedDate) / 1000;
						var r = '';
						if (delta < 60) {
							r = "Il y a " + delta + ' s';
						} else if(delta < 120) {
							r = 'Il y a 1min';
						} else if(delta < (45*60)) {
							r = "Il y a " +(parseInt(delta / 60, 10)).toString() + ' min';
						} else if(delta < (90*60)) {
							r = 'Il y a 1h';
						} else if(delta < (24*60*60)) {
							r = "Il y a " + (parseInt(delta / 3600, 10)).toString() + ' h';
						} else if(delta < (48*60*60)) {
							r = 'Il y a 1j';
						} else {
							r = 'Il y a ' + (parseInt(delta / 86400, 10)).toString() + ' j';
						}
						return r;
					},

					// Update the timestamps in realtime
					refreshTime: function() {
						var twitter = this;
						$(twitter.container).find('span.dateDuTweet').each(function() {
							$(this).html(twitter.relativeTime(this.timeStamp));
						});
					},

					// Handle reloading
					refresh: function(initialize) {
						var twitter = this;
						if(this.settings.refresh || initialize) {
							var url 		= '';
							var params 		= {};
							if(twitter.mode == 'search') {
								params.q 	= this.query;

								if(this.settings.geocode) {
									params.geocode = this.settings.geocode;
								}
								if(this.settings.lang) {
									params.lang = this.settings.lang;
								}
								
								// Convert params to string
								var paramsString = [];
								for(var param in params) {
									if(params.hasOwnProperty(param)) {
										paramsString[paramsString.length] = param + '=' + encodeURIComponent(params[param]);
									}
								}
								paramsString = paramsString.join("&");
								url = "http://search.twitter.com/search.json?" + paramsString + "&callback=?";
							} else if(twitter.mode == 'user_timeline') {
								url = "http://twitter.com/statuses/user_timeline/" + encodeURIComponent(this.query) + ".json?count=" + twitter.limit + "&callback=?";
							}
							$.getJSON(url, function(json) {
								var results = null;
								if(twitter.mode == 'search') {
									results = json.results;
								} else {
									results = json;
								}
								var newTweets 	= 0;
								var tweets 		= $(results).reverse();
								$(results).reverse().each(function(e) {
									
									if(e >= (tweets.length - settings.start) || e < (tweets.length - settings.start)-settings.limit) return true;
									
									var screen_name 		= '';
									var profile_image_url 	= '';
									if(twitter.mode == 'search') 
									{
										screen_name 		= this.from_user;
										profile_image_url 	= this.profile_image_url;
										created_at_date 	= this.created_at;	
									} else {
										screen_name 		= this.user.screen_name;
										profile_image_url 	= this.user.profile_image_url;
										// Fix for IE
										created_at_date 	= this.created_at.replace(/^(\w+)\s(\w+)\s(\d+)(.*)(\s\d+)$/, "$1, $3 $2$5$4");
									}
									
									var userInfo 		= this.user;
									var linkified_text 	= this.text.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:% &\?\/.=]+/, function(m) { return m.link(m); });
									linkified_text 		= linkified_text.replace(/@[A-Za-z0-9_]+/, function(u){return u.link('http://twitter.com/'+u.replace(/^@/,''));});
									if(Date.parse(created_at_date) > twitter.lastTimeStamp) {
										newTweets += 1;
										var tweetHTML 	= '<li class="tweet t-'+this.id+'">';
										if(twitter.settings.showAuthor) {
											tweetHTML += 
												'<h3><a class="username"><a href="http://twitter.com/' + screen_name + '" class="lienNom">' + screen_name + '</a></h3> '+
												'<span class="dateDuTweet">' + twitter.relativeTime(created_at_date) + '</span>' +
												'<p class="clearfix"></p>' +
												'<a class="twitter_hover" href="http://www.twitter.com/' + screen_name + '" style="position:relative;margin-right:-49px"><img src="lib/img/flickr_hover.png" alt="Twitter Hover" width="49" height="49"></a>' +
												'<img width="48" height="48" src="' + profile_image_url + '" class="twitter_hover">' +
												'<p class="contenuDuTweet">' + linkified_text + '</p>' +
												'<p class="clearfix"></p>' +
												'</li><hr>';}
										$(twitter.container).prepend(tweetHTML);
										var timeStamp 		= created_at_date;
										$(twitter.container).find('span.dateDuTweet:first').each(function() {
											this.timeStamp 	= timeStamp;
										});
									 /*if(!initialize) {
											//$(twitter.container).find('.tweet-'+this.id).hide().fadeIn();
										}*/
										twitter.lastTimeStamp = Date.parse(created_at_date);
									}
								});
								if(newTweets > 0) {
									// Limit number of entries
									
									/*console.log('Normalement, je me supprime' + newTweets);*/
									$(twitter.container).find('li.tweet:gt('+(twitter.limit-1)+')').remove();
									$(twitter.container).find('hr:gt('+(twitter.limit-1)+')').remove();
									
									// Run callback
									if(twitter.callback) {
										twitter.callback(domNode, newTweets);
									}
									// Trigger event
									$(domNode).trigger('tweets');
									
									//$('ul.twitter li:first-of-type').css({'background':'#FFD600'}).nextAll().css('background','none');
									$('ul.twitter li:first-of-type').hide().slideDown('slow').fadeIn(400);									
								}
							});
						}	
					},
					start: function() {
						var twitter = this;
						if(!this.interval) {
							this.interval = setInterval(function(){twitter.refresh();}, twitter.settings.rate);
							this.refresh(true);
						}
					},
					stop: function() {
						if(this.interval) {
							clearInterval(this.interval);
							this.interval = false;
						}
					}
				};
				var twitter = this.twitter;
				this.timeInterval = setInterval(function(){twitter.refreshTime();}, 5000);
				this.twitter.start();
			}
		});
		return this;
	};
})(jQuery);
