//	alert("Module layerLib.js [v20031220.1] has loaded.");
//  <!-- to use this module, copy following (commented) line to your html file -->
//	<!-- <script src="/{server_alias}/includes/layerLib.js"></script> -->

	/* <!--
	name:	layerLib.js
	dir:	\htdocs\includes
	by: 	OpenAsia Solutions Pte Ltd
	func:	Provides general purpose layer functions that are compatible with
			modern browsers (ie- Netscape 6, 7 and Internet Explorer 5, 6).  These
			functions are also backward compatible with Netscape 4 layers, using
			the deprecated functions listed at the end.
			
			For further information on using layers in the Netscape, refer to the 
			help file 'howto_write_netscape_layers.txt'.
			
			Use of the library requires an initial call to the 'getLayerObj' function 
			which passes the layer id (a string) and optionally the frame reference
			(a window object).  This function returns a layer object, which can then
			be passed as an argument to any of the included functions.  Note that 
			'getLayerObj' places a string representation of the frame reference into
			the layer object. This is used to correctly identify the layer object in
			subsequent calls.
	
			resources:
			Cross-Browser Elements Javascript Library 
				- http://lineoflight.com/w3a/cbe.html
			W3C DOM-2 Overview
				- http://www.zytrax.com/tech/dom/guide.html
			DOM Client Object Cross Reference
				- http://devedge.netscape.com/library/xref/2002/client-data/index.html
			Kevin Ashworth's Javascript Layer Library
				- http://kevinashworth.com/code/lib.js.txt
			Netscape Navigator v4 Object Reference
				- http://www.irt.org/xref/nn_4.htm
			
	rev: 	20010909, wmc, consolidated previously separate code for IE and Netscape
			20020420, wmc, added support to set layer target frame, write to relative
				positioned layer object (using cross-platform 'div' tag), and support
				for writing inline text (for example to 'span' layer nested in a table)
			20031220, wmc, complete rewrite to handle Netscape 6, 7 browsers, and to 
				ensure that all functions can be used in frames environment with minimal
				hassles (provided by new 'getLayerObj' function)
			20050524, wmc, added functions 'setLayerSize' and 'setImageSize' using tuples,
				based on new function 'tupleGetNum'
			20050710, wmc, modified function 'createLayerInLayer' to fix problem detecting
				container in a page without frames (changed 'container.frame' to 
				'container.frames', to test if real frames exist)
			20050727, wmc, modified 'createLayer' and 'createLayerInLayer' to check if IE
				properly creates the style elements (and if not, reapply them), tested 
				'writeLayerStr' for compatability with tables and found that if the table
				is forced to reflow due to a long string, that has the effect of corrupting
				other layers (in IE6), but using DOM methods (eg- 'createTextNode' and 
				'appendChild') has the same result, so it's not the fault of 'innerHTML'
	--> */

var layerLib = this;

function getLayerObj (layerId, frameref) {
	var obj = null;
	if (!frameref) {
		frameref = this.window;
	} else if (typeof(frameref) != 'object' || frameref.document == null) {
		alert("Error in 'getLayerObj' - invalid frame reference (expects window object).");
		return;
	}
	if (typeof(layerId) != 'string') {
		alert("Error in 'getLayerObj' - invalid or missing layer reference (expects string).");
		return (obj);
	}
	if (document.getElementById) {
		obj = frameref.document.getElementById(layerId);		// DOM; IE5, NS6, Mozilla, Opera
	} else if (document.all) {
		obj = frameref.document.all[layerId];					// Proprietary DOM; IE4
	} else if (document.layers) {
		obj = getNestedLayerObj(layerId, frameref.document);	// Netscape 4 layers (check for nested layers)
	} else if (document[layerId]) {
		obj = frameref.document[layerId];						// Netscape alternative (OmniWeb 4.2 and Escape 4)
	}
	if (obj != null)
		obj.frame = frameref.name;							// tag this layer object with its frame name
	return (obj);
}

	// this layer write works within nested layers and table cells
	// however (based on testing) you cannot safely write 'innerHTML' inside tables in IE6; 
	// if the table reflows, it breaks other layers
function writeLayerStr (layerObj, str, appendFlag) {
	if (typeof(str) != 'string') {
		alert("Error in 'writeLayerStr' - invalid layer content (expects string).");
		return;
	}
	if (typeof(layerObj) != 'object') {
		alert("Error in 'writeLayerStr' - invalid layer (expects object).");
		return;
	}
	if (document.getElementById || document.all) {
		if (appendFlag)
			layerObj.innerHTML += "<br>" + str;
		else
			layerObj.innerHTML = str;
	} else if (document.layers) {
		layerWriteNetscape4 (layerObj, str);	// does not support append
	}
}

function createLayer (layerId, frameref) {
	var layerObj;
	var defaultLayerStyleStr = "position:absolute; left:2px; top:2px; width:100px; height:20px; " +
	  "visibility:hidden; background-color:#eeeeee";
	if (!frameref) {
		frameref = this.window;
	} else if (typeof(frameref) != 'object' || frameref.document == null) {
		alert("Error in 'createLayer' - invalid frame reference (expects window object).");
		return;
	}
	if (typeof(layerId) != 'string') {
		alert("Error in 'createLayer' - invalid layer id (expects string).");
		return;
	}
	if (getLayerObj(layerId, frameref) != null) {
		alert("Error in 'createLayer' - the layer '" + layerId + "' already exists.");
		return;
	}
	if (document.getElementById && !document.all) {
		layerObj = frameref.document.createElement('div');
		layerObj.setAttribute('id', layerId);
		layerObj.setAttribute('style', defaultLayerStyleStr);
		if (frameref.document.body) 
			frameref.document.body.appendChild(layerObj);
		else 
			frameref.onload = "frameref.document.body.appendChild(layerObj)";
	} else if (document.all) {
		if (frameref.document.body) 
			frameref.document.body.insertAdjacentHTML('BeforeEnd', '<div id="' + layerId + '" style="' + 
			  defaultLayerStyleStr + '"></div>');
		else
			frameref.onload = "frameref.document.body.insertAdjacentHTML('BeforeEnd', '<div id=\"'" + 
			  layerId + "'\" style=\"'" + defaultLayerStyleStr + "'\"></div>')";
		layerObj = frameref.document.all[layerId];
			// apparently, older versions of IE may ignore the style attribute
		if (layerObj.style.backgroundColor != "#eeeeee") {		
			layerObj.style.top="2px"; 
			layerObj.style.left="2px";
			layerObj.style.width="100px";
			layerObj.style.height="20px";
			layerObj.style.position = "absolute"; 
			layerObj.style.visibility = "hidden"; 
			layerObj.style.backgroundColor = "#eeeeee";
		}
	} else if (document.layers) {
			// note that layer events don't propogate in Netscape 4.x
		frameref.document.layers[layerId] = new Layer(container.width, container);
		layerObj = frameref.document.layers[layerId];
	}
	if (layerObj)
		layerObj.frame = frameref.name;			// tag this layer object with it's frame name
	return (layerObj);
}

function createLayerInLayer (layerId, container) {
	var layerObj;
	var frameref = (container.frames ? eval("top." + container.frame) : this.window);
	var defaultLayerStyleStr = "position:absolute; left:2px; top:2px; width:100px; height:20px; " +
	  "visibility:hidden; background-color:#eeeeee";

	if (typeof(container) != 'object' || !container.id || !container.nodeName.toLowerCase() == "div") {
		alert("Error in 'createLayerInLayer' - invalid container reference (expects layer object).");
		return;
	}
	if (typeof(layerId) != 'string') {
		alert("Error in 'createLayerInLayer' - invalid layer id (expects string).");
		return;
	}
	if (getLayerObj(layerId, frameref)) {
		alert("Error in 'createLayer' - the layer '" + layerId + "' already exists.");
		return;
	}
	if (document.getElementById && !document.all) {
		layerObj = frameref.document.createElement('div');
		layerObj.setAttribute('id', layerId);
		layerObj.setAttribute('style', defaultLayerStyleStr);
		container.appendChild(layerObj);
	} else if (document.all) {
		container.insertAdjacentHTML('BeforeEnd', '<div id="' + layerId + '" style="' + 
		  defaultLayerStyleStr + '"></div>');
		layerObj = frameref.document.all[layerId];
			// apparently, older versions of IE may ignore the style attribute
		if (layerObj.style.backgroundColor != "#eeeeee") {		
			layerObj.style.top="2px"; 
			layerObj.style.left="2px";
			layerObj.style.width="100px";
			layerObj.style.height="20px";
			layerObj.style.position = "absolute"; 
			layerObj.style.visibility = "hidden"; 
			layerObj.style.backgroundColor = "#eeeeee";
		}
	} else if (document.layers) {
			// note that layer events don't propogate in Netscape 4.x
		frameref.container.document.layers[layerId] = new Layer(container.width, container);
		layerObj = frameref.container.document.layers[layerId];
	}
	if (layerObj)
		layerObj.frame = frameref.name;			// tag this layer object with it's frame name
	return (layerObj);
}

function getLayerInfoStr (layerObj) {
	var str = "";
	if (typeof(layerObj) != 'object') {
		alert("Error in 'getLayerInfoStr' - invalid layer (expects object).");
		return;
	}
	if (document.getElementById && !document.all) {
		var isNested = (layerObj.parentNode && layerObj.parentNode.id != null && 
		  layerObj.parentNode.nodeName.toLowerCase() == "div");
		str += "Following is information about the layer '" + layerObj.id + "':\n";
		str += "Actual Window Frame - " + layerObj.ownerDocument.defaultView.name + "\n";
		str += "Assigned Frame in Layer Object - " + layerObj.frame + "\n";
		if (isNested) 
			str += "Is Nested Layer - yes [container id='" + layerObj.parentNode.id + "']\n";
		else
			str += "Is Nested Layer - no \n";
		str += "Document Location - " + layerObj.ownerDocument.location + "\n";
		str += "Visibility - " + layerObj.style.visibility + "\n";
		if (layerObj.innerHTML != "")
			str += "Has Text - yes ['" + layerObj.innerHTML.substr(0, 30) + "']\n";
		else
			str += "Has Text - no \n";
		str += "Current Style - " + layerObj.style.cssText + "\n";
	} else if (document.all) {
		var isNested = (layerObj.parentElement && layerObj.parentElement.id != null && 
		  layerObj.parentElement.nodeName.toLowerCase() == "div");
		str += "Following is information about the layer '" + layerObj.id + "':\n";
		str += "Actual Window Frame - " + layerObj.parentElement.ownerDocument.parentWindow.name + "\n";
		str += "Assigned Frame in Layer Object - " + layerObj.frame + "\n";
		if (isNested) 
			str += "Is Nested Layer - yes [container id='" + layerObj.parentElement.id + "']\n";
		else
			str += "Is Nested Layer - no \n";
		str += "Document Location - " + layerObj.parentElement.ownerDocument.location + "\n";
		str += "Visibility - " + layerObj.style.visibility + "\n";
		if (layerObj.innerHTML != "")
			str += "Has Text - yes ['" + layerObj.innerHTML.substr(0, 30) + "']\n";
		else
			str += "Has Text - no \n";
		str += "Current Style - " + layerObj.style.cssText + "\n";
	} else {
		alert("Error in 'getLayerInfoStr' - this function can only be used in browsers supporting " +
			"either the W3C or Microsoft's document object models.");
	}
	return (str);
}

function setLayerVisibility (layerObj, typeStr) { 
	var validTypes = "visible, hidden, inherit";
	var typeStr = typeStr.toLowerCase();
	if (typeof(typeStr) != 'string' || (validTypes + ",").indexOf(typeStr + ",") < 0) {
		alert("Error in 'setLayerVisibility' - missing or invalid type string " + 
		  "(expects 'visibile', 'hidden', or 'inherit').");
		return;
	}
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) 
			layerObj.style.visibility = typeStr;
		 else if (document.layers)
		 	if (typeStr == "visible") 
				layerObj.visibility = "show";
		 	else if (typeStr == "hidden") 
				layerObj.visibility = "hide";
		 	else if (typeStr == "inherit") 
				layerObj.visibility = "inherit";
	}
}

function getLayerVisibility (layerObj) {
	var typeStr = "";
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) 
			typeStr = layerObj.style.visibility;
		 else if (document.layers)
		 	if (layerObj.visibility == "show")
				typeStr = "visible";
		 	else if (layerObj.visibility == "hide")
				typeStr = "hidden";
		 	else if (layerObj.visibility == "inherit")
				typeStr = "inherit";
	}
	return (typeStr);
}

function setLayerOpacity (layerObj, opacity) { 
	if (typeof(opacity) != 'number' || opacity < 0 || opacity > 100) {
		alert("Error in 'layerLib.setLayerOpacity' - missing or invalid opacity " + 
		  "(expects number from 0 to 100).");
		return;
	}
	if (typeof(layerObj) == 'object') {
		if (document.getElementById && !document.all) 
			layerObj.style.MozOpacity = opacity/100;
		else if (document.all)
			layerObj.filters.alpha.opacity = opacity;
		else if (document.layers)
			;	// opacity is not supported
	}
}

function getLayerOpacity (layerObj) {
	var opacity = -1;
	if (typeof(layerObj) == 'object') {
		if (document.getElementById && !document.all) 
			opacity = layerObj.style.MozOpacity * 100;
		else if (document.all)
			opacity = layerObj.filters.alpha.opacity;
		else if (document.layers)
			;	// opacity is not supported
	}
	return (opacity);
}

function moveLayerTo (layerObj, x, y) {
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.left = x + "px";
			layerObj.style.top = y + "px";
		} else if (document.layers) {
			layerObj.moveTo (x, y);
		}
	}	
}

function moveLayerBy (layerObj, dx, dy) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.left = parseInt(layerObj.style.left) + dx + "px";
			layerObj.style.top = parseInt(layerObj.style.top) + dy + "px";
		} else if (document.layers) {
			layerObj.moveBy (dx,dy);
		}
	}
}

function setLeft (layerObj, x) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.left = x;
		} else if (document.layers) {
			layerObj.left = x;		
		}
	}
}

function setTop (layerObj, y) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.top = y;
		} else if (document.layers) {
			layerObj.top = y;		
		}
	}
}

function setRight (layerObj, x) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.right = x;
		} else if (document.layers) {
			layerObj.right = x;		
		}
	}
}

function setBottom (layerObj, y) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.bottom = y;
		} else if (document.layers) {
			layerObj.bottom = y;		
		}
	}
}

function getLeft (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			return (parseInt(layerObj.style.left));
		} else if (document.layers) {
			return (layerObj.left);		
		}
	}
}

function getTop (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			return (parseInt(layerObj.style.top));
		} else if (document.layers) {
			return (layerObj.top);		
		}
	}
}

function getRight (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			return (parseInt(layerObj.style.right));
		} else if (document.layers) {
			return (layerObj.right);		
		}
	}
}

function getBottom (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			return (parseInt(layerObj.style.bottom));
		} else if (document.layers) {
			return (layerObj.bottom);		
		}
	}
}

function setWidth (layerObj, dx) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.width = dx;
		} else if (document.layers) {
			if (layerObj.document.width)
				layerObj.document.width = dx;
			else 
				layerObj.clip.right = layerObj.clip.left + dx;
		}
	}
}

function setHeight (layerObj, dy) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.height = dy;
		} else if (document.layers) {
			if (layerObj.document.height)
				layerObj.document.height = dy;
			else 
				layerObj.clip.bottom = layerObj.clip.top + dy;
		}
	}
}

function getWidth (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById) {
			return (layerObj.offsetWidth);
		} else if (document.all) {
			if (layerObj.style.pixelWidth)
				return (layerObj.style.pixelWidth);
			else 
				return (layerObj.clientWidth);
		} else if (document.layers) {
			if (layerObj.document.width)
				return (layerObj.document.width);
			else 
				return (layerObj.clip.right - layerObj.clip.left);
		}
	}
}

function getHeight (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById) {
			return (layerObj.offsetHeight);
		} else if (document.all) {
			if (layerObj.style.pixelHeight)
				return (layerObj.style.pixelHeight);
			else 
				return (layerObj.clientHeight);
		} else if (document.layers) {
			if (layerObj.document.height)
				return (layerObj.document.height);
			else 
				return (layerObj.clip.bottom - layerObj.clip.top);
		}
	}
}

function getPageLeft (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			var x = 0;
			while (layerObj.offsetParent != null) {
				x += layerObj.offsetLeft;
				layerObj = layerObj.offsetParent;
			}
			x += layerObj.offsetLeft;
			return (x);
		} else if (document.layers) {
			return (layerObj.pageX);		
		}
	}
}

function getPageTop (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			var y = 0;
			while (layerObj.offsetParent != null) {
				y += layerObj.offsetTop;
				layerObj = layerObj.offsetParent;
			}
			y += layerObj.offsetTop;
			return (y);
		} else if (document.layers) {
			return (layerObj.pageY);		
		}
	}
}

function getzIndex (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			return (layerObj.style.zIndex);
		} else if (document.layers) {
			return (layerObj.zIndex);
		}
	}
}

function setzIndex (layerObj, z) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.zIndex = z;
		} else if (document.layers) {
			layerObj.zIndex = z;
		}
	}
}

function clipLayer (layerObj, cliptop, clipright, clipbottom, clipleft) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			layerObj.style.clip = 'rect(' + cliptop + 'px ' + clipright + 'px ' 
			  + clipbottom + 'px ' + clipleft + 'px)';
		} else if (document.layers) {
			layerObj.clip.left = clipleft;
			layerObj.clip.top = cliptop;
			layerObj.clip.right = clipright;
			layerObj.clip.bottom = clipbottom;
		}
	}
}

function getClipTop (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			if (layerObj.style.clip) 
				return(getClipValuesArray(layerObj.style.clip)[0]);
			else
				return (0);
		} else if (document.layers) {
			return layerObj.clip.top;	
		}
	}
}

function getClipRight (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			if (layerObj.style.clip) 
				return(getClipValuesArray(layerObj.style.clip)[1]);
			else
				return (0);
		} else if (document.layers) {
			return layerObj.clip.right;		
		}
	}
}

function getClipBottom (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			if (layerObj.style.clip) 
				return(getClipValuesArray(layerObj.style.clip)[2]);
			else
				return (0);
		} else if (document.layers) {
			return layerObj.clip.bottom;
		}
	}
}

function getClipLeft (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			if (layerObj.style.clip) 
				return(getClipValuesArray(layerObj.style.clip)[3]);
			else
				return (0);
		} else if (document.layers) {
			return layerObj.clip.left;
		}
	}
}

function getClipWidth (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			if (layerObj.style.clip) {
				var clipValuesArray = getClipValuesArray(layerObj.style.clip);
				return (clipValuesArray[1] - clipValuesArray[3]);
			} else {
				return (layerObj.style.pixelWidth ? layerObj.style.pixelWidth : 0);
			}
		} else if (document.layers) {
			return layerObj.clip.width;
		}
	}
}

function getClipHeight (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) {
			if (layerObj.style.clip) {
				var clipValuesArray = getClipValuesArray(layerObj.style.clip);
				return (clipValuesArray[2] - clipValuesArray[0]);
			} else {
				return (layerObj.style.pixelHeight ? layerObj.style.pixelHeight : 0);
			}
		} else if (document.layers) {
			return layerObj.clip.height;
		}
	}
}

function getClipValuesArray (clipValuesStr) {
	if (typeof(clipValuesStr) == 'string') {
		clipValuesStr = clipValuesStr.substr(clipValuesStr.indexOf("(") + 1);
		clipValuesStr = clipValuesStr.substr(0, clipValuesStr.lastIndexOf(")"));
		var clipValuesArray = clipValuesStr.split(" ");
		for (var i in clipValuesArray)
			clipValuesArray[i] = parseInt(clipValuesArray[i]);
		return (clipValuesArray);
	}
}

function scrollLayerTo (layerObj, x, y, isBound) {
	if (typeof(layerObj) == 'object') {
		var dx = getClipLeft(layerObj) - x;
		var dy = getClipTop(layerObj) - y;
		scrollLayerBy(layerObj, -dx, -dy, isBound);
	}
}

function scrollLayerBy (layerObj, dx, dy, isBound) {
	if (typeof(layerObj) == 'object') {
		var cl = getClipLeft(layerObj);
		var ct = getClipTop(layerObj);
		var cr = getClipRight(layerObj);
		var cb = getClipBottom(layerObj);
		if (isBound) {
			if (cl + dx < 0) 
				dx = -cl;
			else if (cr + dx > getWidth(layerObj)) 
				dx = getWidth(layerObj) - cr;
			if (ct + dy < 0) 
				dy = -ct;
			else if (cb + dy > getHeight(layerObj)) 
				dy = getHeight(layerObj) - cb;
		}
		clipLayer (layerObj, cl + dx, ct + dy, cr + dx, cb + dy);
		moveLayerBy (layerObj, -dx, -dy);
	}
}

function setBgColor (layerObj, color) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) 
			layerObj.style.backgroundColor = color;
		else if (document.layers)
			layerObj.bgColor=color;
	}
}

function setBgImage (layerObj, src) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) 
			layerObj.style.backgroundImage = "url(" + src + ")";
		else if (document.layers)
			layerObj.background.src = src;
	}
}

function getImageObj (imageId, frameref) { 
	var imageObj;
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if (typeof(imageId) != 'string') {
		alert("Error in 'getImageObj' - invalid or missing image reference (expects string).");
		return (null);
	}
	if (document.getElementById) {
			// images ususally have names rather than ids, but try both
		if (frameref.document.getElementById(imageId))
			imageObj = frameref.document.getElementById(imageId);
		else
			imageObj = frameref.document.getElementsByName(imageId).item(0);
		return (imageObj);
	} else if (document.all) {
		return (frameref.document.all[imageId]);
	} else if (document.layers) {
		return (getNestedImageObj(imageId, frameref.document));
	}
}

function getNestedImageObj (imageId, docObj) {
	if (document.layers) {
		var i;
		var imageObj;
		for (i = 0; i < docObj.images.length; i++)
			if (docObj.images[i].name == imageId) 
				return (docObj.images[i]);
		for (i = 0; i < docObj.layers.length; i++)
			if ((imageObj = getNestedImageObj(imageId, docObj.layers[i].document)) != null) {
				imageObj.container = docObj.layers[i];
				return (imageObj);
			}
		return (null);
	}
}

function getImagePageLeft (imageObj) { 
	if (typeof(imageObj) == 'object') {
		if (document.getElementById || document.all) {
			var x = 0;
			while (imageObj.offsetParent != null) {
				x += imageObj.offsetLeft;
				imageObj = imageObj.offsetParent;
			}
			x += imageObj.offsetLeft;
			return (x);
		} else if (document.layers) {
			if (imageObj.container) 
				return (imageObj.container.pageX + imageObj.x);
			else 
				return (imageObj.x);
		}
	}
}

function getImagePageTop (imageObj) { 
	if (typeof(imageObj) == 'object') {
		if (document.getElementById || document.all) {
			var y = 0;
			while (imageObj.offsetParent != null) {
				y += imageObj.offsetTop;
				imageObj = imageObj.offsetParent;
			}
			y += imageObj.offsetTop;
			return (y);
		} else if (document.layers) {
			if (imageObj.container) 
				return (imageObj.container.pageY + imageObj.y);
			else 
				return (imageObj.y);
		}
	}
}

function getWindowWidth (frameref) { 
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if (document.getElementById && !document.all) 		// returns viewport width less scrollbar
		return (frameref.window.innerWidth);
		/*
		return (parseInt(frameref.document.defaultView.getComputedStyle(
		  frameref.document.documentElement, null).getPropertyValue("width")));
		*/
	else if (document.all && frameref.document.body) 
		return (frameref.document.body.clientWidth);
	else if (document.layers)
		return (frameref.window.innerWidth);
}

function getWindowHeight (frameref) { 
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if (document.getElementById && !document.all) 		// returns viewport height less scrollbar
		return (frameref.window.innerHeight);
		/*
		return (parseInt(frameref.document.defaultView.getComputedStyle(
		  frameref.document.documentElement, null).getPropertyValue("height")));
		*/
	else if (document.all && frameref.document.body) 
		return (frameref.document.body.clientHeight);
	else if (document.layers) 
		return (frameref.window.innerHeight);
}

function getPageWidth (frameref) { 
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if ((document.getElementById || document.all) && frameref.document.body) 
		return (frameref.document.body.scrollWidth == 0 ? getWindowWidth(frameref) :
		  frameref.document.body.scrollWidth);
	else if (document.layers) 
		return (frameref.document.width);
}

function getPageHeight (frameref) { 
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if ((document.getElementById || document.all) && frameref.document.body) 
		return (frameref.document.body.scrollHeight == 0 ? getWindowHeight(frameref) :
		  frameref.document.body.scrollHeight);
	else if (document.layers) 
		return (frameref.document.height);
}

function getPageScrollX (frameref) { 
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if ((document.getElementById || document.all) && frameref.document.body) 
		return frameref.document.body.scrollLeft;
	else if (document.layers) 
		return frameref.window.pageXOffset;
}

function getPageScrollY (frameref) { 
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if ((document.getElementById || document.all) && frameref.document.body) 
		return frameref.document.body.scrollTop;
	else if (document.layers) 
		return frameref.window.pageYOffset;
}

function getMouseX (e, frameref) {		// untested
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if ((document.getElementById || document.all) && frameref.document.body) 
		return (frameref.window.event.clientX + frameref.document.body.scrollLeft);
	else if (document.layers) 
		return (e.pageX);
}

function getMouseY (e, frameref) {		// untested
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if ((document.getElementById || document.all) && frameref.document.body) 
		return (frameref.window.event.clientY + frameref.document.body.scrollTop);
	else if (document.layers) 
		return (e.pageY);
}

function setLayerSize (layerId, dimTuple, frameref) {
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if (layerObj = layerLib.getLayerObj(layerId, frameref)) {
		setLeft(layerObj, tupleGetNum(dimTuple, 1));
		setTop(layerObj, tupleGetNum(dimTuple, 2));
		setWidth(layerObj, tupleGetNum(dimTuple, 3));
		setHeight(layerObj, tupleGetNum(dimTuple, 4));
	}
}

function setImageSize (imageId, dimTuple, frameref) {
	if (typeof(frameref) != 'object' || frameref.document == null) 
		frameref = this.window;
	if (imageObj = layerLib.getImageObj(imageId, frameref)) {
		imageObj.width = tupleGetNum(dimTuple, 3);
		imageObj.height = tupleGetNum(dimTuple, 4);
	}
}

	// tuple is a comma-delimited set, tuple elements are accessed from 1 to n
function tupleGetNum (tuple, elementId) {
	var element = "0";
	var tupleArray = tuple.split(",");
	if (elementId > 0 && elementId <= tupleArray.length)
		element = tupleArray[elementId - 1];
	return (Math.floor(element));	
}


	// ** begin deprecated layer writing functions ** //
	
var targetframe = (targetframe ? targetframe : top.bodyframe);

function setLayerTargetFrame (framename) {
	if (typeof(framename) == 'string')
		targetframe = eval(framename);
}

function layerWrite (layerId, str, container) {
		// ignore Netscape 4 'container'
	if (typeof(str) != 'string') {
		alert("Error in 'layerWrite' - invalid layer content (expects string).");
		return;
	}
	if (typeof(layerId) != 'string') {
		alert("Error in 'layerWrite' - invalid layer id (expects string).");
		return;
	} 
	writeLayerStr (getLayerObj(layerId, targetframe), str, append=false);
}

function layerWriteInFrame (layerId, str, frameref, container) {
		// ignore Netscape 4 'container'
	var thisframe = (typeof(frameref) != 'object' ? this.targetframe : frameref);
	if (typeof(str) != 'string') {
		alert("Error in 'layerWriteInFrame' - invalid layer content (expects string).");
		return;
	}
	if (typeof(layerId) != 'string') {
		alert("Error in 'layerWriteInFrame' - invalid layer id (expects string).");
		return;
	} 
	writeLayerStr (getLayerObj(layerId, thisframe), str, append=false);
}

function writeInlineText (container, layerId, str, framename) {
	var layerObj;
	var thisframe = (typeof(framename) != 'string' ? this.targetframe : eval(framename));
	if (typeof(str) != 'string') {
		alert("Error in 'layerWriteInFrame' - invalid layer content (expects string).");
		return;
	}
	if (typeof(layerId) != 'string') {
		alert("Error in 'layerWriteInFrame' - invalid layer id (expects string).");
		return;
	}
	if (typeof(container) != 'string') {
		alert("Error in 'layerWriteInFrame' - invalid layer id (expects string).");
		return;
	}
	if (document.getElementById || document.all) 
		layerObj = getLayerObj(layerId, thisframe);
	else if (document.layers)
		layerObj = getLayerObj(layerId, thisframe);
	writeLayerStr (layerObj, str, append=false);
	setLayerVisibility (layerObj, 'visible')
}

function addLayer (str, container) {
	var i = 0;
	var layerObj;
	if (typeof(str) != 'string') {
		alert("Error in 'addLayer' - invalid layer content (expects string).");
		return;
	}
	if (typeof(container) != 'object')
		container = window.document;
	if (document.getElementById) 
		i = document.getElementsByTagName('div').length;
	else if (document.all)
		i = document.all.tags("div").length
	else if (document.layers)
		i = document.layers.length;
	layerObj = createLayer("created_layer_" + (++i), container);
	writeLayerStr(layerObj, str);
	setLayerVisibility (layerObj, 'visible')
}

	// ** end deprecated layer writing functions ** //

	// ** begin other deprecated layer functions ** //

function getLayer (layerId) {
	return (getLayerObj(layerId));
}

function hideLayer (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) 
			layerObj.style.visibility = "hidden";
		 else if (document.layers) 
			layerObj.visibility = "hide";
	}
}

function showLayer (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) 
			layerObj.style.visibility = "visible";
		 else if (document.layers) 
			layerObj.visibility = "show";
	}
}

function inheritLayer (layerObj) { 
	if (typeof(layerObj) == 'object') {
		if (document.getElementById || document.all) 
			layerObj.style.visibility = "inherit";
		 else if (document.layers) 
			layerObj.visibility = "inherit";
	}
}

function getVisibility (layerObj) {
	return (getLayerVisibility (layerObj));
}

function getIEClipValues (clipValuesStr) {
	return (getClipValuesArray(clipValuesStr));
}

function getImage (imageId, frameref) { 
	return (getImageObj(imageId, frameref));
}

function findNSImage (imageId, docObj) {
	return(getNestedImageObj(imageId, docObj));
}

	// ** end other deprecated layer functions ** //

	// ** begin deprecated Netscape 4 compatible functions ** //
	
function layerWriteNetscape4 (layerObj, str) {
	if (!str || !layerObj || typeof(layerObj) != "object")
		return;

	if (document.layers) {
 			// in case layer is relatively positioned, insert another inside it to contain text
		layerObj.document.layers['insertedDiv'] = new Layer(layerObj.document.width, layerObj);
		insertedLayerObj = layerObj.document.layers['insertedDiv'];
		insertedLayerObj.moveTo(layerObj.left, layerObj.top);
		// insertedLayerObj.resizeTo(layerObj.document.width, layerObj.document.height);
		insertedLayerObj.visibility = "inherit";

			// now write out the text in prevailing style (style must be in this frame)	
		insertedLayerObj.document.open();
		insertedLayerObj.document.write('<p class="ns_layer">' + str + '</p>');
		insertedLayerObj.document.close();

		/*	// this is a slightly less complex alternative which looses background color
		layerObj.document.open();
		layerObj.document.write('<span class="ns_layer"><div id="insertedDiv" style="position:absolute">' + str + '</div></span>');
		layerObj.document.layers['insertedDiv'].moveTo(layerObj.left, layerObj.top);
		layerObj.document.close();
		*/
	}
}

function findNSLayer (layerId, docObj) {
	return (getNestedLayerObj(layerId, docObj));
}

function getNestedLayerObj (layerId, docObj) {
	if (!docObj) docObj = this.window.document;
	if (layerId && docObj.layers) {
		var thisLayer;
		for (var i = 0; i < docObj.layers.length; i++) {
			thisLayer = docObj.layers[i];
			if (thisLayer.name == layerId) {
				return thisLayer;
			} else if (thisLayer.document.layers.length > 0) {
				if ((thisLayer = getNestedLayerObj(layerId, thisLayer.document)) != null)
					return thisLayer;
			}
		}
		alert("Error in 'getNestedLayerObj' - invalid layer reference '" + layerId + "' \n" 
		  + "(remember, if using 'div', define position without using inline styles).");
		return null;
	}
}

	// ** end deprecated Netscape 4 compatible functions ** //

	// use to view contents of arrays or objects
function peekInside (obj, name) {
	var str = "";
	if (typeof(obj) != 'object') {
		alert("Error in 'peekInside' - invalid parameter (expects object).");
		return;
	}
	var objname = (obj.name) ? obj.name : name;
	for (var i in obj)
		str += i + ": " + obj[i] + "\n";
	return ("object '" + objname + "' contains:\n" + str);
}

