/*
    Scrolling Divs code from Dynamic Web Coding at dyn-web.com
    Copyright 2001-2011 by Sharon Paine 
    See Terms of Use at www.dyn-web.com/business/terms.php
    This notice must be retained in the code as is!
    
    For demos, documentation and updates, visit http://www.dyn-web.com/code/scroll/
    version date: Nov 2011 (adds touch and keyboard support and more...)
*/

/*
Resources:
  detecting if touch device: http://modernizr.github.com/Modernizr/touch.html
  mousewheel code: http://adomas.org/javascript-mouse-wheel/
  switchKeyEvents (keypress/keydown): http://www.quirksmode.org/js/dragdrop.html
  addEvent for custom scroll events: Mark Wubben (see http://simonwillison.net/2004/May/26/addLoadEvent/)
  dw_Util.getCurrentStyle: jquery and dean edwards (http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291)
*/

// all files in one, compressed, with licensing alert

// arguments: id of scroll area div, id of content div
// don't need horizId. (keeping for updaters)
function dw_scrollObj(wnId, lyrId, horizId) {
    this.id = wnId; 
    dw_scrollObj.col[this.id] = this;
    dw_scrollObj.ids[ dw_scrollObj.ids.length ] = this.id;
    this.load(lyrId, horizId);
    dw_scrollObj.setupMouseWheel(wnId);
    dw_scrollObj.setupDrag(wnId, lyrId);
    dw_scrollObj.setupKeyboardScroll(wnId);
    
    // for tabbing among elements inside scroll area (div onscroll event)
    // 3rd arg to .handleOnScroll is duration (200 when user tabs, 0 onload)
    dw_Event.add( document.getElementById(wnId), 'scroll', function(e){ dw_scrollObj.handleOnScroll(e, wnId, 200); } );
    // invoke here in case onscroll triggered before page loaded (e.g., link clicked with target in scroll area)
    dw_scrollObj.handleOnScroll(null, wnId, 0);
};
 
dw_scrollObj.scrollOnMousewheel = true;
dw_scrollObj.enableKeyboardScroll = true;
// if want to support drag only for touch devices set false here
dw_scrollObj.scrollOnDrag = false; // default is false - flag applies only if not touch device
 
dw_scrollObj.defaultSpeed = dw_scrollObj.prototype.speed = 100; // default for mouseover or mousedown scrolling
dw_scrollObj.defaultSlideDur = dw_scrollObj.prototype.slideDur = 500; // default duration of glide onclick
 
// different speeds for vertical and horizontal
dw_scrollObj.mousewheelSpeed = 20;
dw_scrollObj.mousewheelHorizSpeed = 60;
 
var dw_Event={add:function(obj,etype,fp,cap){cap=cap||false;if(obj.addEventListener)obj.addEventListener(etype,fp,cap);else if(obj.attachEvent)obj.attachEvent("on"+etype,fp);},remove:function(obj,etype,fp,cap){cap=cap||false;if(obj.removeEventListener)obj.removeEventListener(etype,fp,cap);else if(obj.detachEvent)obj.detachEvent("on"+etype,fp);},DOMit:function(e){e=e?e:window.event;if(!e.target)e.target=e.srcElement;if(!e.preventDefault)e.preventDefault=function(){e.returnValue=false;return false;};if(!e.stopPropagation)e.stopPropagation=function(){e.cancelBubble=true;};return e;},getTarget:function(e){e=dw_Event.DOMit(e);var tgt=e.target;if(tgt.nodeType!=1)tgt=tgt.parentNode;return tgt;}};
var dw_Util;if(!dw_Util)dw_Util={};dw_Util.inArray=function(val,ar){for(var i=0;ar[i];i++){if(ar[i]==val){return true;}}return false;};dw_Util.addElement=function(tag,id,cls,atts){var el=document.createElement(tag);if(id){el.id=id;}if(cls){el.className=cls;}for(var i in atts){el.setAttribute(i,atts[i]);}return el;};dw_Util.isTouchDevice=function(){try{document.createEvent("TouchEvent");return true;}catch(e){return false;}};dw_Util.getMouseWheelDelta=function(e){var delta=0;if(!e)e=window.event;if(e.wheelDelta){delta=e.wheelDelta/120;}else if(e.detail){delta=-e.detail/3;}return delta;};dw_Util.getOptBool=function(val){val=(val===undefined)?true:(typeof val=='boolean')?val:true;return val;};dw_Util.writeStyleSheet=function(file,bScreenOnly){var css='<link rel="stylesheet" type="text/css" href="'+file;var media=(dw_Util.getOptBool(bScreenOnly))?'" media="screen"':'"';document.write(css+media+' />');};dw_writeStyleSheet=dw_Util.writeStyleSheet;dw_Util.addLinkCSS=function(file,bScreenOnly){if(!document.createElement)return;var el=document.createElement("link");el.setAttribute("rel","stylesheet");el.setAttribute("type","text/css");if(dw_Util.getOptBool(bScreenOnly)){el.setAttribute("media","screen");}el.setAttribute("href",file);document.getElementsByTagName('head')[0].appendChild(el);};dw_Util.contained=function(oNode,oCont){if(!oNode)return null;while((oNode=oNode.parentNode))if(oNode==oCont)return true;return false;};dw_Util.getLayerOffsets=function(el,oCont){var left=0,top=0;if(dw_Util.contained(el,oCont)){do{left+=el.offsetLeft;top+=el.offsetTop;}while(((el=el.offsetParent)!=oCont));}return{x:left,y:top};};dw_Util.get_DelimitedClassList=function(cls){var ar=[],ctr=0;if(cls.indexOf('_')!=-1){var whitespace=/\s+/;if(!whitespace.test(cls)){ar[0]=cls;}else{var classes=cls.split(whitespace);for(var i=0;classes[i];i++){if(classes[i].indexOf('_')!=-1){ar[ctr++]=classes[i];}}}}return ar;};dw_Util.getValueFromQueryString=function(name,obj){obj=obj?obj:window.location;if(obj.search&&obj.search.indexOf(name!=-1)){var pairs=obj.search.slice(1).split("&");var set;for(var i=0;pairs[i];i++){set=pairs[i].split("=");if(set[0]==name&&set[1]){return set[1];}}}return '';};dw_Util.getCurrentStyle=function(el,prop){var val='';if(document.defaultView&&document.defaultView.getComputedStyle){val=document.defaultView.getComputedStyle(el,null)[prop];}else if(el.currentStyle){val=el.currentStyle[prop];if(!/^\d+(px)?$/i.test(val)&&/^\d/.test(val)){var style=el.style.left;var runtimeStyle=el.runtimeStyle.left;el.runtimeStyle.left=el.currentStyle.left;el.style.left=val||0;val=el.style.pixelLeft+"px";el.style.left=style;el.runtimeStyle.left=runtimeStyle;}}return val;};
dw_scrollObj.isSupported=function(){return!!(document.getElementById&&document.getElementsByTagName&&document.createElement&&document.createDocumentFragment&&(document.addEventListener||document.attachEvent));};dw_scrollObj.col={};dw_scrollObj.ids=[];dw_scrollObj.prototype.on_load=function(){};dw_scrollObj.prototype.on_scroll=function(){};dw_scrollObj.prototype.on_scroll_start=function(){};dw_scrollObj.prototype.on_scroll_stop=function(){};dw_scrollObj.prototype.on_scroll_end=function(){};dw_scrollObj.prototype.on_update=function(){};dw_scrollObj.prototype.load=function(lyrId,horizId){var wndo,lyr;if(this.lyrId){dw_scrollObj.unsetDrag(this.id,this.lyrId);lyr=document.getElementById(this.lyrId);lyr.style.visibility="hidden";}if(!dw_scrollObj.scrdy)return;this.lyr=lyr=document.getElementById(lyrId);this.lyr.style.position='absolute';this.lyrId=lyrId;this.horizId=horizId||null;wndo=document.getElementById(this.id);this.y=0;this.x=0;this.shiftTo(0,0);this.getDims();dw_scrollObj.setupDrag(this.id,lyrId);lyr.style.visibility="visible";this.ready=true;this.on_load();};dw_scrollObj.prototype.shiftTo=function(x,y){if(this.lyr&&!isNaN(x)&&!isNaN(y)){this.x=x;this.y=y;this.lyr.style.left=Math.round(x)+"px";this.lyr.style.top=Math.round(y)+"px";}};dw_scrollObj.prototype.getX=function(){return this.x;};dw_scrollObj.prototype.getY=function(){return this.y;};dw_scrollObj.prototype.getDims=function(){var wndo=document.getElementById(this.id);var lyr=document.getElementById(this.lyrId);this.lyrWd=this.horizId?document.getElementById(this.horizId).offsetWidth:lyr.offsetWidth;this.lyrHt=lyr.offsetHeight;this.wnWd=wndo.offsetWidth;this.wnHt=wndo.offsetHeight;var w=this.lyrWd-this.wnWd;var h=this.lyrHt-this.wnHt;this.maxX=(w>0)?w:0;this.maxY=(h>0)?h:0;};dw_scrollObj.prototype.updateDims=function(){this.getDims();this.on_update();};dw_scrollObj.refreshAll=function(){var wndo;for(var i=dw_scrollObj.ids.length;i--;){wndo=dw_scrollObj.col[dw_scrollObj.ids[i]];wndo.updateDims();}};dw_scrollObj.prototype.clearTimer=function(){clearInterval(this.timerId);this.timerId=0;};dw_scrollObj.prototype.initScrollVals=function(deg,speed){if(!this.ready)return;this.clearTimer();this.speed=speed||dw_scrollObj.defaultSpeed;this.fx=(deg==0)?-1:(deg==180)?1:0;this.fy=(deg==90)?1:(deg==270)?-1:0;this.endX=(deg==90||deg==270)?this.x:(deg==0)?-this.maxX:0;this.endY=(deg==0||deg==180)?this.y:(deg==90)?0:-this.maxY;this.lyr=document.getElementById(this.lyrId);this.lastTime=new Date().getTime();this.on_scroll_start(this.x,this.y);var self=this;self.timerId=setInterval(function(){self.scroll();},10);};dw_scrollObj.prototype.scroll=function(){var now=new Date().getTime();var d=(now-this.lastTime)/1000*this.speed;if(d>0){var x=this.x+(this.fx*d);var y=this.y+(this.fy*d);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);this.on_scroll(x,y);}else{this.clearTimer();this.shiftTo(this.endX,this.endY);this.on_scroll(this.endX,this.endY);this.on_scroll_end(this.endX,this.endY);}}};dw_scrollObj.prototype.ceaseScroll=function(){if(!this.ready)return;this.clearTimer();this.on_scroll_stop(this.x,this.y);};dw_scrollObj.prototype.initScrollByVals=function(dx,dy,dur){if(!this.ready||this.sliding)return;this.startX=this.x;this.startY=this.y;this.destX=this.destY=this.distX=this.distY=0;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.glideScrollPrep(this.destX,this.destY,dur);};dw_scrollObj.prototype.initScrollToVals=function(destX,destY,dur){if(!this.ready||this.sliding)return;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;if(dur==0){this.on_scroll_start(this.startX,this.startY);this._jumpTo(this.destX,this.destY);}else{this.glideScrollPrep(this.destX,this.destY,dur);}};dw_scrollObj.prototype._jumpTo=function(x,y){this.shiftTo(x,y);this.on_scroll(x,y);};dw_scrollObj.prototype.glideScrollPrep=function(destX,destY,dur){this.slideDur=(typeof dur=='number')?dur:dw_scrollObj.defaultSlideDur;this.per=Math.PI/(2*this.slideDur);this.sliding=true;this.lyr=document.getElementById(this.lyrId);this.startTime=new Date().getTime();var self=this;self.timerId=setInterval(function(){self.doGlideScroll();},10);this.on_scroll_start(this.startX,this.startY);};dw_scrollObj.prototype.doGlideScroll=function(){var elapsed=new Date().getTime()-this.startTime;if(elapsed<this.slideDur){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);this.on_scroll(x,y);}else{this.clearTimer();this.sliding=false;this.shiftTo(this.destX,this.destY);this.on_scroll(this.destX,this.destY);this.on_scroll_stop(this.destX,this.destY);if(this.distX&&(this.destX==0||this.destX==-this.maxX)||this.distY&&(this.destY= … 
function dw_Slidebar(barId,trackId,axis,x,y){var bar=document.getElementById(barId);var track=document.getElementById(trackId);var isTouchDevice=dw_Util.isTouchDevice();this.barId=barId;this.trackId=trackId;this.axis=axis;dw_Slidebar.col[this.barId]=this;dw_Slidebar.ids[dw_Slidebar.ids.length]=this.barId;this.bar=bar;var lft=parseInt(dw_Util.getCurrentStyle(bar,'left'));lft=!isNaN(lft)?lft:0;var tp=parseInt(dw_Util.getCurrentStyle(bar,'top'));tp=!isNaN(tp)?tp:0;this.x=lft;this.y=tp;this.shiftTo(this.x,this.y);this.barWd=bar.offsetWidth;this.barHt=bar.offsetHeight;if(axis=='v'){this.maxY=track.offsetHeight-this.barHt-this.y;this.minY=this.y;this.maxX=this.x;this.minX=this.x;}else{this.maxX=track.offsetWidth-this.barWd-this.x;this.minX=this.x;this.maxY=this.y;this.minY=this.y;}this.on_drag_start=this.on_drag=this.on_drag_end=this.on_slide_start=this.on_slide=this.on_slide_end=function(){};if(!isTouchDevice){dw_Event.add(bar,'mousedown',function(e){dw_Slidebar.prepDrag(e,barId);});}else{dw_Event.add(bar,'touchstart',function(e){dw_Slidebar.prepDrag(e,barId);});dw_Event.add(bar,'gesturestart',function(e){dw_Slidebar.gestureFlag=true;});dw_Event.add(bar,'gesturechange',function(e){dw_Slidebar.gestureFlag=true;});dw_Event.add(track,'gesturestart',function(e){dw_Slidebar.gestureFlag=true;});dw_Event.add(bar,'gestureend',function(e){dw_Slidebar.gestureFlag=false;});dw_Event.add(track,'gestureend',function(e){dw_Slidebar.gestureFlag=false;});}dw_Event.add(track,'mousedown',function(e){dw_Slidebar.prepSlide(e,barId);});if(dw_Slidebar.scrollOnMousewheel){if(bar.addEventListener){bar.addEventListener('DOMMouseScroll',function(e){dw_Slidebar.doOnMouseWheel(e,barId);},false);track.addEventListener('DOMMouseScroll',function(e){dw_Slidebar.doOnMouseWheel(e,barId);},false);}bar.onmousewheel=track.onmousewheel=function(e){dw_Slidebar.doOnMouseWheel(e,barId);};}this.bar=bar=null;track=null;};dw_Slidebar.prototype.slideDur=500;dw_Slidebar.scrollOnMousewheel=true;dw_Slidebar.mousewheelSpeed=5;dw_Slidebar.mousewheelHorizSpeed=10;dw_Slidebar.col={};dw_Slidebar.ids=[];dw_Slidebar.current=null;dw_Slidebar.prepSlide=function(e,barId){var _this=dw_Slidebar.col[barId];dw_Slidebar.current=_this;var bar=_this.bar=document.getElementById(barId);_this.clearTimer();e=e?e:window.event;e.offX=(typeof e.offsetX=="number")?e.offsetX:e.layerX;e.offY=(typeof e.offsetY=="number")?e.offsetY:e.layerY;_this.startX=parseInt(bar.style.left);_this.startY=parseInt(bar.style.top);if(_this.axis=="v"){_this.destX=_this.startX;_this.destY=(e.offY<_this.startY)?e.offY:e.offY-_this.barHt;_this.destY=Math.min(Math.max(_this.destY,_this.minY),_this.maxY);}else{_this.destX=(e.offX<_this.startX)?e.offX:e.offX-_this.barWd;_this.destX=Math.min(Math.max(_this.destX,_this.minX),_this.maxX);_this.destY=_this.startY;}_this.distX=_this.destX-_this.startX;_this.distY=_this.destY-_this.startY;_this.per=Math.PI/(2*_this.slideDur);_this.slideStartTime=new Date().getTime();_this.on_slide_start(_this.startX,_this.startY);_this.timer=setInterval(dw_Slidebar.doSlide,10);};dw_Slidebar.doSlide=function(){var _this=dw_Slidebar.current;var elapsed=new Date().getTime()-_this.slideStartTime;if(elapsed<_this.slideDur){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);_this.on_slide(x,y);}else{_this.clearTimer();_this.shiftTo(_this.destX,_this.destY);_this.on_slide(_this.destX,_this.destY);_this.on_slide_end(_this.destX,_this.destY);dw_Slidebar.current=null;}};dw_Slidebar.prepDrag=function(e,barId){var bar=document.getElementById(barId);var _this=dw_Slidebar.col[barId];var isTouchDevice=dw_Util.isTouchDevice();dw_Slidebar.current=_this;_this.bar=bar;_this.clearTimer();e=dw_Event.DOMit(e);var o=e.changedTouches?e.changedTouches[0]:e;_this.downX=o.clientX;_this.downY=o.clientY;_this.startX=parseInt(bar.style.left);_this.startY=parseInt(bar.style.top);if(_this.axis=='v'){_this.maxdLeft=true;_this.maxdRight=true;_this.maxdUp=(_this.startY==_this.minY)?true:(_this.startY==_this.maxY)?false:false;_this.maxdDown=(_this.startY==_this.minY)?false:(_this.startY==_this.maxY)?true:false;}else{_this.maxdLeft=(_this.startX==_this.minX)?true:(_this.startX==_this.maxX)?false:false;_this.maxdRight=(_this.startX==_this.minX)?false:(_this.startX==_this.maxX)?true:false;_this.maxdUp=true;_this.maxdDown=true;}dw_Slidebar.dragMaxChecked=false;_this.on_drag_start(_this.startX,_this.startY);if(!isTouchDevice){dw_Event.add(document,"mousemove",dw_Slidebar.doDrag,true);dw_Event.add(document,"mouseup",dw_Slidebar.endDrag,true);}else if(e.touches.length==1){dw_Event.add(bar,"touchmove",dw_Slidebar.doDrag,true);dw_Event.add(bar,"touchend",dw_Slidebar.endDrag,true);}e.preventDefault();e.stopPropagation();};dw_Slidebar.checkDragMaxd=function(x,y){var _this=dw_Slidebar.current;var v=(y<0)?'up':(y>0)?'down':'';var h=(x<0)?'left':(x>0)?'right':'';if((Math.abs(y)<8)||(Math.abs(x)<8)){if(Math.abs(y)<Math.abs(x)){v='';}else{h='';}}if((!v||(v=='down'&&_this.maxdDown)||(v=='up'&&_this.maxdUp))&&(!h||(h=='right'&&_this.maxdRight)||(h=='left'&&_this.maxdLeft))){var bar=_this.bar;dw_Event.remove(bar,"touchmove",dw_Slidebar.doDrag,true);dw_Event.remove(bar,"touchend",dw_Slidebar.endDrag,true);dw_Event.remo … 
dw_scrollObj.prototype.buildScrollControls=function(id,axis,eType,bScrollbar,bAtt){var wnId=this.id;var scrollbar=document.getElementById(id);var start_cls,end_cls,pr,start_deg,end_deg,tip,atts,barStart,barEnd,track,dragBar,x,y;var f=document.createDocumentFragment();pr=(axis=='v')?wnId+'_':wnId+'_h_';if(axis=='v'){start_cls='up';start_deg=90;end_cls='down';end_deg=270;}else{start_cls='left';start_deg=180;end_cls='right';end_deg=0;}if(dw_Util.getOptBool(bAtt)){tip=(eType=='mousedown')?'Press mouse button to scroll':'';atts=tip?{'title':tip}:{};}barStart=dw_Util.addElement('div',pr+start_cls,start_cls,atts);barEnd=dw_Util.addElement('div',pr+end_cls,end_cls,atts);if(bScrollbar){track=dw_Util.addElement('div',pr+'track','track');dragBar=dw_Util.addElement('div',pr+'dragBar','dragBar');track.appendChild(dragBar);}f.appendChild(barStart);if(track){f.appendChild(track);}f.appendChild(barEnd);scrollbar.appendChild(f);if(!eType){eType='mouseover';}dw_scrollObj.setupMouseEvents(barStart,wnId,eType,start_deg);dw_scrollObj.setupMouseEvents(barEnd,wnId,eType,end_deg);if(bScrollbar){this.setUpScrollbar(pr+'dragBar',pr+'track',axis);}dw_scrollObj.handleControlVis(id,wnId,axis);dw_Scrollbar_Co.addEvent(this,'on_load',function(){dw_scrollObj.handleControlVis(id,wnId,axis);});dw_Scrollbar_Co.addEvent(this,'on_update',function(){dw_scrollObj.handleControlVis(id,wnId,axis);});};dw_scrollObj.setupMouseEvents=function(el,wnId,eType,deg,speed){var isTouchDevice=dw_Util.isTouchDevice();if(!isTouchDevice){if(eType=='mouseover'){dw_Event.add(el,'mouseover',function(e){dw_scrollObj.col[wnId].initScrollVals(deg,speed);});dw_Event.add(el,'mouseout',function(e){dw_scrollObj.col[wnId].ceaseScroll();});dw_Event.add(el,'mousedown',function(e){dw_scrollObj.col[wnId].speed*=3;});dw_Event.add(el,'mouseup',function(e){dw_scrollObj.col[wnId].speed=dw_scrollObj.prototype.speed;});}else{dw_Event.add(el,'mousedown',function(e){dw_scrollObj.col[wnId].initScrollVals(deg,speed);e=dw_Event.DOMit(e);e.preventDefault();});dw_Event.add(el,'dragstart',function(e){e=dw_Event.DOMit(e);e.preventDefault();});dw_Event.add(el,'mouseup',function(e){dw_scrollObj.col[wnId].ceaseScroll();});dw_Event.add(el,'mouseout',function(e){dw_scrollObj.col[wnId].ceaseScroll();});}}else{dw_Event.add(el,'mousedown',function(e){var wndo=dw_scrollObj.col[wnId];if(!wndo.isScrolling){wndo.initScrollVals(deg,speed);wndo.isScrolling=true;}else{wndo.ceaseScroll();wndo.isScrolling=false;}});}dw_Event.add(el,'click',function(e){if(e&&e.preventDefault)e.preventDefault();return false;});};dw_scrollObj.handleControlVis=function(controlsId,wnId,axis){var wndo=dw_scrollObj.col[wnId];var el=document.getElementById(controlsId);if((axis=='v'&&wndo.maxY>0)||(axis=='h'&&wndo.maxX>0)){el.style.visibility='visible';}else{el.style.visibility='hidden';}};dw_scrollObj.prototype.setUpLoadLinks=function(controlsId){var el=document.getElementById(controlsId);if(!el){return;}var wnId=this.id;var links=el.getElementsByTagName('a');var list,cls,clsStart,clsEnd,parts,lyrId;clsStart='load_'+wnId+'_';for(var i=0;links[i];i++){list=dw_Util.get_DelimitedClassList(links[i].className);lyrId='';for(var j=0;cls=list[j];j++){if(cls.indexOf(clsStart)!=-1){clsEnd=cls.slice(clsStart.length);if(document.getElementById(clsEnd)){lyrId=clsEnd;dw_Event.add(links[i],'click',function(wnId,lyrId){return function(e){dw_scrollObj.col[wnId].load(lyrId);if(e&&e.preventDefault)e.preventDefault();return false;}}(wnId,lyrId));}}}}};
