/*
 * slider 1.0.0 - JQuery Based Content Slider
 *
 * Copyright (c) 2009 Mohammad Ruhul Amin <ruhulshakib@yahoo.com>
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * $Date: 2009-05-24 14:22:17 -0400 (Sun, 24 May 2009) $
 * $Rev: 1 $
 * Sample:
 * $('#slider').slider({pause: 3000, speed:3000, prevId : '#btnPrevInfo', nextId : '#btnNextInfo'});
 */
(function($){			
	$.fn.slider = function(options)
	{
		var defaults = {
			itemsCss: '.item',
			prevId : '#showcase_prev',
			nextId : '#showcase_next',
			speed: 900,
			pause: 6000,
			auto: true,
			effect: 'horizontal', // ''/'fade'/'vertical'
			maxLoops: 0,
			direction: '', // 'reverse',
			startSpace: 0
		};
		
		var options = $.extend(defaults, options);
		
		
		this.each(function()
		{
			var obj = $(this);
			var items = $(options.itemsCss, obj);
			var timer = null;
			var index = 0;
			var loopCount = 0;
			
			var s = options.startSpace;
			
			var w = obj.width();
			var h = obj.height();
			
								
			items.each(function()
			{
				$(this).css('position', 'absolute')
					   .css('top', 0)
					   .css('left', w)
					   .hide();
			});
			
			$(items[0]).show().css('left',0);
			
			if(items.length <= 1) return;
			
			if(options.auto == true)
			{
				start();
			}
			
			function start()
			{
				if(options.maxLoops > 0 && options.maxLoops <= loopCount) return;
				timer = window.setTimeout(nextClicked, options.pause);
			};
			
			function stop()
			{
				window.clearTimeout(timer);
				timer = null;
			};
			
			function _nextIndex()
			{
				index++;
				
				if(index >= items.length)
				{
					index = 0;
					loopCount++;
				}
			};
			
			function _prevIndex()
			{
				index--;
				
				if(index < 0)
				{
					index = items.length-1;
				}
			};
			
			function _slideUp()
			{
				if(options.direction != 'reverse')
				{
					$(items[index]).show().animate({top: -h - s}, options.speed, 'swing');
					
					_nextIndex();
					
					$(items[index]).hide().css('left', 0).css('top', h + s);
					
					$(items[index]).show().animate({top: 0}, options.speed, 'swing', onNextCompleted);
				}
				else
				{
					$(items[index]).show().animate({top: h + s}, options.speed, 'swing');
					
					_nextIndex();
					
					$(items[index]).hide().css('left', 0).css('top', -h - s);
					
					$(items[index]).show().animate({top: 0}, options.speed, 'swing', onNextCompleted);
				}
			};
			
			function _slideDown()
			{
				if(options.direction != 'reverse')
				{
					$(items[index]).show().animate({top: h + s}, options.speed, 'swing');
						
					_prevIndex();
					
					$(items[index]).hide().css('left', 0).css('top', -h - s);
					
					$(items[index]).show().animate({top: 0}, options.speed, 'swing', onPrevCompleted);
				}
				else
				{
					$(items[index]).show().animate({top: -h - s}, options.speed, 'swing');
					
					_nextIndex();
					
					$(items[index]).hide().css('left', 0).css('top', h + s);
					
					$(items[index]).show().animate({top: 0}, options.speed, 'swing', onPrevCompleted);				
				}
			};
			
			function _slideNext()
			{
				if(options.direction != 'reverse')
				{
					$(items[index]).show().animate({left: -w - s}, options.speed, 'swing');
					
					_nextIndex();
				
					$(items[index]).hide().css('left', w + s);
				
					$(items[index]).show().animate({left: 0}, options.speed, 'swing', onNextCompleted);
				}
				else
				{
					$(items[index]).show().animate({left: w + s}, options.speed, 'swing');
					
					_nextIndex();
				
					$(items[index]).hide().css('left', -w - s);
				
					$(items[index]).show().animate({left: 0}, options.speed, 'swing', onNextCompleted);
				}
			};
			
			function _slidePrev()
			{
				if(options.direction != 'reverse')
				{
					$(items[index]).show().animate({left: w + s}, options.speed, 'swing');
					
					_prevIndex();
					
					$(items[index]).css('left', -w - s);
					
					$(items[index]).show().animate({left: 0}, options.speed, 'swing', onPrevCompleted);
				}
				else
				{
					$(items[index]).show().animate({left: -w - s}, options.speed, 'swing');
					
					_prevIndex();
					
					$(items[index]).css('left', w + s);
					
					$(items[index]).show().animate({left: 0}, options.speed, 'swing', onPrevCompleted);
					
				}
			};
			
			function _fadeNext()
			{
				$(items[index]).fadeOut('slow', function()
				{
					_nextIndex();
					
					$(items[index]).css('left',0).fadeIn('slow', onNextCompleted);
				});
			};
			
			function _fadePrev()
			{
				$(items[index]).fadeOut('slow', function()
				{
					_prevIndex();
					
					$(items[index]).css('left',0).fadeIn('slow', onPrevCompleted);
				});
			}
			
			function onNextCompleted()
			{
				$(options.nextId).click(function()
				{
					return nextClicked();
				});
				
				if(options.auto == true)
				{
					start();
				}
			};
			
			function nextClicked()
			{
				stop();
				
				$(options.nextId).unbind().click(function(){ return false; });
				
				if(options.effect == 'fade')
				{
					_fadeNext();
				}
				else if(options.effect == 'vertical')
				{
					_slideUp();
				}
				else
				{
					_slideNext();
				}
				
				return false;
			};
			
			function onPrevCompleted()
			{
				$(options.prevId).click(function()
				{
					return prevClicked();
				});
				
				if(options.auto == true)
				{
					start();
				}
			};
			
			function prevClicked()
			{
				stop();
				
				$(options.prevId).unbind().click(function(){ return false; });
				
				if(options.effect == 'fade')
				{
					_fadePrev();
				}
				else if(options.effect == 'vertical')
				{
					_slideDown();
				}
				else
				{
					_slidePrev();
				}
				
				return false;
			};
			
			$(options.nextId).click(function()
			{
				return nextClicked();
			});
			
			$(options.prevId).click(function()
			{
				return prevClicked();
			});
			
		});
		
	};
	
})(jQuery);
