﻿/// <reference path="jquery-1.5.1.min.js" />

$.fn.carousel = function carousel(params) {
    var container = (params.container) ? params.container : "";
    var pager = (params.pager) ? params.pager : "";
    var btnNext = (params.btnNext) ? params.btnNext : "";
    var btnPrev = (params.btnPrev) ? params.btnPrev : "";
    var effect = (params.effect) ? params.effect : "slide";
    var speed = (params.speed) ? params.speed : 500;
    var auto = (params.auto) ? params.auto : "";
    var loop = (params.loop) ? params.loop : false;
    var easing = (params.easing) ? params.easing : "swing";
    var beforeStart = (params.beforeStart) ? params.beforeStart : null;
    var afterFinish = (params.afterFinish) ? params.afterFinish : null;
    var timer = null;
    var carouselWidth = 0;
    var width = $(this).width();
    var currentSlide = 1;
    var numSlides = 0;
    var group = $(this).find("ul:first");
    var self = this;
    group.css("position", "absolute");
    $(this).css("position", "relative");

    $(this).find("ul:first>li").each(function (i) {
        $(this).css("float", "left");
        carouselWidth += $(this).width();
        if (pager && $(pager)) {
            $(self).closest(container).find(pager).append("<a class=\"pager" + (i + 1) + "\" href=\"javascript:void(0);\">" + (i + 1) + "</a>");
        }
        numSlides++;
    });

    if (pager && $(pager)) {
        $(self).closest(container).find(pager).find("a").each(function (i) {
            if (i == 0) {
                $(this).addClass("active");
            }
            $(this).click(function () {
                self.gotoSlide(i + 1, "");
            });
        });
    }

    group.width(carouselWidth);

    if (btnPrev) {
        $(this).closest(container).find(btnPrev).click(function () {
            self.prev();
        });
    }

    if (btnNext) {
        $(this).closest(container).find(btnNext).click(function () {
            self.next();
        });
    }

    if (auto) {
        setTimer();
    }

    if (effect == "fade") {
        group.find(">li").hide().css("position", "absolute");
        group.find(">li:nth-child(1)").show();
    }

    $(this).mouseover(function () {
        clearInterval(timer);
    });

    $(this).mouseout(function () {
        if (auto) {
            setTimer();
        }
    });

    this.prev = function () {
        slideNum = currentSlide - 1;
        if (slideNum < 1) {
            slideNum = numSlides;
        }
        self.gotoSlide(slideNum, "prev");
    };

    this.next = function () {
        slideNum = currentSlide + 1;
        if (slideNum > numSlides) {
            slideNum = 1;
        }
        self.gotoSlide(slideNum, "next");
    };

    function setTimer() {
        clearInterval(timer);
        timer = setInterval(function () { self.next(); }, auto);
    }

    this.gotoSlide = function (slideNum, direction) {
        var newPos = null;
        var nextSlide = slideNum;
        if (auto) {
            if (slideNum == numSlides && !loop) {
                clearInterval(timer);
            } else {
                setTimer();
            }
        }
        if (slideNum == numSlides && direction == "prev") {
            if (effect == "slide") {
                group.find("li:last").insertBefore(group.find("li:first"));
                group.css("left", (group.find("li:nth-child(" + (currentSlide + 1) + ")").position().left * -1) + "px");
                newPos = (group.find("li:first").position().left * -1);
            }
            nextSlide = 1;
        } else if (slideNum == 1 && direction == "next") {
            if (effect == "slide") {
                group.find("li:first").insertAfter(group.find("li:last"));
                group.css("left", (group.find("li:nth-child(" + (numSlides - 1) + ")").position().left * -1) + "px");
                newPos = (group.find("li:last").position().left * -1);
            }
            nextSlide = numSlides;
        } else {
            newPos = (group.find("li:nth-child(" + slideNum + ")").position().left * -1);
        }

        if (beforeStart) { beforeStart(getSlide(currentSlide), getSlide(nextSlide)); }
        if (effect == "slide") {
            group.animate({ left: newPos}, speed, easing, function () {
                if (afterFinish) { afterFinish(getSlide(currentSlide), getSlide(nextSlide)); }
                if (slideNum == numSlides && direction == "prev") {
                    group.find("li:first").insertAfter(group.find("li:last"));
                    group.css("left", (group.find("li:last").position().left * -1) + "px");
                    newPos = (group.find("li:first").position().left * -1);
                } else if (slideNum == 1 && direction == "next") {
                    group.find("li:last").insertBefore(group.find("li:first"));
                    group.css("left", (group.find("li:first").position().left * -1) + "px");
                    newPos = (group.find("li:last").position().left * -1);
                }
                currentSlide = slideNum;
            });
        } else if (effect == "fade" && slideNum != currentSlide) {
            getSlide(slideNum).show().css("z-index", "1");
            getSlide(currentSlide).css("z-index", "2").fadeOut(speed, easing, function () {
                if (afterFinish) { afterFinish(getSlide(currentSlide), getSlide(nextSlide)); }
                currentSlide = slideNum;
            });
        }
        if (pager && $(pager)) {
            $(self).closest(container).find(pager).find("a").removeClass("active");
            $(self).closest(container).find(pager).find("a:nth-child(" + slideNum + ")").addClass("active");
        }
    }

    function getSlide(slideNum) {
        return group.find("li:nth-child(" + slideNum + ")");
    }

    return this;

};
