﻿var CarouselManager = {
    CreateCarousel: function(animAreaSelector, leftArrowSelector, rightArrowSelector) {
        return new Carousel(animAreaSelector, leftArrowSelector, rightArrowSelector);
    }
};

function Carousel(animAreaSelector, leftArrowSelector, rightArrowSelector) {
    this.__AnimIndex = 0;
    this.AnimPause = 4000;
    this.AnimMode = "fade";
    this.__LeftArrowSelector = leftArrowSelector;
    this.__RightArrowSelector = rightArrowSelector;
    this.__AnimAreaSelector = animAreaSelector;
    
    var self = this;
    $(function() { self.Init(); });
};

Carousel.prototype.Init = function() {
    var self = this;

    if (!this.__AnimAreaSelector)
        return;

    this.__$AnimArea = $(this.__AnimAreaSelector);
    this.__$Items = this.__$AnimArea.find("li");
    this.__AnimCount = this.__$Items.length;

    if (this.__AnimCount === 0)
        return;

    if (this.__AnimCount === 1) {
        if (this.__LeftArrowSelector) {
            $(this.__LeftArrowSelector).hide();
        }
        if (this.__RightArrowSelector) {
            $(this.__RightArrowSelector).hide();
        }
        return;
    }

    if (this.__LeftArrowSelector) {
        $(this.__LeftArrowSelector).click(function(e) {
            e.preventDefault();
            self.__Animate(-1, "fast", false);
        });
    }

    if (this.__RightArrowSelector) {
        $(this.__RightArrowSelector).click(function(e) {
            e.preventDefault();
            self.__Animate(1, "fast", false);
        });
    }

    this.__Queue();
};

Carousel.prototype.__Queue = function() {
    var self = this;
    this.__At = setTimeout(function() { self.__Animate(1, "slow", true); }, this.AnimPause);
};

Carousel.prototype.__Animate = function(delta, animSpeed, autoNext) {
    clearTimeout(this.__At);

    var self = this;

    if (typeof(MoviePlay) === "undefined" || !MoviePlay) { // Don't do animations while global movie is playing

        var oldIndex = this.__AnimIndex;
        var newIndex = this.__AnimIndex + delta;

        if (newIndex === this.__AnimCount)
            newIndex = 0;
        else if (newIndex < 0)
            newIndex = this.__AnimCount - 1;

        if (this.AnimMode === "fade" ) {
            this.__$Items.eq(oldIndex).fadeOut(animSpeed,
                function() {
                    self.__$Items.eq(newIndex).fadeIn(animSpeed,
                        function() {
                            self.__AnimIndex = newIndex;
                            if (autoNext) {
                                self.__Queue();
                            }
                        });
                });
        }

    }
}
