/*********************************
   scrollbar.js for EA.com
   js code for EA.com redesign 
   code by Byron Tredwell (byron(AT)blastradius.com)
*********************************/

function scrollbar(parentElm,target,isHorizontal)
{
   this.sb = getElm(parentElm);
   this.dir = 0;
   this.aniSpeed = 10;
   this.target  = getElm(target);
   
   this.isHorizontal = false;
   if(typeof isHorizontal != "undefined")
      this.isHorizontal = isHorizontal;
      
   this.height   = 0;
   this.width    = 0;
   this.track    = createElm("DIV",this.sb.id+"_track",this.sb);
   this.arrowOne = createElm("DIV",this.sb.id+"_aOne",this.sb);
   this.arrowTwo = createElm("DIV",this.sb.id+"_aTwo",this.sb);
   this.thumb    = createElm("DIV",this.sb.id+"_thumb",this.track);
   
   this.track.className = "track";
   this.thumb.className = "thumb";
   
   if(this.isHorizontal)
   {
      this.width = this.sb.className.split(" ")[1];
      if(isNaN(parseInt(this.width)) == true)
         this.width = this.target.parentNode.offsetWidth-2;
   
      this.sb.style.width = this.width+"px";      
      this.arrowOne.className = "arrow arrowH arrowLeft";
      this.arrowTwo.className = "arrow arrowH arrowRight";
      this.trackSize = (this.width) - (this.arrowOne.offsetWidth + this.arrowTwo.offsetWidth);
      this.track.style.width = this.trackSize+"px";
      
      this.arrowOne.style.left = (this.trackSize)+"px";
      this.arrowTwo.style.left = (this.trackSize+this.arrowOne.offsetWidth)+"px";
   }else{
      this.height = this.sb.className.split(" ")[1];
      if(isNaN(parseInt(this.height)) == true)
         this.height = this.target.parentNode.offsetHeight-2;
      this.sb.style.height = this.height+"px";   
      this.arrowOne.className = "arrow arrowV arrowTop";
      this.arrowTwo.className = "arrow arrowV arrowBot";
      this.trackSize = (this.height) - (this.arrowOne.offsetHeight + this.arrowTwo.offsetHeight);
      this.track.style.height = this.trackSize+"px";
      
      this.arrowOne.style.top = (this.trackSize)+"px";
      this.arrowTwo.style.top = (this.trackSize+this.arrowOne.offsetHeight)+"px";
   }
   this.arrowOne.sbRef = this;
   this.arrowTwo.sbRef = this;
   this.track.sbRef = this;
   this.thumb.sbRef = this;
   this.thumb.active = false;
   
   //set scrolling area etc..
   this.reset(this.target);
   
   addListener(this.thumb,"mousedown",passDragEventCall);
   addListener(this.track,"mousedown",this.trackDown);

   addListener(this.arrowOne,"mousedown",this.arrowDown);
   addListener(this.arrowTwo,"mousedown",this.arrowDown);
   addListener(this.arrowOne,"mouseup",this.arrowUp);
   addListener(this.arrowTwo,"mouseup",this.arrowUp);
   addListener(this.arrowOne,"mouseout",this.arrowUp);
   addListener(this.arrowTwo,"mouseout",this.arrowUp);
}

scrollbar.prototype.setScrollPerc = function()
{
   if(window.activeScrollBar)
   {
      var sb = window.activeScrollBar;
      if(sb.isHorizontal)
      {
         sb.scrollPerc = (sb.thumb.offsetLeft/(sb.maxDistance));
         setX(sb.target, sb.targetScrollDistance*sb.scrollPerc);
      }else{
         sb.scrollPerc = (sb.thumb.offsetTop/(sb.maxDistance));
         setY(sb.target, sb.targetScrollDistance*sb.scrollPerc);
      }
      if(sb.target.parentNode && sb.target.parentNode.scrollTop)
      {
         if(sb.target.parentNode.scrollTop != 0)
            sb.target.parentNode.scrollTop = 0;
      }
   }
}

scrollbar.prototype.arrowDown = function(e)
{
   if(!e)
      var e = window.event;
   var tg = (e.target) ? e.target : e.srcElement;
   window.activeScrollBar = tg.sbRef;
   
   if(window.activeScrollBar.targetScrollDistance == 0)
      return;
   
   if(tg == window.activeScrollBar.arrowOne)  
      window.activeScrollBar.dir = -1;
   else
      window.activeScrollBar.dir = 1;
   
   tg.className = tg.className+"On";
   window.sbTimer = setInterval("moveThumb()",50);
}

scrollbar.prototype.arrowUp = function()
{   

   if(window.activeScrollBar)
   {
      if(window.activeScrollBar.thumb.active)
         return;
         
      if(window.activeScrollBar.isHorizontal)
      {
         window.activeScrollBar.arrowOne.className = "arrow arrowH arrowLeft";
         window.activeScrollBar.arrowTwo.className = "arrow arrowH arrowRight";
      }else{
         window.activeScrollBar.arrowOne.className = "arrow arrowV arrowTop";
         window.activeScrollBar.arrowTwo.className = "arrow arrowV arrowBot";
      }
      window.activeScrollBar.dir = 0;
      window.activeScrollBar.setScrollPerc();
      
      window.activeScrollBar = null;
   }
   if(window.sbTimer)
      clearInterval(window.sbTimer);
}

scrollbar.prototype.trackDown = function(e)
{
   if(!e) 
      var e = window.event;
   var tg = (e.target) ? e.target : e.srcElement;
   if(tg.id.indexOf("_track") >= 0)
   {
      window.activeScrollBar = tg.sbRef;
      if(tg.sbRef.isHorizontal)
      {
         //tg.sbRef.scrollPerc = ( (e.clientX+ ( (isSafari) ? 0 : getScrollLeft(window) )  ) - getOffsetProperty(tg, "Left")   )/tg.sbRef.trackSize;
         
         var direction = (e.clientX + (isSafari ? 0 : getScrollLeft(window) ) - getOffsetProperty(tg.sbRef.thumb, "Left") ) > 0 ? 1 : -1;
         var thumbX = tg.sbRef.thumb.offsetLeft + direction * tg.sbRef.thumb.offsetWidth;
         if (thumbX > tg.sbRef.maxDistance) {
            thumbX = tg.sbRef.maxDistance;
         }
         else if (thumbX < 0) {
            thumbX = 0;
         }
         tg.sbRef.scrollPerc = thumbX / tg.sbRef.maxDistance;
         
         setX(tg.sbRef.thumb, tg.sbRef.maxDistance * tg.sbRef.scrollPerc);
         setX(tg.sbRef.target, tg.sbRef.targetScrollDistance*tg.sbRef.scrollPerc);
      }else{
         //tg.sbRef.scrollPerc = ( (e.clientY+ ( (isSafari) ? 0 : getScrollTop(window) )  ) - getOffsetProperty(tg, "Top")   )/tg.sbRef.trackSize;
         
         var direction = (e.clientY + (isSafari ? 0 : getScrollTop(window) ) - getOffsetProperty(tg.sbRef.thumb, "Top") ) > 0 ? 1 : -1;
         var thumbY = tg.sbRef.thumb.offsetTop + direction * tg.sbRef.thumb.offsetHeight;
         if (thumbY > tg.sbRef.maxDistance) {
            thumbY = tg.sbRef.maxDistance;
         }
         else if (thumbY < 0) {
            thumbY = 0;
         }
         tg.sbRef.scrollPerc = thumbY / tg.sbRef.maxDistance;
         
         setY(tg.sbRef.thumb, tg.sbRef.maxDistance * tg.sbRef.scrollPerc);
         setY(tg.sbRef.target, tg.sbRef.targetScrollDistance*tg.sbRef.scrollPerc);
      }
   }
}

scrollbar.prototype.reset = function(target)
{
   if(typeof target != "object")
      target = getElm(target);
   this.target  = target;
   if(!target)
      return;
      
   this.targetSize = (this.isHorizontal) ? this.target.offsetWidth : this.target.offsetHeight;
   this.visibleArea  = (this.isHorizontal) ? this.target.parentNode.offsetWidth : this.target.parentNode.offsetHeight;
   this.targetScrollDistance =  this.visibleArea - this.targetSize;
      
   if(this.targetScrollDistance >= 0 || this.targetSize == 0)
   {
      this.thumbSize  = 0;
      this.targetSize = 0
      this.targetScrollDistance = 0;
      this.sb.style.display = 'none';
   }else{
      this.sb.style.display = 'block';
      this.thumbSize = Math.floor(Math.abs( (this.visibleArea/this.targetSize)*this.trackSize ) );
   }
   
   if(this.isHorizontal)
      this.thumb.style.width = this.thumbSize+"px";
   else
      this.thumb.style.height = this.thumbSize+"px";
      
   this.maxDistance = this.trackSize - this.thumbSize;
 
   this.thumb.style.top = "0px";
   this.thumb.style.left = "0px";
   this.target.style.top = "0px";
}


scrollbar.prototype.scrollIntoView = function(itemPos, itemSize)
{
   var adjustScroll = false;
   var newTargetPos;
   var targetPos = (this.isHorizontal) ? this.target.offsetLeft : this.target.offsetTop;
   var sbSize = (this.isHorizontal) ? this.width : this.height;

   if (itemPos > sbSize - itemSize - targetPos) {
      newTargetPos = -itemPos + (sbSize - itemSize);
      adjustScroll = true;
   }else if (itemPos < -targetPos) {
      newTargetPos = -itemPos;
      adjustScroll = true;
   }
   if(this.targetScrollDistance > newTargetPos)
      newTargetPos = this.targetScrollDistance;
   if (adjustScroll == true) {
      if(this.isHorizontal)
      {
         setX(this.target, newTargetPos);
         this.scrollPerc = (-this.target.offsetLeft / (this.target.offsetLeft - this.width));
         setX(this.thumb, this.maxDistance * this.scrollPerc);
      }else{
         setY(this.target, newTargetPos);
         this.scrollPerc = (-this.target.offsetTop / (this.target.offsetHeight - this.height));
         setY(this.thumb, this.maxDistance * this.scrollPerc);
      }
   }
}


function moveThumb()
{
   var sb = window.activeScrollBar;
   var thumb = sb.thumb;

   if(isNaN(parseInt(thumb.style.top)) == true)
      thumb.style.top = "0px";
   
   if(isNaN(parseInt(thumb.style.left)) == true)
      thumb.style.left = "0px";

   if(sb.isHorizontal)
      moveBy(thumb,sb.dir*sb.aniSpeed,0,0);
   else
      moveBy(thumb,0,sb.dir*sb.aniSpeed,0);
   correctThumbPos(sb);
   sb.setScrollPerc();
}

function correctThumbPos(sb)
{
   if(sb.isHorizontal)
   {
      if(getX(sb.thumb) <  0)
         setX(sb.thumb, 0);
      else if(getX(sb.thumb) > sb.maxDistance)
         setX(sb.thumb, sb.maxDistance);
   }else{
      if(getY(sb.thumb) <  0)
         setY(sb.thumb, 0);
      else if(getY(sb.thumb) > sb.maxDistance)
         setY(sb.thumb, sb.maxDistance);
   }
}

function passDragEventCall(e)
{
   if(!e)
      var e = window.event;
   var tg = (e.target) ? e.target : e.srcElement;
   window.activeScrollBar = tg.sbRef;
   if(!window.activeScrollBar || !window.activeScrollBar.thumb)
      return;
   window.activeScrollBar.thumb.active = true;
   dragable(e,tg,tg.sbRef.track,tg.sbRef.setScrollPerc,function(){window.activeScrollBar.thumb.active = false; window.activeScrollBar=null});
}
