var MooScroller=new Class({options:{knobSize:61,mode:"vertical",width:0,scrollSteps:10,wheel:true,scrollLinks:{forward:"scrollForward",back:"scrollBack"},onScroll:Class.empty,onPage:Class.empty},initialize:function(d,a,b){this.setOptions(b);this.horz=(this.options.mode=="horizontal");this.content=$(d).setStyle("overflow","hidden");this.knob=$(a);this.track=this.knob.getParent();this.setPositions();if(this.horz&&this.options.width){this.wrapper=new Element("div");this.content.getChildren().each(function(e){this.wrapper.adopt(e)});this.wrapper.injectInside(this.content).setStyle("width",this.options.width)}this.bound={start:this.start.bind(this),end:this.end.bind(this),drag:this.drag.bind(this),wheel:this.wheel.bind(this),page:this.page.bind(this)};this.position={};this.mouse={};this.update();this.attach();var c=function(){$clear(this.scrolling)}.bind(this);["forward","back"].each(function(e){var f=$(this.options.scrollLinks[e]);if(f){f.addEvents({mousedown:function(){this.scrolling=this[e].periodical(50,this)}.bind(this),mouseup:c.bind(this),click:c.bind(this)})}},this);this.knob.addEvent("click",c.bind(this));window.addEvent("domready",function(){try{$(document.body).addEvent("mouseup",c.bind(this))}catch(f){}}.bind(this))},setPositions:function(){[this.track,this.knob].each(function(a){if(a.getStyle("position")=="static"){a.setStyle("position","relative")}})},update:function(){var a=this.horz?"Width":"Height";this.contentSize=this.content["offset"+a];this.contentScrollSize=this.content["scroll"+a];this.trackSize=this.track["offset"+a];this.contentRatio=this.contentSize/this.contentScrollSize;this.knobSize=this.options.knobSize;this.scrollRatio=(this.contentScrollSize-this.contentSize)/(this.trackSize-this.knobSize);if((this.contentScrollSize*0.9)<this.trackSize){this.knob.setStyle("display","none")}else{this.knob.setStyle("display","block")}this.knob.setStyle(a.toLowerCase(),this.knobSize+"px");this.updateThumbFromContentScroll();this.updateContentFromThumbPosition()},updateContentFromThumbPosition:function(){this.content[this.horz?"scrollLeft":"scrollTop"]=this.position.now*this.scrollRatio},updateThumbFromContentScroll:function(){if(!this.position.now){this.position.now=0}this.knob.setStyle(this.horz?"left":"top",this.position.now+"px")},attach:function(){this.knob.addEvent("mousedown",this.bound.start);if(this.options.scrollSteps){this.content.addEvent("mousewheel",this.bound.wheel)}this.track.addEvent("mouseup",this.bound.page)},wheel:function(a){a=new Event(a);this.scroll(-(a.wheel*this.options.scrollSteps));this.updateThumbFromContentScroll();a.stop()},scroll:function(a){a=a||this.options.scrollSteps;this.content[this.horz?"scrollLeft":"scrollTop"]+=a;this.position.now=this.content[this.horz?"scrollLeft":"scrollTop"]/this.scrollRatio;this.updateThumbFromContentScroll()},forward:function(a){this.scroll(a)},back:function(a){a=a||this.options.scrollSteps;this.scroll(-a)},page:function(c){var b=this.horz?"x":"y",a;c=new Event(c);a=(c.page[b]>this.knob.getPosition()[b]);this.scroll((a?1:-1)*this.content["offset"+(this.horz?"Width":"Height")]);this.updateThumbFromContentScroll();this.fireEvent("onPage",a);c.stop()},start:function(b){b=new Event(b);var a=this.horz?"x":"y";this.mouse.start=b.page[a];this.position.start=this.knob.getStyle(this.horz?"left":"top").toInt();document.addEvent("mousemove",this.bound.drag);document.addEvent("mouseup",this.bound.end);this.knob.addEvent("mouseup",this.bound.end);b.stop()},end:function(a){a=new Event(a);document.removeEvent("mousemove",this.bound.drag);document.removeEvent("mouseup",this.bound.end);this.knob.removeEvent("mouseup",this.bound.end);a.stop()},drag:function(b){b=new Event(b);var a=this.horz?"x":"y";this.mouse.now=b.page[a];this.position.now=(this.position.start+(this.mouse.now-this.mouse.start)).limit(0,(this.trackSize-this.knobSize));this.updateContentFromThumbPosition();this.updateThumbFromContentScroll();b.stop()}});MooScroller.implement(new Events);MooScroller.implement(new Options);
