/* Copyright (c) 2006 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$
 */
(function($){$.jScrollPane={active:[]};$.fn.jScrollPane=function(bn){bn=$.extend({},$.fn.jScrollPane.defaults,bn);var ba=function(){return false};return this.each(function(){var j=$(this);j.css('overflow','hidden');var k=this;if($(this).parent().is('.jScrollPaneContainer')){var l=bn.maintainPosition?j.position().top:0;var m=$(this).parent();var o=m.innerWidth();var q=m.outerHeight();var r=q;$('>.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown',m).remove();j.css({'top':0})}else{var l=0;this.originalPadding=j.css('paddingTop')+' '+j.css('paddingRight')+' '+j.css('paddingBottom')+' '+j.css('paddingLeft');this.originalSidePaddingTotal=(parseInt(j.css('paddingLeft'))||0)+(parseInt(j.css('paddingRight'))||0);var o=j.innerWidth();var q=j.innerHeight();var r=q;var s=$('<div></div>').attr({'className':'jScrollPaneContainer'}).css({'height':q+'px','width':o+'px'});if(bn.enableKeyboardNavigation){s.attr('tabindex',bn.tabIndex)}j.wrap(s);$(document).bind('emchange',function(e,a,b){j.jScrollPane(bn)})}if(bn.reinitialiseOnImageLoad){var t=$.data(k,'jScrollPaneImagesToLoad')||$('img',j);var u=[];if(t.length){t.each(function(i,b){$(this).bind('load readystatechange',function(){if($.inArray(i,u)==-1){u.push(b);t=$.grep(t,function(n,i){return n!=b});$.data(k,'jScrollPaneImagesToLoad',t);var a=$.extend(bn,{reinitialiseOnImageLoad:false});j.jScrollPane(a)}}).each(function(i,a){if(this.complete||this.complete===undefined){this.src=this.src}})})}}var p=this.originalSidePaddingTotal;var v=(o-bn.scrollbarWidth-bn.scrollbarMargin-p);var w={'height':'auto','width':v+'px'};if(bn.scrollbarOnLeft){w.paddingLeft=bn.scrollbarMargin+bn.scrollbarWidth+'px'}else{w.paddingRight=bn.scrollbarMargin+'px'}j.css(w);var x=j.outerHeight();var y=q/x;if(y<.99){var s=j.parent();s.append($('<div></div>').attr({'className':'jScrollPaneTrack'}).css({'width':bn.scrollbarWidth+'px'}).append($('<div></div>').attr({'className':'jScrollPaneDrag'}).css({'width':bn.scrollbarWidth+'px'}).append($('<div></div>').attr({'className':'jScrollPaneDragTop'}).css({'width':bn.scrollbarWidth+'px'}),$('<div></div>').attr({'className':'jScrollPaneDragBottom'}).css({'width':bn.scrollbarWidth+'px'}))));var z=$('>.jScrollPaneTrack',s);var A=$('>.jScrollPaneTrack .jScrollPaneDrag',s);var B;var C=[];var D;var E=function(){if(D>4||D%4==0){X(Q+B*P)}D++};if(bn.enableKeyboardNavigation){s.bind('keydown.jscrollpane',function(e){switch(e.keyCode){case 38:B=-1;D=0;E();C[C.length]=setInterval(E,100);return false;case 40:B=1;D=0;E();C[C.length]=setInterval(E,100);return false;case 33:case 34:return false;default:}}).bind('keyup.jscrollpane',function(e){if(e.keyCode==38||e.keyCode==40){for(var i=0;i<C.length;i++){clearInterval(C[i])}return false}})}if(bn.showArrows){var F;var G;var H=function(a){$('html').unbind('mouseup',H);F.removeClass('jScrollActiveArrowButton');clearInterval(G)};var I=function(){$('html').bind('mouseup',H);F.addClass('jScrollActiveArrowButton');D=0;E();G=setInterval(E,100)};s.append($('<a></a>').attr({'href':'javascript:;','className':'jScrollArrowUp','tabindex':-1}).css({'width':bn.scrollbarWidth+'px'}).html('Scroll up').bind('mousedown',function(){F=$(this);B=-1;I();this.blur();return false}).bind('click',ba),$('<a></a>').attr({'href':'javascript:;','className':'jScrollArrowDown','tabindex':-1}).css({'width':bn.scrollbarWidth+'px'}).html('Scroll down').bind('mousedown',function(){F=$(this);B=1;I();this.blur();return false}).bind('click',ba));var J=$('>.jScrollArrowUp',s);var K=$('>.jScrollArrowDown',s);if(bn.arrowSize){r=q-bn.arrowSize-bn.arrowSize;z.css({'height':r+'px',top:bn.arrowSize+'px'})}else{var L=J.height();bn.arrowSize=L;r=q-L-K.height();z.css({'height':r+'px',top:L+'px'})}}var M=$(this).css({'position':'absolute','overflow':'visible'});var N;var O;var P;var Q=0;var R=y*q/2;var S=function(a,c){var p=c=='X'?'Left':'Top';return a['page'+c]||(a['client'+c]+(document.documentElement['scroll'+p]||document.body['scroll'+p]))||0};var T=function(){return false};var U=function(){bk();N=A.offset(false);N.top-=Q;O=r-A[0].offsetHeight;P=2*bn.wheelSpeed*O/x};var V=function(a){U();R=S(a,'Y')-Q-N.top;$('html').bind('mouseup',W).bind('mousemove',Y);if($.browser.msie){$('html').bind('dragstart',T).bind('selectstart',T)}return false};var W=function(){$('html').unbind('mouseup',W).unbind('mousemove',Y);R=y*q/2;if($.browser.msie){$('html').unbind('dragstart',T).unbind('selectstart',T)}};var X=function(a){a=a<0?0:(a>O?O:a);Q=a;A.css({'top':a+'px'});var p=a/O;j.data('jScrollPanePosition',(q-x)*-p);M.css({'top':((q-x)*p)+'px'});j.trigger('scroll');if(bn.showArrows){J[a==0?'addClass':'removeClass']('disabled');K[a==O?'addClass':'removeClass']('disabled')}};var Y=function(e){X(S(e,'Y')-N.top-R)};var Z=Math.max(Math.min(y*(q-bn.arrowSize*2),bn.dragMaxHeight),bn.dragMinHeight);A.css({'height':Z+'px'}).bind('mousedown',V);var bb;var bc;var bd;var be=function(){if(bc>8||bc%4==0){X((Q-((Q-bd)/2)))}bc++};var bf=function(){clearInterval(bb);$('html').unbind('mouseup',bf).unbind('mousemove',bg)};var bg=function(a){bd=S(a,'Y')-N.top-R};var bh=function(a){U();bg(a);bc=0;$('html').bind('mouseup',bf).bind('mousemove',bg);bb=setInterval(be,100);be();return false};z.bind('mousedown',bh);s.bind('mousewheel',function(a,b){b=b||(a.wheelDelta?a.wheelDelta/120:(a.detail)?-a.detail/3:0);U();bk();var d=Q;X(Q-b*P);var c=d!=Q;return!c});var bi;var bj;function animateToPosition(){var a=(bi-Q)/bn.animateStep;if(a>1||a<-1){X(Q+a)}else{X(bi);bk()}}var bk=function(){if(bj){clearInterval(bj);delete bi}};var bl=function(a,b){if(typeof a=="string"){$e=$(a,j);if(!$e.length)return;a=$e.offset().top-j.offset().top}s.scrollTop(0);bk();var c=x-q;a=a>c?c:a;j.data('jScrollPaneMaxScroll',c);var d=a/c*O;if(b||!bn.animateTo){X(d)}else{bi=d;bj=setInterval(animateToPosition,bn.animateInterval)}};j[0].scrollTo=bl;j[0].scrollBy=function(a){var b=-parseInt(M.css('top'))||0;bl(b+a)};U();bl(-l,true);$('*',this).bind('focus',function(a){var b=$(this);var c=0;while(b[0]!=j[0]){c+=b.position().top;b=b.offsetParent()}var d=(-parseInt(M.css('top'))||0);var e=d+q;var f=((c>d)&&(c<e));if(!f){var g=(c-bn.scrollbarMargin);if(c>d){g+=$(this).height()+15+bn.scrollbarMargin-q}bl(g)}});if(location.hash){setTimeout(function(){bl(location.hash)},$.browser.safari?100:0)}$(document).bind('click',function(e){$target=$(e.target);if($target.is('a')){var h=$target.attr('href');if(h&&h.substr(0,1)=='#'&&h.length>1){setTimeout(function(){bl(h,!bn.animateToInternalLinks)},$.browser.safari?100:0)}}});function onSelectScrollMouseDown(e){$(document).bind('mousemove.jScrollPaneDragging',onTextSelectionScrollMouseMove);$(document).bind('mouseup.jScrollPaneDragging',onSelectScrollMouseUp)}var bm;var bo;function onTextSelectionInterval(){direction=bm<0?-1:1;j[0].scrollBy(bm/2)}function clearTextSelectionInterval(){if(bo){clearInterval(bo);bo=undefined}}function onTextSelectionScrollMouseMove(e){var a=j.parent().offset().top;var b=a+q;var c=S(e,'Y');bm=c<a?c-a:(c>b?c-b:0);if(bm==0){clearTextSelectionInterval()}else{if(!bo){bo=setInterval(onTextSelectionInterval,100)}}}function onSelectScrollMouseUp(e){$(document).unbind('mousemove.jScrollPaneDragging').unbind('mouseup.jScrollPaneDragging');clearTextSelectionInterval()}s.bind('mousedown.jScrollPane',onSelectScrollMouseDown);$.jScrollPane.active.push(j[0])}else{j.css({'height':q+'px','width':o-this.originalSidePaddingTotal+'px','padding':this.originalPadding});j[0].scrollTo=j[0].scrollBy=function(){};j.parent().unbind('mousewheel').unbind('mousedown.jScrollPane').unbind('keydown.jscrollpane').unbind('keyup.jscrollpane')}})};$.fn.jScrollPaneRemove=function(){$(this).each(function(){$this=$(this);var a=$this.parent();if(a.is('.jScrollPaneContainer')){$this.css({'top':'','height':'','width':'','padding':'','overflow':'','position':''});a.after($this).remove()}})};$.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};$(window).bind('unload',function(){var a=$.jScrollPane.active;for(var i=0;i<a.length;i++){a[i].scrollTo=a[i].scrollBy=null}})})(jQuery);