/*
	jQuery Twitter Plugin by Dennis Ang - http://www.dennisang.com
*/
(
	function($)
	{
		// Default Configuration
		var numberOfTweetsToShow = 5;
		var placeholderID = 'tweets';
		var textReadMore = 'Read More';
		var textLoading = '<div id="tweets_loading"><img src="' + CMS_SITE_FOLDER_THEME_ACTIVE + '/images/loading.gif" width="32px" height="32px" alt="Loading tweets..." /></div>';
		var textLoadFailed = 'Load failed';
		var updateTime = 360;
		var isLiveUpdate = true;
		var searchMode = 'fromUser';
		var searchObject;
		var searchURL;
		var numberOfTweets = 0;
		var tweetListID = 0;
		var newTweetListID = 0;
		var showProfileImage = true;
		var showUsername = true;

		// Twitter API URLs
		var urlAPI_FromMultipleUser = 'http://search.twitter.com/search.json?ors=from%3A';
		var urlAPI_FromUser = 'http://api.twitter.com/1/statuses/user_timeline.json?screen_name=';
		var urlAPI_ToMultipleUser = 'http://search.twitter.com/search.json?ors=to%3A';
		var urlAPI_ToUser = 'http://search.twitter.com/search.json?q=to%3A';
		var urlAPI_Search = 'http://search.twitter.com/search.json?q=';
		
		var regexp_url = new RegExp('([A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&amp;\?\/.=]+)');
		var regexp_user = new RegExp('[@]+([A-Za-z0-9-_]+)');
		var regexp_hash = new RegExp('[##]+([A-Za-z0-9-_]+)');
		
		$.Twitter = {
			setConfig: function(parameters)
			{
				searchObject = parameters.searchObject;
				searchMode = parameters.searchMode?parameters.searchMode:searchMode;
				isLiveUpdate = parameters.isLiveUpdate;
				placeholderID = parameters.placeholderID?parameters.placeholderID:placeholderID;
				textLoading = parameters.textLoading?parameters.textLoading:textLoading;		
				updateTime = parameters.updateTime?parameters.updateTime:updateTime;
				numberOfTweetsToShow = parameters.numberOfTweetsToShow?parameters.numberOfTweetsToShow:numberOfTweetsToShow;
				textReadMore = parameters.textReadMore?parameters.textReadMore:textReadMore;
				showProfileImage = parameters.showProfileImage;
				showUsername = parameters.showUsername;
			},
			init: function(parameters)
			{
				$.ajaxSetup({ cache: true });
				
				if($('#' + placeholderID))
				{
					this.setConfig(parameters);
					this.beginLoad();
					searchURL = this.createURL();
					this.getTweets(1);
					
					if(isLiveUpdate)
					{
						this.scheduleUpdate();
					}
				}
			},
			update: function()
			{			
				this.getTweets(2);
				
				if(isLiveUpdate)
				{
					this.scheduleUpdate();
				}
			},
			beginLoad: function()
			{
				$('#' + placeholderID).html(textLoading);
			},
			createURL: function()
			{
				var url = '';
				
				var searchMultipleUsers = searchObject.search(/,/);
				
				if(searchMode == 'search')
				{
					url = urlAPI_Search + searchObject;
				}
				else if(searchMultipleUsers > 0)
				{
					if(searchMode == 'toUser')
					{
						searchObject = searchObject.replace(/,/g, '+to%3A');
						url = urlAPI_ToMultipleUser + searchObject;
					}
					else if(searchMode == 'fromUser')
					{
						searchObject = searchObject.replace(/,/g, '+from%3A');
						url = urlAPI_FromMultipleUser + searchObject;
					}
				}
				else
				{
					if(searchMode == 'toUser')
					{
						url = urlAPI_ToUser + searchObject;
					}
					else if(searchMode == 'fromUser')
					{
						url = urlAPI_FromUser + searchObject;
					}
				}
				
				url += '&count=' + numberOfTweetsToShow;
				return url;
			},
			deleteOldestTweet: function()
			{
				if(numberOfTweets >= numberOfTweetsToShow)
				{
					$('.twitter_tweet_li').each(
						function(i, element)
						{
							if(i >= numberOfTweetsToShow)
							{
								$(this).hide("slow");
							}
						}
					);
				}
			},
			getTweets: function(e)
			{
				$.ajax({
					url: searchURL,
					dataType: 'jsonp',
					retryCount: 0,
					maxRetryCount: 3,
					timeout: 1000,
					error: function(xmlHttpRequest, textStatus, ex)
					{
						if(this.retryCount < this.maxRetryCount)
						{
							$('#' + placeholderID).html('');
							$.ajax(this);
							this.retryCount ++;
							return;
						}
						else
						{
							$('#' + placeholderID).html(ex);
						}
					},
					success: function(json)
					{
						if(e == 1)
						{
							$('#' + placeholderID).html('');
						}
						$.each(json, function(i, tweet)
						{
							if(tweet.id > tweetListID)
							{
								if(i == 0)
								{
									newTweetListID = tweet.id;
									$('<ul></ul>')
										.attr('id', 'twitter_list_' + tweetListID)
										.attr('class', 'twitter_ul')
										.prependTo('#' + placeholderID);
								}
								
								if(tweet.text != "undefined")
								{
									var linkReference = 'http://twitter.com/' + tweet.user.screen_name + '/status/' + tweet.id_str;
									
									tweet.text = tweet.text.replace(regexp_url, "<a target=\"_blank\" href=\"$1\">$1</a>");  
									tweet.text = tweet.text.replace(regexp_hash, "<a target=\"_blank\" href=\"http://twitter.com/#search/%23$1\">#$1</a>");  
									tweet.text = tweet.text.replace(regexp_user, "<a target=\"_blank\" href=\"http://twitter.com/$1\">@$1</a>");  

									var htmlString = '';
									
									if (showProfileImage)
									{
										htmlString += '<div class="twitter_tweet_avatar"><a href="http://www.twitter.com/' + tweet.user.screen_name + '"><img src="' + tweet.user.profile_image_url + '" alt="' + tweet.user.screen_name + '" /></a></div>'
									}
									
									if (showUsername)
									{
										htmlString += '<div class="twitter_tweet_container"><a href="http://www.twitter.com/' + tweet.user.screen_name + '">' + tweet.user.screen_name + '</a><br />';
									}

									htmlString += tweet.text + '<br /><a href="' + linkReference + '" target="_blank" class="twitter_tweet_time">' + $.Twitter.getRelativeTime($.Twitter.parseDate(tweet.created_at)) + '</a></div>';
									
									$("<li></li>") 
										.attr('id', 'twitter_tweet_li_' + numberOfTweets)
										.attr('class', 'twitter_tweet_li')
										.appendTo("#twitter_list_" + tweetListID);
									
									$('#twitter_tweet_li_' + numberOfTweets).html(htmlString);
									if(e != 1)
									{
										$('#twitter_tweet_li_' + numberOfTweets).hide();	
										$('#twitter_tweet_li_' + numberOfTweets).show('slow');
									}
									
									$.Twitter.deleteOldestTweet();
									numberOfTweets ++;
								}
							}
						});
						if(newTweetListID > 0)
						{
							tweetListID = newTweetListID;
						}
					}
				});
			},
			scheduleUpdate: function()
			{
				if(isLiveUpdate)
				{
					updateRate = updateTime * 1000;
					setTimeout("$.Twitter.update()", updateRate);
				}
			},
			parseDate: function(date_str)
			{
				return Date.parse(date_str.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3'));
			},
			getRelativeTime: function(date)
			{
				var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
				var delta = parseInt((relative_to.getTime() - date) / 1000, 10);
				var r = '';
				if (delta < 60) {
				r = delta + ' seconds ago';
				} else if(delta < 120) {
				r = 'a minute ago';
				} else if(delta < (45 * 60)) {
				r = (parseInt(delta / 60, 10)).toString() + ' minutes ago';
				} else if(delta < (2 * 60 * 60)) {
				r = 'an hour ago';
				} else if(delta < (24 * 60 * 60)) {
				r = '' + (parseInt(delta / 3600, 10)).toString() + ' hours ago';
				} else if(delta < (48 * 60 * 60)) {
				r = 'a day ago';
				} else {
				r = (parseInt(delta / 86400, 10)).toString() + ' days ago';
				}
				return r;
			}
		}
	}
)(jQuery);
