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