// Main layer functions

var dom = (document.getElementById?1:(document.layers?2:(document.all?3:0)));
var w3c = 1;
var ns4 = 2;
var ie4 = 3;
var scrollingID;

function findLayer(name, doc) {
	// For Netscape 4.x to find nested layer

	var i, layer;
	for (i = 0; i < doc.layers.length; i++) {
		layer = doc.layers[i];
		if (layer.name == name) return layer;
		if ((layer.document.layers.length > 0) && ((layer = findLayer(name, layer.document)) != null))
			return layer;
	}
	return null;
}

function getLayer(layer) {
	// Returns the layer object

	switch(dom) {
		case w3c:
			return document.getElementById(layer);
		case ie4:
			return document.all[layer];
		case ns4:
			return findLayer(layer, document);
		default:
			return null;
	}
}

function getLeft(layer) {
	layer = getLayer(layer);
	switch(dom) {
		case w3c:
			return parseInt(layer.style.left);
		case ie4:
			return layer.style.pixelLeft;
		case ns4:
			return layer.left;
		default:
			return -1;
	}
}

function getTop(layer) {
	layer = getLayer(layer);
	switch(dom) {
		case w3c:
			return parseInt(layer.style.top);
		case ie4:
			return layer.style.pixelTop;
		case ns4:
			return layer.top;
		default:
			return -1;
	}
}

function getWidth(layer) {
	layer = getLayer(layer);
	switch(dom) {
		case w3c:
			return layer.offsetWidth;
		case ie4:
			if (layer.style.pixelWidth)
				return layer.style.pixelWidth;
			else
				return layer.clientWidth;
		case ns4:
			if (layer.document.width)
				return layer.document.width;
			else
				return layer.clip.right - layer.clip.left;
		default:
			return -1;
	}
}

function getHeight(layer) {
	layer = getLayer(layer);
	switch(dom) {
		case w3c:
			return layer.offsetHeight;
		case ie4:
			if (layer.style.pixelHeight)
				return layer.style.pixelHeight;
			else
				return layer.clientHeight;
		case ns4:
			if (layer.document.height)
				return layer.document.height;
			else
				return layer.clip.bottom - layer.clip.top;
		default:
			return -1;
	}
}

function moveLayerBy(layer,dx,dy) {
	layer = getLayer(layer);

	switch(dom) {
		case w3c:
			layer.style.left = getLeft(layer.id) + dx + "px";
			layer.style.top = getTop(layer.id) + dy + "px";
			break;
		case ie4:
			layer.style.pixelLeft += dx;
			layer.style.pixelTop += dy;
			break;
		case ns4:
			layer.moveBy(dx,dy);
	}
}

function moveLayerTo(layer,x,y) {
	layer = getLayer(layer);
	switch(dom) {
		case w3c:
			layer.style.left = x + "px";
			layer.style.top = y + "px";
			break;
		case ie4:
			layer.style.pixelLeft = x;
			layer.style.pixelTop = y;
			break;
		case ns4:
			layer.moveTo(x,y);
	}
}

// Layer clipping

function getClipValues(layer) {
	// Parses values from clipping rect for IE and W3C

	var clip = new Array();
	var str = layer.style.clip;

	// Parse out the clipping values
	var clipStart = str.lastIndexOf("(") + 1;
	var clipStop = str.lastIndexOf(")");
	clip = str.slice(clipStart, clipStop).split(" ");

	// Convert 'auto' to proper number
	clip[0] = (clip[0].toString().toLowerCase()=="auto")?0:parseInt(clip[0]);  // Top
	clip[1] = (clip[1]=="auto")?getWidth(layer.id):parseInt(clip[1]);  // Right
	clip[2] = (clip[2]=="auto")?getHeight(layer.id):parseInt(clip[2]);  // Bottom
	clip[3] = (clip[3]=="auto")?0:parseInt(clip[3]);  // Left
	return clip;
}

function clipLayer(layer, cliptop, clipright, clipbottom, clipleft) {
	layer = getLayer(layer);

	cliptop    = (cliptop == "auto")?0:parseInt(cliptop);
	clipright  = (clipright == "auto")?getWidth(layer.id):parseInt(clipright);
	clipbottom = (clipbottom == "auto")?getHeight(layer.id):parseInt(clipbottom);
	clipleft   = (clipleft == "auto")?0:parseInt(clipleft);

	switch(dom) {
		case w3c: case ie4:
			layer.style.clip = 'rect(' + cliptop + ' ' +  clipright + ' ' + clipbottom + ' ' + clipleft + ')';
			break;
		case ns4:
			layer.clip.top    = cliptop;
			layer.clip.right  = clipright;
			layer.clip.bottom = clipbottom;
			layer.clip.left   = clipleft;
	}
}

function getClipTop(layer) {
	layer = getLayer(layer);
	switch(dom) {
		case w3c: case ie4:
			if (!layer.style.clip) return 0;
			var clip = getClipValues(layer);
			return(clip[0]);
		case ns4:
			return layer.clip.top;
		default:
			return -1;
	}
}

function getClipBottom(layer) {
	layer = getLayer(layer);
	switch(dom) {
		case w3c: case ie4:
			if (!layer.style.clip) return getHeight(layer.id);
			var clip = getClipValues(layer);
			return(clip[2]);
		case ns4:
			return layer.clip.bottom;
		default:
			return -1;
	}
}

function getClipHeight(layer) {
	layer = getLayer(layer);
	switch(dom) {
		case w3c: case ie4:
			if (!layer.style.clip) return getHeight(layer.id);
			var clip = getClipValues(layer);
			return(clip[2] - clip[0]);
		case ns4:
			return layer.clip.height;
		default:
			return -1;
	}
}

// Scrolling Content Functions

function ScrollInit(layerName, lefta,topa,widtha,heighta) {
	moveLayerTo(layerName, lefta,topa);
	clipLayer(layerName, 0,widtha,heighta,0);
	scrollingID = "";
}

function ScrollUp(layerName) {
	scrollingID = setInterval("scrollLayerBy('" + layerName + "', -2, true)", 3);
}
function ScrollDown(layerName) {
	scrollingID = setInterval("scrollLayerBy('" + layerName + "', 2, true)", 20);
}
function ScrollStop() {
	window.clearInterval(scrollingID);
}

function scrollLayerBy(layer, dy, bound) {
	var ct = getClipTop(layer);
	var cb = getClipBottom(layer);

	// Do nothing if layer is shorter than table height
	if (getHeight(layer) < cb) { return }

	if (bound) {
		if (ct + dy < 0) dy = -ct;
		else if (cb + dy > getHeight(layer)) dy = getHeight(layer) - cb;
	}

	moveLayerBy(layer, 0, -dy);
	clipLayer(layer, ct + dy, 350, cb + dy, 0);
}

function resetLayer(layer) {
	var dy = getClipTop(layer);
	scrollLayerBy(layer, -dy, true);
}
