LNJS.__scrollbar=true;LNJS.Widget.Scrollbar=Class.create();LNJS.Widget.Scrollbar.prototype=({initialize:function(handle,track,options){this.__className="LNJS.Widget.Scrollbar";this.options={offsetX:1,offsetY:1,slideDuration:500}.extend(options||{});this.handle=$(handle);if(LNJS.isNull(this.handle))throw LNJS.Err("LNJS.Widget.Scrollbar requires a handle element! Could not find "+handle);this.track=$(track);if(LNJS.isNull(this.track))throw LNJS.Err("LNJS.Widget.Scrollbar requires a track element! Could not find "+track);this.container=$(this.options.container)||this.handle.parentNode;if(LNJS.isNull(this.container))throw LNJS.Err("LNJS.Widget.Scrollbar requires a container element!");this.inAction=false;this.axis=this.options.axis||'horizontal';this.handle.style.left=this.options.offsetX+"px";this.handle.style.top=this.options.offsetY+"px";this.track.handle=this.handle;this.getMinMax();this.HandleMouseDown=this.onHandleMouseDown.bindAsEventListener(this);this.HandleSelect=this.onHandleSelect.bindAsEventListener(this);this.TrackMouseDown=this.onTrackMouseDown.bindAsEventListener(this);this.eventMouseMove=this.onMouseMove.bindAsEventListener(this);this.eventMouseUp=this.onMouseUp.bindAsEventListener(this);Event.observe(this.handle,"mousedown",this.HandleMouseDown);if(navigator.appVersion.match(/MSIE/))Event.observe(this.handle,"selectstart",this.HandleSelect);Event.observe(this.track,"mousedown",this.TrackMouseDown);},isVertical:function(){return(this.axis=='vertical');},getMinMax:function(){if(this.isVertical()){this.handle.trkHt=this.track.offsetHeight;this.handle.maxY=this.handle.trkHt-this.handle.offsetHeight-this.options.offsetY;this.handle.maxX=this.options.offsetX;this.handle.minX=this.options.offsetX;this.handle.minY=this.options.offsetY;}else{this.handle.trkWd=this.track.offsetWidth;this.handle.maxX=this.handle.trkWd-this.handle.offsetWidth-this.options.offsetX;this.handle.minX=this.options.offsetX;this.handle.maxY=this.options.offsetY;this.handle.minY=this.options.offsetY;}},dispose:function(){Event.stopObserving(this.handle,"mousedown",this.HandleMouseDown);if(navigator.appVersion.match(/MSIE/))Event.stopObserving(this.handle,"selectstart",this.HandleSelect);Event.stopObserving(this.track,"mousedown",this.TrackMouseDown);Event.stopObserving(document,"mouseup",this.eventMouseUp);Event.stopObserving(document,"mousemove",this.eventMouseMove);},onTrackMouseDown:function(event){if(this.aniTimer)clearInterval(this.aniTimer);this.inAction=true;event.offX=(typeof event.layerX!="undefined")?event.layerX:event.offsetX;event.offY=(typeof event.layerY!="undefined")?event.layerY:event.offsetY;this.handle.startX=parseInt(this.handle.style.left);this.handle.startY=parseInt(this.handle.style.top);if(this.isVertical()){this.handle.destX=handle.startX;this.handle.destY=(event.offY<this.handle.startY)?event.offY:event.offY-this.handle.offsetHeight;this.handle.destY=Math.min(Math.max(this.handle.destY,this.handle.minY),this.handle.maxY);}else{this.handle.destX=(event.offX<this.handle.startX)?event.offX:event.offX-this.handle.offsetWidth;this.handle.destX=Math.min(Math.max(this.handle.destX,this.handle.minX),this.handle.maxX);this.handle.destY=this.handle.startY;}this.handle.distX=this.handle.destX-this.handle.startX;this.handle.distY=this.handle.destY-this.handle.startY;this.per=Math.PI/(2*this.options.slideDuration);this.slideStart=(new Date()).getTime();LNJS.Widget.Scrollables.notify('onSlideStart',this,event);this.aniTimer=setInterval((function(){this.SlideHandle(this);}).bind(this),10);},SlideHandle:function(event){if(!this.inAction){clearInterval(this.aniTimer);return;}var elapsed=(new Date()).getTime()-this.slideStart;if(elapsed<this.options.slideDuration){var x=this.handle.startX+this.handle.distX*Math.sin(this.per*elapsed);var y=this.handle.startY+this.handle.distY*Math.sin(this.per*elapsed);this.handle.style.left=x+"px";this.handle.style.top=y+"px";LNJS.Widget.Scrollables.notify('onSlide',this,event);if(this.__initialized&&this.options.onSlide)this.options.onSlide(this.value,this);}else{clearInterval(this.aniTimer);this.handle.style.left=this.handle.destX+"px";this.handle.style.top=this.handle.destY+"px";LNJS.Widget.Scrollables.notify('onSlideEnd',this,event);this.inAction=false;}},onHandleSelect:function(event){Event.stop(event);},onHandleMouseDown:function(event){if(this.aniTimer)clearInterval(this.aniTimer);this.inAction=true;this.handle.downX=event.clientX;this.handle.downY=event.clientY;this.handle.startX=parseInt(this.handle.style.left);this.handle.startY=parseInt(this.handle.style.top);LNJS.Widget.Scrollables.notify('onDragStart',this,event);Event.observe(document,"mouseup",this.eventMouseUp);Event.observe(document,"mousemove",this.eventMouseMove);Event.stop(event);},onMouseMove:function(event){if(!this.inAction)return;var nx=this.handle.startX+event.clientX-this.handle.downX;var ny=this.handle.startY+event.clientY-this.handle.downY;nx=Math.min(Math.max(this.handle.minX,nx),this.handle.maxX);ny=Math.min(Math.max(this.handle.minY,ny),this.handle.maxY);this.handle.style.left=nx+"px";this.handle.style.top=ny+"px";LNJS.Widget.Scrollables.notify('onDrag',this,event);},onMouseUp:function(event){Event.stopObserving(document,"mouseup",this.eventMouseUp);Event.stopObserving(document,"mousemove",this.eventMouseMove);if(!this.inAction)return;LNJS.Widget.Scrollables.notify('onDragEnd',this,event);this.inAction=false;}});
/* (c) LoopNet Scrollbar Version 1.0b */
LNJS.__scroll=true;LNJS.Widget.Scrollables=({__className:"LNJS.Widget.Scrollables",scrolls:{},observers:[],count:0,register:function(Scrollable){if(this.count==0){}Scrollable.id=this.count;this.scrolls[Scrollable.name]=Scrollable;this.count++;},unregister:function(Scrollable){this.scrolls[Scrollable.name]=null;this.count--;if(this.count==0){}},activate:function(scrollable){window.focus();this.activeScrollable=scrollable;},deactivate:function(scrollable){this.activeScrollable=null;},addObserver:function(observer){this.observers.push(observer);this._cacheObserverCallbacks();},removeObserver:function(element){this.observers=this.observers.reject(function(o){return o.element==element;});this._cacheObserverCallbacks();},notify:function(eventName,scrollable,event){if(this[eventName+'Count']>0)this.observers.each(function(o){if(o[eventName])o[eventName](eventName,scrollable,event);});},_cacheObserverCallbacks:function(){['onSlideStart','onSlide','onSlideEnd','onDragStart','onDrag','onDragEnd','onScrollStart','onScroll','onScrollEnd'].each(function(eventName){LNJS.Widget.Scrollables[eventName+'Count']=LNJS.Widget.Scrollables.observers.select(function(o){return o[eventName];}).length;});},dispose:function(){if(this.count==0)return;for(prop in this.scrolls){if(!LNJS.isNull(this.scrolls[prop].dispose))this.scrolls[prop].dispose();}}});LNJS.Widget.Scrollable=Class.create();LNJS.Widget.Scrollable.prototype=({initialize:function(name,container,content,options){this.__className="LNJS.Widget.Scrollable";this.name=name;this.ready=false;this.container=$(container);if(LNJS.isNull(this.container))throw LNJS.Err("LNJS.Widget.Scrollbar requires a container element! Could not find "+container);this.content=$(content);if(LNJS.isNull(this.content))throw LNJS.Err("LNJS.Widget.Scrollbar requires a content element! Could not find "+content);this.options=Object.extend({resizeOnChange:true,scrollWheel:10,speed:100,hideScrollbar:true,sizeScrollbar:true},options||{});this.Scrolling=false;this.x=0;this.y=0;LNJS.Widget.Scrollables.register(this);if(this.options.pagekeys){this.KeyDown=this.onKeyDown.bindAsEventListener(this);Event.observe(document,"keydown",this.KeyDown);}if(this.options.resizeOnChange){this.ReSize=this.onReSize.bindAsEventListener(this);Event.observe(window,"resize",this.ReSize);}this.load(this.content);if(this.options.hideScrollbar)this.checkScrollAreaSize();if(this.options.vbar)this.initScrollbar(this.options.vbar);if(this.options.hbar)this.initScrollbar(this.options.hbar);LNJS.Widget.Scrollables.addObserver(this);if(this.options.sizeScrollbar)this.setScrollbarSize();},getMinMax:function(){this.maxY=(this.content.offsetHeight-this.container.offsetHeight>0)?this.content.offsetHeight-this.container.offsetHeight:0;this.maxX=(this.content.offsetWidth-this.container.offsetWidth>0)?this.content.offsetWidth-this.container.offsetWidth:0;},dispose:function(){if(this.options.pagekeys)Event.stopObserving(document,"keydown",this.KeyDown);if(this.options.resizeOnChange)Event.stopObserving(window,"resize",this.ReSize);LNJS.Widget.Scrollables.unregister(this);},load:function(content){this.unload();content=$(content);this.getMinMax();this.content=content;this.MouseWheel=this.onMouseWheel.bindAsEventListener(this);if(window.addEventListener){Event.observe(this.content,"DOMMouseScroll",this.MouseWheel);}else{Event.observe(this.content,"mousewheel",this.MouseWheel);}this.content.style.visibility="visible";this.onLoad();this.ready=true;},unload:function(){if(!this.ready)return;this.content.style.visibility="hidden";if(window.addEventListener)Event.stopObserving(this.content,"DOMMouseScroll",this.MouseWheel);else Event.stopObserving(this.content,"mousewheel",this.MouseWheel);},checkScrollAreaSize:function(){if(this.options.vbar){if(this.content.offsetHeight>this.container.offsetHeight){this.options.vbar.container.style.visibility='visible';this.options.vbar.container.style.display='block';this.options.vbar.container.parentNode.style.width=this.options.vbar.container.style.width;}else{this.options.vbar.container.style.visibility='hidden';this.options.vbar.container.style.display='none';this.options.vbar.container.parentNode.style.width='0px';}}if(this.options.hbar){if(this.content.offsetWidth>this.container.offsetWidth){this.options.hbar.container.style.visibility='visible';this.options.hbar.container.style.display='block';}else{this.options.hbar.container.style.visibility='hidden';this.options.hbar.container.style.display='none';}}},initScrollbar:function(bar){bar.scrollable=this;},setScrollbarSize:function(){if(this.options.vbar){handle=this.options.vbar.handle;chk=(this.content.offsetHeight>this.container.offsetHeight)?handle.trkHt/(this.content.offsetHeight/this.container.offsetHeight):handle.trkHt-2*handle.minY;handle.style.height=(chk>=0)?chk:0+"px";handle.maxY=handle.trkHt-handle.offsetHeight-handle.minY;}if(this.options.hbar){handle=this.options.hbar.handle;chk=(this.table>this.container.offsetWidth)?handle.trkWd/(this.table/wn.offsetWidth):handle.trkWd-2*handle.minX;handle.style.width=(chk>=0)?chk:0+"px";handle.maxX=handle.trkWd-handle.offsetWidth-handle.minX;}},resetScrollbars:function(){if(this.options.vbar){handle=this.options.vbar.handle;handle.style.left=handle.minX+"px";handle.style.top=handle.minY+"px";}if(this.options.hbar){handle=this.options.hbar.handle;handle.style.left=handle.minX+"px";handle.style.top=handle.minY+"px";}},onLoad:function(){this.resetScrollbars();if(this.options.sizeScrollbar)this.setScrollbarSize();},onDrag:function(eventName,scrollbar,event){this.calcMove(eventName,scrollbar,event);},onSlide:function(eventName,scrollbar,event){this.calcMove(eventName,scrollbar,event);},onSlideEnd:function(eventName,scrollable){if(scrollable.options.onSlideEnd){scrollable.options.onSlideEnd(scrollable);}},calcMove:function(eventName,scrollbar,event){if(!scrollbar.handle)return;var nx,ny;if(scrollbar.isVertical()){nx=this.x;ny=-(parseInt(scrollbar.handle.style.top)-scrollbar.handle.minY)*(this.maxY/(scrollbar.handle.maxY-scrollbar.handle.minY))||0;}else{ny=this.y;nx=-(parseInt(scrollbar.handle.style.left)-scrollbar.handle.minX)*(this.maxX/(scrollbar.handle.maxX-scrollbar.handle.minX))||0;}this.shiftTo(nx,ny);},shiftTo:function(x,y){this.content.style.left=(this.x=x)+'px';this.content.style.top=(this.y=y)+'px';},onScroll:function(eventName,scrollbar,point){this.updateScrollbar(point.x,point.y);},onScrollEnd:function(eventName,scrollbar,point){this.updateScrollbar(point.x,point.y);},onMouseWheel:function(event){ny=this.y+((event.wheelDelta<=0||event.detail>=0)?-this.options.scrollWheel:+this.options.scrollWheel);if((ny+this.maxY+this.options.scrollWheel)>=0&&(ny+this.maxY-this.options.scrollWheel)<=this.maxY){ny=-Math.min(Math.max(-ny,0),this.maxY);this.shiftTo(this.x,ny);this.updateScrollbar(this.x,ny);Event.stop(event);}},onKeyDown:function(event){switch(event.keyCode){case 33:ny=this.y+this.container.offsetHeight;ny=-Math.min(Math.max(-ny,0),this.maxY);this.shiftTo(this.x,ny);this.updateScrollbar(this.x,ny);Event.stop(event);break;case 34:ny=this.y-this.container.offsetHeight;ny=-Math.min(Math.max(-ny,0),this.maxY);this.shiftTo(this.x,ny);this.updateScrollbar(this.x,ny);Event.stop(event);break;case 37:break;case 38:ny=this.y+(this.options.scrollWheel*3);ny=-Math.min(Math.max(-ny,0),this.maxY);this.shiftTo(this.x,ny);this.updateScrollbar(this.x,ny);Event.stop(event);break;case 39:break;case 40:ny=this.y-(this.options.scrollWheel*3);ny=-Math.min(Math.max(-ny,0),this.maxY);this.shiftTo(this.x,ny);this.updateScrollbar(this.x,ny);Event.stop(event);break;default:break;}},onReSize:function(event){this.updateSize();},updateSize:function(event){if(this.options.hideScrollbar)this.checkScrollAreaSize();if(this.options.vbar)this.options.vbar.getMinMax();if(this.options.hbar)this.options.hbar.getMinMax();this.getMinMax();if(this.options.sizeScrollbar)this.setScrollbarSize();this.updateScrollbar(this.x,this.y);},hideScrollbar:function(collapse){this.options.vbar.container.style.visibility='hidden';this.options.vbar.container.style.display='none';if(collapse)this.options.vbar.container.parentNode.style.width='0px';},showScrollbar:function(collapse){this.options.vbar.container.style.visibility='visible';this.options.vbar.container.style.display='block';if(collapse)this.options.vbar.container.parentNode.style.width=this.options.vbar.container.style.width;},updateScrollbar:function(x,y){var nx,ny;if(this.options.vbar){if(!this.maxY)return;ny=-(y*((this.options.vbar.handle.maxY-this.options.vbar.handle.minY)/this.maxY)-this.options.vbar.handle.minY);ny=Math.min(Math.max(ny,this.options.vbar.handle.minY),this.options.vbar.handle.maxY);nx=parseInt(this.options.vbar.handle.style.left);this.options.vbar.handle.style.left=nx+"px";this.options.vbar.handle.style.top=ny+"px";}if(this.options.hbar){if(!this.maxX)return;nx=-(x*((this.options.hbar.maxX-this.options.hbar.minX)/this.maxX)-this.options.hbar.minX);nx=Math.min(Math.max(nx,this.options.hbar.minX),this.options.hbar.maxX);ny=parseInt(this.options.hbar.style.top);this.options.hbar.style.left=nx+"px";this.options.hbar.style.top=ny+"px";}}});
LNJS.__scrollglide=true;LNJS.Widget.Scrollable.prototype.extend({slideDuration:500,slideTo:function(destX,destY){this.per=Math.PI/(2*this.slideDuration);this.sliding=true;this.slideStart=(new Date()).getTime();this.aniTimer=setInterval((function(){this.Slide(this);}).bind(this),10);LNJS.Widget.Scrollables.notify('onSlideStart',this);},Slide:function(event){var elapsed=(new Date()).getTime()-this.slideStart;if(elapsed<this.slideDuration){var x=this.startX+this.distX*Math.sin(this.per*elapsed);var y=this.startY+this.distY*Math.sin(this.per*elapsed);this.shiftTo(x,y);LNJS.Widget.Scrollables.notify('onSlide',this);}else{clearInterval(this.aniTimer);this.sliding=false;this.shiftTo(this.destX,this.destY);LNJS.Widget.Scrollables.notify('onSlideEnd',this);}},glideBy:function(dx,dy,dur){if(this.sliding)return;this.slideDuration=dur||this.slideDuration;this.destX=this.destY=this.distX=this.distY=0;this.startX=this.x;this.startY=this.y;if(dy<0)this.distY=(this.startY+dy>=-this.maxY)?dy:-(this.startY+this.maxY);else if(dy>0)this.distY=(this.startY+dy<=0)?dy:-this.startY;if(dx<0)this.distX=(this.startX+dx>=-this.maxX)?dx:-(this.startX+this.maxX);else if(dx>0)this.distX=(this.startX+dx<=0)?dx:-this.startX;this.destX=this.startX+this.distX;this.destY=this.startY+this.distY;this.slideTo(this.destX,this.destY);},glideTo:function(destX,destY,dur){if(this.sliding)return;this.slideDuration=dur||this.slideDuration;this.startX=this.x;this.startY=this.y;this.destX=-Math.max(Math.min(destX,this.maxX),0);this.destY=-Math.max(Math.min(destY,this.maxY),0);this.distY=this.destY-this.startY;this.distX=this.destX-this.startX;this.slideTo(this.destX,this.destY);},scrollBy:function(x,y,dur){this.glideBy(x,y,dur);},scrollTo:function(x,y,dur){this.glideTo(x,y,dur);}});
LNJS.__scrollhover=true;LNJS.Widget.Scrollable.prototype.extend({startScroll:function(deg,speed){var cosine,sine;if(typeof deg=="string"){switch(deg){case"up":deg=90;break;case"down":deg=270;break;case"left":deg=180;break;case"right":deg=0;break;default:LNJS.Trace.error("Direction of scroll in mouseover scroll links should be 'up', 'down', 'left', 'right' or number: 0 to 360.");break;}}deg=deg%360;if(deg%90==0){cosine=(deg==0)?-1:(deg==180)?1:0;sine=(deg==90)?1:(deg==270)?-1:0;}else{var angle=deg*Math.PI/180;cosine=-Math.cos(angle);sine=Math.sin(angle);}this.fx=cosine/(Math.abs(cosine)+Math.abs(sine));this.fy=sine/(Math.abs(cosine)+Math.abs(sine));this.endX=(deg==90||deg==270)?this.x:(deg<90||deg>270)?-this.maxX:0;this.endY=(deg==0||deg==180)?this.y:(deg<180)?0:-this.maxY;if(!this.ready)return;if(this.timerId)clearInterval(this.timerId);this.options.speed=speed||this.options.speed;this.lastTime=(new Date()).getTime();LNJS.Widget.Scrollables.notify('onScrollStart',this);this.timerId=setInterval((function(){this.scroll(this);}).bind(this),10);},scroll:function(event){var now=(new Date()).getTime();var d=(now-this.lastTime)/1000*this.options.speed;if(d>0){var x=this.x+this.fx*d;var y=this.y+this.fy*d;if(this.fx==0||this.fy==0){if((this.fx==-1&&x>-this.maxX)||(this.fx==1&&x<0)||(this.fy==-1&&y>-this.maxY)||(this.fy==1&&y<0)){this.lastTime=now;this.shiftTo(x,y);LNJS.Widget.Scrollables.notify('onScroll',this,{x:x,y:y});}else{clearInterval(this.timerId);this.timerId=0;this.shiftTo(this.endX,this.endY);LNJS.Widget.Scrollables.notify('onScrollEnd',this,{x:this.endX,y:this.endY});}}else{if((this.fx<0&&x>=-this.maxX&&this.fy<0&&y>=-this.maxY)||(this.fx>0&&x<=0&&this.fy>0&&y<=0)||(this.fx<0&&x>=-this.maxX&&this.fy>0&&y<=0)||(this.fx>0&&x<=0&&this.fy<0&&y>=-this.maxY)){this.lastTime=now;this.shiftTo(x,y);LNJS.Widget.Scrollables.notify('onScroll',this,{x:x,y:y});}else{clearInterval(this.timerId);this.timerId=0;LNJS.Widget.Scrollables.notify('onScrollEnd',this,{x:x,y:y});}}}},doubleSpeed:function(){this.options.speed*=2;},resetSpeed:function(){this.options.speed/=2;},stopScroll:function(){this.endScroll();},endScroll:function(){if(!this.ready)return;if(this.timerId)clearInterval(this.timerId);this.timerId=0;}});
