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