(function($) {
	$.fn.rotateThrough = function(options) {
		var self = this;
		
		var settings = {
			items: self.find('li'),
			width: self.width(),
			displayTime: 5000,
			duration: 1200, // transition duration
			lastDelay: 10000
		};
		
		var cur = 0;
		var next;
		var items = settings.items;
		var intervalID;
		
		$.extend(settings, options);
		
		var doNext = function() {
			var isLastOne = false;
			calculateNext();
			
			if (next == items.length -1)
			{
				isLastOne = true;
				var transOut = function() {
					$(items[cur]).fadeOut(settings.duration);
				};
				var transIn = function() {
					$(items[next]).hide().css({top: 0, left: 0}).fadeIn(settings.duration);
				};
			}
			else {
				var transOut = function() { slideOutLeft(items[cur]); };
				var transIn = function() { slideInRight(items[next]); };
			}
			
			transOut();			
			setTimeout(transIn,settings.duration);
			
			cur = next;
			
			if (isLastOne) {
				stop();
				setTimeout(function() { begin(0); },settings.lastDelay);
			}
		};
		
		var slideOutLeft = function(el) {
			$(el).animate({
				'left': -(settings.width + 1)
			},settings.duration);
		};
		
		var slideInRight = function(el) {
			$(el).css({	
				top: 0,	
				left: settings.width
			})
			.show()
			.animate({
				'left': 0
			},settings.duration);
		};
		
		var calculateNext = function()
		{
			if (cur < (items.length - 1)) next = cur + 1;
			else next = 0;
		};
		
		var begin = function(itemoneDisplayTime) {
			if (!itemoneDisplayTime && itemoneDisplayTime !== 0) itemoneDisplayTime = settings.displayTime; // remember that 0 is false in javascript
			
			setTimeout( function() { 
				doNext(); 
				intervalID = setInterval(doNext,settings.displayTime + settings.duration * 2); 
			}, itemoneDisplayTime);	
		};
		
		var stop = function() {
			clearInterval(intervalID);
		};
		
		begin();
	};
})(jQuery);