﻿/*
* 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: '.sliderItem',
            prevId: '#previousSliderButton',
            nextId: '#nextSliderButton',
            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);

