///<reference path="jquery-1.4.2.min.js"/>
///<reference path="dep.js"/>

(function ($) {



    $.fn.carousel = function (previous, next, initCallback, clickCallback) {
        var sliderList = jQuery(this).children()[0];

        var expose = {
            items: jQuery(sliderList).children(),
            count: 1,
            obj: jQuery(this),
            id: jQuery(this).parent().attr("id")
        };

        if (sliderList) {
            var increment = jQuery(sliderList).children().outerWidth("true"),
		elmnts = jQuery(sliderList).children(),
		numElmts = elmnts.length,
		sizeFirstElmnt = increment,
		shownInViewport = Math.round(jQuery(this).width() / sizeFirstElmnt),
		firstElementOnViewPort = 1,
		isAnimating = false;
            
            if (numElmts <= shownInViewport) {
                jQuery(previous).css("visibility", "hidden");
                jQuery(next).css("visibility", "hidden");
            }
            
            for (i = 0; i < shownInViewport; i++) {
                jQuery(sliderList).css('width', (numElmts + shownInViewport) * increment + increment + "px");
                jQuery(sliderList).append(jQuery(elmnts[i]).clone());
            }

            jQuery(previous).click(function (event) {
                if (!isAnimating) {
                    if (firstElementOnViewPort == 1) {
                        jQuery(sliderList).css('left', "-" + numElmts * sizeFirstElmnt + "px");
                        firstElementOnViewPort = numElmts;
                    }
                    else {
                        firstElementOnViewPort--;
                    }

                    jQuery(sliderList).animate({
                        left: "+=" + increment,
                        y: 0,
                        queue: true
                    }, "swing", function () { isAnimating = false; });
                    isAnimating = true;

                    if (expose.count == 1)
                        expose.count = expose.items.length;
                    else
                        expose.count -= 1;

                    if (typeof (clickCallback) != "undefined")
                        clickCallback(expose);
                }

            });

            jQuery(next).click(function (event) {
                if (!isAnimating) {
                    if (firstElementOnViewPort > numElmts) {
                        firstElementOnViewPort = 2;
                        jQuery(sliderList).css('left', "0px");
                    }
                    else {
                        firstElementOnViewPort++;
                    }
                    jQuery(sliderList).animate({
                        left: "-=" + increment,
                        y: 0,
                        queue: true
                    }, "swing", function () { isAnimating = false; });
                    isAnimating = true;

                    if (expose.count == expose.items.length)
                        expose.count = 1;
                    else
                        expose.count += 1;

                    if (typeof (clickCallback) != "undefined")
                        clickCallback(expose);
                }
            });

            if (typeof (initCallback) != "undefined")
                initCallback(expose);

            return jQuery(this);
        }
    };

} (jQuery));
