/*
* jScrollPane - v2.0.0beta10 - 2011-04-17
* http://jscrollpane.kelvinluck.com/
*
* Copyright (c) 2010 Kelvin Luck
* Dual licensed under the MIT and GPL licenses.
*/
(function (b, a, c)
{
    b.fn.jScrollPane = function (f)
    {
        function d(E, P)
        {
            var aA, R = this, Z, al, w, an, U, aa, z, r, aB, aG, aw, j, J, i, k, ab, V, ar, Y, u, B, at, ag, ao, H, m, av, az, y, ax, aJ, g, M, ak = true, Q = true, aI = false, l = false, aq = E.clone(false, false).empty(), ad = b.fn.mwheelIntent ? "mwheelIntent.jsp" : "mousewheel.jsp"; aJ = E.css("paddingTop") + " " + E.css("paddingRight") + " " + E.css("paddingBottom") + " " + E.css("paddingLeft"); g = (parseInt(E.css("paddingLeft"), 10) || 0) + (parseInt(E.css("paddingRight"), 10) || 0); function au(aS) { var aN, aP, aO, aL, aK, aR, aQ = false, aM = false; aA = aS; if (Z === c) { aK = E.scrollTop(); aR = E.scrollLeft(); E.css({ overflow: "hidden", padding: 0 }); al = E.innerWidth() + g; w = E.innerHeight(); E.width(al); Z = b('<div class="jspPane" />').css("padding", aJ).append(E.children()); an = b('<div class="jspContainer" />').css({ width: al + "px", height: w + "px" }).append(Z).appendTo(E) } else { E.css("width", ""); aQ = aA.stickToBottom && L(); aM = aA.stickToRight && C(); aL = E.innerWidth() + g != al || E.outerHeight() != w; if (aL) { al = E.innerWidth() + g; w = E.innerHeight(); an.css({ width: al + "px", height: w + "px" }) } if (!aL && M == U && Z.outerHeight() == aa) { E.width(al); return } M = U; Z.css("width", ""); E.width(al); an.find(">.jspVerticalBar,>.jspHorizontalBar").remove().end() } Z.css("overflow", "auto"); if (aS.contentWidth) { U = aS.contentWidth } else { U = Z[0].scrollWidth } aa = Z[0].scrollHeight; Z.css("overflow", ""); z = U / al; r = aa / w; aB = r > 1; aG = z > 1; if (!(aG || aB)) { E.removeClass("jspScrollable"); Z.css({ top: 0, width: an.width() - g }); o(); F(); S(); x(); aj() } else { E.addClass("jspScrollable"); aN = aA.maintainPosition && (J || ab); if (aN) { aP = aE(); aO = aC() } aH(); A(); G(); if (aN) { O(aM ? (U - al) : aP, false); N(aQ ? (aa - w) : aO, false) } K(); ah(); ap(); if (aA.enableKeyboardNavigation) { T() } if (aA.clickOnTrack) { q() } D(); if (aA.hijackInternalLinks) { n() } } if (aA.autoReinitialise && !ax) { ax = setInterval(function () { au(aA) }, aA.autoReinitialiseDelay) } else { if (!aA.autoReinitialise && ax) { clearInterval(ax) } } aK && E.scrollTop(0) && N(aK, false); aR && E.scrollLeft(0) && O(aR, false); E.trigger("jsp-initialised", [aG || aB]) } function aH() { if (aB) { an.append(b('<div class="jspVerticalBar" />').append(b('<div class="jspCap jspCapTop" />'), b('<div class="jspTrack" />').append(b('<div class="jspDrag" />').append(b('<div class="jspDragTop" />'), b('<div class="jspDragBottom" />'))), b('<div class="jspCap jspCapBottom" />'))); V = an.find(">.jspVerticalBar"); ar = V.find(">.jspTrack"); aw = ar.find(">.jspDrag"); if (aA.showArrows) { at = b('<a class="jspArrow jspArrowUp" />').bind("mousedown.jsp", aF(0, -1)).bind("click.jsp", aD); ag = b('<a class="jspArrow jspArrowDown" />').bind("mousedown.jsp", aF(0, 1)).bind("click.jsp", aD); if (aA.arrowScrollOnHover) { at.bind("mouseover.jsp", aF(0, -1, at)); ag.bind("mouseover.jsp", aF(0, 1, ag)) } am(ar, aA.verticalArrowPositions, at, ag) } u = w; an.find(">.jspVerticalBar>.jspCap:visible,>.jspVerticalBar>.jspArrow").each(function () { u -= b(this).outerHeight() }); aw.hover(function () { aw.addClass("jspHover") }, function () { aw.removeClass("jspHover") }).bind("mousedown.jsp", function (aK) { b("html").bind("dragstart.jsp selectstart.jsp", aD); aw.addClass("jspActive"); var s = aK.pageY - aw.position().top; b("html").bind("mousemove.jsp", function (aL) { W(aL.pageY - s, false) }).bind("mouseup.jsp mouseleave.jsp", ay); return false }); p() } } function p() { ar.height(u + "px"); J = 0; Y = aA.verticalGutter + ar.outerWidth(); Z.width(al - Y - g); try { if (V.position().left === 0) { Z.css("margin-left", Y + "px") } } catch (s) { } } function A()
            {
                if (aG)
                {
                    an.append(b('<div class="jspHorizontalBar" />').append(b('<div class="jspCap jspCapLeft" />'), b('<div class="jspTrack" />').append(b('<div class="jspDrag" />').append(b('<div class="jspDragLeft" />'), b('<div class="jspDragRight" />'))), b('<div class="jspCap jspCapRight" />'))); ao = an.find(">.jspHorizontalBar"); H = ao.find(">.jspTrack"); i = H.find(">.jspDrag"); if (aA.showArrows)
                    {
                        az = b('<a class="jspArrow jspArrowLeft" />').bind("mousedown.jsp", aF(-1, 0)).bind("click.jsp", aD); y = b('<a class="jspArrow jspArrowRight" />').bind("mousedown.jsp", aF(1, 0)).bind("click.jsp", aD);
                        if (aA.arrowScrollOnHover) { az.bind("mouseover.jsp", aF(-1, 0, az)); y.bind("mouseover.jsp", aF(1, 0, y)) } am(H, aA.horizontalArrowPositions, az, y)
                    } i.hover(function () { i.addClass("jspHover") }, function () { i.removeClass("jspHover") }).bind("mousedown.jsp", function (aK) { b("html").bind("dragstart.jsp selectstart.jsp", aD); i.addClass("jspActive"); var s = aK.pageX - i.position().left; b("html").bind("mousemove.jsp", function (aL) { X(aL.pageX - s, false) }).bind("mouseup.jsp mouseleave.jsp", ay); return false }); m = an.innerWidth(); ai()
                } 
            } function ai() { an.find(">.jspHorizontalBar>.jspCap:visible,>.jspHorizontalBar>.jspArrow").each(function () { m -= b(this).outerWidth() }); H.width(m + "px"); ab = 0 } function G() { if (aG && aB) { var aK = H.outerHeight(), s = ar.outerWidth(); u -= aK; b(ao).find(">.jspCap:visible,>.jspArrow").each(function () { m += b(this).outerWidth() }); m -= s; w -= s; al -= aK; H.parent().append(b('<div class="jspCorner" />').css("width", aK + "px")); p(); ai() } if (aG) { Z.width((an.outerWidth() - g) + "px") } aa = Z.outerHeight(); r = aa / w; if (aG) { av = Math.ceil(1 / z * m); if (av > aA.horizontalDragMaxWidth) { av = aA.horizontalDragMaxWidth } else { if (av < aA.horizontalDragMinWidth) { av = aA.horizontalDragMinWidth } } i.width(av + "px"); k = m - av; af(ab) } if (aB) { B = Math.ceil(1 / r * u); if (B > aA.verticalDragMaxHeight) { B = aA.verticalDragMaxHeight } else { if (B < aA.verticalDragMinHeight) { B = aA.verticalDragMinHeight } } aw.height(B + "px"); j = u - B; ae(J) } } function am(aL, aN, aK, s) { var aP = "before", aM = "after", aO; if (aN == "os") { aN = /Mac/.test(navigator.platform) ? "after" : "split" } if (aN == aP) { aM = aN } else { if (aN == aM) { aP = aN; aO = aK; aK = s; s = aO } } aL[aP](aK)[aM](s) } function aF(aK, s, aL) { return function () { I(aK, s, this, aL); this.blur(); return false } } function I(aN, aM, aQ, aP) { aQ = b(aQ).addClass("jspActive"); var aO, aL, aK = true, s = function () { if (aN !== 0) { R.scrollByX(aN * aA.arrowButtonSpeed) } if (aM !== 0) { R.scrollByY(aM * aA.arrowButtonSpeed) } aL = setTimeout(s, aK ? aA.initialDelay : aA.arrowRepeatFreq); aK = false }; s(); aO = aP ? "mouseout.jsp" : "mouseup.jsp"; aP = aP || b("html"); aP.bind(aO, function () { aQ.removeClass("jspActive"); aL && clearTimeout(aL); aL = null; aP.unbind(aO) }) } function q() { x(); if (aB) { ar.bind("mousedown.jsp", function (aP) { if (aP.originalTarget === c || aP.originalTarget == aP.currentTarget) { var aN = b(this), aQ = aN.offset(), aO = aP.pageY - aQ.top - J, aL, aK = true, s = function () { var aT = aN.offset(), aU = aP.pageY - aT.top - B / 2, aR = w * aA.scrollPagePercent, aS = j * aR / (aa - w); if (aO < 0) { if (J - aS > aU) { R.scrollByY(-aR) } else { W(aU) } } else { if (aO > 0) { if (J + aS < aU) { R.scrollByY(aR) } else { W(aU) } } else { aM(); return } } aL = setTimeout(s, aK ? aA.initialDelay : aA.trackClickRepeatFreq); aK = false }, aM = function () { aL && clearTimeout(aL); aL = null; b(document).unbind("mouseup.jsp", aM) }; s(); b(document).bind("mouseup.jsp", aM); return false } }) } if (aG) { H.bind("mousedown.jsp", function (aP) { if (aP.originalTarget === c || aP.originalTarget == aP.currentTarget) { var aN = b(this), aQ = aN.offset(), aO = aP.pageX - aQ.left - ab, aL, aK = true, s = function () { var aT = aN.offset(), aU = aP.pageX - aT.left - av / 2, aR = al * aA.scrollPagePercent, aS = k * aR / (U - al); if (aO < 0) { if (ab - aS > aU) { R.scrollByX(-aR) } else { X(aU) } } else { if (aO > 0) { if (ab + aS < aU) { R.scrollByX(aR) } else { X(aU) } } else { aM(); return } } aL = setTimeout(s, aK ? aA.initialDelay : aA.trackClickRepeatFreq); aK = false }, aM = function () { aL && clearTimeout(aL); aL = null; b(document).unbind("mouseup.jsp", aM) }; s(); b(document).bind("mouseup.jsp", aM); return false } }) } } function x() { if (H) { H.unbind("mousedown.jsp") } if (ar) { ar.unbind("mousedown.jsp") } } function ay() { b("html").unbind("dragstart.jsp selectstart.jsp mousemove.jsp mouseup.jsp mouseleave.jsp"); if (aw) { aw.removeClass("jspActive") } if (i) { i.removeClass("jspActive") } } function W(s, aK) { if (!aB) { return } if (s < 0) { s = 0 } else { if (s > j) { s = j } } if (aK === c) { aK = aA.animateScroll } if (aK) { R.animate(aw, "top", s, ae) } else { aw.css("top", s); ae(s) } } function ae(aK) { if (aK === c) { aK = aw.position().top } an.scrollTop(0); J = aK; var aN = J === 0, aL = J == j, aM = aK / j, s = -aM * (aa - w); if (ak != aN || aI != aL) { ak = aN; aI = aL; E.trigger("jsp-arrow-change", [ak, aI, Q, l]) } v(aN, aL); Z.css("top", s); E.trigger("jsp-scroll-y", [-s, aN, aL]).trigger("scroll") } function X(aK, s)
            {
                if (!aG) { return } if (aK < 0) { aK = 0 } else { if (aK > k) { aK = k } } if (s === c) { s = aA.animateScroll } if (s)
                {
                    R.animate(i, "left", aK, af)
                } else { i.css("left", aK); af(aK) } 
            } function af(aK) { if (aK === c) { aK = i.position().left } an.scrollTop(0); ab = aK; var aN = ab === 0, aM = ab == k, aL = aK / k, s = -aL * (U - al); if (Q != aN || l != aM) { Q = aN; l = aM; E.trigger("jsp-arrow-change", [ak, aI, Q, l]) } t(aN, aM); Z.css("left", s); E.trigger("jsp-scroll-x", [-s, aN, aM]).trigger("scroll") } function v(aK, s) { if (aA.showArrows) { at[aK ? "addClass" : "removeClass"]("jspDisabled"); ag[s ? "addClass" : "removeClass"]("jspDisabled") } } function t(aK, s) { if (aA.showArrows) { az[aK ? "addClass" : "removeClass"]("jspDisabled"); y[s ? "addClass" : "removeClass"]("jspDisabled") } } function N(s, aK) { var aL = s / (aa - w); W(aL * j, aK) } function O(aK, s) { var aL = aK / (U - al); X(aL * k, s) } function ac(aX, aS, aL) { var aP, aM, aN, s = 0, aW = 0, aK, aR, aQ, aU, aT, aV; try { aP = b(aX) } catch (aO) { return } aM = aP.outerHeight(); aN = aP.outerWidth(); an.scrollTop(0); an.scrollLeft(0); while (!aP.is(".jspPane")) { s += aP.position().top; aW += aP.position().left; aP = aP.offsetParent(); if (/^body|html$/i.test(aP[0].nodeName)) { return } } aK = aC(); aQ = aK + w; if (s < aK || aS) { aT = s - aA.verticalGutter } else { if (s + aM > aQ) { aT = s - w + aM + aA.verticalGutter } } if (aT) { N(aT, aL) } aR = aE(); aU = aR + al; if (aW < aR || aS) { aV = aW - aA.horizontalGutter } else { if (aW + aN > aU) { aV = aW - al + aN + aA.horizontalGutter } } if (aV) { O(aV, aL) } } function aE() { return -Z.position().left } function aC() { return -Z.position().top } function L() { var s = aa - w; return (s > 20) && (s - aC() < 10) } function C() { var s = U - al; return (s > 20) && (s - aE() < 10) } function ah() { an.unbind(ad).bind(ad, function (aN, aO, aM, aK) { var aL = ab, s = J; R.scrollBy(aM * aA.mouseWheelSpeed, -aK * aA.mouseWheelSpeed, false); return aL == ab && s == J }) } function o() { an.unbind(ad) } function aD() { return false } function K() { Z.find(":input,a").unbind("focus.jsp").bind("focus.jsp", function (s) { ac(s.target, false) }) } function F() { Z.find(":input,a").unbind("focus.jsp") } function T() { var s, aK, aM = []; aG && aM.push(ao[0]); aB && aM.push(V[0]); Z.focus(function () { E.focus() }); E.attr("tabindex", 0).unbind("keydown.jsp keypress.jsp").bind("keydown.jsp", function (aP) { if (aP.target !== this && !(aM.length && b(aP.target).closest(aM).length)) { return } var aO = ab, aN = J; switch (aP.keyCode) { case 40: case 38: case 34: case 32: case 33: case 39: case 37: s = aP.keyCode; aL(); break; case 35: N(aa - w); s = null; break; case 36: N(0); s = null; break } aK = aP.keyCode == s && aO != ab || aN != J; return !aK }).bind("keypress.jsp", function (aN) { if (aN.keyCode == s) { aL() } return !aK }); if (aA.hideFocus) { E.css("outline", "none"); if ("hideFocus" in an[0]) { E.attr("hideFocus", true) } } else { E.css("outline", ""); if ("hideFocus" in an[0]) { E.attr("hideFocus", false) } } function aL() { var aO = ab, aN = J; switch (s) { case 40: R.scrollByY(aA.keyboardSpeed, false); break; case 38: R.scrollByY(-aA.keyboardSpeed, false); break; case 34: case 32: R.scrollByY(w * aA.scrollPagePercent, false); break; case 33: R.scrollByY(-w * aA.scrollPagePercent, false); break; case 39: R.scrollByX(aA.keyboardSpeed, false); break; case 37: R.scrollByX(-aA.keyboardSpeed, false); break } aK = aO != ab || aN != J; return aK } } function S() { E.attr("tabindex", "-1").removeAttr("tabindex").unbind("keydown.jsp keypress.jsp") } function D() { if (location.hash && location.hash.length > 1) { var aL, aK; try { aL = b(location.hash) } catch (s) { return } if (aL.length && Z.find(location.hash)) { if (an.scrollTop() === 0) { aK = setInterval(function () { if (an.scrollTop() > 0) { ac(location.hash, true); b(document).scrollTop(an.position().top); clearInterval(aK) } }, 50) } else { ac(location.hash, true); b(document).scrollTop(an.position().top) } } } } function aj() { b("a.jspHijack").unbind("click.jsp-hijack").removeClass("jspHijack") } function n() { aj(); b("a[href^=#]").addClass("jspHijack").bind("click.jsp-hijack", function () { var s = this.href.split("#"), aK; if (s.length > 1) { aK = s[1]; if (aK.length > 0 && Z.find("#" + aK).length > 0) { ac("#" + aK, true); return false } } }) } function ap()
            {
                var aL, aK, aN, aM, aO, s = false; an.unbind("touchstart.jsp touchmove.jsp touchend.jsp click.jsp-touchclick").bind("touchstart.jsp", function (aP) { var aQ = aP.originalEvent.touches[0]; aL = aE(); aK = aC(); aN = aQ.pageX; aM = aQ.pageY; aO = false; s = true }).bind("touchmove.jsp", function (aS)
                {
                    if (!s) { return } var aR = aS.originalEvent.touches[0], aQ = ab, aP = J; R.scrollTo(aL + aN - aR.pageX, aK + aM - aR.pageY); aO = aO || Math.abs(aN - aR.pageX) > 5 || Math.abs(aM - aR.pageY) > 5;
                    return aQ == ab && aP == J
                }).bind("touchend.jsp", function (aP) { s = false }).bind("click.jsp-touchclick", function (aP) { if (aO) { aO = false; return false } })
            } function h() { var s = aC(), aK = aE(); E.removeClass("jspScrollable").unbind(".jsp"); E.replaceWith(aq.append(Z.children())); aq.scrollTop(s); aq.scrollLeft(aK) } b.extend(R, { reinitialise: function (aK) { aK = b.extend({}, aA, aK); au(aK) }, scrollToElement: function (aL, aK, s) { ac(aL, aK, s) }, scrollTo: function (aL, s, aK) { O(aL, aK); N(s, aK) }, scrollToX: function (aK, s) { O(aK, s) }, scrollToY: function (s, aK) { N(s, aK) }, scrollToPercentX: function (aK, s) { O(aK * (U - al), s) }, scrollToPercentY: function (aK, s) { N(aK * (aa - w), s) }, scrollBy: function (aK, s, aL) { R.scrollByX(aK, aL); R.scrollByY(s, aL) }, scrollByX: function (s, aL) { var aK = aE() + s, aM = aK / (U - al); X(aM * k, aL) }, scrollByY: function (s, aL) { var aK = aC() + s, aM = aK / (aa - w); W(aM * j, aL) }, positionDragX: function (s, aK) { X(s, aK) }, positionDragY: function (aK, s) { W(aK, s) }, animate: function (aK, aN, s, aM) { var aL = {}; aL[aN] = s; aK.animate(aL, { duration: aA.animateDuration, ease: aA.animateEase, queue: false, step: aM }) }, getContentPositionX: function () { return aE() }, getContentPositionY: function () { return aC() }, getContentWidth: function () { return U }, getContentHeight: function () { return aa }, getPercentScrolledX: function () { return aE() / (U - al) }, getPercentScrolledY: function () { return aC() / (aa - w) }, getIsScrollableH: function () { return aG }, getIsScrollableV: function () { return aB }, getContentPane: function () { return Z }, scrollToBottom: function (s) { W(j, s) }, hijackInternalLinks: function () { n() }, destroy: function () { h() } }); au(P)
        } f = b.extend({}, b.fn.jScrollPane.defaults, f); b.each(["mouseWheelSpeed", "arrowButtonSpeed", "trackClickSpeed", "keyboardSpeed"], function () { f[this] = f[this] || f.speed }); var e; this.each(function () { var g = b(this), h = g.data("jsp"); if (h) { h.reinitialise(f) } else { h = new d(g, f); g.data("jsp", h) } e = e ? e.add(g) : g }); return e
    }; b.fn.jScrollPane.defaults = { showArrows: false, maintainPosition: true, stickToBottom: false, stickToRight: false, clickOnTrack: true, autoReinitialise: false, autoReinitialiseDelay: 500, verticalDragMinHeight: 0, verticalDragMaxHeight: 99999, horizontalDragMinWidth: 0, horizontalDragMaxWidth: 99999, contentWidth: c, animateScroll: false, animateDuration: 300, animateEase: "linear", hijackInternalLinks: false, verticalGutter: 4, horizontalGutter: 4, mouseWheelSpeed: 0, arrowButtonSpeed: 0, arrowRepeatFreq: 50, arrowScrollOnHover: false, trackClickSpeed: 0, trackClickRepeatFreq: 70, verticalArrowPositions: "split", horizontalArrowPositions: "split", enableKeyboardNavigation: true, hideFocus: false, keyboardSpeed: 0, initialDelay: 300, speed: 30, scrollPagePercent: 0.8}
})(jQuery, this);
