/******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').getTweetsList({
	url:'path/to/getTweet.php',
	screenName:'twitter screen name',
	& options
});

---REQUIRED PARAMETERS---
url: (string) path to getTweet.php
screenName: (string) 

---OPTIONS---
duration: (int) duration (ms) to change next tweet / only single = true
speed: (int) speed (ms) to appear or disappear tweet / only single = true
showDate: (boolean) true to show tweet date
refresh: (int) time to refresh tweets using ajax (minutes)
count: (int) number of tweet to load
display: (int) number of tweet to display / only single = false
listMargin: (int) margin from list to ul frame
single: (boolean) true: show only 1 tweet, false: show tweets as list
showAvatar: (boolean) Show avatar image
RT: (boolean) Include retweets
showRTAvatar: (boolean) Show original user's avatar for retweets
tag: (string) Choose 'ol' or 'ul'
OAuth: (boolean) Use OAuth authentication
search: (string) Search word like '#twitter', if you want to search by a couple of words, use reglar expression pattern like '(word1|word2)' 

beforeLoad: (function) Called before ajax load
beforeCreateList: (function) Called before creation of HTML list
afterCreateList: (function) Called after creation of HTML list

******************/
(function($) {
	$.fn.getTweetsList = function(userArgs) {
		if(!this.length) return false;
		
		var args = {
			duration:4000,
			speed:1000,
			url:'getTweet.php',
			showDate:true,
			refresh:0,
			count:5,
			display:5,
			screenName:'!!!',
			listMargin:5,
			single:true,
			showAvatar:false,
			OAuth:false,
			search:false,
			tag:'ul',
			RT:true,
			showRTAvatar:false,
			afterCreateList:null,
			beforeLoad:null,
			beforeCreateList:null
		}
		$.extend(true, args, userArgs);
		
		var frame = this.css({'position':'relative','overflow':'hidden'});
		var listFrame = null;
		var currentItem = 0;
		var itemTotal = 0;
		var changeTimer = null;
		var ajaxTimer = null;
		
		var init = true;
		
		connection();
		
		if(args.refresh > 0) {
			ajaxTimer = window.setInterval(function() {
				window.clearInterval(changeTimer);
				changeTimer = null;
				if(args.beforeLoad) args.beforeLoad();
				connection();
			}, args.refresh*60000);
		}
		
		function connection() {
			$.ajax({
				url:args.url+'?count='+args.count+'&screen_name='+encodeURIComponent(args.screenName)+'&OAuth='+args.OAuth+'&RT='+args.RT,
				dataType:'json',
				success:function(data) {
					if(!data.error) {
						makeList(data);
					}
				}
			});
			return false;
		}
		
		function makeList(data) {
			if(args.beforeCreateList) args.beforeCreateList();
			
			frame.empty();
			if(args.search) {
				for(var s=data.length-1;s>=0;s--) {
					if(data[s].text.search(new RegExp(args.search, 'i')) == -1) {
						data.splice(s, 1);	
					}
				}
			}
			
			if(args.single)
				itemTotal = data.length;
			else {
				itemTotal = args.display;
				if(data.length < args.display) itemTotal = data.length;
			}
			
			listFrame = $('<'+args.tag+'></'+args.tag+'>').css({'position':'relative','top':0,'left':0}).appendTo(frame);
			
			for(var i=0; i<itemTotal; i++) {
				if(data[i]) {
					var content = data[i].text;
					if(args.showAvatar) {
						var avatarimg = data[i].avatar;
						if(args.showRTAvatar && data[i].RT == 'true') avatarimg = data[i].RTavatar;
						content = '<img src="'+avatarimg+'"/>'+content;
					}
					if(args.showDate) content += '<br/><span>'+data[i].created_at+'</span>';
					var list = $('<li></li>').html(content);
					if(args.single) 
						list.css({'position':'absolute','top':0,'left':0,'opacity':0,'padding':args.listMargin+'px'}).css('display','none');
					else
						list.css({'padding':args.listMargin+'px'});
					listFrame.append(list);
				}
			}
			content = null; list = null; avatarimg=null;
	
			if(args.single)
				frame.find('li').eq(0).css('display','block').animate({'opacity':1}, 1000);
			
			if(itemTotal > 1 && args.single) {
				if(changeTimer == null) {
					changeTimer = window.setInterval(function() {
						changeItem();
					}, args.duration);
				}
			}
			
			if(args.afterCreateList) {
				args.afterCreateList();
			}
			return false;
		}
		
		function changeItem() {
			var currentList = frame.find('li').eq(currentItem);
			currentItem++;
			if(currentItem >= itemTotal) currentItem = 0;
			var nextList = frame.find('li').eq(currentItem);
			
			$.when({obj1:currentList,obj2:nextList}).then(
				function(obj) {
					obj.obj1.stop(true,true).animate({'opacity':0}, args.speed);
				}
			).then( 
				function(obj) {
					obj.obj1.css({'display':'none'});
					obj.obj2.css({'display':'block'}).css({'display':'block'}).stop(true,true).animate({'opacity':1}, args.speed);
					currentList = null, nextList = null;
					return false;
				}
			);
		}
		
		return this;
	}

})(jQuery);
