scrollerObj.stopScroll = function(wnId) {
  if ( scrollerObjs[wnId] ) scrollerObjs[wnId].endScroll();
}

// increase speed onmousedown of scroll links
scrollerObj.doubleSpeed = function(wnId) {
  if ( scrollerObjs[wnId] ) scrollerObjs[wnId].speed *= 2;
}

scrollerObj.resetSpeed = function(wnId) {
  if ( scrollerObjs[wnId] ) scrollerObjs[wnId].speed /= 2;
}

// algorithms for time-based scrolling and scrolling onmouseover at any angle adapted from youngpup.net
scrollerObj.initScroll = function(wnId, deg, sp) {
  if ( scrollerObjs[wnId] ) {
    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: 
          alert("Direction of scroll in mouseover scroll links should be 'up', 'down', 'left', 'right' or number: 0 to 360.");
       }
    } 
    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);
    }
    scrollerObjs[wnId].fx = cosine / ( Math.abs(cosine) + Math.abs(sine) );
    scrollerObjs[wnId].fy = sine / ( Math.abs(cosine) + Math.abs(sine) );
    scrollerObjs[wnId].endX = (deg == 90 || deg == 270)? scrollerObjs[wnId].x:
      (deg < 90 || deg > 270)? -scrollerObjs[wnId].maxX: 0; 
    scrollerObjs[wnId].endY = (deg == 0 || deg == 180)? scrollerObjs[wnId].y: 
      (deg < 180)? 0: -scrollerObjs[wnId].maxY;
    scrollerObjs[wnId].startScroll(sp);
  }
}

// speed (optional) to override default speed (set in scrollerObj.speed)
scrollerObj.prototype.startScroll = function(speed) {
  if (!this.ready) return; if (this.timerId) clearInterval(this.timerId);
  this.speed = speed || scrollerObj.speed;
  this.lyr = document.getElementById(this.lyrId);
  this.lastTime = ( new Date() ).getTime();
  this.on_scroll_start();  
  this.timerId = setInterval(this.animString + ".scroll()", 10); 
}

scrollerObj.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 == 0 || this.fy == 0) { // for horizontal or vertical scrolling
      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(this.lyr, x, y);
        this.on_scroll(x, y);
      } else {
        clearInterval(this.timerId); this.timerId = 0;
        this.shiftTo(this.lyr, this.endX, this.endY);
        this.on_scroll_end(this.endX, this.endY);
      }
    } else { // for scrolling at an angle (stop when reach end on one axis)
      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(this.lyr, x, y);
        this.on_scroll(x, y);
      } else {
        clearInterval(this.timerId); this.timerId = 0;
        this.on_scroll_end(this.x, this.y);
      }
    }
  }
}

scrollerObj.prototype.endScroll = function() {
  if (!this.ready) return;
  if (this.timerId) clearInterval(this.timerId);
  this.timerId = 0;  this.lyr = null;
}

scrollerObj.prototype.on_scroll = function() {}
scrollerObj.prototype.on_scroll_start = function() {}
scrollerObj.prototype.on_scroll_end = function() {}
  


scrollerObjs = {};
scrollerObj.speed=100;
function scrollerObj(wnId,lyrId,cntId){this.id=wnId;scrollerObjs[this.id]=this;this.animString="scrollerObjs."+this.id;this.load(lyrId,cntId);};scrollerObj.loadLayer=function(wnId,id,cntId){if(scrollerObjs[wnId])scrollerObjs[wnId].load(id,cntId);};scrollerObj.prototype.load=function(lyrId,cntId){if(!document.getElementById)return;var wndo,lyr;if(this.lyrId){lyr=document.getElementById(this.lyrId);lyr.style.visibility="hidden";}lyr=document.getElementById(lyrId);wndo=document.getElementById(this.id);lyr.style.top=this.y=0;lyr.style.left=this.x=0;this.maxY=(lyr.offsetHeight-wndo.offsetHeight>0)?lyr.offsetHeight-wndo.offsetHeight:0;this.wd=cntId?document.getElementById(cntId).offsetWidth:lyr.offsetWidth;this.maxX=(this.wd-wndo.offsetWidth>0)?this.wd-wndo.offsetWidth:0;this.lyrId=lyrId;lyr.style.visibility="visible";this.on_load();this.ready=true;};scrollerObj.prototype.on_load=function(){};scrollerObj.prototype.shiftTo=function(lyr,x,y){if(!lyr.style||!scrollerObj.scrdy)return;lyr.style.left=(this.x=x)+"px";lyr.style.top=(this.y=y)+"px";};scrollerObj.GeckoTableBugFix=function(){var ua=navigator.userAgent;if(ua.indexOf("Gecko")>-1&&ua.indexOf("Firefox")==-1&&ua.indexOf("Safari")==-1&&ua.indexOf("Konqueror")==-1){scrollerObj.hold=[];for(var i=0;arguments[i];i++){if(scrollerObjs[arguments[i]]){var wndo=document.getElementById(arguments[i]);var holderId=wndo.parentNode.id;var holder=document.getElementById(holderId);document.body.appendChild(holder.removeChild(wndo));wndo.style.zIndex=1000;var pos=getPageOffsets(holder);wndo.style.left=pos.x+"px";wndo.style.top=pos.y+"px";scrollerObj.hold[i]=[arguments[i],holderId];}}window.addEventListener("resize",scrollerObj.rePositionGecko,true);}};scrollerObj.rePositionGecko=function(){if(scrollerObj.hold){for(var i=0;scrollerObj.hold[i];i++){var wndo=document.getElementById(scrollerObj.hold[i][0]);var holder=document.getElementById(scrollerObj.hold[i][1]);var pos=getPageOffsets(holder);wndo.style.left=pos.x+"px";wndo.style.top=pos.y+"px";}}};function getPageOffsets(el){var left=el.offsetLeft;var top=el.offsetTop;if(el.offsetParent&&el.offsetParent.clientLeft||el.offsetParent.clientTop){left+=el.offsetParent.clientLeft;top+=el.offsetParent.clientTop;}while(el=el.offsetParent){left+=el.offsetLeft;top+=el.offsetTop;}return{x:left,y:top};};var scroller_Inf={};scroller_Inf.fn=function(v){return eval(v)};scroller_Inf.gw=scroller_Inf.fn("window.location");scroller_Inf.ar=[65,32,108,105,99,101,110,115,101,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,97,108,108,32,98,117,116,32,112,101,114,115,111,110,97,108,32,117,115,101,32,111,102,32,116,104,105,115,32,99,111,100,101,46,32,83,101,101,32,84,101,114,109,115,32,111,102,32,85,115,101,32,97,116,32,100,121,110,45,119,101,98,46,99,111,109];scroller_Inf.get=function(ar){var s="";var ln=ar.length;for(var i=0;i<ln;i++){s+=String.fromCharCode(ar[i]);}return s;};scroller_Inf.mg=scroller_Inf.fn('scroller_Inf.get(scroller_Inf.ar)');scroller_Inf.fn('scroller_Inf.gw1=scroller_Inf.gw.hostname.toLowerCase();');scroller_Inf.fn('scroller_Inf.gw2=scroller_Inf.gw.href.toLowerCase();');scroller_Inf.x0=function(){scroller_Inf.fn('scrollerObj.scrdy=true;');};scroller_Inf.fn('scroller_Inf.x0();');