ie4	= navigator.appName == "Microsoft Internet Explorer" && !document.getElementById ? 1 : 0
ns4	= document.layers ? 1 : 0;
dom	= document.getElementById ? 1 : 0;
ns6 = (navigator.appName.indexOf("Netscape")!=-1 && navigator.appVersion.indexOf("5.")!=-1) ? 1 : 0

mac	= navigator.platform == "MacPPC" ? 1 : 0;
mo5	= navigator.userAgent.indexOf("Gecko") != -1 ? 1 : 0;
minRes = 1;

function makeScrollObj(RootLayerName, ScrollBarTop, ScrollContentTop, ScrollBarMax, ArrowOverSpeed, ArrowDownSpeed, allowScrollDrag, showScrollBar, ImagesLocation, ScrollbarImage, ScrollUpImage, ScrollDownImage){
		this.RootLayerName 		= RootLayerName;
		
		this.lyrFrame			= getLyr(RootLayerName, document)
		this.lyrScrollBar		= getLyr(RootLayerName+"ScrollBar", this.lyrFrame)
		this.lyrScrollUp		= getLyr(RootLayerName+"ScrollUp", this.lyrFrame)
		this.lyrScrollDown		= getLyr(RootLayerName+"ScrollDown", this.lyrFrame)
		this.lyrContainer		= getLyr(RootLayerName+"Container", this.lyrFrame)
		this.lyrContent			= getLyr(RootLayerName+"Content", this.lyrContainer)
		
		this.ScrollBarMax 		= ScrollBarMax;
		this.ScrollBarH 		= ns4 ? this.lyrScrollBar.document.height : this.lyrScrollBar.offsetHeight; 
		this.ScrollBarI			= ScrollBarTop;
		this.scrollTopI			= ScrollContentTop;
		this.scrollTop			= ScrollContentTop;
		
		this.lyrScrollBar.s.top = this.ScrollBarI;
		
		
		this.ImagesLocation 	= ImagesLocation;
		this.ScrollbarImage 	= ScrollbarImage;
		this.ScrollUpImage 		= ScrollUpImage;
		this.ScrollDownImage 	= ScrollDownImage;

		this.ArrowOverSpeed 	= ArrowOverSpeed;
		this.ArrowDownSpeed		= ArrowDownSpeed;
		this.allowScrollDrag	= allowScrollDrag;
		this.showScrollBar		= showScrollBar;
		
		InitializeObj(this);
		
		
		return this;
		
}
function InitializeObj (Object) {

	// THIS CLIP HEIGHT IS EVALUATING TO 0 ON NETSCAPE...
	Object.clipH  			= ns4 ? Object.lyrContainer.document.height : Object.lyrContainer.offsetHeight;
	Object.docH				= Math.max(ns4 ? Object.lyrContent.document.height : Object.lyrContent.offsetHeight, Object.clipH);
	Object.scrollH			= Object.docH - Object.clipH;
	
	// Reset the Content to the Top and the Scrollbar to the Top.
	Object.lyrContent.s.top		= Object.scrollTopI;
	Object.scrollTop			= Object.scrollTopI;
	Object.lyrScrollBar.s.top	= Object.ScrollBarI;
 
	if (Object.docH > Object.clipH) {
		if (document.layers) { 
			Object.lyrScrollBar.captureEvents(Event.MOUSEDOWN)
			Object.lyrScrollUp.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP)
			Object.lyrScrollDown.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP)
		}		
	
		// there has to be scrollbars, so turn them on.
		if (Object.allowScrollDrag) {
			Object.lyrScrollBar.onmousedown   = startDrag;
			Object.lyrScrollBar.onmouseover	= function() { toggleScrollBar(Object,"_o"); document.ObjectInUse = Object;}
			Object.lyrScrollBar.onmouseout	= function() { toggleScrollBar(Object,""); }
			Object.lyrScrollBar.ondragstart	= function() { return false; }		
		}
		if (Object.showScrollBar) Object.lyrScrollBar.s.visibility = "visible";
		
		Object.lyrScrollUp.onmouseover 	= function() { toggleButton(Object,"Up", "_o"); document.ObjectInUse = Object; Object.aniTimer = setInterval("scroll(-"+Object.ArrowOverSpeed+")",minRes);  }
		Object.lyrScrollUp.onmouseout  	= function() { toggleButton(Object,"Up", ""); Object.aniTimer = clearInterval(Object.aniTimer);  }
		Object.lyrScrollDown.onmouseover 	= function() { toggleButton(Object,"Down", "_o"); document.ObjectInUse = Object; Object.aniTimer = setInterval("scroll("+Object.ArrowOverSpeed+")",minRes); }
		Object.lyrScrollDown.onmouseout  	= function() { toggleButton(Object,"Down", ""); Object.aniTimer = clearInterval(Object.aniTimer); }			
		
		if (Object.ArrowDownSpeed > 0) {
			Object.lyrScrollUp.onmousedown 	= function() { toggleButton(Object,"Up", "_o"); document.ObjectInUse = Object; Object.aniTimer = clearInterval(Object.aniTimer); Object.aniTimer = setInterval("scroll(-"+Object.ArrowDownSpeed+")",minRes);}			
			Object.lyrScrollUp.onmouseup 		= function() { toggleButton(Object,"Up", "_o"); document.ObjectInUse = Object; Object.aniTimer = clearInterval(Object.aniTimer); Object.aniTimer = setInterval("scroll(-"+Object.ArrowOverSpeed+")",minRes);}			
			Object.lyrScrollDown.onmousedown 	= function() { toggleButton(Object,"Down", "_o"); document.ObjectInUse = Object; Object.aniTimer = clearInterval(Object.aniTimer); Object.aniTimer = setInterval("scroll("+Object.ArrowDownSpeed+")",minRes); }			
			Object.lyrScrollDown.onmouseup	= function() { toggleButton(Object,"Down", "_o"); document.ObjectInUse = Object; Object.aniTimer = clearInterval(Object.aniTimer); Object.aniTimer = setInterval("scroll("+Object.ArrowOverSpeed+")",minRes); }										
			
			Object.lyrScrollUp.s.visibility = Object.lyrScrollDown.s.visibility	= "visible";
		}
		
	} else {
		with(Object) {
			lyrScrollBar.s.visibility = lyrScrollUp.s.visibility = lyrScrollDown.s.visibility = "hidden";	
		}
	}
}

function toggleScrollBar (Object, iState) {
	var img = getFirstImage(Object.lyrScrollBar)
	if (!Object.dragActive) {
		img.src = Object.ImagesLocation + Object.ScrollbarImage + iState + ".gif"
	}
}
function toggleButton  (Object, suffix, iState) { 
	var lyr = eval("Object.lyrScroll" + suffix);
	var img = getFirstImage(lyr);
	img.src =  Object.ImagesLocation + eval("Object.Scroll"+suffix+"Image") + iState + ".gif";
}



function getFirstImage (lyr) {
	return document.layers ? lyr.document.images[0] : document.all ? lyr.all.tags("IMG")[0] : lyr.getElementsByTagName("IMG")[0]
}
function getLyr (sLyrId, oNestRef) {
	var o;
	if (document.all) {
		o = document.all[sLyrId];
	} else if (document.layers) {
		o = oNestRef.layers[sLyrId];
	} else {
		o = recursiveNs6Get(sLyrId, oNestRef);
	}
	o.s = document.layers ? o : o.style;
	return o;
}
// this is kinda slow for ns6 -> 
// but best way I could think of w/o totally bloating the code.
function recursiveNs6Get (id, p) {
	if (p.childNodes) {
		for (var i = 0; i < p.childNodes.length; i++) {
			if (p.childNodes[i].id == id) return p.childNodes[i]
			else if (p.childNodes[i].childNodes.length > 0) {
				var obj = recursiveNs6Get(id, p.childNodes[i])
				if (obj && obj != null) return obj
			}
		}
	}
	return false
}

function scroll (speed) {
	Object = document.ObjectInUse;
	var ny = Object.scrollTop + speed / 100;
	if (ny > Object.scrollH && speed > 0 || ny < 0 && speed < 0) {
		Object.aniTimer = clearInterval(Object.aniTimer);
		jumpTo(Object, speed > 0 ? Object.scrollH : 0)
	} else {
		jumpTo(Object, ny)
	}
}

function jumpTo (Object, ny) {
	var ScrollBarTop = Object.ScrollBarI + ny * Object.ScrollBarMax / Object.scrollH;
	
	Object.lyrScrollBar.s.top = ScrollBarTop;
	Object.lyrContent.s.top = -ny;
	Object.scrollTop = ny
}

function startDrag(e) {
	if (!e) e = window.event
	var ey = e.pageY ? e.pageY : e.y
	
	document.ObjectInUse.dragLastY = ey
	document.ObjectInUse.dragStartOffset = parseInt(document.ObjectInUse.lyrScrollBar.s.top) - document.ObjectInUse.ScrollBarI;
	document.ObjectInUse.dragActive = true

	if (ns4) window.document.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP)
	window.document.onmousemove = doDrag
	window.document.onmouseup = stopDrag

	return false
}


function doDrag(e) {
	var s  = document.ObjectInUse;
	if (!e) e = window.event
	var ey = (e.pageY ? e.pageY : e.y)
	var dy = ey - s.dragLastY
	var ny = dy + s.dragStartOffset
	ny = Math.min(Math.max(ny, 0), s.ScrollBarMax)

	
	jumpTo(s, ny / s.ScrollBarMax * s.scrollH);
	return false;
}

function stopDrag() {
	document.ObjectInUse.dragActive = false
	toggleScrollBar (document.ObjectInUse, "");
	if (ns4) window.document.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP)
	window.document.onmousemove = null
	window.document.onmouseup   = null
}