/***
**  JQUERY MINISUGGEST PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  08/2011
**  DEPENDENCIES : JQUERY 1.3.1+
***/
var MiniTweet = function(element, options) {
	var conf = $.extend({}, $.fn.minitweet.defaults, options);
	var tweeter  = $(element);
	var query 	 = "";
	var tweetids = [];
	var _initialize = function() {
		tweeter.addClass("minitweeter");
		for(i=0;i<conf.users.length;i++){
			if(query != "") query+='+OR+';
			query+='from:'+conf.users[i];
		}
		for(i=0;i<conf.to.length;i++){
			if(query != "") query+='+OR+';
			query+='to:'+conf.to[i];
		}
		for(i=0;i<conf.words.length;i++){
			if(query != "") query+='+OR+';
			query+=''+conf.words[i];
		}
		if(conf.hash != ""){
			if(query != "") query+='+OR+';
			query+=''+conf.hash;
		}
		_loadTweets(false);
		
	};
	
	var _loadTweets = function(reload){
		$.getJSON("http://search.twitter.com/search.json?q="+query+"&callback=?",
		    function(ob){
				var tweets = ob.results;
				var timed = 0;
				var count = 0;
				for(i=(tweets.length-1);i>=0;i--){
					if(!_exists(tweets[i].id)){
						count++;
						if(conf.limit && count > conf.limit){
							timed++;
							_createTimedTweed(tweets[i],conf.delay*timed);
						}else{
							_createTweet(tweets[i]);
						}
						
					}
				}
				if(timed){
					setTimeout(function(){_refreshTweets();},conf.delay*timed);
				}
				
			}
		);
	}
	var _createTimedTweed = function(tweet,delay){
		setTimeout(function(){_createTweet(tweet);},delay);
	}
	
	var _refreshTweets = function(){
		setTimeout(function(){_loadTweets(true);},conf.refresh);
	}
	
	var _exists = function(id){
		for(a=0;a<tweetids.length;a++){		
			if(tweetids[a] == id){
				return true;
			}
		}
		return false;
	}
	
	var _createTweet = function(tweet){
		tweetids[tweetids.length] = tweet.id;
		var tweetOb =  $('<div class="minitweet">\
						<a href="http://twitter.com/'+tweet.from_user+'" target="_blank" class="avatar"><img src="'+tweet.profile_image_url+'" alt="'+tweet.from_user+'" /></a>\
						<div class="txt">'+_format(tweet.text)+'</div>\
						<span class="user"><a href="http://twitter.com/'+tweet.from_user+'" target="_blank">'+tweet.from_user+'</a></span>\
						<span class="time">'+_timer(tweet.created_at)+'</span>\
					</div>');
		tweetOb.css("display","none");				
		tweeter.prepend(tweetOb);
		if(conf.limit){
			if($(".minitweet",tweeter).length > conf.limit){
				$(".minitweet:last",tweeter).slideUp("normal",function(){$(this).remove()});
			}
		}
		tweetOb.slideDown();
		
	}
	
	var _format = function(str){
		str=' '+str;
		str = str.replace(/((ftp|https?):\/\/([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?)/gm,'<a href="$1" target="_blank">$1</a>');
		str = str.replace(/([^\w])\@([\w\-]+)/gm,'$1@<a href="http://twitter.com/$2" target="_blank">$2</a>');
		str = str.replace(/([^\w])\#([\w\-]+)/gm,'$1<a href="http://twitter.com/search?q=%23$2" target="_blank">#$2</a>');
		return str;
	}
	
	var _timer = function(time){
		var origStamp = Date.parse(time);
		var curDate = new Date();
		var currentStamp = curDate.getTime();
		var difference = parseInt((currentStamp - origStamp)/1000);
		if(difference < 0) return false;
		if(difference <= 5)				return "Just now";
		if(difference <= 20)			return "Seconds ago";
		if(difference <= 60)			return "A minute ago";
		if(difference < 3600)			return parseInt(difference/60)+" minutes ago";
		if(difference <= 1.5*3600) 		return "One hour ago";
		if(difference < 23.5*3600)		return Math.round(difference/3600)+" hours ago";
		if(difference < 1.5*24*3600)	return "One day ago";
		var dateArr = time.split(' ');
		return dateArr[4].replace(/\:\d+$/,'')+' '+dateArr[2]+' '+dateArr[1]+(dateArr[3]!=curDate.getFullYear()?' '+dateArr[3]:'');
	}
	
	_initialize();
	return tweeter;
};

/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minitweet = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minitweet')) return;
			var w = new MiniTweet(this, options);
			element.data('minitweet', w);
		});
	};
})(jQuery);

$.fn.minitweet.defaults = {
	users 	: [],
	to		: [],
	hash	: "",
	words	: [],
	refresh	: 3500,
	delay	: 7500,
	limit	: 5
};
