if(typeof (Prototype)=="undefined"){throw"Control.ScrollBar requires Prototype to be loaded."}if(typeof (Control.Slider)=="undefined"){throw"Control.ScrollBar requires Control.Slider to be loaded."}if(typeof (Object.Event)=="undefined"){throw"Control.ScrollBar requires Object.Event to be loaded."}Control.ScrollBar=Class.create({initialize:function(B,A,C){this.enabled=false;this.notificationTimeout=false;this.container=$(B);this.boundMouseWheelEvent=this.onMouseWheel.bindAsEventListener(this);this.boundResizeObserver=this.onWindowResize.bind(this);this.track=$(A);this.handle=this.track.firstDescendant();this.options=Object.extend({active_class_name:"scrolling",apply_active_class_name_to:this.container,notification_timeout_length:125,handle_minimum_height:25,scroll_to_smoothing:0.01,scroll_to_steps:15,proportional:true,slider_options:{}},C||{});this.slider=new Control.Slider(this.handle,this.track,Object.extend({axis:"vertical",onSlide:this.onChange.bind(this),onChange:this.onChange.bind(this)},this.options.slider_options));this.recalculateLayout();Event.observe(window,"resize",this.boundResizeObserver);this.handle.observe("mousedown",function(){if(this.auto_sliding_executer){this.auto_sliding_executer.stop()}}.bind(this))},destroy:function(){Event.stopObserving(window,"resize",this.boundResizeObserver)},enable:function(){this.enabled=true;this.container.observe("mouse:wheel",this.boundMouseWheelEvent);this.slider.setEnabled();this.track.show();if(this.options.active_class_name){$(this.options.apply_active_class_name_to).addClassName(this.options.active_class_name)}this.notify("enabled")},disable:function(){this.enabled=false;this.container.stopObserving("mouse:wheel",this.boundMouseWheelEvent);this.slider.setDisabled();this.track.hide();if(this.options.active_class_name){$(this.options.apply_active_class_name_to).removeClassName(this.options.active_class_name)}this.notify("disabled");this.reset()},reset:function(){this.slider.setValue(0)},recalculateLayout:function(){if(this.container.scrollHeight<=this.container.offsetHeight){this.disable()}else{if(this.options.proportional){this.handle.style.height=Math.max(this.container.offsetHeight*(this.container.offsetHeight/this.container.scrollHeight),this.options.handle_minimum_height)+"px";this.slider.handleLength=this.handle.style.height.replace(/px/,"")}this.enable();this.slider.trackLength=this.slider.maximumOffset()-this.slider.minimumOffset()}},onWindowResize:function(){this.recalculateLayout();this.scrollBy(0)},onMouseWheel:function(A){if(this.auto_sliding_executer){this.auto_sliding_executer.stop()}this.slider.setValueBy(-(A.memo.delta/20));A.stop();return false},onChange:function(A){this.container.scrollTop=Math.round(A/this.slider.maximum*(this.container.scrollHeight-this.container.offsetHeight));if(this.notification_timeout){window.clearTimeout(this.notificationTimeout)}this.notificationTimeout=window.setTimeout(function(){this.notify("change",A)}.bind(this),this.options.notification_timeout_length)},getCurrentMaximumDelta:function(){return this.slider.maximum*(this.container.scrollHeight-this.container.offsetHeight)},getDeltaToElement:function(A){return this.slider.maximum*((A.positionedOffset().top+(A.getHeight()/2))-(this.container.getHeight()/2))},scrollTo:function(F,A){var C=this.getCurrentMaximumDelta();if(F=="top"){F=0}else{if(F=="bottom"){F=C}else{if(typeof (F)!="number"){F=this.getDeltaToElement($(F))}}}if(this.enabled){F=Math.max(0,Math.min(F,C));if(this.auto_sliding_executer){this.auto_sliding_executer.stop()}var B=F/C;var E=this.slider.value;var D=(B-E)*C;if(A){this.auto_sliding_executer=new PeriodicalExecuter(function(){if(Math.round(this.slider.value*100)/100<Math.round(B*100)/100||Math.round(this.slider.value*100)/100>Math.round(B*100)/100){this.scrollBy(D/this.options.scroll_to_steps)}else{this.auto_sliding_executer.stop();this.auto_sliding_executer=null;if(typeof (A)=="function"){A()}}}.bind(this),this.options.scroll_to_smoothing)}else{this.scrollBy(D)}}else{if(typeof (A)=="function"){A()}}},scrollBy:function(A){if(!this.enabled){return false}this.slider.setValueBy(A/this.getCurrentMaximumDelta())}});Object.Event.extend(Control.ScrollBar)