/* Copyright (c) 2009 Kelvin Luck (kelvin AT kelvinluck DOT com || http://www.kelvinluck.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * 
 * See http://kelvinluck.com/assets/jquery/jScrollPane/
 * $Id: jScrollPane.js 87 2009-10-12 10:44:17Z kelvin.luck $
 */
(function(b){b.jScrollPane={active:[]};b.fn.jScrollPane=function(c){c=b.extend({},b.fn.jScrollPane.defaults,c);var n=function(){return false};return this.each(function(){var d=b(this),R=this,S=0,l,f,q,L=c.topCapHeight,g;if(b(this).parent().is(".jScrollPaneContainer")){g=b(this).parent();S=c.maintainPosition?d.position().top:0;var h=b(this).parent();l=h.innerWidth();f=h.outerHeight();b(">.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown, >.jScrollCap",h).remove();d.css({top:0})}else{d.data("originalStyleTag",
d.attr("style"));d.css("overflow","hidden");this.originalPadding=d.css("paddingTop")+" "+d.css("paddingRight")+" "+d.css("paddingBottom")+" "+d.css("paddingLeft");this.originalSidePaddingTotal=(parseInt(d.css("paddingLeft"))||0)+(parseInt(d.css("paddingRight"))||0);l=d.innerWidth();f=d.innerHeight();g=b("<div></div>").attr({className:"jScrollPaneContainer"}).css({height:f+"px",width:l+"px"});c.enableKeyboardNavigation&&g.attr("tabindex",c.tabIndex);d.wrap(g);g=d.parent();b(document).bind("emchange",
function(){d.jScrollPane(c)})}q=f;if(c.reinitialiseOnImageLoad){var v=b.data(R,"jScrollPaneImagesToLoad")||b("img",d),T=[];v.length&&v.each(function(a,e){b(this).bind("load readystatechange",function(){if(b.inArray(a,T)==-1){T.push(e);v=b.grep(v,function(k){return k!=e});b.data(R,"jScrollPaneImagesToLoad",v);var i=b.extend(c,{reinitialiseOnImageLoad:false});d.jScrollPane(i)}}).each(function(){if(this.complete||this.complete===undefined)this.src=this.src})})}h={height:"auto",width:l-c.scrollbarWidth-
c.scrollbarMargin-this.originalSidePaddingTotal+"px"};if(c.scrollbarOnLeft)h.paddingLeft=c.scrollbarMargin+c.scrollbarWidth+"px";else h.paddingRight=c.scrollbarMargin+"px";d.css(h);var w=d.outerHeight(),z=f/w;h=z<0.99;g[h?"addClass":"removeClass"]("jScrollPaneScrollable");if(h){g.append(b("<div></div>").addClass("jScrollCap jScrollCapTop").css({height:c.topCapHeight}),b("<div></div>").attr({className:"jScrollPaneTrack"}).css({width:c.scrollbarWidth+"px"}).append(b("<div></div>").attr({className:"jScrollPaneDrag"}).css({width:c.scrollbarWidth+
"px"}).append(b("<div></div>").attr({className:"jScrollPaneDragTop"}).css({width:c.scrollbarWidth+"px"}),b("<div></div>").attr({className:"jScrollPaneDragBottom"}).css({width:c.scrollbarWidth+"px"}))),b("<div></div>").addClass("jScrollCap jScrollCapBottom").css({height:c.bottomCapHeight}));l=b(">.jScrollPaneTrack",g);var A=b(">.jScrollPaneTrack .jScrollPaneDrag",g),x,r=[],s,t=function(){if(s>4||s%4==0)o(j+x*M);s++};c.enableKeyboardNavigation&&g.bind("keydown.jscrollpane",function(a){switch(a.keyCode){case 38:x=
-1;s=0;t();r[r.length]=setInterval(t,100);return false;case 40:x=1;s=0;t();r[r.length]=setInterval(t,100);return false;case 33:case 34:return false;default:}}).bind("keyup.jscrollpane",function(a){if(a.keyCode==38||a.keyCode==40){for(a=0;a<r.length;a++)clearInterval(r[a]);return false}});if(c.showArrows){var B,U,V=function(){b("html").unbind("mouseup",V);B.removeClass("jScrollActiveArrowButton");clearInterval(U)},W=function(){b("html").bind("mouseup",V);B.addClass("jScrollActiveArrowButton");s=0;
t();U=setInterval(t,100)};g.append(b("<a></a>").attr({href:"javascript:;",className:"jScrollArrowUp",tabindex:-1}).css({width:c.scrollbarWidth+"px",top:c.topCapHeight+"px"}).html("Scroll up").bind("mousedown",function(){B=b(this);x=-1;W();this.blur();return false}).bind("click",n),b("<a></a>").attr({href:"javascript:;",className:"jScrollArrowDown",tabindex:-1}).css({width:c.scrollbarWidth+"px",bottom:c.bottomCapHeight+"px"}).html("Scroll down").bind("mousedown",function(){B=b(this);x=1;W();this.blur();
return false}).bind("click",n));var C=b(">.jScrollArrowUp",g),N=b(">.jScrollArrowDown",g)}if(c.arrowSize){q=f-c.arrowSize-c.arrowSize;L+=c.arrowSize}else if(C){h=b.browser.opera?parseInt(C.css("height")):C.height();c.arrowSize=h;q=b.browser.opera?f-h-parseInt(N.css("height")):f-h-N.height();L+=h}q-=c.topCapHeight+c.bottomCapHeight;l.css({height:q+"px",top:L+"px"});var O=b(this).css({position:"absolute",overflow:"visible"}),y,p,M,j=0,D=z*f/2,E=function(a,e){var i=e=="X"?"Left":"Top";return a["page"+
e]||a["client"+e]+(document.documentElement["scroll"+i]||document.body["scroll"+i])||0},F=function(){return false},H=function(){G();y=A.offset(false);y.top-=j;p=q-A[0].offsetHeight;M=2*c.wheelSpeed*p/w},X=function(){b("html").unbind("mouseup",X).unbind("mousemove",Y);D=z*f/2;b.browser.msie&&b("html").unbind("dragstart",F).unbind("selectstart",F)},o=function(a){g.scrollTop(0);j=a=a<0?0:a>p?p:a;A.css({top:a+"px"});var e=a/p;d.data("jScrollPanePosition",(f-w)*-e);O.css({top:(f-w)*e+"px"});d.trigger("scroll");
if(c.showArrows){C[a==0?"addClass":"removeClass"]("disabled");N[a==p?"addClass":"removeClass"]("disabled")}},Y=function(a){if(b.browser.msie)if((new Date).getTime()/1E3-d.data("time")<0.025)return;d.data("time",(new Date).getTime()/1E3);o(E(a,"Y")-y.top-D)};A.css({height:Math.max(Math.min(z*(f-c.arrowSize*2),c.dragMaxHeight),c.dragMinHeight)+"px"}).bind("mousedown",function(a){H();D=E(a,"Y")-j-y.top;b("html").bind("mouseup",X).bind("mousemove",Y);b.browser.msie&&b("html").bind("dragstart",F).bind("selectstart",
F);return false});var Z,I,$,aa=function(){if(I>8||I%4==0)o(j-(j-$)/2);I++},ba=function(){clearInterval(Z);b("html").unbind("mouseup",ba).unbind("mousemove",P)},P=function(a){$=E(a,"Y")-y.top-D};l.bind("mousedown",function(a){H();P(a);I=0;b("html").bind("mouseup",ba).bind("mousemove",P);Z=setInterval(aa,100);aa();return false});g.bind("mousewheel",function(a,e){a.preventDefault();e=e||(a.wheelDelta?a.wheelDelta/120:a.detail?-a.detail/3:0);H();G();var i=j;o(j-e*M);return i==j});var J,Q,ca=function(){var a=
(J-j)/c.animateStep;if(a>1||a<-1)o(j+a);else{o(J);G()}},G=function(){if(Q){clearInterval(Q);delete J}},u=function(a,e){if(typeof a=="string"){try{$e=b(a,d)}catch(i){return}if(!$e.length)return;a=$e.offset().top-d.offset().top}G();var k=w-f;a=a>k?k:a;d.data("jScrollPaneMaxScroll",k);k=a/k*p;if(e||!c.animateTo)o(k);else{g.scrollTop(0);J=k;Q=setInterval(ca,c.animateInterval)}};d[0].scrollTo=u;d[0].scrollBy=function(a){var e=-parseInt(O.css("top"))||0;u(e+a)};H();u(-S,true);b("*",this).bind("focus",function(){for(var a=
b(this),e=0;a[0]!=d[0];){e+=a.position().top;a=a.offsetParent()}a=-parseInt(O.css("top"))||0;var i=a+f;if(!(e>a&&e<i)){i=e-c.scrollbarMargin;if(e>a)i+=b.browser.opera?parseInt(b(this).css("height"))+15+c.scrollbarMargin-f:b(this).height()+15+c.scrollbarMargin-f;u(i)}});if(c.observeHash){if(location.hash&&location.hash.length>1)setTimeout(function(){u(location.hash)},b.browser.safari?100:0);b(document).bind("click",function(a){$target=b(a.target);if($target.is("a")){var e=$target.attr("href");if(e&&
e.substr(0,1)=="#"&&e.length>1)setTimeout(function(){u(e,!c.animateToInternalLinks)},b.browser.safari?100:0)}})}var K,m,da=function(){direction=K<0?-1:1;d[0].scrollBy(K/2)},ea=function(a){var e=d.parent().offset().top,i=e+f;a=E(a,"Y");K=a<e?a-e:a>i?a-i:0;if(K==0){if(m){clearInterval(m);m=undefined}}else m||(m=setInterval(da,100))},fa=function(){b(document).unbind("mousemove.jScrollPaneDragging").unbind("mouseup.jScrollPaneDragging");if(m){clearInterval(m);m=undefined}};g.bind("mousedown.jScrollPane",
function(){b(document).bind("mousemove.jScrollPaneDragging",ea);b(document).bind("mouseup.jScrollPaneDragging",fa)});b.jScrollPane.active.push(d[0])}else{d.css({height:f+"px",width:l-this.originalSidePaddingTotal+"px",padding:this.originalPadding});d[0].scrollTo=d[0].scrollBy=function(){};d.parent().unbind("mousewheel").unbind("mousedown.jScrollPane").unbind("keydown.jscrollpane").unbind("keyup.jscrollpane")}})};b.fn.jScrollPaneRemove=function(){b(this).each(function(){$this=b(this);var c=$this.parent();
if(c.is(".jScrollPaneContainer")){$this.css({top:"",height:"",width:"",padding:"",overflow:"",position:""});$this.attr("style",$this.data("originalStyleTag"));c.after($this).remove()}})};b.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,tabIndex:0,enableKeyboardNavigation:true,animateToInternalLinks:false,
topCapHeight:0,bottomCapHeight:0,observeHash:true};b(window).bind("unload",function(){for(var c=b.jScrollPane.active,n=0;n<c.length;n++)c[n].scrollTo=c[n].scrollBy=null})})(jQuery);
