(function(A) {
    A.jScrollPane = { active: [] };
    A.fn.jScrollPane = function(C) {
        C = A.extend({}, A.fn.jScrollPane.defaults, C);
        var B = function() { return false };
        return this.each(function() {
            var O = A(this);
            O.css("overflow", "hidden");
            var X = this;
            if (A(this).parent().is(".jScrollPaneContainer")) {
                var Ac = C.maintainPosition ? O.position().top : 0;
                var L = A(this).parent();
                var d = L.innerWidth();
                var Ad = L.outerHeight();
                var M = Ad; A(">.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown", L).remove();
                O.css({ top: 0 })
            } else {
                var Ac = 0; this.originalPadding = O.css("paddingTop") + " " + O.css("paddingRight") + " " + O.css("paddingBottom") + " " + O.css("paddingLeft");
                this.originalSidePaddingTotal = (parseInt(O.css("paddingLeft")) || 0) + (parseInt(O.css("paddingRight")) || 0);
                var d = O.innerWidth();
                var Ad = O.innerHeight();
                var M = Ad;
                O.wrap(A("<div></div>").attr({ className: "jScrollPaneContainer" }).css({ height: Ad + "px", width: d + "px" }));
                A(document).bind("emchange", function(Ae, Af, p) { O.jScrollPane(C) })
            } if (C.reinitialiseOnImageLoad) {
                var N = A.data(X, "jScrollPaneImagesToLoad") || A("img", O);
                var G = [];
                if (N.length) {
                    N.each(function(p, Ae) {
                        A(this).bind("load", function() {
                            if (A.inArray(p, G) == -1) {
                                G.push(Ae);
                                N = A.grep(N, function(Ag, Af) { return Ag != Ae });
                                A.data(X, "jScrollPaneImagesToLoad", N);
                                C.reinitialiseOnImageLoad = false;
                                O.jScrollPane(C)
                            }
                        }).each(function(Af, Ag) { if (this.complete || this.complete === undefined) { this.src = this.src } })
                    })
                }
            } var o = this.originalSidePaddingTotal;
            if (typeof o == 'undefined')
                o = 0;
            var l = { height: "auto", width: d - C.scrollbarWidth - C.scrollbarMargin - o + "px" };
            if (C.scrollbarOnLeft) { l.paddingLeft = C.scrollbarMargin + C.scrollbarWidth + "px" } else { l.paddingRight = C.scrollbarMargin + "px" } O.css(l);
            var m = O.outerHeight();
            var i = Ad / m;
            if (i < 0.99) {
                var H = O.parent();
                H.append(A("<div></div>").attr({ className: "jScrollPaneTrack" }).css({ width: C.scrollbarWidth + "px" }).append(A("<div></div>").attr({ className: "jScrollPaneDrag" }).css({ width: C.scrollbarWidth + "px" }).append(A("<div></div>").attr({ className: "jScrollPaneDragTop" }).css({ width: C.scrollbarWidth + "px" }), A("<div></div>").attr({ className: "jScrollPaneDragBottom" }).css({ width: C.scrollbarWidth + "px" }))));
                var z = A(">.jScrollPaneTrack", H);
                var P = A(">.jScrollPaneTrack .jScrollPaneDrag", H);
                if (C.showArrows) {
                    var g;
                    var Ab;
                    var S;
                    var r;
                    var j = function() { if (r > 4 || r % 4 == 0) { y(u + Ab * b) } r++ };
                    var K = function(p) {
                        A("html").unbind("mouseup", K);
                        g.removeClass("jScrollActiveArrowButton");
                        clearInterval(S)
                    };
                    var Z = function() {
                        A("html").bind("mouseup", K);
                        g.addClass("jScrollActiveArrowButton");
                        r = 0;
                        j();
                        S = setInterval(j, 100)
                    };
                    H.append(A("<a></a>").attr({ href: "javascript:;", className: "jScrollArrowUp" }).css({ width: C.scrollbarWidth + "px" }).html("Scroll up").bind("mousedown", function() {
                        g = A(this);
                        Ab = -1;
                        Z();
                        this.blur();
                        return false
                    }).bind("click", B), A("<a></a>").attr({ href: "javascript:;", className: "jScrollArrowDown" }).css({ width: C.scrollbarWidth + "px" }).html("Scroll down").bind("mousedown", function() {
                        g = A(this);
                        Ab = 1;
                        Z();
                        this.blur();
                        return false
                    }).bind("click", B));
                    var Q = A(">.jScrollArrowUp", H);
                    var J = A(">.jScrollArrowDown", H);
                    if (C.arrowSize) {
                        M = Ad - C.arrowSize - C.arrowSize;
                        z.css({ height: M + "px", top: C.arrowSize + "px" })
                    } else {
                        var s = Q.height();
                        C.arrowSize = s;
                        M = Ad - s - J.height();
                        z.css({ height: M + "px", top: s + "px" })
                    }
                } var w = A(this).css({ position: "absolute", overflow: "visible" });
                var D;
                var Y;
                var b;
                var u = 0;
                var V = i * Ad / 2;
                var a = function(Ae, Ag) {
                    var Af = Ag == "X" ? "Left" : "Top";
                    return Ae["page" + Ag] || (Ae["client" + Ag] + (document.documentElement["scroll" + Af] || document.body["scroll" + Af])) || 0
                };
                var f = function() { return false };
                var v = function() {
                    n();
                    D = P.offset(false);
                    D.top -= u;
                    Y = M - P[0].offsetHeight;
                    b = 2 * C.wheelSpeed * Y / m
                };
                var E = function(p) {
                    v();
                    V = a(p, "Y") - u - D.top;
                    A("html").bind("mouseup", T).bind("mousemove", h);
                    if (A.browser.msie) { A("html").bind("dragstart", f).bind("selectstart", f) } return false
                };
                var T = function() {
                    A("html").unbind("mouseup", T).unbind("mousemove", h);
                    V = i * Ad / 2;
                    if (A.browser.msie) { A("html").unbind("dragstart", f).unbind("selectstart", f) }
                };
                var y = function(Ae) {
                    Ae = Ae < 0 ? 0 : (Ae > Y ? Y : Ae);
                    u = Ae;
                    P.css({ top: Ae + "px" });
                    var Af = Ae / Y;
                    w.css({ top: ((Ad - m) * Af) + "px" });
                    O.trigger("scroll");
                    if (C.showArrows) {
                        Q[Ae == 0 ? "addClass" : "removeClass"]("disabled");
                        J[Ae == Y ? "addClass" : "removeClass"]("disabled")
                    }
                };
                var h = function(p) { y(a(p, "Y") - D.top - V) };
                var q = Math.max(Math.min(i * (Ad - C.arrowSize * 2), C.dragMaxHeight), C.dragMinHeight);
                P.css({ height: q + "px" }).bind("mousedown", E);
                var k;
                var R;
                var I;
                var t = function() { if (R > 8 || R % 4 == 0) { y((u - ((u - I) / 2))) } R++ };
                var Aa = function() {
                    clearInterval(k);
                    A("html").unbind("mouseup", Aa).unbind("mousemove", e)
                };
                var e = function(p) { I = a(p, "Y") - D.top - V };
                var U = function(p) {
                    v();
                    e(p);
                    R = 0;
                    A("html").bind("mouseup", Aa).bind("mousemove", e);
                    k = setInterval(t, 100);
                    t()
                };
                z.bind("mousedown", U);
                H.bind("mousewheel", function(Ae, Ag) {
                    v();
                    n();
                    var Af = u;
                    y(u - Ag * b);
                    var p = Af != u;
                    return !p
                });
                var F;
                var W;
                function c() {
                    var p = (F - u) / C.animateStep;
                    if (p > 1 || p < -1) { y(u + p) } else {
                        y(F);
                        n()
                    }
                } var n = function() {
                    if (W) {
                        clearInterval(W);
                        delete F
                    }
                };
                var x = function(Af, p) {
                    if (typeof Af == "string") {
                        $e = A(Af, O);
                        if (!$e.length) { return } Af = $e.offset().top - O.offset().top
                    } H.scrollTop(0);
                    n();
                    var Ae = -Af / (Ad - m) * Y;
                    if (p || !C.animateTo) { y(Ae) } else {
                        F = Ae;
                        W = setInterval(c, C.animateInterval)
                    }
                };
                O[0].scrollTo = x;
                O[0].scrollBy = function(Ae) {
                    var p = -parseInt(w.css("top")) || 0;
                    x(p + Ae)
                };
                v();
                x(-Ac, true);
                A("*", this).bind("focus", function(Ah) {
                    var Ag = A(this);
                    var Aj = 0;
                    while (Ag[0] != O[0]) {
                        Aj += Ag.position().top;
                        Ag = Ag.offsetParent()
                    } var p = -parseInt(w.css("top")) || 0;
                    var Ai = p + Ad;
                    var Af = Aj > p && Aj < Ai;
                    if (!Af) {
                        var Ae = Aj - C.scrollbarMargin;
                        if (Aj > p) { Ae += A(this).height() + 15 + C.scrollbarMargin - Ad } x(Ae)
                    }
                });
                if (location.hash) { x(location.hash) } A(document).bind("click", function(Ae) {
                    $target = A(Ae.target);
                    if ($target.is("a")) {
                        var p = $target.attr("href");
                        if (p.substr(0, 1) == "#") { x(p) }
                    }
                });
                A.jScrollPane.active.push(O[0])
            } else {
                O.css({ height: Ad + "px", width: d - this.originalSidePaddingTotal + "px", padding: this.originalPadding });
                O.parent().unbind("mousewheel")
            }
        })
    };
    A.fn.jScrollPane.defaults = { scrollbarWidth: 10, scrollbarMargin: 5, wheelSpeed: 18, showArrows: false, arrowSize: 0, animateTo: false, dragMinHeight: 1, dragMaxHeight: 99999, animateInterval: 100, animateStep: 3, maintainPosition: true, scrollbarOnLeft: false, reinitialiseOnImageLoad: false };

    A(window).bind("unload", function() {
        var C = A.jScrollPane.active;
        for (var B = 0; B < C.length; B++) {
            C[B].scrollTo = C[B].scrollBy = null
        }
    }
        )
}
        )(jQuery);
