// Browser detection
var dom = document.getElementById ? true:false;
var nn4 = document.layers ? true:false;
var ie4 = (document.all && !document.getElementById);
var ie5 = (document.all && document.getElementById);

var mouseY; // Mouse Y position onclick
var mouseX; // Mouse X position onclick

var whl        = false; // If wheel
var clickUp    = false; // If click on up-arrow
var clickDown  = false; // If click on down-arrow
var clickDrag  = false; // If click on scrollbar
var clickAbove = false; // If click above scrollbar
var clickBelow = false; // If click below scrollbar

var speed   =  4;    // Scroll speed
var wheelSpeed = 20; // scrollSpeed for mousewheels
var timer = setTimeout("",500); // Repeat variable
var upL;          // Up-arrow X
var upT;          // Up-arrow Y
var downL;        // Down-arrow X
var downT;        // Down-arrow Y
var dragL;        // Scrollbar X
var dragT;        // Scrollbar Y
var rulerL;       // Ruler X
var rulerT;       // Ruler Y
var contentT;     // Content layer Y;
var contentH;     // Content height
var contentClipY; // Content clip top
var contentClipX; // Content clip left
var contentClipW; // Content clip width
var contentClipH; // Content clip height
var scrollLength; // Number of pixels scrollbar should move
var startY;       // Keeps track of offset between mouse and div


function initDHTMLScroller() {
	eventLoader();
  for (var i=0; i<initDHTMLScroller.arguments.length; ++i) {
  parentLayerName = initDHTMLScroller.arguments[i] + "ScrollParent";
  parentLayerData = new Array();
  parentLayerData = getLayerInformation(parentLayerName);
  childLayerName  = initDHTMLScroller.arguments[i] + "ScrollChild";
  childLayerData  = new Array();
  childLayerData  = getLayerInformation(childLayerName);
  if(nn4) {
     clipHeight = document.layers[parentLayerName].clip.height;
   }
  else {
     clipHeight = parentLayerData[3];
    }
  if(childLayerData[3] > clipHeight) {
    vSwitch(initDHTMLScroller.arguments[i]+"Ruler",1);
    vSwitch(initDHTMLScroller.arguments[i]+"ScrollBar",1);
    vSwitch(initDHTMLScroller.arguments[i]+"Down",1);
    vSwitch(initDHTMLScroller.arguments[i]+"Up",1);
    vSwitch(initDHTMLScroller.arguments[i]+"Drag",1);
   }
  }
  document.getElementById(parentLayerName).onscroll = processScroll;
}


// Preload
function eventLoader(){
	// Up-arrow X and Y variables, width + height
	getLayerInformation("contentUp");
	upL = parseInt(thisLayerPosition[1]);
	upT = parseInt(thisLayerPosition[0]);
 	upW = parseInt(thisLayerPosition[2]);
 	upH = parseInt(thisLayerPosition[3]);
	// Down-arrow X and Y variables, width + height
	getLayerInformation("contentDown");
	downL = parseInt(thisLayerPosition[1]);
	downT = parseInt(thisLayerPosition[0]);
 	downW = parseInt(thisLayerPosition[2]);
 	downH = parseInt(thisLayerPosition[3]);
	// Scrollbar height
	getLayerInformation("contentScrollBar");
 	scrollH = parseInt(thisLayerPosition[3]);
	// Scrolldragger X and Y variables, width + height
	getLayerInformation("contentDrag");
	dragL = parseInt(thisLayerPosition[1]);
	dragT = parseInt(thisLayerPosition[0]);
 	dragW = parseInt(thisLayerPosition[2]);
 	dragH = parseInt(thisLayerPosition[3]);
	// Ruler Y variable#
	getLayerInformation("contentRuler");
	rulerT = parseInt(thisLayerPosition[0]);
	getLayerInformation("contentScrollChild");
	contentH = parseInt(thisLayerPosition[3]);
	getLayerInformation("contentScrollParent");
	contentClipH = parseInt(thisLayerPosition[3]);
	
	// Number of pixels scrollbar should move
	scrollLength = ((scrollH-dragH)/(contentH-contentClipH));
	// Initializes event capturing
	if(nn4){
	 document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
	 window.onresize = reloadPage;
	}
	document.onmousewheel = wheel;
	document.onmousedown = down;
	document.onmousemove = move;
	document.onmouseup = up;
}

// reloads page to position the layers again
function reloadPage(){
        location.reload();
}


// mousewheel
function wheel(e) {
	var arriba = true;     
	if (event.wheelDelta >= 120) {
		arriba = true;
	} else if (event.wheelDelta <= -120) {
		arriba = false;   
	}
	
  whl = true;
  if(arriba) {
    return scrollUp();
  }
  else {
    return scrollDown();
  }
	return true;
}

// Mousedown
function down(e){
	if((document.layers && e.which!=1) || (document.all && event.button!=1)) return true; // Enables the right mousebutton
	getMouse(e);
	startY = (mouseY - dragT);
	
	// If click on up-arrow
	if(mouseX >= upL && (mouseX <= (upL + upW)) && mouseY >= upT && (mouseY <= (upT + upH))){
		clickUp = true;
		return scrollUp();
	}       
	// Else if click on down-arrow
	else if(mouseX >= downL && (mouseX <= (downL + downW)) && mouseY >= downT && (mouseY <= (downT + downH))){
		clickDown = true;
		return scrollDown();
	}
	// Else if click on scrollbar
	else if(mouseX >= dragL && (mouseX <= (dragL + dragW)) && mouseY >= dragT && (mouseY <= (dragT + dragH))){
		clickDrag = true;
		return false;
	}
	else if(mouseX >= dragL && (mouseX <= (dragL + dragW)) && mouseY >= rulerT && (mouseY <= (rulerT + scrollH))){
		// If click above drag
		if(mouseY < dragT){
	    clickAbove = true;
	    clickUp = true;
	    return scrollUp();
    }
    // Else click below drag
    else{
	    clickBelow = true;
	    clickDown = true;
	    return scrollDown();
    }
	}
	// If no scrolling is to take place
	else{
		return true;
	}
}
	
	// Drag function
function move(e){
	if(clickDrag && contentH > contentClipH){
	  getMouse(e);
	  dragT = (mouseY - startY);
	  
	  if(dragT < (rulerT))
	  	dragT = rulerT;         
	  if(dragT > (rulerT + scrollH - dragH))
	  	dragT = (rulerT + scrollH - dragH);
	  
	  contentT = ((dragT - rulerT)*(1/scrollLength));
	  contentT = eval('-' + contentT);

	
	  moveTo();
	  
	  // So ie-pc doesn't select gifs
	  if(ie4 || ie5)
	  	return false;
	}
}
	
function up(){
	clearTimeout(timer);
	// Resetting variables
	whl = false;
	clickUp = false;
	clickDown = false;
	clickDrag = false;
	clickAbove = false;
	clickBelow = false;
	return true;
}

// Reads content layer top
function getT(){
	getLayerInformation("contentScrollChild");
	contentT = thisLayerPosition[0];
}

// Reads mouse X and Y coordinates
function getMouse(e){
	if(ie4 || ie5){
   mouseY = event.clientY + document.body.scrollTop;
   mouseX = event.clientX + document.body.scrollLeft;
	}
	else if(nn4 || dom){
	  mouseY = e.pageY;
	  mouseX = e.pageX;
	}
}

// Moves the layer
function moveTo(){
	setLayerPosition("contentScrollChild",0,contentT);

	getLayerInformation("contentRuler");
	setLayerPosition("contentRuler",thisLayerPosition[1],dragT);

	getLayerInformation("contentDrag");
	setLayerPosition("contentDrag",thisLayerPosition[1],dragT);
}

// Scrolls up
function scrollUp(){
 getT();

 if(clickAbove){
 	if(dragT <= (mouseY-(dragH/2)))
 		return up();
 }
 
 if(clickUp){
  if(contentT < 0){
   dragT = dragT - (speed*scrollLength);
   
   if(dragT < (rulerT))
    dragT = rulerT;
           
   contentT = contentT + speed;
   if(contentT > 0)
    contentT = 0;
   
   moveTo();
   timer = setTimeout("scrollUp()",25);
  }
 }

 if(whl){
  if(contentT < 0){
   dragT = dragT - (wheelSpeed*scrollLength);
   
   if(dragT < (rulerT))
    dragT = rulerT;
           
   contentT = contentT + wheelSpeed;
   if(contentT > 0)
    contentT = 0;

   moveTo();
  }
 }
 
 return false;
}

// Scrolls down
function scrollDown(){
  getT();

  if(clickBelow){
   if(dragT >= (mouseY-(dragH/2)))
    return up();
  }

  if(clickDown){
   if(contentT > -(contentH - contentClipH)){                      
    dragT = dragT + (speed*scrollLength);
    if(dragT > (rulerT + scrollH - dragH))
      dragT = (rulerT + scrollH - dragH);
           
    contentT = contentT - speed;
    if(contentT < -(contentH - contentClipH))
            contentT = -(contentH - contentClipH);
    
    moveTo();
    timer = setTimeout("scrollDown()",25);
   }
  }

  if(whl){
   if(contentT > -(contentH - contentClipH)){                      
    dragT = dragT + (wheelSpeed*scrollLength);
    if(dragT > (rulerT + scrollH - dragH))
      dragT = (rulerT + scrollH - dragH);
           
    contentT = contentT - wheelSpeed;
    if(contentT < -(contentH - contentClipH))
            contentT = -(contentH - contentClipH);
    
    moveTo();
   }
  }

 return false;
}



/**
*	when parent div rolled by tab key. calculate the distance. and let 
*   author: David Li
*   Date:June 16 2008
*/
var scrollMoveFlag = true;
function processScroll(element){
		var contentScrollParent = document.getElementById("contentScrollParent");
		var contentScrollChild = document.getElementById("contentScrollChild");
		
		if(scrollMoveFlag){
			scrollMoveFlag = false;
			var childOldTop = document.getElementById('contentScrollChild').style.top;
			childOldTop = childOldTop.substr(0,childOldTop.length - 2);
			var distance = Math.abs(contentScrollParent.scrollTop) + Math.abs(childOldTop);
			childOffsetY('-' + distance);			
			contentScrollParent.scrollTop = 0;
		}else
		{
			scrollMoveFlag = true;
		}
}

/*
*	Let the content(child) div move to  childOffsetY position,
*   also move scrollBar  
*   author: David Li
*   Date:May 26 2008
*/
function childOffsetY(childOffsetY){
	if(contentH > contentClipH){
	
		childOffsetY = parseInt(childOffsetY);
		contentT = childOffsetY;
		
		var oppositeChildOffsetY;
		if(childOffsetY > 0){
			oppositeChildOffsetY = eval('-' + childOffsetY);
		} else{
			oppositeChildOffsetY = Math.abs(childOffsetY);
		}
		
		dragT =  oppositeChildOffsetY * scrollLength + rulerT;
		
		if(dragT < rulerT)
			dragT = rulerT;         
		if(dragT > (rulerT + scrollH - dragH))
			dragT = (rulerT + scrollH - dragH);
		
		moveTo();
		if(ie4 || ie5)
			return false;
	}
}

//----------------------------------- the below code come from the old scriptlib.js ----------------------------------------------
function setLayerPosition(thisLayer,positionLeft,positionTop) {
  var unit = "";
  thisLayer = document.all ? document.all[thisLayer] : document.getElementById ? document.getElementById(thisLayer) : NSStyle(thisLayer);
  thisLayer = document.layers ? thisLayer : thisLayer.style;
  if(document.getElementById) {unit = "px";}
  thisLayer.left = positionLeft + unit;
  thisLayer.top  = positionTop + unit;
  return;
}

function getLayerInformation(thisLayer) {
  thisLayerPosition = new Array();
  thisLayer = document.all ? document.all[thisLayer] : document.getElementById ? document.getElementById(thisLayer) : NSStyle(thisLayer);
  thisLayerPosition[0] = document.layers ? thisLayer.top : thisLayer.offsetTop;
  thisLayerPosition[1] = document.layers ? thisLayer.left : thisLayer.offsetLeft;
  thisLayerPosition[2] = document.layers ? thisLayer.document.width : thisLayer.offsetWidth;
  thisLayerPosition[3] = document.layers ? thisLayer.document.height : thisLayer.offsetHeight;
  return(thisLayerPosition);
}

function vSwitch(aLayer,aBool) {
  if (preLoadIsComplete) {
    if (document.all) {
      IEStyle(aLayer).visibility = (aBool == 0) ? "hidden" : "visible";
    }
    else {
      if (nn4) {
        NSStyle(aLayer).visibility = (aBool == 0) ? 'hide' : 'show';
      }
      else {
        document.getElementById(aLayer).style.visibility= (aBool == 0) ? "hidden" : "visible";
      }
    }
  }
  else {
    preLoad();
  }
}

function IEStyle(s) {
  return document.all.tags("div")[s].style;
}

var preLoadIsComplete    = false;
function preLoad() {
  var preLoadedImgs = "";
  if (document.layers) {
    for (i=0; i<document.layers.length; i++) {
      for (j=0; j<document.layers[i].document.images.length; j++)  {
        if (document.layers[i].document.images[j].name) {
          if (preLoadedImgs.indexOf(document.layers[i].document.images[j].name) < 0) {
            var imgSrc = document.layers[i].document.images[j].src;
            if (!(/\-a\./.test(imgSrc))) {
              var tmpPrefix = imgSrc.substr(0,imgSrc.length-4);
              var tmpSuffix = imgSrc.substr(imgSrc.length-4,imgSrc.length-1);
              if (tmpSuffix == ".gif" || tmpSuffix == ".jpg") {
                var tmpActiveSrc = tmpPrefix + "-a" + tmpSuffix;
                var IEFix = new activeImageConstructor(document.layers[i].document.images[j].name,document.layers[i].document.images[j].src,tmpActiveSrc);
                var tmpData = new Array(IEFix);
                pictures = pictures.concat(tmpData);
                preLoadedImgs = preLoadedImgs.concat(document.layers[i].document.images[j].name);
              }
            }
          }
        }
      }
    }
  }
  for (i=0; i <document.images.length; i++) {
    if (document.images[i].name) {
      if (preLoadedImgs.indexOf(document.images[i].name) < 0) {
        var imgSrc = document.images[i].src;
        if (!(/\-a\./.test(imgSrc))) {
          var tmpPrefix = imgSrc.substr(0,imgSrc.length-4);
          var tmpSuffix = imgSrc.substr(imgSrc.length-4,imgSrc.length-1);
          if (tmpSuffix == ".gif" || tmpSuffix == ".jpg") {
            var tmpActiveSrc = tmpPrefix + "-a" + tmpSuffix;
            var IEFix = new activeImageConstructor(document.images[i].name,document.images[i].src,tmpActiveSrc);
            var tmpData = new Array(IEFix);
            pictures = pictures.concat(tmpData);
            preLoadedImgs = preLoadedImgs.concat(document.images[i].name);
          }
        }
      }
    }
  }
  preLoadIsComplete = true;
}
