//MODIFIED BY Robert Ahlin Toftegaard - Strong

(function($) {
	
	$.extend({
		formatDate : function(date) {			
			if($.log) $.log(date);		
			var today = new Date(Number(date)),
			year = today.getUTCFullYear();
			if (year < 1000) {
				year += 1900;
			}
			return (today.getUTCDate() + "." + (today.getUTCMonth()+1) + "." + year);
		},
		formatDateAndTime : function(date) {			
			var today = new Date(Number(date)),
			year = today.getUTCFullYear();
			if (year < 1000) {
				year += 1900;
			}
						
			var hours = today.getHours() < 10 ? "0" + today.getHours() : today.getHours();
			var minutes = today.getMinutes() < 10 ? "0" + today.getMinutes() : today.getMinutes();
			//var seconds = today.getSeconds() < 10 ? "0" + today.getSeconds() : today.getSeconds();
			
			return (today.getUTCDate() + "." + (today.getUTCMonth()+1) + "." + year) + " - " + hours + "." + minutes; // + "." + seconds;
			
		}
	});

	$.fn.extend({	
		twitter : function(parameters){			
		
			var defaults = {
				container: null,
				source: { 
					account: ["toftegaard"] 		  // [string]   required, unless you want to display our tweets. :) it can be an array, just do ["account1","account2","etc"]
				},  
				dimensions : {},
				avatar_size: 48,                    // [integer]  height and width of avatar if displayed (48px max)                          
				intro_text: null,                     // [string]   do you want text BEFORE your your tweets?
				outro_text: null,                     // [string]   do you want text AFTER your tweets?      
				loading_text: null,                   // [string]   optional loading text, displayed while tweets load,
				show_date: true,				      // [boolean]  optional
				query: null,                          // [string]   optional search query
				format: {
					type : 'list',
					parameters : {					  // [object] 	format parameters
						size : 5					  // [integer]  how many tweets to display?
					}
				},
				language: 'no',						  // [string]   language code (e.g no, en, de)
				labels : {
					"no" : {
						"less_than_a_minute_ago" : 'mindre enn et minutt siden',
						"about_a_minute_ago" : 'omtrent et minutt siden',
						"minutes_ago" : ' minutter siden',
						"about_an_hour_ago" : 'omtrent en time siden',
						"about" : 'omtrent ',
						"hours_ago" : ' timer siden',
						"one_day_ago" : '1 dag siden',
						"days_ago" : ' dager siden'				
						},
					"en" : {
						"less_than_a_minute_ago" : 'less than a minute ago',
						"about_a_minute_ago" : 'about a minute ago',
						"minutes_ago" : ' minutes ago',
						"about_an_hour_ago" : 'about an hour ago',
						"about" : 'about ',
						"hours_ago" : ' hours ago',
						"one_day_ago" : '1 day ago',
						"days_ago" : ' days ago'				
					}		
				}
			}
			
			var options = $.extend(true,defaults,parameters);
			
			return this.each(function(){ 
				var self = $(this);
				
				//ADD META DATA; IF AVAILABLE
				var o = $.metadata ? $.extend(true,options,self.metadata()) : options;
				o.container = self;
					
				$.fn.twitter.result(o);
			});		
		}
	});			
	
	$.fn.extend({
		linkUrl: function() {
			var returning = [];
			var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
			this.each(function() {
				returning.push(this.replace(regexp,"<a href=\"$1\">$1</a>"))
			});
			return $(returning);
		},
		linkUser: function() {
			var returning = [];
			var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
			this.each(function() {
				returning.push(this.replace(regexp,"<a href=\"http://twitter.com/$1\">@$1</a>"))
			});
			return $(returning);
		},
		linkHash: function(options) {
			var returning = [];
			var regexp = / [\#]+([A-Za-z0-9-_]+)/gi;
			this.each(function() {
				returning.push(this.replace(regexp, ' <a href="http://search.twitter.com/search?q=&tag=$1&lang=all&from='+options.source.account.join("%2BOR%2B")+'">#$1</a>'))
			});
			return $(returning);
		}
	});

    $.fn.twitter.result = function(options){
			
		var elements = jQuery("<div />").addClass("elements");
		
		options.container.addClass("twitter").append(elements);
		
		if($.fn.busy)
   	        elements.busy();		
		
      	var intro = '<p class="intro">'+options.intro_text+'</p>'
      	var outro = '<p class="outro">'+options.outro_text+'</p>'
      	var loading = $('<p class="loading">'+options.loading_text+'</p>');
      	if(typeof(options.source.account) == "string"){
        	options.source.account = [options.source.account];
      	}
      	var query = '';
      	if(options.query) {
        	query += 'q='+options.query;
      	}
      	query += '&q=from:'+options.source.account.join('%20OR%20from:');
      	var url = 'http://search.twitter.com/search.json?&'+query+'&rpp='+options.format.parameters.size+'&callback=?';
      	
		if($.log) $.log(url);	
		
		$.getJSON(url, function(data){		
							
			
			$.each(data.results, function(i,item){    
				
				if($.log) $.log(item);
										  
				var element = $("<div/>").addClass("element");								  
								
				var avatar_template = '<a class="avatar" href="http://twitter.com/'+ item.from_user+'"><img src="'+item.profile_image_url+'" height="'+options.avatar_size+'" width="'+options.avatar_size+'" alt="'+item.from_user+'\'s avatar" title="'+item.from_user+'\'s avatar" border="0"/></a>';
				var image = (options.avatar_size ? avatar_template : '')
				
				var title = '<h5>'+item.from_user+'</h5>';
				
				var byline = '';
				if(options.show_date){
					
					var date = '';
										
					var parsed_date = Date.parse(item.created_at);
					var relative_to = new Date();
					var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
					if(delta < 60) {
						date = options.labels[options.language]["less_than_a_minute_ago"];
					} else if(delta < 120) {
						date = options.labels[options.language]["about_a_minute_ago"];
					} else if(delta < (45*60)) {
						date = (parseInt(delta / 60)).toString() + options.labels[options.language]["minutes_ago"];
					} else if(delta < (90*60)) {
						date = options.labels[options.language]["about_an_hour_ago"];
					} else if(delta < (24*60*60)) {
						date = options.labels[options.language]["about"] + (parseInt(delta / 3600)).toString() + options.labels[options.language]["hours_ago"];
					} else if(delta < (48*60*60)) {
						date = options.labels[options.language]["one_day_ago"];
					} else {
						date = (parseInt(delta / 86400)).toString() + options.labels[options.language]["days_ago"];
					}	
					
					//overwrite date with simple formatted date
					date = $.formatDateAndTime(parsed_date);				
					
					var byline = '<p class="byline"><a class="date" href="http://twitter.com/'+item.from_user+'/statuses/'+item.id+'" title="view tweet on twitter">'+date+'</a></p>';
				}
							
				var presentation = '<p class="presentation">' +$([item.text]).linkUrl().linkUser().linkHash(options)[0]+ '</p>';
			
				$(element).html(image + title + byline + presentation);
				
				//SIZE IS SET, WHICH IS NUMBER OF ELEMENTS IN EACH SLIDE
				if($.hasValue(options.format.parameters.size) && options.format.parameters.size > 1){												
					
					//FIRST TIME IN OR IF THE CONTAINING ELEMENT IS FILLED- CREATE THE CONTAINING ELEMENT
					if($(elements).children().length == 0){
						$(elements).append($("<div/>").addClass("multiple-elements-container"));
					}
					
					if($(elements).find(".multiple-elements-container:last").children().length < options.format.parameters.size){												
						$(elements).find(".multiple-elements-container:last").append(element);
											
					//THE CONTAINING ELEMENT IS FILLED, CREATE A NEW ONE
					} else {
						$(elements).append($("<div />").addClass("multiple-elements-container").append(element));
					}
																																	
				//ONLY ONE ELEMENT PER SLIDE
				} else {
					$(elements).append(element);
				}												
			});

			$(elements).children('div:first').addClass('first');
			$(elements).children('div:odd').addClass('even');
			$(elements).children('div:even').addClass('odd');

			$(elements).find('.multiple-elements-container').find('div:first').addClass('first');
			$(elements).find('.multiple-elements-container').find('div:even').addClass('even');
			$(elements).find('.multiple-elements-container').find('div:odd').addClass('odd');

			//CYCLE
			if(options.format.type == "cycle"){				
				//PAGER
				if($.isset(options.format.parameters.pager)){
					options.format.parameters.pager = '#'+options.name+'-navigation';
					
					//PUTTING THE NAVIGATION AFTER THE CONTAINER
					$(options.container).append('<div id="'+options.name+'-navigation" class="pages-navigation"></div>');
				}	
				$(elements).cycle(options.format.parameters);
			}
			
			if($.fn.finished)
   			    elements.finished();
			
		});	  	  				
	}
 
})(jQuery);
