/******USAGE*******
PHP files (config.php, getTweet.php, TweetWithOAuth.class.php, OAuth.php, twitteroauth.php) must be required.

HTML CODE
<div id="unique_id">Loading Tweets ... </div>

JAVASCRIPT CODE
$('#unique_id').getSearchTweets({
	url:'path/to/getTweet.php' (string) ... Path to the getTweet.php on the php folder
	search: (string) ... Search word (ref: https://dev.twitter.com/docs/using-search)
	refresh: (int) (second) ... Refresh rate, over 30 recommended
	OPTIONS
});

---OPTIONS---
duration: (int) (second) Duration to change next tweet
speed: (int) (milisecond) Moving speed of tweets
showDate: (boolean) Show tweet date
display: (int) Number of tweets to display
listMargin: (int) (pixel) Margin for <list>
showAvatar: (boolean) Show avatar image
resultType: (string) 'recent', 'mixed' or 'popular'
tag: (string) 'ul' or 'ol'
active: (boolean) If active is true, get double number of tweets at the beggining
OAuth: (boolean) Use OAuth, config.php required

******************/
(function($) {
	$.fn.getSearchTweets = function(userArgs) {
		if(!this.length) return false;
		if(!this.is('div')) console.log('Please use Div.');
		
		var args = {
			duration:5,
			speed:300,
			url:'getTweet.php',
			showDate:true,
			refresh:30,
			display:10,
			search:'#twitter',
			listMargin:5,
			showAvatar:false,
			resultType:'recent',
			tag:'ul',
			active:false,
			OAuth:false
		}
		$.extend(true, args, userArgs);
		
		var frame = this.css({'position':'relative','overflow':'hidden'});
		var listFrame = null;
		var init = true;
		var changeTimer = null;
		var ajaxTimer = null;
		var listsArray = new Array();
		var count = Math.ceil(args.refresh/args.duration);
		if(count < args.display) count = args.display;
		
		if(args.active) connection(count*2);
		else connection(count);
		
		if(args.refresh > 0) {
			ajaxTimer = setInterval(function() {
				connection(count);
			}, args.refresh*1000);
		}
		
		function connection(ct) {
			$.ajax({
				url:args.url+'?count='+ct+'&search='+encodeURIComponent(args.search)+'&result_type='+args.resultType+'&OAuth='+args.OAuth,
				dataType:'json',
				success:function(data) {
					if(!data.error) {
						if(init) createList(data);
						else addData(data);
					}
				}
			});
			return false;
		}
		
		function createList(data) {
			init = false;
			frame.empty();
			listFrame = $('<'+args.tag+'></'+args.tag+'>').css({'position':'relative','top':0,'left':0}).appendTo(frame);
			var total = args.display;
			if(data.length < args.display) total = data.length;
			
			for(var i=0; i<total; i++) {
				var content = data[i].text;
				if(args.showAvatar) content = '<img src="'+data[i].avatar+'"/>'+content;
				if(args.showDate) content += '<br/><span>'+data[i].created_at+'</span>';
				var list = $('<li></li>').html(content);
				list.css({'padding':args.listMargin+'px'});
				listFrame.append(list);
				content = null,list = null;
			}
			data.splice(0, i);
			total = null, i = null;
			listsArray = data;
			
			changeTimer = setInterval(function() {
				addList();
			}, args.duration*1000);
			
			return false;
		}
		
		function addData(data) {
			
			var startPoint = 0;
			if(data.length > 0) {
				for(var i=0; i<data.length; i++) {
					if(data[i].id > listsArray[listsArray.length-1].id) {
						startPoint = i;
						//console.log('new tweets: '+Number(data.length-startPoint));
						break;
					}else{
						startPoint = i+1;	
					}
				}
			}
			data.splice(0,startPoint);
			listsArray = listsArray.concat(data);
			if(listsArray.length > count+2) {
				listsArray.splice(count+2, listsArray.length-count+1);
			}
			
			return false;
		}
		
		function addList() {
			if(listsArray.length > 1) {
				var content = listsArray[1].text;
				if(args.showAvatar) content = '<img src="'+listsArray[1].avatar+'"/>'+content;
				if(args.showDate) content += '<br/><span>'+listsArray[1].created_at+'</span>';
				var list = $('<li></li>').html(content);
				list.css({'padding':args.listMargin+'px'});
				listFrame.append(list);
				
				listsArray.shift();
				
				if(listFrame.find('li').length > args.display) {
					var firstList = listFrame.find('li').eq(0);
					listFrame.stop(true,true).animate({'top':firstList.height()*(-1)+'px'}, args.speed, function() {
						firstList.remove();
						listFrame.css('top',0);
						firstList = null;
						if(listFrame.find('li').length > args.display) {
							var gap = listFrame.find('li').length - args.display;
							for(var i=gap-1; i>=0; i--) {
								listFrame.find('li').eq(i).remove();
							}
						}
					});
				}
				content = null, list = null;
			}
			return false;
		}
		
		return this;
	}
})(jQuery);
