/* params = {
 *     itemsSelector,
 *     leftControllerSelector,
 *     rightControllerSelector,
 *     pageWidth,
 *     itemSelector, // optional, li by default
 *     pageTime, // optional, 1000 by default
 *     pageInterval, // optional, 5000 by default
 *     auto, // optional, true by default
 *     dir, // optional, ltr by default
 *     beforeCarousel, // optional, null by default
 *     afterCarousel // optional, null by default
 * }
 */

jQuery.carousel = function(params)
{
    if(params.pageTime === undefined)
        params.pageTime = 1000;
    if(params.pageInterval === undefined)
        params.pageInterval = 5000;
    if(params.auto === undefined)
        params.auto = true;
    if(params.itemSelector === undefined)
        params.itemSelector = "li";
    if(params.dir === undefined)
        params.dir = "ltr";
    if(params.beforeCarousel === undefined)
        params.beforeCarousel = null;
    if(params.afterCarousel === undefined)
        params.afterCarousel = null;

    var offsetAttribute = params.dir == "rtl" ? "margin-right" : "margin-left";
    var itemFirstFlag = params.dir == "rtl" ? "right" : "left";

    jQuery(document).ready(function(){
        var items = jQuery(params.itemsSelector);
        var leftController = jQuery(params.leftControllerSelector);
        var rightController = jQuery(params.rightControllerSelector);

        var itemWidth = items.children(params.itemSelector + ":first").outerWidth(true);
        var pageItemCount = params.pageWidth / itemWidth;
        var itemTime = params.pageTime / pageItemCount;

        var width = 0;
        items.children(params.itemSelector).each(function(){
            width += jQuery(this).outerWidth(true);
        }).end().width(width).css(offsetAttribute, -params.pageWidth);

        var carouseling = false;
        var autoInterval = null;
        var autoTimeout = null;

        var carousel = function(direction){
            if(params.beforeCarousel)
            {
                if(!params.beforeCarousel(direction))
                    return;
            }
            var offsetMargin = parseInt(items.css(offsetAttribute));
            var animateParams = {marginLeft: direction == itemFirstFlag ? offsetMargin - params.pageWidth : offsetMargin + params.pageWidth}
            if(params.dir == "rtl")
                animateParams = {marginRight: direction == itemFirstFlag ? offsetMargin - params.pageWidth : offsetMargin + params.pageWidth}
            items.animate(animateParams, params.pageTime,
                function(){
                    if(direction == itemFirstFlag)
                    {
                        for(var j = 0; j < pageItemCount; j++)
                        {
                            items.children(params.itemSelector + ":first").remove().appendTo(items);
                        }
                    }
                    else
                    {
                        for(var j = 0; j < pageItemCount; j++)
                        {
                            items.children(params.itemSelector + ":last").remove().prependTo(items);
                        }
                    }

                    items.css(offsetAttribute, -params.pageWidth);

                    if(params.afterCarousel)
                        params.afterCarousel(direction);

                    carouseling = false;
            });
            carouseling = true;
        };

        leftController.click(function(){
            if(!carouseling)
            {
                if(autoInterval)
                {
                    clearInterval(autoInterval);
                    autoInterval = null;
                }
                if(autoTimeout)
                {
                    clearTimeout(autoTimeout);
                    autoTimeout = null;
                }
                if(params.auto)
                {
                    autoTimeout = setTimeout(function(){
                        autoInterval = setInterval(function(){carousel("left");}, params.pageInterval);
                    }, params.pageTime + params.pageInterval);
                }

                carousel("left");
            }
        });
        rightController.click(function(){
            if(!carouseling)
            {
                if(autoInterval)
                {
                    clearInterval(autoInterval);
                    autoInterval = null;
                }
                if(autoTimeout)
                {
                    clearTimeout(autoTimeout);
                    autoTimeout = null;
                }
                if(params.auto)
                {
                    autoTimeout = setTimeout(function(){
                        autoInterval = setInterval(function(){carousel("right");}, params.pageInterval);
                    }, params.pageTime + params.pageInterval);
                }

                carousel("right");
            }
        });

        if(params.auto)
            autoInterval = setInterval(function(){carousel("left");}, params.pageInterval);
    });
};

