﻿/*
* Tiny Carousel 1.7
*
* Copyright (c) 2010 Maarten Baijs
*
* Date: 12 / 05 / 2010
* Library: jQuery
*
*/
(function ($) {
    $.fn.tinycarousel = function (options) {
        var defaults = {
            start: 1, // where should the carousel start?
            display: 1, // how many blocks do you want to move at 1 time?
            axis: 'x', // vertical or horizontal scroller? ( x || y ).
            controls: true, // show left and right navigation buttons.
            pager: false, // is there a page number navigation present?
            interval: false, // move to another block on intervals.
            intervaltime: 3000, // interval time in milliseconds.
            animation: true, // false is instant, true is animate.
            duration: 1000, // how fast must the animation move in ms?
            callback: null // function that executes after every move
        };
        var options = $.extend(defaults, options);

        var oSlider = $(this);
        var oViewport = $('.viewport', oSlider);
        var oContent = $('.overview', oSlider);
        var oPages = oContent.children();
        var oBtnNext = $('.next', oSlider);
        var oBtnPrev = $('.prev', oSlider);
        var oPager = $('.pager', oSlider);



        var iCurrent = (options.start - 2), iPageSize = 0, oTimer = 0, iSteps = 0, bForward = true;

        

        return this.each(function () {
            initialize();
        });
        function initialize() {
            iPageSize = options.axis == 'x' ? $(oPages[0]).outerWidth(true) : $(oPages[0]).outerHeight(true);

            var iLeftover = Math.ceil(((options.axis == 'x' ? oViewport.outerWidth() : oViewport.outerHeight()) / (iPageSize * options.display)) - 1);
            iSteps = Math.ceil(oPages.length / options.display) - (iLeftover <= 1 && options.display > 1 ? 0 : iLeftover);
            iCurrent = iCurrent < 1 || iSteps < iCurrent ? -1 : iCurrent;
            oContent.css(options.axis == 'x' ? 'width' : 'height', (iPageSize * oPages.length));
            move(1);
            setEvents();
        }
        function setButtons() {
            if (options.controls) {
                oBtnPrev.toggleClass('disable', !(iCurrent > 0));
                oBtnNext.toggleClass('disable', !(iCurrent + 1 < iSteps));
            }
        }
        function setEvents() {
            if (options.controls && oBtnPrev.length > 0 && oBtnNext.length > 0) {
                oBtnPrev.click(function () { move(-1); return false; });
                oBtnNext.click(function () { move(1); return false; });
            }
            if (options.pager && oPager.length > 0) {
                oPager.click(setPager);
            }
        }
        function setPager(oEvent) {
            var oTarget = oEvent.target;
            if ($(oTarget).hasClass('pagenum')) {
                iCurrent = parseInt(oTarget.rel) - 1;
                move(1);
            }
            return false;
        }
        function setPagerActive() {
            if (options.pager) {
                var oNumbers = $('.pagenum', oPager);
                oNumbers.removeClass('active');
                $(oNumbers[iCurrent]).addClass('active');
            }
        }
        function setTimer() {
            if (options.interval) {
                oTimer = window.setInterval(function () {
                    var iDirection = 0, exp = iCurrent - 1 == -1;
                    bForward ? iCurrent + 1 == iSteps ? bForward = false : iDirection = 1 : exp ? bForward = true : iDirection = -1;
                    move(iDirection, true);
                }, options.intervaltime);
            }
        }
        function resetTimer(bReset) {
            if (options.interval && !bReset) {
                clearInterval(oTimer);
                setTimer();
            }
        }
        function move(iDirection, bTimerReset) {
            
            if (iCurrent > 0 || iCurrent + 1 < iSteps) {
                iCurrent += iDirection;
                var oPosition = {};
                oPosition[options.axis == 'x' ? 'left' : 'top'] = -(iCurrent * (iPageSize * options.display));
                oContent.animate(oPosition, {
                    queue: false,
                    duration: options.animation ? options.duration : 0,
                    complete: function () {
                        if (typeof (options.callback) == 'function')
                            options.callback.call(this, oPages[iCurrent], iCurrent);
                    }
                });
                setButtons();
                setPagerActive();
                resetTimer(bTimerReset);
            }
        }
    };
})(jQuery);