/*
 * jQuery LiveTwitter 1.4.2
 * - 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/04/23$
 */

/*
 * Usage example:
 * $("#twitterSearch").liveTwitter('bacon', {limit: 10, rate: 15000});
 */

(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({
					mode:      'search', // Mode, valid options are: 'search', 'user_timeline'
					rate:      15000,    // Refresh rate in ms
					limit:     10,       // Limit number of results
					refresh:   true,
					data:		false,
					base:		"",
					allowed:	false,
					querylimit:	10,
					lastTimeStamp:	0,
					lastTweetTimeStamp:	0,
				}, options);
				
				//console.log(options.data);
				
				// 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,
					strip:			settings.strip,
					limit:			settings.limit,
					mode:			settings.mode,
					prints:			0,
					interval:		false,
					container:		this,
					lastTimeStamp:	settings.lastTimeStamp,
					lastTweetTimeStamp:	settings.lastTweetTimeStamp,
					count:			0,
					callback:		callback,
					additional:		settings.data,
					base:			settings.base,
					allowed:		settings.allowed,
					querylimit:		settings.querylimit,

					// 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 = 'fa ' + delta + ' segs.';
						} else if(delta < 120) {
							r = 'fa un minut';
						} else if(delta < (45*60)) {
							r = 'fa ' + (parseInt(delta / 60, 10)).toString() + ' mins.';
						} else if(delta < (90*60)) {
							r = 'fa una hora';
						} else if(delta < (24*60*60)) {
							r = 'fa ' + (parseInt(delta / 3600, 10)).toString() + ' hores';
						} else if(delta < (48*60*60)) {
							r = 'fa un dia';
						} else {
							r = 'fa ' + (parseInt(delta / 86400, 10)).toString() + ' dies';
						}
						return r;
					},

					// Update the timestamps in realtime
					refreshTime: function() {
						var twitter = this;
						$(twitter.container).find('div.time').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;
								}
								params.rpp = this.settings.querylimit;

								// 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.querylimit+"&callback=?";
							}
							
							
							$.getJSON(url, function(json) 
							{
								var results = null;
								if(twitter.mode == 'search'){
									results = json.results;
								} else {
									results = json;
								}
								var newTweets = 0;
								var limit=0;
								var selected=[];
								
								$(results).each(function(){
									//console.log(twitter.limit);
									if((twitter.allowed && typeof twitter.allowed[this.from_user.toLowerCase()]!="undefined" && limit!=twitter.limit) || (!twitter.allowed && limit!=twitter.limit))
									{
										selected.push(this);
										limit++;
										
										if(limit==twitter.limit) return;
									}
								});
								
																								
								//* Consultar amb SMS
								$.get(twitter.base+'/sms/getlive/'+twitter.limit,function(data)
								{
									//alert("hola");
									var json=eval(data);
									//* Fusionar tweets amb sms -> selected
										// @selected és un json de tweets ordenat de més nou a més vell x created_at
										// @json és un json de sms ordenat de més nou a més vell x sent_at
									
									var tweet_pointer=0;
									var sms_pointer=0;
									var done=false;
									
									var mixed=[];
									
									var i=0;

									var tweet_date=true;
									var sms_date=true;
									
									while(i<twitter.limit && (tweet_date!=false && sms_date!=false))
									{
										
										tweet_date=false;
										sms_date=false;
										
										if(selected[tweet_pointer]!=undefined && selected[tweet_pointer]!="undefined")
										{
											tweet_date=new Date(selected[tweet_pointer].created_at);
										}

										if(json[sms_pointer]!=undefined && json[sms_pointer]!="undefined")
										{
											sms_date=mysqlTimeStampToDate(json[sms_pointer].Sms.sent_at);
										}
										
										
										
										//console.log(tweet_date);
										//console.log(sms_date);
										
										if(tweet_date==false)
										{
											mixed.push(json[sms_pointer]);
											sms_pointer++;
										}
										else if(sms_date==false)
										{
											mixed.push(selected[tweet_pointer]);
											tweet_pointer++;
										}
										else
										{
											if(tweet_date>sms_date)
											{
												//console.log("tweet wins");
												mixed.push(selected[tweet_pointer]);
												tweet_pointer++;
											}
											else 
											{
												//console.log("sms wins");
												mixed.push(json[sms_pointer]);
												sms_pointer++;
											}										
										}
										
										i++;
									}	
									
									//console.log(mixed);
									
									
									$(mixed).reverse().each(function(){
									
										//* És un SMS
										if(this.Sms!=undefined && this.Sms!="undefined")
										{
											var linkified_text = this.Sms.text.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g, function(m) { return /* m.link(m); */'<a href="'+m+'" target="_blank">'+m+'</a>'; });
											
											if(Date.parse(mysqlTimeStampToDate(this.Sms.sent_at)) > twitter.lastTimeStamp)
											{
												//console.log("inserim");
												var datejs=mysqlTimeStampToDate(this.Sms.sent_at);
												newTweets+=1;
												var tweetHTML='';
												
												tweetHTML+=	'<li id="sms-'+this.Sms.id+'" class="sms sms-'+this.Sms.id+'">';
												tweetHTML+=		'<div class="info">';
												tweetHTML+=			'<div class="twavatar">';
												tweetHTML+=				'<div class="twavatar-holder">';
												
												var smsavatar=twitter.base+'/img/man_xs.png';
												if(this.Member.photo_microleft!=undefined && this.Member.photo_microleft!="")
												{
													smsavatar=twitter.base+'/files/'+this.Member.photo_microleft;
												}
												else if(this.Twaccount.id!=undefined && this.Twaccount.id!="")
												{
													smsavatar=this.Twaccount.tw_avatar;
												}
												else if(this.Member.photo_small!=undefined && this.Member.photo_small!="")
												{
													smsavatar=twitter.base+'/files/'+this.Member.photo_small;				
												}
									
												if(this.Member.detail==1)
												{
													tweetHTML+=				'<a href="'+twitter.base+'/equip/'+this.Member.slug+'"><img src="'+smsavatar+'" /></a>';
												}
												else
												{
													tweetHTML+=				'<img src="'+smsavatar+'" />';
												}
												tweetHTML+=				'</div>';
												tweetHTML+=			'</div>';
												tweetHTML+=			'<div class="source"><img src="'+twitter.base+'/img/microblogging/mobile_msg.png"</div>';
												
												var hour=new Date(datejs).getHours();
												var minutes=new Date(datejs).getMinutes();
												
												if(hour.toString().length==1) hour="0"+hour;
												if(minutes.toString().length==1) minutes="0"+minutes;
												
												tweetHTML+=			'<div class="hour">'+hour+":"+minutes+'</div>';
												tweetHTML+=			'<div class="time">'+twitter.relativeTime(datejs)+'</div>';
												tweetHTML+=		'</div>';
												
												tweetHTML+=		'<div class="bafarada">';
												tweetHTML+=			'<p class="text">';
												tweetHTML+= 			linkified_text;
												tweetHTML+=			'</p>';
												tweetHTML+=			'<div class="username">';
												
												if(this.Member.detail==1)
												{
													tweetHTML+=	'<a href="'+twitter.base+'/equip/'+this.Member.slug+'">'+this.Member.name+'</a>';
												}
												else
												{
													tweetHTML+=	this.Member.name;
												}
												
												tweetHTML+=		'</div>';
												tweetHTML+=	'</li>';
												
												$(twitter.container).prepend(tweetHTML);
												
												var timeStamp = datejs;
												$(twitter.container).find('div.time:first').each(function(){
													this.timeStamp = timeStamp;
												});
												
												//console.log(timeStamp);
												
												//if(!initialize) {
												$(twitter.container).find('.sms-'+this.Sms.id).hide().slideDown();
												//}
												twitter.lastTimeStamp = Date.parse(timeStamp);
												
												twitter.prints++;
												
											}
											
										}
										//* És un Tweeter
										else
										{
											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;
											
											if(twitter.settings.strip)
											{
												var reg=eval('/' + twitter.settings.strip + '/gi');
												this.text=this.text.replace(reg,"");
											}
											
											var linkified_text = this.text.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g, function(m) { return /* m.link(m); */'<a href="'+m+'" target="_blank">'+m+'</a>'; });
											linkified_text = linkified_text.replace(/@[A-Za-z0-9_àáèéíìóòúùäëïöü]+/g, function(u){return /* u.link('http://twitter.com/'+u.replace(/^@/,'')) */'<a href="http://twitter.com/'+u.replace(/^@/,'')+'" target="_blank">'+u+'</a>';});
											linkified_text = linkified_text.replace(/#[A-Za-z0-9_àáèéíìóòúùäëïöü]+/g, function(u){return /* u.link('http://twitter.com/search?q='+encodeURIComponent(u) .replace(/^#/,'') ) */'<a href="http://twitter.com/search?q='+encodeURIComponent(u)+'" target="_blank">'+u+'</a>';});
											
											if(Date.parse(created_at_date) > twitter.lastTweetTimeStamp)
											{
												
												var datejs=new Date(created_at_date);
												newTweets += 1;
												var tweetHTML='';
												
												var orientation="right";
												if(twitter.prints%2==0)
												{
													var orientation="left";
												}
												
												var userdata=false;
												//* Si té dades propies
												if(twitter.additional)
												{
													if(typeof twitter.additional[screen_name.toLowerCase()] != "undefined")
													{
														userdata={};
														userdata.display_name=twitter.additional[screen_name.toLowerCase()].Member.name;
														if(twitter.additional[screen_name.toLowerCase()].Member.detail==1)
														{
															userdata.slug=twitter.additional[screen_name.toLowerCase()].Member.slug;
														}
														
														userdata.avatar=profile_image_url;
														if(twitter.additional[screen_name.toLowerCase()].Member.photo_microleft!="")
														{
															userdata.avatar=twitter.base+'/files/'+twitter.additional[screen_name.toLowerCase()].Member.photo_microleft;
														}
													}
												}
												
												tweetHTML+=	'<li id="tweet-'+this.id+'" class="tweet tweet-'+orientation+' tweet-'+this.id+'">';
												tweetHTML+=		'<div class="info">';
												
												if(twitter.settings.showAuthor) 
												{
													tweetHTML+=		'<div class="twavatar">';
													tweetHTML+=			'<div class="twavatar-holder">';
													
													//* Si té dades, li posem el nom complet enlloc del de twitter
													if(userdata)
													{
														//* Si té secció propia, link a la secció propia, sinó: no link
														if(typeof userdata.slug != "undefined")
														{
															tweetHTML+=		'<a href="'+twitter.base+'/equip/'+userdata.slug+'"><img src="'+profile_image_url+'" /></a>';
														}
														else
														{
															tweetHTML+=		'<img src="'+profile_image_url+'" />';
														}
													}
													else
													{
														tweetHTML+=			'<a target="_blank" href="http://twitter.com/'+screen_name+'"><img src="'+profile_image_url+'" /></a>';
													}
													
													tweetHTML+=			'</div>';
													tweetHTML+=		'</div>';
													
												}
												
																						
												tweetHTML+=			'<div class="source">';
												tweetHTML+=				'<a target="_blank" href="http://twitter.com/'+screen_name+'"><img src="'+twitter.base+'/img/microblogging/minitweet.png" /></a>';
												tweetHTML+=			'</div>';
												
												var hour=new Date(created_at_date).getHours();
												var minutes=new Date(created_at_date).getMinutes();
												
												if(hour.toString().length==1) hour="0"+hour;
												if(minutes.toString().length==1) minutes="0"+minutes;
												
												tweetHTML+=			'<div class="hour">'+hour+":"+minutes+'</div>';
												
												tweetHTML+=			'<div class="time">'+twitter.relativeTime(created_at_date)+'</div>';
												
												tweetHTML+=		'</div>';
												
												tweetHTML+=		'<div class="bafarada">';
												tweetHTML+=			'<p class="text">';
												tweetHTML+= 			linkified_text;
												tweetHTML+=			'</p>';
												
												if(twitter.settings.showAuthor) 
												{
													tweetHTML+=		'<div class="username">';
													if(userdata)
													{
														if(typeof userdata.slug != "undefined")
														{
															tweetHTML+=	'<a href="'+twitter.base+'/equip/'+userdata.slug+'">'+userdata.display_name+'</a>';
														}
														else
														{
															tweetHTML+=	userdata.display_name;
														}
													}
													else
													{
														tweetHTML+=		'<a target="_blank" href="http://twitter.com/'+screen_name+'">'+screen_name+'</a>';				
													}
													tweetHTML+=		'</div>';
												}
												
												tweetHTML+=		'</div>';

												

												tweetHTML+=	'</li>';
												
												$(twitter.container).prepend(tweetHTML);
												
												var timeStamp = created_at_date;
												$(twitter.container).find('div.time:first').each(function(){
													this.timeStamp = timeStamp;
												});
												
												$(twitter.container).find('.tweet-'+this.id).hide().slideDown();
												
												twitter.lastTweetTimeStamp = Date.parse(created_at_date);
												if(twitter.lastTweetTimeStamp>twitter.lastTimeStamp)
												{
													twitter.lastTimeStamp = Date.parse(created_at_date);
												}
												
												twitter.prints++;
											}
										}												
									});
											

									if(newTweets > 0) {
										// Limit number of entries
										$(twitter.container).find('li:gt('+(twitter.limit-1)+')').remove();
										// Run callback
										if(twitter.callback){
											twitter.callback(domNode, newTweets);
										}
										// Trigger event
										$(domNode).trigger('tweets');
									}
								});
							});
						}	
					},
					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);
