var page = 1;
var rpp = 20;
var query = "%23Holiday";
var lastID;
var el;
var prepending;
var updateTimer = {};
var tryTimer = {};
var storedTweets = {};
var trys = 0;
var maxTries = 10;

var aTagRegexp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
var hashtagRegexp = /(^|\s)#(\w+)/g;
var userRegexp = /(^|\s)@(\w+)/g;

months = new Array(
		"January",
		"February",
		"March",
		"April",
		"May",
		"June",
		"July",
		"August",
		"September",
		"October",
		"November",
		"December"
);

//-------------------------------------------------------------------------------------------------
function initTweetFeed(divElement){
	$('#pageButton').hide();
	
	el = divElement;
	
	requestTweets();
}
//-------------------------------------------------------------------------------------------------
function requestTweets(appending){
	startTryTimer();
	
	var httpData;
	if(lastID == null || Boolean(appending)){
		httpData = 'callback=?&rpp='+rpp+'&page='+page+'&q='+query;
		prepending = false;
	}else{
		httpData = 'callback=?&rpp='+rpp+'&page='+page+'&since_id='+lastID+'&q='+query;
		prepending = true;
	}

	$.ajax({
		dataType: "json",
		url: "http://search.twitter.com/search.json",
		data: httpData,
		error: function(XMLHttpReq, textStatus, errorThrown){
			twitterFail(XMLHttpReq, textStatus, errorThrown);
		},
		success: function(data){
			printTweets(data);	
		},
	});
	
	if(!prepending){
		determineMoreButton();
	}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function startTryTimer(){
	 tryTimer = $.timer(2500, tryTimerDoneHand);
}
//-----------------------------------------------
function stopTryTimer(){
	trys = 0;
	$.clearTimer(tryTimer);
}
//-----------------------------------------------
function tryTimerDoneHand(){
	trys++;
	if(trys < maxTries){
		requestTweets();
	}else{
		throwError();
	}
	
}
//-------------------------------------------------------------------------------------------------
function twitterFail(XMLHttpReq, textStatus, errorThrown){
	throwError();
}
//-------------------------------------------------------------------------------------------------
function throwError(){
	hidePreloader();
	
	$('<div class="errorText"><p>Sorry! twitter seems to be down, try again in a few minutes.</p></div>').appendTo(".twitterTweets");
}
//-------------------------------------------------------------------------------------------------
function printTweets(data){
	stopTryTimer();
	startRefreshTimer();
	hidePreloader();
	
	$.each(data, function(i, tweets){
    	if (tweets.length != undefined){              			
            if (tweets[0] != undefined){
            	if (tweets[0].created_at != undefined){
                	var $tweetContainer = $(document.createElement("ul"))
						.attr("id","tweet-cont")
						.addClass("tweet-cont");
					
					if(prepending){	
						$(el).prepend($tweetContainer);
					}else{
						$(el).append($tweetContainer);
					}
				
					storeLastID(tweets[0].id);
					for(var i = 0; i < tweets.length; i++){ 
						if(!storedTweets[tweets[i].id]){
							storeTweet(tweets[i].id); 
							var $tweet = $(document.createElement("li"))
								.attr("id","tweet_"+tweets[i].id)
								.addClass("tweet");
							
							$tweetContainer.append($tweet);
							
							//alert(tweets[i]);
	
							appendAvatarToTweet(tweets[i], $tweet);
							appendMessageToTweet(tweets[i], $tweet);
							appendTimeStampToTweet(tweets[i], $tweet);			    
								
							if((i+1) != tweets.length || prepending){
	            				appendHRToTweet($tweet);
	        				}
    					}
            				
					}
            	}
			}        		
		}     				
	});
}
//-----------------------------------------------
function appendMoreHR(){
	var $tweetHR = $(document.createElement("div"))
		.addClass("moreHr")
		.html("<hr />");
	$('#tweets').append($tweetHR);
}
//-----------------------------------------------
function storeTweet(id){
	storedTweets[id] = true;
}
//-----------------------------------------------
function hidePreloader(){
	$('#preloader').hide();
}
//-----------------------------------------------
function storeLastID(id){
	lastID = id;
}
//-------------------------------------------------------------------------------------------------
function appendAvatarToTweet(tweet, ele){
	var $tweetPhoto = $(document.createElement("img"))
		.addClass("avatar")
		.attr("src",tweet.profile_image_url);
							
	ele.append($tweetPhoto);
}
//-------------------------------------------------------------------------------------------------
function appendTimeStampToTweet(tweet, ele){
	var tweetDate = new Date(tweet.created_at);
	var today = new Date();
									    
	var timeDiff;
	var minDiff = Math.ceil((today.getTime()-tweetDate.getTime())/(60*1000));
	var hourDiff = Math.ceil((today.getTime()-tweetDate.getTime())/(60*60*1000));
	var dayDiff = Math.ceil((today.getTime()-tweetDate.getTime())/(24*60*60*1000));
				                           					
	if(minDiff < 59){
		timeDiff = "<div class='time'>about "+minDiff+" minutes ago from "+fixEncHTML(tweet.source)+"</div>";
	}else if(hourDiff < 24){
		timeDiff = "<div class='time'>about "+hourDiff+" hours ago from "+fixEncHTML(tweet.source)+"</div>";
	}else if(dayDiff < 5){
		timeDiff = "<div class='time'>"+dayDiff+" days ago from "+fixEncHTML(tweet.source)+"</div>";
	}else{
		var AMPM = "PM";
		var myHours;
		if(tweetDate.getHours() < 12){
			AMPM = "AM";
			if(tweetDate.getHours() == 0){
				myHours = "12";
			}else{
				myHours = tweetDate.getHours();
			}
		}else{
			myHours = tweetDate.getHours()-12;
		}
				    	
		var myDate = tweetDate.getDate() +"th";
		if(tweetDate.getDate() == 1 || tweetDate.getDate() == 21 || tweetDate.getDate() == 31){
			myDate = tweetDate.getDate() +"st";
		}else if(tweetDate.getDate() == 2 || tweetDate.getDate() == 22){
			myDate = tweetDate.getDate() +"nd";
		}else if(tweetDate.getDate() == 3 || tweetDate.getDate() == 23){
			myDate = tweetDate.getDate() +"rd";
		}
		
		timeDiff = "<div class='time'>"+myHours+":"+tweetDate.getMinutes()+" "+AMPM+" "+months[tweetDate.getMonth()]+" "+myDate+" from "+fixEncHTML(tweet.source)+"</div>";
	}
				    
	ele.append(timeDiff);
}
//-----------------------------------------------
function fixEncHTML(str){
    if(isEncHTML(str)){
		return str.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g,"'"); 
	}else{
		return str;
	}
}
//-----------------------------------------------
function isEncHTML (str){
	if(str.search(/&amp;/g) != -1 || str.search(/&lt;/g) != -1 || str.search(/&gt;/g) != -1 || str.search(/&quot;/g) != -1){
		return true;
	}else {
		return false;
	}
}
//-------------------------------------------------------------------------------------------------
function appendMessageToTweet(tweet, ele){
	var $tweetDesc = $(document.createElement("div"))
		.addClass("text")
		.html("<a href='http://www.twitter.com/"+tweet.from_user+"' target='_blank'>"+tweet.from_user+"</a>: " + replaceURLs(tweet.text));	
			
	ele.append($tweetDesc);
}
//-----------------------------------------------
function replaceURLs(text){
	text = text.replace(aTagRegexp,"<a href='$1' target='_blank'>$1</a>");
	text = text.replace(userRegexp,"$1<a class='user' href='http://www.twitter.com/$2' target='_blank'>@$2</a>");
	text = text.replace(hashtagRegexp,"$1<a class='hashtag' href='http://search.twitter.com/search?q=%23$2' target='_blank'>#$2</a>");
	return text;
}
//-------------------------------------------------------------------------------------------------
function appendHRToTweet(ele){
	var $tweetHR = $(document.createElement("div"))
		.addClass("hr")
		.html("<hr />");
	ele.append($tweetHR);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function startRefreshTimer(){
	 updateTimer = $.timer(5000, timerDoneHand);
}
//-----------------------------------------------
function stopTimer(){
	$.clearTimer(updateTimer);
}
//-----------------------------------------------
function timerDoneHand(){
	requestTweets();
}
//-------------------------------------------------------------------------------------------------
function pageMore() {
	stopTimer();
	$('#pageButton').hide();
	page++;
	appendMoreHR();
	requestTweets(true);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
function determineMoreButton(){
	$.ajax({
		dataType: "json",
		url: "http://search.twitter.com/search.json",
		data: 'callback=?&rpp='+rpp+'&page='+(page+1)+'&q='+query,
		error: twitterFail,
		success: sniffFutureTweets
	});
}
//-------------------------------------------------------------------------------------------------
function sniffFutureTweets(data){
	if(thereIsTweet(data)){
		addMoreButton();
	}
}
//-----------------------------------------------
function thereIsTweet(data){
	var moreTweets = false;
	$.each(data, function(i, tweets){
		if (tweets.length != undefined){
			if (tweets[0] != undefined){
            	if (tweets[0].created_at != undefined){
            		if(!storedTweets[tweets[0].id]){
            			moreTweets = true;
					}
				}
			}
		}
	});
	return moreTweets;
}
//-------------------------------------------------------------------------------------------------
function addMoreButton(){
	$('#pageButton').show();
}
//-------------------------------------------------------------------------------------------------
