﻿/*
* 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: '#btnPrev',
            nextId: '#btnNext',
            speed: 900,
            pause: 6000,
            auto: false,
            effect: 'horizontal', // ''/'fade'/'vertical'
            maxLoops: 0,
            direction: '', // 'reverse',
            startSpace: 0,
            itemTitles: null,
            itemTitleCss: '.itemTitle',
            itemLinks: null,
            itemLinkId: '#itemLink',
            callBackFunct: null,
            sliderBtnIdPrefix: 'slider-img-btn-',
            sliderBtnUpSrc: '/images/layout/slider-cube-btn-grey-1-0.png',
            sliderBtnOverSrc: '/images/layout/slider-cube-btn-green-1-0.png',
        };

        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();
            });
            
            for (var i = 0; i < options.itemTitles.length; i++) {
                var objImageLink = null;
                objImageLink = $('<img id="slider-img-btn-' + (i + 1) + '" src="/images/layout/slider-cube-btn-grey-1-0.png" alt="Slide [ ' + (i + 1) + ' ]" title="Slide [ ' + (i + 1) + ' ]" class="img-slider-cube-btn" />');
                objImageLink.bind('click', function() {
                    //alert($(this).attr('id'));
                    var sIdTmp1 = String($(this).attr('id'));
                    sIdTmp1 = sIdTmp1.replace(options.sliderBtnIdPrefix, '');
                    //alert(sIdTmp1);
                    _moveToSlide(sIdTmp1);
                });
                $('#slider-button-container').append(objImageLink);
            }


            $(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() {

                //Hide slide title
                hideSlideTitle(index);

                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() {

                //Hide slide title
                hideSlideTitle(index);

                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() {

                //Callback Function?
                if (options.callBackFunct != null) { eval(options.callBackFunct); }

                //Display slide title
                displaySlideTitle(index);

                $(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() {

                //Callback Function?
                if (options.callBackFunct != null) { eval(options.callBackFunct); }

                //Display slide title
                displaySlideTitle(index);

                $(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;
            };

            function displaySlideTitle(i) {

                //Slider Buttons
                try {
                    $("#"+options.sliderBtnIdPrefix + (i + 1)).attr("src", options.sliderBtnOverSrc);
                }
                catch (e) { }


                //Title
                if (options.itemTitles != null) {
                    try {
                        $(options.itemTitleCss).html(options.itemTitles[i]);
                        $(options.itemTitleCss).fadeIn("medium");
                    }
                    catch (e) { }
                }

                //Link
                if (options.itemLinks != null) {
                    try {
                        //$(options.itemLinkId).html(options.itemLinks[i]);
                        $(options.itemLinkId)
                            .unbind()
                            .bind("click", function() { window.location = options.itemLinks[i] });
                    }
                    catch (e) { }
                }
            };

            function hideSlideTitle(i) {
                //Slider Buttons
                try {
                    $("#"+options.sliderBtnIdPrefix + (i + 1)).attr("src", options.sliderBtnUpSrc);
                }
                catch (e) { }
            
            
                if (options.itemTitles != null) {
                    try {
                        $(options.itemTitleCss).fadeOut("medium");
                    }
                    catch (e) { }
                }
            };
            
            //Move to a Slide
            function _moveToSlide(i){
                stop();
                var iC = (i-1);
                //Move Left to Slide
                if(index > iC){
                    hideSlideTitle(index);
                    $(items[index]).show().animate({ left: w + s }, options.speed, 'swing');
                    index = iC;
                    $(items[index]).hide().css('left', -w - s);
                    $(items[index]).show().animate({ left: 0 }, options.speed, 'swing', onNextCompleted);
                //Move Right to Slide 
                }else if(index < iC){
                    hideSlideTitle(index);
                    $(items[index]).show().animate({ left: -w - s }, options.speed, 'swing');
                    index = iC;
                    $(items[index]).css('left', w + s);
                    $(items[index]).show().animate({ left: 0 }, options.speed, 'swing', onPrevCompleted);
                }
            };

            $(options.nextId).click(function() {
                return nextClicked();
            });

            $(options.prevId).click(function() {
                return prevClicked();
            });

        });

    };

})(jQuery);
