//JONK's getAcuElementById------
// some browser sniffing:
document.version = parseFloat(navigator.appVersion);
document.hostApplication = navigator.appName.substring(0,3);
document.browserClass = parseInt(document.version);
			
if(document.browserClass < 4) 
{
 // redirect -- no CSS support
 // if you used &lt;script language=javascript1.2&gt; 
 // this won't be necessary
 // ALL this code will be ignored!
}
else      // isolate this setup from "modern" browsers!!
if(document.browserClass == 4) // might need to check NN5 browsers as well
{

	if(document.hostApplication == "Net") // got netscape?
	{
		  // need to "fake" the style attribute
		  // so we add a little misdirection
		  // by creating an object that will
		  // intercept the property setting.
		  // we make NN think it's setting properties 
		  // in A style object, when it is actually
		  // redirected to set the property to the actual layer
		   // and you might have thought it couldn't be done...
		 function _style()
		 {
		  this.layerRef = null;    // this will be set when <B style="COLOR: black; BACKGROUND-COLOR: #ffff66">getElementByID</B> is called

		  /* we don't actually need these -- it's just pseudocode
		  this.visibility = "";
		  this.top = 0;
		  this.left = 0;
		  */
						   
		   // very cool method in NN (only) -- 
		   // since these aren't "real" object properties
		   // it's more like a watchdog
		   // for more info -- check Netscape's docs
		  this.watch("visibility", 
		     function(id, old, nval) 
		      {  // set the "real" property of the layer here
		       eval("this.layerRef." + id + " = '" + nval + "'");
		       return nval; });
		        // you must return either old or nval
		  this.watch("top",
		     function(id, old, nval) {
		       eval("this.layerRef." + id + " = '" + nval + "'");
		      return nval;});
		  this.watch("left",
		     function(id, old, nval) {
		       eval("this.layerRef." + id + " = '" + nval + "'");
		      return nval;});
						  
		   // note: all the inline functions are exactly the same
		   //  you can cut'n'paste for each property you need to watch!
		}

	 // here we set up the "appearance" of a style property

	 Layer.prototype.style = new _style();
	  // each time a new layer is created, a new _style() object
	  // is attached to it
				    
	} // end if NN

	 // here, getElementById is getting declared by BOTH IE4 and NN4 browsers
	document.getAcuElementById = function(name)
	{
		if(document.hostApplication == "Net") // netscape 4
		{
			if (document.browserClass == 4){
				var lyr = eval("document." + name);
						   
			 // only need to do this once, but
			 // what the hey...
			 if(lyr.style != null) lyr.style.layerRef = lyr;
								    
			return lyr;
			}else{
				return document.layers('" + name + "');
			}
		}
		  else // IE
		  {
			return eval("document.all." + name);
		  }
  }
}else // end browserClass == 4
	{
	if(document.hostApplication == "Net"){
		document.getAcuElementById = function(name){
				if(!eval("document." + name)){
					return document.getElementById(name);
				}else{
					return eval("document." + name);
				}
			}
	}else
	{
		document.getAcuElementById = function(name){
				return document.getElementById(name);
			}
	}
}
//END JONK's getAcuElementById---------



/*isIE = ((ua.indexOf("msie") != -1) && (ua.indexOf("opera") == -1) && (ua.indexOf("webtv") == -1)); 
isGecko = (ua.indexOf("gecko") != -1);
isSafari = (ua.indexOf("safari") != -1);*/

var isW3C = (document.getElementById) ? true : false;
var isAll = (document.all) ? true : false;

/***
* getOffsetLeft and getOffsetTop use element's parentOffset to calculate the
* absolute position. If the element is absolutely positioned, the "left" style is used
***/
function getOffsetLeft(p) {
	return p.offsetParent != null ? getInt(p.offsetLeft) + getOffsetLeft(p.offsetParent)
		: ((new RegExp("^(absolute)$","i")).test(getStyleByObj(p, "position")) ? getInt(p.offsetLeft) : getInt(getStyleByObj(p, "left")));
}
function getOffsetTop(p) {
	return p.offsetParent != null ?	getInt(p.offsetTop) + getOffsetTop(p.offsetParent)
		: ((new RegExp("^(absolute)$","i")).test(getStyleByObj(p, "position")) ? getInt(p.offsetTop) : getInt(getStyleByObj(p, "top")));
}

function trim(inputString) {
	if (typeof inputString != "string") return inputString;
	return inputString
		.replace((new RegExp("\\s{2,}","g"))," ");
}

function getEventTarget(e) {
	var obj = e.srcElement ? e.srcElement : e.target;
	return obj;
}

function showObject(obj, useiframehelper) {
	if (useiframehelper == null) useiframehelper = true;
	if (typeof(obj) == "string") obj = getObject(obj);
	if (obj) {
		if (getStyleByObj(obj, "display") == "none") {
			obj.displayattribute = "display";
		} else if (getStyleByObj(obj, "visibility") == "hidden") {
			obj.displayattribute = "visibility";
		}
		
		switch (obj.displayattribute) {
			case "visibility":	obj.style.visibility = "visible";
								break;
			
			case "display":		obj.style.display = "block";
								break;
		}
		
		if (useiframehelper) if ((new RegExp("^(absolute)$","i")).test(getStyleByObj(obj, "position"))) showIFrameHelper(obj);
	}
}

function hideObject(obj, displayattribute) {
	if (typeof(obj) == "string") obj = getObject(obj);
	if (obj) {
		hideIFrameHelper(obj);
		if (displayattribute == null) displayattribute = obj.displayattribute ? obj.displayattribute : (new RegExp("^(absolute)$","i")).test(getStyleByObj(obj, "position")) ? "visibility" : "display";
		switch (displayattribute) {
			case "visibility":	obj.style.visibility = "hidden";
								break;
			case "display":
			default:			obj.style.visibility = "";
								obj.style.display = "none";
								break;
		}
	}
}

function isVisible(obj) {
	return	((!(new RegExp("^(none)$","i")).test(getStyleByObj(obj, "display")) || getStyleByObj(obj, "display") == "") &&
			(!(new RegExp("^(hidden)$","i")).test(getStyleByObj(obj, "visibility")) || getStyleByObj(obj, "visibility") == ""));
}

function showIFrameHelper(obj, stoptrying) {
	var defaultZIndex = 100;
	if (!obj.parentNode && !stoptrying) {
		document.tempobj = obj;
		eval("document.iframehelper_" + obj.uniqueID + " = document.tempobj");
		window.setTimeout("showIFrameHelper(document.iframehelper_" + obj.uniqueID + ", true", 1);
	} else if (obj.parentNode) {
		if (gBrowserType()=='IE' && gOS()=='WIN' && gBrowserVersion() > 5) {
			var IFRAME_ID = 'iframehelper_' + obj.uniqueID;
			if (!getObject(IFRAME_ID)) {
				var newiframe = document.createElement('iframe');
				newiframe.setAttribute("id", IFRAME_ID);
				newiframe.style.position = "absolute";
				newiframe.style.visibility = "hidden";
				newiframe.style.border = 0;
				obj.parentNode.appendChild(newiframe);
			}
			//if (getStyleByObj(obj, "zIndex") == "") obj.style.zIndex = defaultZIndex;
			var iframe = getObject(IFRAME_ID);
			iframe.width = obj.offsetWidth;
			iframe.height = obj.offsetHeight;
			iframe.style.left = obj.offsetLeft;
			iframe.style.top = obj.offsetTop;
			iframe.style.zIndex = getStyleByObj(obj, "zIndex") - 1;
			iframe.frameBorder = 0;
			iframe.style.border = "none";
			iframe.style.visibility = "visible";
			obj.iframehelper = iframe;
			document.tempobj = obj;
			eval("document.iframehelper_" + obj.uniqueID + " = document.tempobj");
			eval("obj.iframehelperupdatefn = function(e){updateIFrameHelper(document.iframehelper_" + obj.uniqueID + ");}");
			addEvent(document, "mousemove", obj.iframehelperupdatefn);
		}
	}
}

function updateIFrameHelper(obj) {
	obj.iframehelper.width = obj.offsetWidth;
	obj.iframehelper.height = obj.offsetHeight;
	obj.iframehelper.style.left = obj.offsetLeft;
	obj.iframehelper.style.top = obj.offsetTop;
	obj.iframehelper.style.zIndex = getStyleByObj(obj, "zIndex") - 1;
}

function hideIFrameHelper(obj) {
	if (gBrowserType()=='IE' && gOS()=='WIN' && gBrowserVersion() > 5) {
		var IFRAME_ID = 'iframehelper_' + obj.uniqueID;
		if (getObject(IFRAME_ID)) {
			getObject(IFRAME_ID).style.visibility = "hidden";
			if (obj.iframehelperupdatefn) removeEvent(document, "mousemove", obj.iframehelperupdatefn);
		}
	}
}

function getObject(objid) {
	var obj = (isAll) ? document.all[objid] : ((isW3C) ? document.getElementById(objid) : null);
	return obj;
}

function addEvent(obj, evtName, fn) {
	try{removeEvent(obj, evtName, fn)}catch(e){}
	if (obj.addEventListener) {
		obj.addEventListener(evtName, fn, false);
	} else if (obj.attachEvent) {
		obj.attachEvent('on' + evtName, fn);
	} else {
		obj['on' + evtName] = fn;
	}
}
						
function removeEvent(obj, evtName, fn) {
	try {
		if (obj.removeEventListener) {
			obj.removeEventListener(evtName, fn, false);
		} else if (obj.detachEvent) {
			obj.detachEvent('on' + evtName, fn);
		} else {
			obj['on' + evtName] = null;
		}
	} catch(e){}
}

function hideOnMouseOut(obj, delay, triggerobjects) {
	if ((new RegExp("\\D")).test(delay) || !delay) delay = 1;
	eval("document.obj_" + obj.uniqueID + " = obj;");
	removeOnMouseOutEvents(obj);
	window.setTimeout("window.clearTimeout(document.obj_" + obj.uniqueID + ".queuehidetimeout);document.obj_" + obj.uniqueID + ".queuehidetimeout=null;",0);
	eval("obj.mouseoverfn = function(e){"
			+ "e.cancelBubble = true;"
			+ "var obj = document.obj_" + obj.uniqueID + ";"
			+ "if (obj.queuehidetimeout) {"
				+ "window.clearTimeout(obj.queuehidetimeout);"
				+ "obj.queuehidetimeout = null;"
			+ "}"
		+ "}"
	);
	eval("obj.queuehidefn = function(e) {"
			+ "var obj = document.obj_" + obj.uniqueID + ";"
			+ "if (!obj.queuehidetimeout && isVisible(obj)) {"
				+ "obj.queuehidetimeout = window.setTimeout(\""
					+ "document.obj_" + obj.uniqueID + ".hidefn()\"," + delay + ");"
			+ "}"
		+ "}"
	);
	eval("obj.hidefn = function(){"
			+ "var obj = document.obj_" + obj.uniqueID + ";"
			+ "hideObject(obj);"
			+ "obj.queuehidetimeout = null;"
			+ "removeOnMouseOutEvents(obj);"
		+ "}"
	);
	addEvent(obj, "mouseover", obj.mouseoverfn);
	addEvent(obj, "mouseout", obj.queuehidefn);
	addEvent(document, "mouseover", obj.queuehidefn);
	for (var i = 0; i < frames.length; i++) {
		var framedoc = frames[i].document ? frames[i].document : frames[i].contentDocument ? frames[i].contentDocument : null;
		if (framedoc != null) addEvent(framedoc, "mouseover", obj.queuehidefn);
	}
	obj.triggerobjects = triggerobjects;
	if (obj.triggerobjects) {
		if (obj.triggerobjects.length) {
			for (var i = 0; i < obj.triggerobjects.length; i++) {
				if (typeof(obj.triggerobjects[i]) == "object") {
					addEvent(obj.triggerobjects[i], "mouseover", obj.mouseoverfn);
					addEvent(obj.triggerobjects[i], "mouseout", obj.queuehidefn);
				}
			}
		} else if (typeof(obj.triggerobjects) == "object") {
			addEvent(obj.triggerobjects, "mouseover", obj.mouseoverfn);
			addEvent(obj.triggerobjects, "mouseout", obj.queuehidefn);
		}
	}
}

function removeOnMouseOutEvents(obj) {
	removeEvent(obj, "mouseover", obj.mouseoverfn);
	removeEvent(obj, "mouseout", obj.queuehidefn);
	removeEvent(document, "mouseover", obj.queuehidefn);
	for (var i = 0; i < frames.length; i++) {
		var framedoc = frames[i].document ? frames[i].document : frames[i].contentDocument ? frames[i].contentDocument : null;
		if (framedoc != null) removeEvent(framedoc, "mouseover", obj.queuehidefn);
	}
	if (obj.triggerobjects) {
		if (obj.triggerobjects.length) {
			for (var i = 0; i < obj.triggerobjects.length; i++) {
				if (typeof(obj.triggerobjects[i]) == "object") {
					removeEvent(obj.triggerobjects[i], "mouseover", obj.mouseoverfn);
					removeEvent(obj.triggerobjects[i], "mouseout", obj.queuehidefn);
				}
			}
		} else if (typeof(obj.triggerobjects) == "object") {
			removeEvent(obj.triggerobjects, "mouseover", obj.mouseoverfn);
			removeEvent(obj.triggerobjects, "mouseout", obj.queuehidefn);
		}
	}
}

/***
* either rng or a doc is required
* tag is optional
***/
function getNodeFromRange(rng, doc, tag) {
	if (!rng) {
		if (!doc) doc = document;
		var rng = getSelectedRange(doc);
	}
	if (rng) {
		if (rng.parentElement) {
			var node = rng.parentElement();
		} else if (rng.startContainer) {
			var node = rng.commonAncestorContainer; // doesn't seem to work in Mozilla
		}
	}
	if (node) {
		if ((!tag) || (typeof(tag) != "string")) return node;
		tag = tag.toLowerCase();
		while ((node) && (node.tagName) && (new String(node.tagName).toLowerCase() != tag)) {
			node = node.parentNode;
		}
		return (!node) || (!node.tagName) ? null : node;
	}
	return null;
}

function selectRange(rng, doc) {
	if (!doc) doc = document;
	var selection = getCurrentSelection(doc);
	if (rng) {
		if (rng.select) {
			select.clear();
			rng.select();
		} else if (selection.addRange) {
			selection.removeAllRanges();
			selection.addRange(rng);
		}
	}
}

function getCurrentSelection(doc) {
	if (!doc) doc = document;
	var selection = document.all ? doc.selection : (doc.defaultView ? doc.defaultView.getSelection() : doc.getSelection());
	return selection;
}

function getSelectedRange(doc) {
	if (!doc) doc = document;
	var selection = getCurrentSelection(doc);
	var rng = document.all ? (selection != null ? selection.createRange() : null) : selection.getRangeAt(selection.rangeCount - 1);
	return rng;
}

function getEventX(e) {
	if (gBrowserType() == 'NS' && !gIsSafari)
		var x = e.pageX;
	else if (gOS() == "MAC")
		var x = event.clientX;
	else
		var x = event ? event.x : e.x;
	
	if (e) {
		var node = getEventTarget(e);
		if (node.ownerDocument) {
			var pframe = node.ownerDocument.parentWindow ? node.ownerDocument.parentWindow : node.ownerDocument.defaultView;
			while ((pframe) && (pframe.frameElement)) {
				x += getOffsetLeft(pframe.frameElement);
				pframe = pframe.parent;
			}
		}
	}
	return x;
}

function getEventY(e) {
	if (gBrowserType() == 'NS' && !gIsSafari)
		var y = e.pageY;
	else if (gOS() == "MAC")
		var y = event.clientY;
	else
		var y = event ? event.y : e.y;
	
	if (e) {
		var node = getEventTarget(e);
		if (node.ownerDocument) {
			var pframe = node.ownerDocument.parentWindow ? node.ownerDocument.parentWindow : node.ownerDocument.defaultView;
			if (pframe) {
				while (pframe.frameElement) {
					y += getOffsetTop(pframe.frameElement);
					pframe = pframe.parent;
				}
			}
		}
	}
	return y;
}

function getInt(i) {
	if (gIsSafari)
		return i.toString().replace((new RegExp("\\D+")),"").valueOf();
	else if ((new RegExp("\\d")).test(i))
		return parseInt(i);
	else
		return 0;
}

function numsort(a,b) {return (a-b);}

function arcopy(a1,a2) {
	for (var i=0; i<a1.length; i++) {
		if ((a1[i]) && (typeof(a1[i]) == "object") && (a1[i].length)) {
			var newArray = new Array();
			arcopy(a1[i], newArray);
			a2[i] = newArray;
		} else {
			a2[i] = a1[i];
		}
	}
}

function getRegExpSafeString(str) {
	return str
		.replace((new RegExp("(\\\\)","g")), "$1$1")
		.replace((new RegExp("\\*","g")), "\\*")
		.replace((new RegExp("\\+","g")), "\\+")
		.replace((new RegExp("\\[","g")), "\\[")
		.replace((new RegExp("\\]","g")), "\\]")
		.replace((new RegExp("\\(","g")), "\\(")
		.replace((new RegExp("\\)","g")), "\\)")
		.replace((new RegExp("\\{","g")), "\\{")
		.replace((new RegExp("\\}","g")), "\\}")
		.replace((new RegExp("\\?","g")), "\\?")
		.replace((new RegExp("\\^","g")), "\\^")
		.replace((new RegExp("\\$","g")), "\\$")
		.replace((new RegExp("\\.","g")), "\\.")
		.replace((new RegExp("\\!","g")), "\\!")
		.replace((new RegExp("\\-","g")), "\\-")
		.replace((new RegExp("\\|","g")), "\\|")
		.replace((new RegExp("\\&","g")), "\\&")
		.replace((new RegExp("\\/","g")), "\\/");
}

function escapeQuotes(str) {
	return str.replace((new RegExp("(^|[^\\]([\\]{2})*)(?=')","g")), "$1\\");
}

function unescapeQuotes(str) {
	return str.replace((new RegExp("((^|[^\\\\])([\\\\]{2})*)[\\\\](?=')","g")), "$1");
}