/*******************************************************************************
 jquery.mb.components
 Copyright (c) 2001-2010. Matteo Bicocchi (Pupunzi); Open lab srl, Firenze - Italy
 email: info@pupunzi.com
 site: http://pupunzi.com
 Licences: MIT, GPL
 ******************************************************************************/

/*
 * Name:jquery.mb.scrollable
 * Version: 1.5.7
*/

(function($) {
    $.mbScrollable =
    { plugin: "mb.scroller",
        author: "MB",
        version: "1.0",
        defaults: {
            dir: "horizontal",
            width: 950,
            elementsInPage: 4,
            elementMargin: 2,
            shadow: false,
            height: "auto",
            controls: ".controls",
            slideTimer: 600,
            autoscroll: false,
            scrollTimer: 6000,
            nextCallback: function() { },
            prevCallback: function() { }
        },

        buildMbScrollable:
            function(f) {
                return this.each
            (function() {
                this.options = {};
                $.extend(this.options, $.mbScrollable.defaults);
                $.extend(this.options, f);
                var a = this;
                a.isVertical = a.options.dir != "horizontal";
                var b = $(a.options.controls);
                a.idx = 1; a.scrollTo = 0;
                a.elements = $(a).children();
                a.elements.addClass("scrollEl");
                b.hide();
                $(a).children().each(function() { $(this).wrap("<div class='SECont'></div>") });
                if (a.options.shadow) {
                    $(a.elements).css("-moz-box-shadow", a.options.shadow);
                    $(a.elements).css("-webkit-box-shadow", a.options.shadow)
                }
                a.elements = $(a).children();
                var c = a.options.elementsInPage < this.elements.size() ? a.options.elementsInPage : a.elements.size();
                if (a.isVertical) {
                    a.singleElDim = (a.options.height / c) - a.options.elementMargin;
                    $(a.elements).css({ marginBottom: a.options.elementMargin, height: a.singleElDim, width: a.options.width })
                }
                else {
                    a.singleElDim = (a.options.width / c) - a.options.elementMargin;
                    $(a.elements).css({ marginRight: a.options.elementMargin, width: a.singleElDim, display: "inline-block", float: "left" })
                }
                this.elementsDim = (a.singleElDim * a.elements.size()) + (a.options.elementMargin * a.elements.size());
                a.totalPages = Math.ceil(a.elements.size() / a.options.elementsInPage);
                var d = $.browser.safari && a.options.elementsInPage > 2 ? a.options.elementMargin / (a.options.elementsInPage) : 0;
                if (a.isVertical)
                    $(a).css({ overflow: "hidden", height: a.options.height - d, width: a.options.width, paddingRight: 5, position: "relative" });
                else $(a).css({ overflow: "hidden", width: a.options.width - d, height: a.options.height, paddingBottom: 5, position: "relative" });

                var e = $("<div class='scrollableStrip'/>").css({ width: a.elementsDim, position: "relative" });
                $(a.elements).wrapAll(e); a.mbscrollableStrip = $(a).find(".scrollableStrip");

                $(a.elements).hover(
                    function() {
                        if (a.autoScrollActive) $(a).mbStopAutoscroll()
                    },
                    function() {
                        if (a.autoScrollActive) $(a).mbAutoscroll()
                    }
                );

                if (a.options.autoscroll && a.elements.size() > a.options.elementsInPage) {
                    a.autoScrollActive = true;
                    $(a).mbAutoscroll()
                } $(a).mbPageIndex(); $(a).mbActivateControls(); setTimeout(function() { $(".scrollEl").fadeIn() }, 0);
                $(a).mbManageControls()
            })
            }, mbNextPage: function(a) {
                var b = $(this).get(0);

                if (!a) b.autoScrollActive = false; if (b.idx == b.totalPages) {
                    $(b).mbManageControls();
                    return
                }

                if (b.options.nextCallback) b.options.nextCallback();

                var c = $.browser.safari && b.options.elementsInPage > 2 ? b.options.elementMargin / b.options.elementsInPage : 0;
                b.scrollTo -= ((b.singleElDim + b.options.elementMargin) * b.options.elementsInPage) - c;
                if (b.isVertical) {
                    if ((b.scrollTo < -b.elementsDim + b.options.height)) b.scrollTo = -b.elementsDim + b.options.height;
                    $(b.mbscrollableStrip).animate({ marginTop: b.scrollTo }, b.options.slideTimer)
                }
                else {
                    if ((b.scrollTo < -b.elementsDim + b.options.width)) b.scrollTo = -b.elementsDim + b.options.width;
                    $(b.mbscrollableStrip).animate({ marginLeft: b.scrollTo }, b.options.slideTimer)
                }
                b.idx += 1;
                $(this).mbManageControls()
            }, mbPrevPage: function(a) {
                var b = $(this).get(0);
                if (!a) b.autoScrollActive = false;
                if (b.idx == 1) {
                    $(b).mbManageControls();
                    return
                }
                if (b.options.prevCallback) b.options.prevCallback();
                var c = $.browser.safari && b.options.elementsInPage > 2 ? b.options.elementMargin / b.options.elementsInPage : 0;
                b.scrollTo += ((b.singleElDim + b.options.elementMargin) * b.options.elementsInPage) + c;
                if (b.isVertical) {
                    if (b.scrollTo >= 0) b.scrollTo = 0; $(b.mbscrollableStrip).animate({ marginTop: b.scrollTo }, b.options.slideTimer)
                }
                else {
                    if (b.scrollTo >= 0) b.scrollTo = 0;
                    $(b.mbscrollableStrip).animate({ marginLeft: b.scrollTo }, b.options.slideTimer)
                } b.idx -= 1;
                $(this).mbManageControls()
            },

        mbFirstPage:
                    function() {
                        var a = $(this).get(0);
                        a.autoScrollActive = false; a.scrollTo = 0;
                        if (a.isVertical) {
                            $(a.mbscrollableStrip).animate({ marginTop: a.scrollTo }, a.options.slideTimer)
                        }
                        else {
                            $(a.mbscrollableStrip).animate({ marginLeft: a.scrollTo }, a.options.slideTimer)
                        }
                        a.idx = 1;
                        $(this).mbManageControls();
                        $(a).mbStopAutoscroll()
                    },

        mbLastPage:
                    function() {
                        var a = $(this).get(0);
                        a.autoScrollActive = false;
                        if (a.isVertical) {
                            a.scrollTo = -a.elementsDim + a.options.height;
                            $(a.mbscrollableStrip).animate({ marginTop: a.scrollTo }, a.options.slideTimer)
                        }
                        else {
                            a.scrollTo = -a.elementsDim + a.options.width;
                            $(a.mbscrollableStrip).animate({ marginLeft: a.scrollTo }, a.options.slideTimer)
                        }
                        a.idx = a.totalPages;
                        $(a).mbManageControls();
                        $(a).mbStopAutoscroll()
                    },
        mbPageIndex:
                    function() {
                        var a = $(this).get(0);
                        var b = $(a.options.controls);
                        var c = b.find(".pageIndex"); if (c) {

                            function getPage(i) {
                                a.scrollTo = -((a.singleElDim + a.options.elementMargin) * (a.options.elementsInPage * (i - 1)));
                                if (a.isVertical) {
                                    if (a.scrollTo < -a.elementsDim + a.options.height)
                                        a.scrollTo = -a.elementsDim + a.options.height;
                                    $(a.mbscrollableStrip).animate({ marginTop: a.scrollTo }, a.options.slideTimer)
                                }
                                else {
                                    if (a.scrollTo < -a.elementsDim + a.options.width)
                                        a.scrollTo = -a.elementsDim + a.options.width;
                                    $(a.mbscrollableStrip).animate({ marginLeft: a.scrollTo }, a.options.slideTimer)
                                }
                                a.idx = Math.floor(i);
                                $(a).mbManageControls()
                            }

                            var n = 0;
                            for (var i = 1; i <= a.totalPages; i++) {
                                n++;
                                var p = $("<span class='page'> " + n + " <\/span>").bind("click", function() {
                                    getPage($(this).html());
                                    $(a).mbStopAutoscroll();
                                    a.autoScrollActive = false
                                });
                                c.append(p)
                            }
                        }
                    },
        mbAutoscroll:
                    function() {
                        var a = "next";
                        var b = $(this).get(0);
                        b.autoScrollActive = true;
                        if (b.autoscroll) return;
                        var c = b.options.scrollTimer + b.options.slideTimer; b.autoscroll = true;
                        b.auto = setInterval(
                            function() {
                                a = b.idx == 1 ? "next" : b.idx == b.totalPages ? "prev" : a;
                                if (a == "next") $(b).mbNextPage(true);
                                else $(b).mbPrevPage(true)
                            }
                        , c);
                        $(b).mbManageControls()
                    },
        mbStopAutoscroll:
                    function() {
                        var a = $(this).get(0);
                        a.autoscroll = false;
                        clearInterval(a.auto);
                        $(a).mbManageControls()
                    },
        mbActivateControls:
                    function() {
                        var a = $(this).get(0);
                        var b = $(a.options.controls);
                        b.find(".first").bind("click", function() {
                            $(a).mbFirstPage()
                        });
                        b.find(".prev").bind("click", function() {
                            $(a).mbStopAutoscroll();
                            $(a).mbPrevPage();

                            $(a).mbAutoscroll()
                        });
                        b.find(".next").bind("click", function() {
                            $(a).mbStopAutoscroll();
                            $(a).mbNextPage();

                            $(a).mbAutoscroll()
                        });
                        b.find(".last").bind("click", function() {
                            $(a).mbLastPage()
                        });
                        b.find(".start").bind("click", function() {
                            $(a).mbAutoscroll()
                        });
                        b.find(".stop").bind("click", function() {
                            $(a).mbStopAutoscroll();
                            a.autoScrollActive = false
                        })
                    },
        mbManageControls:
                    function() {
                        var a = $(this).get(0);
                        var b = $(a.options.controls);
                        if (a.elements.size() <= a.options.elementsInPage) {
                            b.hide()
                        }
                        else { b.fadeIn() }

                        if (a.idx == a.totalPages) {
                            b.find(".last").addClass("disabled");
                            b.find(".next").addClass("disabled")
                        }
                        else {
                            b.find(".last").removeClass("disabled");
                            b.find(".next").removeClass("disabled")
                        }

                        if (a.idx == 1) {
                            b.find(".first").addClass("disabled");
                            b.find(".prev").addClass("disabled")
                        }
                        else {
                            b.find(".first").removeClass("disabled");
                            b.find(".prev").removeClass("disabled")
                        }

                        if (a.autoscroll) {
                            b.find(".start").addClass("sel");
                            b.find(".stop").removeClass("sel")
                        }
                        else {
                            b.find(".start").removeClass("sel");
                            b.find(".stop").addClass("sel")
                        }
                        b.find(".page").removeClass("sel");
                        b.find(".page").eq(a.idx - 1).addClass("sel");
                        b.find(".idx").html(a.idx + " / " + a.totalPages)
                    },
        goToPage:
                    function(i, a) {
                        var b = $(this).get(0);
                        var c = a ? 0 : b.options.slideTimer;
                        if (i > b.totalPages) i = b.totalPages;
                        b.scrollTo = -((b.singleElDim + b.options.elementMargin) * (b.options.elementsInPage * (i - 1)));
                        if (b.isVertical) {
                            if (b.scrollTo < -b.elementsDim + b.options.height)
                                b.scrollTo = -b.elementsDim + b.options.height;

                            $(b.mbscrollableStrip).animate({ marginTop: b.scrollTo }, c)
                        }
                        else {
                            if (b.scrollTo < -b.elementsDim + b.options.width)
                                b.scrollTo = -b.elementsDim + b.options.width;

                            $(b.mbscrollableStrip).animate({ marginLeft: b.scrollTo }, c)
                        }
                        b.idx = Math.floor(i);
                        $(b).mbManageControls();
                        $(b).mbStopAutoscroll();
                        b.autoScrollActive = false
                    }
    };
    $.fn.mbScrollable = $.mbScrollable.buildMbScrollable;
    $.fn.mbNextPage = $.mbScrollable.mbNextPage;
    $.fn.mbPrevPage = $.mbScrollable.mbPrevPage;
    $.fn.mbFirstPage = $.mbScrollable.mbFirstPage;
    $.fn.mbLastPage = $.mbScrollable.mbLastPage;
    $.fn.mbPageIndex = $.mbScrollable.mbPageIndex;
    $.fn.mbgotoPage = $.mbScrollable.gotoPage;
    $.fn.mbAutoscroll = $.mbScrollable.mbAutoscroll;
    $.fn.mbStopAutoscroll = $.mbScrollable.mbStopAutoscroll;
    $.fn.mbActivateControls = $.mbScrollable.mbActivateControls;
    $.fn.mbManageControls = $.mbScrollable.mbManageControls;
    $.fn.goToPage = $.mbScrollable.goToPage
}
    )(jQuery);
