﻿(function ($) {
    $.fn.slideMe = function (slideLeftSelector, slideRightSelector, visibleElements, selectNumber, cbSelect) {

        var slider = $(this).find("ul");
        var elements = slider.find("li").size();
        var sliderElementWidth = slider.find("li").first().outerWidth(true);
        var margin = slider.find("li").first().css('margin-right');
        slider.width(((elements + 1) * sliderElementWidth));

        if (selectNumber) {
            var selectFirst = selectNumber > elements ? elements : selectNumber;
            $(slider.find("li").get(selectFirst - 1)).addClass("selected");
            if (cbSelect) cbSelect();
        }

        var doScroll = elements > visibleElements;

        if (doScroll) {
            $(slideLeftSelector + ", " + slideRightSelector).show();
            slider.find("li:last").prependTo(slider);
            $(this).scrollLeft(sliderElementWidth);
        } else {
            $(slideLeftSelector + ", " + slideRightSelector).hide();
        }

        var clickInProgress = false;
        var clickQueue = [];

        var prev = function () {
            if (clickInProgress) {
                clickQueue.push(prev);
                return;
            }
            clickInProgress = true;
            var selectedIndex = $(slider).find("li").index($(".imageslider .selected"));
            $(slider).find("li").removeClass("selected");

            if (doScroll) {
                slider.append(slider.find("li:last").clone());
                slider.find("li:last").hide().prependTo(slider).animate({ width: "show" }, 400, function () {
                    $(this).animate({ 'margin-right': margin }, 100, function () {
                        slider.find("li:last").remove();
                        $(slider.find("li").get(selectedIndex)).addClass("selected");
                        clickInProgress = false;
                        if (cbSelect) cbSelect();
                        processClickQueue();
                    });
                });
            } else {
                selectedIndex = selectedIndex == 0 ? elements - 1 : selectedIndex - 1;
                $(slider.find("li").get(selectedIndex)).addClass("selected");
                clickInProgress = false;
                if (cbSelect) cbSelect();
                processClickQueue();
            }
        };
        $(slideLeftSelector).click(prev);
        $(window).bind('left-click', prev);

        var next = function () {
            if (clickInProgress) {
                clickQueue.push(next);
                return;
            }
            clickInProgress = true;

            var selectedIndex = slider.find("li").index($(".imageslider .selected"));

            $(slider).find("li").removeClass("selected");

            if (doScroll) {
                slider.append(slider.find("li:first").clone());
                slider.find("li:first").animate({ width: "hide", 'margin-right': 0 }, 500, function () {
                    slider.find("li:first").remove();
                    $(slider.find("li").get(selectedIndex)).addClass("selected");
                    clickInProgress = false;
                    if (cbSelect) cbSelect();
                    processClickQueue();
                });
            } else {
                selectedIndex = selectedIndex == (elements - 1) ? 0 : selectedIndex + 1;
                $(slider.find("li").get(selectedIndex)).addClass("selected");
                clickInProgress = false;
                if (cbSelect) cbSelect();
                processClickQueue();
            }
        };
        $(slideRightSelector).click(next);
        $(window).bind('right-click', next);

        var processClickQueue = function () {
            if (clickQueue.length > 0) (clickQueue.pop())();
        }
    };

})(jQuery);
