var ScrollBox=Class.create();ScrollBox.NO_ACTION=0;ScrollBox.PAGE_ACTION=1;ScrollBox.JUMP_ACTION=2;Object.extend(ScrollBox.prototype,{initialize:function(B,A){this.element=B;Element.addClassName(this.element,"scrollbox");this.opts={scroll_increment:30,hold_delay:500,hold_interval:100,drag_interval:100,update_check_interval:100,auto_hide:false,bar_action:ScrollBox.PAGE_ACTION};Object.extend(this.opts,A);this.content_div=document.createElement("div");Element.addClassName(this.content_div,"scrollbox_content");$A(this.element.childNodes).each(function(C){this.content_div.appendChild(C)}.bind(this));this.element.appendChild(this.content_div);this.content_div.style.overflow="hidden";this.content_div.style.height="100%";this.scrollbar=document.createElement("div");Element.addClassName(this.scrollbar,"scrollbox_scrollbar");this.element.appendChild(this.scrollbar);this.scrollbar.style.position="absolute";this.scrollbar.style.top="0";this.scrollbar.style.right="0";this.up_button=document.createElement("div");Element.addClassName(this.up_button,"scrollbox_up_button");this.up_button.style.position="absolute";this.up_button.style.width="100%";this.up_button.style.top="0";this.up_button.style.right="0";this.scrollbar.appendChild(this.up_button);this.down_button=document.createElement("div");Element.addClassName(this.down_button,"scrollbox_down_button");this.down_button.style.position="absolute";this.down_button.style.width="100%";this.down_button.style.bottom="0";this.down_button.style.right="0";this.scrollbar.appendChild(this.down_button);this.handle=document.createElement("div");Element.addClassName(this.handle,"scrollbox_handle");this.handle.style.position="absolute";this.handle.style.width="100%";this.handle.style.right="0";this.scrollbar.appendChild(this.handle);this.scroll_pos=0;this.setSizes();Event.observe(this.up_button,"mousedown",function(C){this.buttonDown(C,this.scrollUp.bind(this))}.bindAsEventListener(this));Event.observe(this.down_button,"mousedown",function(C){this.buttonDown(C,this.scrollDown.bind(this))}.bindAsEventListener(this));Event.observe(document,"mouseup",this.buttonUp.bindAsEventListener(this));Event.observe(document,"mousemove",this.setMousePos.bindAsEventListener(this));Event.observe(this.handle,"mousedown",this.handleDown.bindAsEventListener(this));this.handle_update_interval=setInterval(this.updateCheck.bind(this),this.opts.update_check_interval);Event.observe(this.up_button,"click",function(C){Event.stop(C)}.bindAsEventListener(this));Event.observe(this.down_button,"click",function(C){Event.stop(C)}.bindAsEventListener(this));Event.observe(this.handle,"click",function(C){Event.stop(C)}.bindAsEventListener(this));Event.observe(this.scrollbar,"click",this.scrollBarClick.bindAsEventListener(this));this.keyboard_events=[[document,"keypress",this.keyboardEvent.bindAsEventListener(this)]];Event.observe(this.element,"click",this.enableKeyboardEvents.bindAsEventListener(this));Event.observe(document,"click",this.disableKeyboardEvents.bindAsEventListener(this));Event.observe(this.content_div,"mousewheel",this.scrollWheel.bindAsEventListener(this),true);Event.observe(this.content_div,"DOMMouseScroll",this.scrollWheel.bindAsEventListener(this),true)},scrollDown:function(){if(this.scroll_pos<this.scroll_max){this.scrollTo(this.scroll_pos+this.opts.scroll_increment<this.scroll_max?this.scroll_pos+this.opts.scroll_increment:this.scroll_max);return true}else{return false}},scrollUp:function(){if(this.scroll_pos>0){this.scrollTo(this.scroll_pos>this.opts.scroll_increment?this.scroll_pos-this.opts.scroll_increment:0);return true}else{return false}},scrollTo:function(A){if(A<0){A=0}if(A>this.scroll_max){A=this.scroll_max}this.content_div.scrollTop=A;this.scroll_pos=A;this.updateHandle()},buttonDown:function(A,B){B();this.timeout=setTimeout(function(){B();this.timeout=null;if(this.interval){clearInterval(this.interval)}this.interval=setInterval(B,this.opts.hold_interval)}.bind(this),this.opts.hold_delay);Event.stop(A)},buttonUp:function(A){if(this.timeout){clearTimeout(this.timeout)}if(this.interval){clearInterval(this.interval)}this.timeout=null;this.interval=null;this.down_position=null},updateHandle:function(){if(this.scroll_max){this.handle_height=Math.floor(this.bar_height/this.scroll_height_ratio)}else{this.handle_height=this.bar_height}if(this.opts.auto_hide){if(this.handle_height==this.bar_height){this.scrollbar.style.visibility="hidden"}else{this.scrollbar.style.visibility=""}}var C=this.up_button.offsetHeight;var A=this.up_button.offsetHeight+(this.bar_height-this.handle_height);var B=A-C;if(this.scroll_max){this.handle_pos=C+Math.floor(B*(this.scroll_pos/this.scroll_max))}else{this.handle_pos=C}this.handle.style.height=this.handle_height+"px";this.handle.style.top=this.handle_pos+"px"},handleDown:function(){this.down_position=this.raw_mouse_pos-Position.cumulativeOffset(this.handle)[1];if(this.interval){clearInterval(this.interval)}this.interval=setInterval(function(){this.scrollTo(this.mouse_pos-(this.down_position*this.scroll_height_ratio))}.bindAsEventListener(this),this.opts.drag_interval)},setMousePos:function(A){if(document.all){tempY=event.clientY+document.body.scrollTop}else{tempY=A.pageY}if(tempY<0){tempY=0}this.raw_mouse_pos=tempY;this.mouse_pos=Math.floor((tempY-this.scrollbar_top)*this.scroll_height_ratio)},setSizes:function(){this.scroll_max=this.content_div.scrollHeight-this.content_div.offsetHeight;if(this.scroll_max<0){this.scroll_max=0}if(this.scroll_pos>this.scroll_max){this.scrollTo(this.scroll_max)}this.bar_height=this.scrollbar.offsetHeight-(this.up_button.offsetHeight+this.down_button.offsetHeight);if(!this.bar_height){setTimeout(this.setSizes.bind(this),100)}this.scroll_height_ratio=(this.content_div.scrollHeight/this.bar_height);this.scroll_height_ratio=this.scroll_height_ratio>=1?this.scroll_height_ratio:1;this.scrollbar_top=Position.cumulativeOffset(this.scrollbar)[1]+this.up_button.offsetHeight;this.scrollbar_bottom=this.scrollbar_top+this.bar_height;this.updateHandle()},scrollBarClick:function(A){switch(this.opts.bar_action){case ScrollBox.PAGE_ACTION:if(this.mouse_pos<this.handle_pos*this.scroll_height_ratio){this.pageUp()}else{this.pageDown()}break;case ScrollBox.JUMP_ACTION:this.scrollTo(this.mouse_pos);break}},pageUp:function(){this.scrollTo(this.scroll_pos-this.content_div.offsetHeight)},pageDown:function(){this.scrollTo(this.scroll_pos+this.content_div.offsetHeight)},scrollWheel:function(C){var B=Event.wheel(C);if(B>0){for(var A=0;A<Math.ceil(B);++A){this.scrollUp()}if(this.scroll_pos>0){Event.stop(C)}}else{if(B<0){for(var A=0;A>Math.floor(B);--A){this.scrollDown()}if(this.scroll_pos<this.scroll_max){Event.stop(C)}}}},updateCheck:function(){if(this.content_div.scrollTop!=this.scroll_pos){this.scrollTo(this.content_div.scrollTop)}if(this.scroll_max!=this.content_div.scrollHeight-this.content_div.offsetHeight){this.setSizes()}},enableKeyboardEvents:function(A){this.disableKeyboardEvents(A);this.keyboard_events.each(function(B){Event.observe(B[0],B[1],B[2])});this.within_enable_event=true},disableKeyboardEvents:function(A){if(!this.within_enable_event){this.keyboard_events.each(function(B){Event.stopObserving(B[0],B[1],B[2])})}else{this.within_enable_event=false}},keyboardEvent:function(A){switch(A.keyCode){case Event.KEY_HOME:this.scrollTo(0);break;case Event.KEY_END:this.scrollTo(this.scroll_max);break;case Event.KEY_PAGEUP:this.pageUp();break;case Event.KEY_PAGEDOWN:this.pageDown();break;case Event.KEY_UP:this.scrollUp();break;case Event.KEY_DOWN:this.scrollDown();break;default:return}Event.stop(A)}});Object.extend(Event,{wheel:function(A){var B=0;if(!A){A=window.event}if(A.wheelDelta){B=A.wheelDelta/120;if(window.opera){B=-B}}else{if(A.detail){B=-A.detail/3}}return B}});