/*USAGE**************
HTML code
<div id="listScroller_sample">
	<ul>
		<li>item</li>
		<li>item</li>
		<li>item</li>
	</ul>
</div>

Javascript code
$('#listScroller_sample').listScroller();

--- Options ---
direction: -1: items are going UP, 1: items are going DOWN
duration: items staying time (ms)
speed: moving speed (ms)
easing: easing type (string)

*************************/

(function($) {
	$.fn.listScroller = function(userArgs) {
		if(!this.length) return false;
		if(!this.is('ul')) return this;
		
		var args = {
			direction:-1,
			duration:5000,
			speed:1000,
			easing:''
		}
		
		$.extend(true, args, userArgs);
		
		//PREPARATION
		var frame = this.css({'position':'relative','overflow':'hidden'});
		var total = frame.find('li').length;
		var uls = new Array($('<ul></ul>'));
		var tempH = 0;
		var ulCounter = 0;
		frame.find('li').each( function(index) {
			tempH += $(this).outerHeight(true);
			if(tempH <= frame.height()) {
				uls[ulCounter].append($(this));
			}else{
				tempH = $(this).outerHeight(true);
				ulCounter++;
				uls.push($('<ul></ul>'));
				uls[ulCounter].append($(this));
			}
		});
		
		for(var i=0; i<uls.length; i++) {
			uls[i].css({'padding':0,'margin':0});
			var leftPosi = i*frame.width()*args.direction;
			$('<li></li>').css({'position':'absolute','top':0,'left':leftPosi+'px','padding':0,'margin':0,'list-style':'none','border':'none','width':'100%','height':'100%'}).append(uls[i]).appendTo(frame);
		}
		leftPosi = null;
		
		if(uls.length > 1) {
			
			setInterval(function() {
				listItemMove();
			}, args.duration);
		}
	
		function listItemMove() {
			
			frame.find('li').each( function() {
	
				var newPosi = $(this).position().left+(frame.width()*args.direction*-1);
				 
				$(this).animate({'left':newPosi+'px'}, args.speed, args.easing, function() {
					if(newPosi == frame.width()*args.direction*-1) {
						var rePosi = frame.width()*(uls.length-1)*args.direction;
						$(this).css({'left':rePosi+'px'});
						newPosi = null;
					}
					rePosi = null;
				});
			});
			return false;
		}
		
		return this;
	}
})(jQuery);

