/* P5 Tweet5 v1.4; updated 10-12-2011 */
jQuery.fn.tweet5 = function(element,options) {
	var attr = '';
	var defaults = {
		username: '',
		searchTerm: '',
		searchLanguage: '', // language in  ISO 639-1 code. Search everything when empty or not available
		numberOfTweets: 5, // 20=max
		showUsername: 'true',
		showUserAvatar: 'true',
		showTweetTime: 'true',
		showReplyButton: 'true',
		showRetweetButton: 'true',
		showLocation: 'true',
		replyButtonText: 'reply',
		retweetButtonText: 'retweet',
		iconColor: 'black', //black or white
		refreshTime: 60,   // time in seconds, minimum is 60
		oneMinuteAgoText: '1 minuut geleden',
		xMinutesAgoText: 'minuten geleden',
		oneHourAgoText: '1 uur geleden',
		xHoursAgoText: 'uur geleden',
		yesterdayText: 'gisteren',
		daysAgoText: 'dagen geleden',
		updateAvailable: 'Er zijn nieuwe tweets beschikbaar.',
		altPath: '/'
	};
	var settings = $.extend(defaults, options);
	
	function popUp(url) {
		window.open(url,'','toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=1,width=800,height=400,left=400,top=150');
	}
	
	function getTweets(val) {
		var elem = element.substr(1);
		var statusUrl = '';
		var Url = '';
		if(val==='fresh'){
			$(element).html('<span class="tweetsLoading" />');
		}
		if(settings.searchTerm===''){
			Url = settings.altPath + 'getTweets.tweet5.php?username=' + settings.username + '&cacheTime=' + settings.refreshTime + '&elem=' + elem + '&count=' + settings.numberOfTweets;
		} else {
			var languageSearch = '';
			if(settings.searchLanguage !== ''){
				languageSearch = '&searchLang=' + settings.searchLanguage;
			}
			Url = settings.altPath + 'getTweets.tweet5.php?searchTerm=' + settings.searchTerm + languageSearch + '&cacheTime=' + settings.refreshTime + '&elem=' + elem + '&count=' + settings.numberOfTweets;
		}
		$.getJSON(Url, function(data) {
				var tweetList = '';
				if(val === 'fresh'){
					getSideElements(data);
					tweetList = $(element).find('ul.tweetList');
				} else if(val === 'update'){
					// first, check if new tweets are available
					if(data[0].created_at === $(element).find('ul.tweetList').attr('createTime')){
						setTimeout('getTweets("update")',settings.refreshTime*1000);
						return false;
					}  else {
						var updateMessage = '<span class="tweetUpdate" onClick="getTweets(\'refresh\')">' + settings.updateAvailable + '</span>';
						tweetList = $(element).find('ul.tweetList');
						$(updateMessage).prependTo(tweetList).slideDown('slow');
						return false;
					}
				}  else if(val==='refresh'){
					tweetList = $(element).find('ul.tweetList');
					$(tweetList).empty();
				}
				var tweets = [];
				$.each(data, function() {
					var tweetId = this.id_str;
					var locationLink = '';
					if(this.place != null){
						var location = this.place.name;
						locationLink = '<a href="http://maps.google.nl/maps?q=' + location + '" target="_blank" class="locationButton tweetIcon ' + settings.iconColor + '" title="' + location + '"></a>';
					}
					var replyLink = '<a onClick="popUp(\'http://twitter.com/intent/tweet?in_reply_to=' + tweetId + '\');" href="javascript:void(0);" class="replyButton" title="' + settings.replyButtonText + '">' + settings.replyButtonText + '<span class="tweetIcon ' + settings.iconColor + ' reply"></span></a>';
					var retweetLink = '<a onClick="popUp(\'http://twitter.com/intent/retweet?tweet_id=' + tweetId +'\');" href="javascript:void(0);" class="retweetButton" title="' + settings.retweetButtonText + '">' + settings.retweetButtonText + '<span class="tweetIcon ' + settings.iconColor + ' retweet"></span></a>';
					var tweetTime = this.created_at;
					var prettyTime = tweetTime.split(" ");
					if(settings.searchLanguage !== ''){
						prettyTime = prettyTime[1] + ' ' + prettyTime[2] + ', ' + prettyTime[4];
					} else {
						prettyTime = prettyTime[1] + ' ' + prettyTime[2] + ', ' + prettyTime[3];
					}
					var tweetMessage = this.text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) { // replace urls with links
						return '<a href="'+url+'" target="_blank" class="linkInTweet">'+url+'</a>';
					}).replace(/\B@([_a-z0-9]+)/ig, function(reply) { // replace @user with link to userprofile
						return  reply.charAt(0)+'<a href="http://twitter.com/'+reply.substring(1)+'" target="_blank" class="twitterUser">'+reply.substring(1)+'</a>';
					});
					if(settings.searchTerm!=='' && settings.showUserAvatar === 'true'){
						var userpic = this.profile_image_url;
						tweets.push('<li class="singleTweet"><span class="contentImage"><img src="' + userpic + '" class="tweetUserAvatar" /></span><span class="singleTweetMessage">' + tweetMessage + '</span>');
					} else {
						tweets.push('<li class="singleTweet"><span class="singleTweetMessage">' + tweetMessage + '</span>');
					}
					if(settings.showLocation === 'true') {
						tweets.push(locationLink);
					}
					if(settings.showRetweetButton === 'true') {
						tweets.push(retweetLink);
					}
					if(settings.showReplyButton === 'true') {
						tweets.push(replyLink);
					}
					if(settings.showTweetTime === 'true') {
						tweets.push('<span class="singleTweetTime" title="' + prettyTime + '">' + relative_time(tweetTime) + '</span>');
					}
					tweets.push('<br style="clear:both" /></li>');
				});
				$(tweetList).html(tweets.join("")).attr('createTime',data[0].created_at);
				if(settings.searchTerm===''){
					setTimeout('getTweets("update")',settings.refreshTime*1000);
				}
			});
	}
	
	getTweets('fresh');
	
	function getSideElements(data){
		var elements = [];
		if(settings.showUsername === 'true' || settings.showUserAvatar === 'true'){
			if(settings.searchTerm === ''){
				var username = data[0].user.screen_name;
				var usersAvatar = data[0].user.profile_image_url;
				if(settings.showUserAvatar === 'true'){
					elements.push('<img src="' + usersAvatar + '" class="tweetUserAvatar" />');
				}
				if(settings.showUsername === 'true'){
					elements.push('<span class="tweetUserName"><a href="http://twitter.com/' + username + '"target="_blank">' + username + '</a></span>');
				}
			} else {
				var searchTerm = settings.searchTerm;
				if(settings.showUsername === 'true'){
					elements.push('<span class="tweetUserName"><a href="http://twitter.com/#!/search/' + searchTerm + '"target="_blank">' + searchTerm + '</a></span>');
				}
			}
			
		}
		if(settings.searchLanguage !== ''){
			elements.push('<ul class="tweetList" />');
		} else {
			elements.push('<ul class="tweetList" createTime="' + data[0].created_at + '" />');
		}
		$(element).html(elements.join(''));
	}

	function relative_time(time_value) {
		var values = time_value.split(" ");
		if(settings.searchTerm !== ''){
			time_value = values[2] + " " + values[1] + ", " +  values[3] + " " + values[4];
		} else {
			time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
		}
		var parsed_date = Date.parse(time_value);
		var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
		var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
		delta = delta + (relative_to.getTimezoneOffset() * 60);

		if(delta < 120) {
			return settings.oneMinuteAgoText;
		} else if(delta < (60*60)) {
			return (parseInt(delta / 60)).toString() + ' ' + settings.xMinutesAgoText;
		} else if(delta < (120*60)) {
			return settings.oneHourAgoText;
		} else if(delta < (24*60*60)) {
			return (parseInt(delta / 3600)).toString() + ' ' + settings.xHoursAgoText;
		} else if(delta < (48*60*60)) {
			return settings.yesterdayText;
		} else {
			return (parseInt(delta / 86400)).toString() + ' ' + settings.daysAgoText;
		}
	}
	
	window.getTweets = getTweets;
	window.popUp = popUp;
};
