(function($){
	jQuery.fn.twitter = function(options){
		
		// Extend defaults (if needed)
		var opts = $.extend({}, $.fn.twitter.defaults, options);
		var $this = $(this);
		fetch($this, opts);
		
		// Auto-reload
		if(options.interval > 0){
			setInterval(
				function(){
					
					fetch($this, opts);
				}, options.interval * 1000);
		}
		
	};
	
	// Whoo, defaults!
	$.fn.twitter.defaults = {
		interval: 30,
		language: 'en_EN',
		callBack: '?',
		keywords: ['Twitter', '#Facebook'],
		returnAmount: 50,
		dateFormatType: 'text',
		clear: false,
		layout:['avatar','user', 'date', 'message', 'more_link']
	};
	
	// Format keywords
	function formatKeyword(keyword){

		var serialized = keyword;


		serialized = encodeURIComponent(serialized);

		return serialized;
	}
	
	// Fetch tweets, do something with the found data
	function fetch(element, options){
		var url = 'http://search.twitter.com/search.json';
		var keyString = '?q=';
		var callBack = '?';
		var length = options.keywords.length;
		var returnAmount = 1;
		var output = '';
		var screen_name = '';		

		$.each(options.keywords, function(k,v){
			keyString += formatKeyword(v);
			
			if(k != (length - 1)){
				keyString += '+OR+';
			}
		});
				
		if(options.callBack != '?'){
			callBack = options.callBack;
		}
		
		if(options.returnAmount > 0){
			returnAmount = options.returnAmount;
		}

		url += keyString + '&callback=' + callBack + '&rpp=' + returnAmount;

	
			
		
		
		
		$.getJSON(url, null, function(data){
			var results = buildRows(data, options);

			$(element).html(results);	
		});
	}
	
	// Format to correct date
	function formatToDate(postDate, dateOptions){
		var formattedDate;
							
		switch(dateOptions.type){
			case 'text':
				formattedDate = formatTimeToText(postDate, dateOptions.language);
			break;
			default:
				formattedDate = formatDate(postDate, dateOptions.language);
			break;
		}
		return formattedDate;
	}
	
	function buildRows(data, options){
		var output = '';
		var rowID = 0;
		
		// Get specific options
		var dateOptions = {
			type: options.dateFormatType,
			language: options.language
		};
		
		// Create rows		
		$(data.results).each(function(k,v){
			rowClass = (rowID % 2 == 0) ? 'uneven' : 'even';
			
			output += '<div id="'+rowClass+'">';
			
			$.each(options.layout, function(layoutKey, layoutValue){
				
				switch(layoutValue){
					case 'avatar':
						output += '<div class="avatar"><a href="http://twitter.com/' + v.from_user + '" target="_blank"><img src="' + v.profile_image_url + '"alt="' + v.from_user + '" /></a></div>';
					break;
					case 'user':
						output += '<div class="user"><a href="http://twitter.com/' + v.from_user + '" target="_blank">' + v.from_user + '</a></div>';	
					break;
					case 'date':
						output += '<div class="time">' + formatToDate(v.created_at, dateOptions) + '</div>';
					break;
					case 'message':
						output += '<div class="message">' + formatMessage(v.text) + '</div>';
					break;
					case 'more_link':
						output += ' <a class="twitter-more-link" href="http://twitter.com/' + v.from_user + '" target="_blank" >&raquo;</a>';
					break;
					
				};
			});
			
			
					
			output += '</div>';
			
			++rowID;
		});
		
		return output;
	}
	
	// Format message
	function formatMessage(str){
		str=' '+str;

		// Replace URLs
		str = str.replace(/((ftp|https?):\/\/([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?)/gm,'<a href="$1" target="_blank">$1</a>');

		// Replace mentions
		str = str.replace(/([^\w])\@([\w\-]+)/gm,'$1@<a href="http://twitter.com/$2" target="_blank">$2</a>');

		// Replace hashtags
		str = str.replace(/([^\w])\#([\w\-]+)/gm,'$1<a href="http://twitter.com/search?q=%23$2" target="_blank">#$2</a>');

		return str;
	}
	
	// Formatting for regular dates
	function formatDate(date, lang){
	
	
		var currentDate = new Date();
		var postDate = Date.parse(date);
		var dateArray = date.split(' ');
		
		var parsedDate = new Date(postDate);
		
		
		var langs = {
			'nl_NL' : {
				dates : {
					months: ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'],
					months_short: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec']
				}
			}
		}
		
		
	
		var day = parsedDate.getDate().toString();
		var month = langs[lang].dates.months_short[parsedDate.getMonth()]; 
	
		return day + ' ' + month + (dateArray[3] != currentDate.getFullYear() ? ' ' + dateArray[3] : '');
		
		//return dateArray[4].replace(/\:\d+$/, '') + ' ' + dateArray[2] + ' ' + dateArray[1] + (dateArray[3] != currentDate.getFullYear() ? ' ' + dateArray[3] : '');
	}
	
	// Format time
	function formatTimeToText(time, lang){
		var postDate = Date.parse(time);
		var currentDate = new Date();
		var timestamp = currentDate.getTime();
		var difference = parseInt((timestamp - postDate) / 1000);
		var formattedMessage = '';
		
		// Languages
		var langs = {
			'en_EN' : {
				justNow : 'Just now',
				secondsAgo : 'Seconds ago',
				minuteAgo : 'A minute ago',
				minutesAgo : 'minutes ago',
				hourAgo : 'One hour ago',
				hoursAgo : 'hours ago',
				dayAgo : 'One day ago',
			},
			'nl_NL' : {
				justNow : 'Net',
				secondsAgo : 'Een paar seconden geleden',
				minuteAgo : 'Een minuut geleden',
				minutesAgo : 'minuten geleden',
				hourAgo : 'Een uur geleden',
				hoursAgo : 'uren geleden',
				dayAgo : 'Een dag geleden',
			}
		};
		
		// Check the difference
		switch(true){
			case (difference < 0):
				formattedMessage = '';
			break;
			case (difference <= 5):
				formattedMessage = langs[lang].justNow;
			break;
			case (difference <= 20):
				formattedMessage = langs[lang].secondsAgo;
			break;
			case (difference <= 60):
				formattedMessage = langs[lang].minuteAgo;
			break;
			case (difference < 3600):
				formattedMessage = parseInt(difference / 60) + ' ' + langs[lang].minutesAgo;
			break;
			case (difference <= 1.5 * 3600):
				formattedMessage = langs[lang].hourAgo;
			break;
			case (difference < 23.5 * 3600):
				
				formattedMessage = Math.round(difference / 3600) + ' ' + langs[lang].hoursAgo;
			break;
			case (difference < 1.5 * 24 * 3600):
				formattedMessage = langs[lang].dayAgo;
			break;
			default:
				formattedMessage = formatDate(time, lang);
				//var dateArray = time.split(' ');
				//formattedMessage = dateArray[4].replace(/\:\d+$/, '') + ' ' + dateArray[2] + ' ' + dateArray[1] + (dateArray[3] != currentDate.getFullYear() ? ' ' + dateArray[3] : '');		
		}
		
		return formattedMessage;
	}
	
})(jQuery);
