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{this.enable();this.slider.trackLength=this.slider.maximumOffset()-this.slider.minimumOffset();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/,"")}}},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);
