/*
+--------------------------------------------------------+
¦ © Copyright 2000, Calypso Systems, Inc.                ¦
¦ All Rights Reserved.                                   ¦
¦                                                        ¦
¦ Description:	CSX - Netscape ScrollBar  
¦                                                        ¦
¦ Who                     When         What              ¦
¦ ------------------------------------------------       ¦
¦ lGoodman@calsys.com     01/17/00     Created           ¦
¦ ------------------------------------------------			|
¦ var MODULE_NAME = "pcsNS4Scroll.js"                         ¦
+--------------------------------------------------------+

*/
arImLoad = ["barBg","barBgBl","bg","bgBl",
            "butBd","butBu","butTd","butTu",
            "tmbBg","tmbBgL","tmbBot","tmbTop"];

arImList = [];
for (counter in arImLoad) {
    arImList[counter] = new Image();
    arImList[counter].src = "./scroll/" + arImLoad[counter] + ".gif";
}

var gScrollActiveItem;
var gScrollTimer;
var gScrollThumbTimer;
var gScrollOrigInt = 500;
var gScrollRepeatInt = 50;
var gScrollInitTimer;
var gScrollDocIncr = 8;
var gScrollBarWidth = 16;
var gScrollThumbMinHeight = 10;
var gScrollBackTimer = null;

/*
--------------------------------------------------------------------------------
layer.prototype.writeDocument
--------------------------------------------------------------------------------*/
Layer.prototype.writeDocument = function(sText)
{
	var oDoc = this.document;
	oDoc.open ();
	oDoc.writeln(sText);
	oDoc.close();
}
	
/*
--------------------------------------------------------------------------------
layer.prototype.addChildLayer
--------------------------------------------------------------------------------*/
Layer.prototype.addChildLayer = function(lWidth,lLeft,lTop,lclipWidth,lclipHeight,sInnerHTML,sVisible)
{
	var oRet = new Layer(lWidth,this);
	oRet.left=lLeft;
	oRet.top=lTop;
	oRet.clip.width=lclipWidth;
	oRet.clip.height=lclipHeight;
	if(sInnerHTML != "")
	{ 
		oRet.writeDocument(sInnerHTML);
	}
	oRet.visibility=sVisible
	return oRet;
}
	
function drawScrollBars(el)
{
	if (!el.hasScrollLayer)
	{
		el.borderWidth = 0;
		el.width = el.layContain.scrollWidth -gScrollBarWidth -el.borderWidth;
		el.height = el.layContain.scrollHeight-el.borderWidth;
		
		el.hasScrollLayer = true;
		var layContain = el.layContain;
		layContain.layScrollBar = new Layer(gScrollBarWidth,el.layContain);
		layContain.layScrollBar.left = el.width;
		layContain.layScrollBar.top = el.borderWidth;
		layContain.layScrollBar.width =gScrollBarWidth;
		layContain.layScrollBar.clip.width = gScrollBarWidth;
		layContain.layScrollBar.clip.height = el.height - el.borderWidth;
		layContain.layScrollBar.writeDocument("<IMG SRC=\"./scroll/butTu.gif\" WIDTH=16 HEIGHT=16 BORDER=0 HSPACE=0 VSPACE=0>");
		
		sHTML = "";
		layContain.layBGCol = layContain.layScrollBar.addChildLayer(16,0,16,16,el.height+150,sHTML,"inherit");
		layContain.layBGCol.background.src = "./scroll/barBgBl.gif";
			
		sHTML = "";
		layContain.layBG = layContain.layScrollBar.addChildLayer(16,0,16,16,el.height+150,sHTML,"inherit");
		layContain.layBG.background.src = "./scroll/barBg.gif";
		
		sHTML = "<IMG SRC=\"./scroll/tmbTop.gif\" WIDTH=16 HEIGHT=2 BORDER=0 HSPACE=0 VSPACE=0 ALIGN=RIGHT>";
		layContain.layThumb = layContain.layScrollBar.addChildLayer(16,0,16,16,100,sHTML,"inherit");
		layContain.layThumb.background.src = "./scroll/tmbBg.gif";
		
		
		sHTML = "<IMG SRC=\"./scroll/tmbBot.gif\" WIDTH=16 HEIGHT=2 BORDER=0 HSPACE=0 VSPACE=0 ALIGN=RIGHT>";
		layContain.layThumbBot = layContain.layThumb.addChildLayer(16,0,98,16,2,sHTML,"inherit");

		sHTML = "<IMG SRC=\"./scroll/butBu.gif\" WIDTH=16 HEIGHT=16 HSPACE=0 BORDER=0>";
		layContain.layButtonBot = layContain.layScrollBar.addChildLayer(16,0,el.height-16-el.borderWidth,16,16,sHTML,"inherit");
		
	}
}

function scrollSizeScrollBar(sLayName){
	var layContain = findLayer(sLayName + 'Outer');
	var layMain = findLayer(sLayName + '',layContain);
	layMain.layContain = layContain;
	drawScrollBars(layMain)
	scrollUpdateScrollBar(layMain)
	}
	
function scrollUpdateScrollBar(layMain)
{	
	layMain.layContain = layMain.parentLayer;
	var layContain = layMain.layContain;
	layContain.layScrollBar.moveAbove(layMain);
	if (layMain.origTop) layMain.top = layMain.origTop;
	layMain.origTop = layMain.top;
	layMain.clip.top = 0;
	layMain.docAlign = scrollDocAlign;
	layMain.layScrollBar=layContain.layScrollBar;
	layMain.layBGCol=layContain.layBGCol;
	layMain.layBG=layContain.layBG;
	layMain.layThumb=layContain.layThumb;
	layMain.layThumbBot=layContain.layThumbBot;
	layMain.layButtonBot=layContain.layButtonBot;


	if (layMain.origHeight) layMain.clip.height = layMain.origHeight;
	layMain.origHeight = layMain.clip.height;

	var docHeight = layMain.document.height;
	var lyrHeight = layMain.clip.height;
	if (docHeight <= lyrHeight){
		layMain.layScrollBar.visibility = "hide";
		return;
	}
	layMain.layThumb.top = gScrollBarWidth;
	
	var elvBarHeight = layContain.layScrollBar.clip.height - (gScrollBarWidth*2);
	var thumbHeight = Math.max((lyrHeight*elvBarHeight)/docHeight,gScrollThumbMinHeight)

	layMain.layThumb.clip.height = thumbHeight;
	
	
	layMain.layThumbBot.top = thumbHeight - layMain.layThumbBot.clip.height;

	layMain.thumbMaxTop = (elvBarHeight + gScrollBarWidth) - thumbHeight;
	
	layMain.docToTravel = docHeight - lyrHeight;
	layMain.scrToTravel = elvBarHeight - thumbHeight;
	layMain.scrPixels = layMain.scrToTravel/layMain.docToTravel;
	layMain.docPixels = layMain.docToTravel/layMain.scrToTravel;

	
	var upImage = layContain.layScrollBar.document.images[0];
	var downImage = layContain.layButtonBot.document.images[0];

	upImage.direction = 0;
	downImage.direction = 1;
	
	upImage.xLayer = layMain;
	
	upImage.onmousedown = scrollButDown;		
	
	downImage.xLayer = layMain;
	downImage.onmousedown = scrollButDown;

	layContain.layThumb.captureEvents(Event.MOUSEDOWN); 
	layContain.layThumb.xLayer = layMain;
	layContain.layThumb.onmousedown = scrollThumbDown;

	layContain.layBG.captureEvents(Event.MOUSEDOWN);
	layContain.layBG.xLayer = layMain;
	layContain.layBG.onmousedown = scrollBackDown;
	layContain.layScrollBar.show();
	layContain.layScrollBar.zIndex = 200;
}
/*
--------------------------------------------------------------------------------
scrollButDown
--------------------------------------------------------------------------------*/
function scrollButDown(e)
{
	// This is our scroll's activation
	var oLay = this.xLayer;
	gScrollActiveItem = oLay;
	
	oLay.butImage = e.target;
	oLay.dir = oLay.butImage.direction
	oLay.butImage.origSrc = oLay.butImage.src;
	oLay.butImage.src = (oLay.dir) ? "./scroll/butBd.gif" : "./scroll/butTd.gif";
	oLay.butImage.onmouseout = scrollButOut;
	captureEvents(Event.MOUSEUP)
	onmouseup = scrollButUp;
	scrollButMove(oLay.dir);
	
	if(e.type=="mousedown") gScrollInitTimer = setTimeout("gScrollTimer = setInterval(scrollButMove,gScrollRepeatInt," + oLay.dir + ")",gScrollOrigInt);
	else scrollTimer = setInterval(scrollButMove,gScrollRepeatInt,oLay.dir);
	return false;
}

/*
--------------------------------------------------------------------------------
scrollClearTimers
--------------------------------------------------------------------------------*/
function scrollClearTimers()
{
	clearTimeout(gScrollInitTimer);
	clearInterval(gScrollTimer);
	gScrollInitTimer = gScrollTimer = null;
	clearTimeout(gScrollBackTimer);
	clearInterval(gScrollThumbTimer);
	gScrollBackTimer = gScrollThumbTimer = null;
}

// ========= MOUSE DOWN EVENTS =========

/*
--------------------------------------------------------------------------------
scrollThumbDown
--------------------------------------------------------------------------------*/
function scrollThumbDown(e)
{
	// This is our scroll's activation
	var oLay = this.xLayer;
	gScrollActiveItem = oLay;
	
	oLay.currentPosY = e.pageY;
	captureEvents(Event.MOUSEMOVE|Event.MOUSEUP); 
	onmousemove = scrollThumbMove;
	onmouseup = scrollThumbUp;
	return false;
}

/*
--------------------------------------------------------------------------------
scrollBackDown
--------------------------------------------------------------------------------*/
function scrollBackDown(e)
{
	// This is our scroll's activation
	var oLay = this.xLayer;
	gScrollActiveItem = oLay;
	
	oLay.dir = (e.pageY < oLay.layThumb.pageY) ? -1 : 1;
	captureEvents(Event.MOUSEUP);
	onmouseup = scrollBackUp;
	scrollBackMove(e);
	ev = e;
	gScrollBackTimer = setTimeout("gScrollThumbTimer = setInterval(scrollBackMove,gScrollRepeatInt,ev)",gScrollOrigInt);
	return false;
}


// ========= MOUSE MOVE EVENTS =========
/*
--------------------------------------------------------------------------------
scrollButMove
--------------------------------------------------------------------------------*/
function scrollButMove(dir) 
{
	// Event could be from anywhere
	var oLay = gScrollActiveItem;
	if ((dir && oLay.clip.top==oLay.docToTravel) || (!dir && oLay.clip.top==0)) {scrollClearTimers();return}
	oLay.top = (dir) ? Math.max(oLay.top-gScrollDocIncr,oLay.origTop-oLay.docToTravel) : Math.min(oLay.top+gScrollDocIncr,oLay.origTop);
	oLay.clip.top = (dir) ? Math.min(oLay.clip.top+gScrollDocIncr,oLay.docToTravel) : Math.max(oLay.clip.top-gScrollDocIncr,0) ;
	oLay.clip.height = oLay.origHeight;
	oLay.layThumb.top = Math.min(Math.max(gScrollBarWidth + (oLay.scrPixels*oLay.clip.top),gScrollBarWidth),oLay.thumbMaxTop);
	
}

/*
--------------------------------------------------------------------------------
scrollThumbMove
--------------------------------------------------------------------------------*/
function scrollThumbMove(e)
{
	// Event could be from anywhere
	var oLay = gScrollActiveItem;
	var difY = e.pageY - oLay.currentPosY;
	oLay.layThumb.top = Math.min(Math.max(oLay.layThumb.top+difY,gScrollBarWidth),oLay.thumbMaxTop);
	oLay.docAlign();
	oLay.currentPosY = e.pageY;

}


/*
--------------------------------------------------------------------------------
scrollBackMove
--------------------------------------------------------------------------------*/
function scrollBackMove(e) 
{
   // Event could be from anywhere
	var oLay = gScrollActiveItem;

	if (e.pageY > oLay.layThumb.pageY && e.pageY <= oLay.layThumb.pageY+oLay.layThumb.clip.height) {scrollBackUp();return}
	oLay.layThumb.top = Math.min(Math.max(oLay.layThumb.top + oLay.layThumb.clip.height * oLay.dir,gScrollBarWidth),oLay.thumbMaxTop);
	
	oLay.layBGCol.top = (oLay.dir==1) ? oLay.layThumb.top : gScrollBarWidth;
	
	oLay.layBGCol.clip.bottom = (oLay.dir==1) ? oLay.scrToTravel : oLay.layThumb.top-gScrollBarWidth;
	oLay.layBGCol.moveAbove(oLay.layBG);
	oLay.docAlign();
}



// ========= MOUSE OUT EVENTS =========
/*
--------------------------------------------------------------------------------
scrollButOut
--------------------------------------------------------------------------------*/
function scrollButOut()
{
	// This is fired local to the image
	var oLay = this.xLayer;
	scrollClearTimers();
	oLay.butImage.src = oLay.butImage.origSrc;
	oLay.butImage.onmouseover = oLay.butDown;
}


// ========= MOUSE UP EVENTS =========
/*
--------------------------------------------------------------------------------
scrollButUp
--------------------------------------------------------------------------------*/
function scrollButUp()
{
	// Event could be from anywhere
	var oLay = gScrollActiveItem;
	scrollClearTimers();
	oLay.butImage.src = oLay.butImage.origSrc;
	oLay.butImage.onmouseout = oLay;
	oLay.butImage.onmouseover = oLay;
	releaseEvents(Event.MOUSEUP);
	return false;
}

/*
--------------------------------------------------------------------------------
scrollThumbUp
--------------------------------------------------------------------------------*/
function scrollThumbUp()
{
	releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);
}

/*
--------------------------------------------------------------------------------
scrollBackUp
--------------------------------------------------------------------------------*/
function scrollBackUp()
{
	// Event could be from anywhere
	var oLay = gScrollActiveItem;
	scrollClearTimers();
	releaseEvents(Event.MOUSEUP);
	oLay.layBG.moveAbove(oLay.layBGCol);
	return false;
}


/*
--------------------------------------------------------------------------------
scrollDocAlign
--------------------------------------------------------------------------------*/
scrollDocAlign=function()
{
	var thumbDiff = this.layThumb.top - gScrollBarWidth;
	this.top = this.origTop - (thumbDiff*this.docPixels);
	this.clip.top = (thumbDiff*this.docPixels);
	this.clip.height = this.origHeight;
}
