// JavaScript Document

/*

 * 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: '.slider_item',

			prevId : '#slider_prev',

			nextId : '#slider_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);

