//Compatibility javascript, for use with cross-browser coding situations involving XMLfunction XMLHttpObject(){	//Function: XMLHttpObject	//Programmer: Daniel J. Boston	//Date: June 3, 2004 / Rev. June 7, 2004	//Revision: 1.2 Final	//Purpose: Create an XMLHttpRequest object regardless of platform. Note: will not work on old browsers.	//	// Revision 1: Added extra error handling, in-case existing code doesn't work.	var xHttp;	try	{ 		//IE		xHttp = new ActiveXObject("Microsoft.XMLHTTP");	}	catch(e)	{		try		{			//NS, Mozilla codebase			xHttp = new XMLHttpRequest();		}		catch(e)		{			exceptionHandleExp(e, "XMLCompat.js", "XMLHttpObject()");			e.message = "XMLHttpObject: Neither IE or NS code works: " + e.message;			throw e;		}	}		return xHttp;}function XMLDocument(){	//Function: XMLDocument	//Programmer: Daniel J. Boston	//Date: June 3, 2004 / Rev. June 7, 2004	//Revision: 1.2 Final	//Purpose: Create an XML document regardless of platform. Note: will not work on old browsers.	//	// Revision 1: Added extra error handling, in-case existing code doesn't work.		var xObj;		try	{		//IE		xObj = new ActiveXObject("Microsoft.XMLDOM");	}	catch(e)	{		try		{			//NS, Mozilla codebase			xObj = document.implementation.createDocument("", "xObj", null);		}		catch(e)		{			exceptionHandleExp(e, "XMLCompat.js", "XMLDocument()");			e.message = "XMLDocument: Neither IE or NS code works: " + e.message;			throw e;		}	}	return xObj;}function XMLCheckErrors(xObj, module){	//Function: XMLCheckErrors	//Programmer: Daniel J. Boston	//Date: June 3, 2004 / Rev. Jun 7, 2004	//Revision: 0.8 [needs more testing?]	//Purpose: Checks an XML document for validity and calls global error method, regardless of platform. Note: will not work on old browsers.	//	try	{		//IE		if (xObj.parseError.errorCode != 0)		{			errorHandle(true, xObj.parseError.reason, xObj.parseError.line, xObj.parseError.linepos, xObj.parseError.errorCode, xObj.parseError.srcText, module, "XML", xObj.xml);		}	}	catch(e)	{		//NS, Mozilla codebase		if (xObj == null)		{			errorHandle(true, "Error loading XML document found by XMLCheckErrors","","","","", module, "XML", "In XMLCheckErrors(xObj, module): xObj=" + sstr(xObj) + " Module=" + sstr(module));		}		else		{			try			{				if (xObj.getElementsByTagName("parseerror").length > 0)				{					errorHandle(true, "Error loading XML document found by XMLCheckErrors::" + XMLGET(xObj, "//parseerror"),"","","","", module, "XML", "In XMLCheckErrors(xObj, module): xObj=" + sstr(xObj) + " Module=" + sstr(module));				}			}			catch(e)			{				errorHandle(true, "Error handling XML document found by XMLCheckErrors::" + e.message,"","","","", module, "XML", "In XMLCheckErrors(xObj, module): xObj=" + sstr(xObj) + " Module=" + sstr(module));			}		}	}		return true;}function XMLToString(xObj){	//Function: XMLToString	//Programmer: Daniel J. Boston	//Date: June 3, 2004	//Revision: 1.0 [final]	//Purpose: Returns the string representation of an XML document, regardless of platform. Note: will not work on old browsers.	//		var XMLString;		try	{		//NS, Mozilla codebase		var toXMLString = new XMLSerializer();		var header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";		XMLString = toXMLString.serializeToString(xObj);				//NS has a faulty serializer implementation. forgets to include <?xml ?> block.		if (XMLString.indexOf("<?xml") < 0)		{			XMLString = header + XMLString;		}	}	catch(e)	{		try		{			//IE			XMLString = xObj.xml;		}		catch(e)		{			exceptionHandleExp(e, "XMLCompat.js", "XMLToString()");			e.message = "XMLToString: Neither IE or NS code works: " + e.message;			throw e;		}	}	return XMLString;}function XMLLoad(xObj, url){	//Function: XMLLoad	//Programmer: Daniel J. Boston	//Date: June 3, 2004	//Revision: 0.8 [Beta - doesn't handle Netscape right... something's screwed somewhere]	//Purpose: Loads an external XML file regardless of platform. Note: will not work on old browsers.	//	// Note: Do extensive testing on the success field... it doesn't seem to be returning what would be expected.	// Note(2): xObj needs to be an XMLHttpRequest object, or this won't work.	var success = xObj.load(url);	if ((success == true) || (success == undefined))	{		return xObj;		//return XMLLoadString(XMLDocument, retr);//xObj;	}	else if (success == false)	{		errorHandle(true, "Error loading XML document while in XMLLoad()","","","","", "XMLCompat.js", "XML", "xObj=" + XMLToString(xObj) + " url=" + url + " success=" + sstr(success));	}}function XMLLoadString(xObj, strng){	//Function: XMLLoadString	//Programmer: Daniel J. Boston	//Date: June 3, 2004	//Revision: 1.0 [Build Version]	//Purpose: Loads a string to an XML file regardless of platform. Note: will not work on old browsers.	//	xObj.async="false";		var success;		try	{		//IE		success = xObj.loadXML(strng);	}	catch(e)	{		//Possibly NS, Mozilla codebase		try		{			var xParse = new DOMParser();			xObj = xParse.parseFromString(strng, "text/xml");			if (xObj != null)			{				success = true;			}			else			{				success = false;			}			xParse = null;					}		catch(e)		{			//Neither browser, some other error. Fault. Terminate Run.			errorHandle(true, e.message, "", "", e.number & 0xFFFF, "", "XMLCompat.js", "Other", "In XMLLoadString(xObj, strng): xObj=" + sstr(xObj) + " strng=" + sstr(strng));		}	}		if (success)	{		return xObj;	}	else	{		errorHandle(false, "Error loading XML document while in XMLLoadString()","","","","", "XMLCompat.js", "XML", strng);		e = new Error();		e.message = "Exception loading XML document while in XMLLoadString(): xObj=" + sstr(xObj) + " strng=" + sstr(strng);		e.name = "XMLException";		throw e;	}}function XMLSelectNode(xObj, xPath){	//Function: XMLSelectNode	//Programmer: Daniel J. Boston	//Date: June 3, 2004	//Revision: 0.9 [Pre-Release, needs further testing and error supression]	//Purpose: Selects a node. If Mozilla codebase, will capture the first node meeting the xPath string. All other nodes in the nodelist will be ignored. Note: will not work on old browsers.	//	// Notes: xObj needs to be an XMLDocument (or IE equiv), or things won't work all that too hot.	var xNode;	try	{		//IE		xNode = xObj.selectSingleNode(xPath);	}	catch(e)	{		try		{			//NS, Mozilla Codebase					//xPath should be a valid xPath statement ... starting with "//"			var xPath = xPath.substring(2, xPath.length);			var xPath2 = xPath.split("/");			var xPath3 = xObj.documentElement;						var xPath4;			var lockfound;						for (var lPath = 1; lPath < xPath2.length; lPath ++)			{				if (xPath3.length != undefined) 				{					lockfound = false;					for (var tPath = 0; tPath < xPath3.length; tPath ++)					{						xPath4 = xPath3.item(tPath).getElementsByTagName(xPath2[lPath]);												if ((xPath4.length != 0) && (lockfound == false))						{							xPath3 = xPath4;							lockfound = true;						}					}				}				else				{						xPath3 = xObj.documentElement.getElementsByTagName(xPath2[lPath]);				}			}						xNode = xPath3.item(0);		}		catch(e)		{			errorHandle(false, "Error getting XML element while in XMLSelectNode(): " + e.message,"","",e.number & 0xFFFF,"", "XMLCompat.js", "XML", "xObj=" + sstr(xObj) + " xPath=" + sstr(xPath));			e = new Error();			e.message = "Exception getting XML element while in XMLSelectNode(): xObj=" + sstr(xObj) + " xPath=" + sstr(xPath);			e.name = "XMLException";			throw e;		}	}		if (xNode == null)	{		errorHandle(false, "XML element not found while in XMLSelectNode() " + e.message,"","",e.number & 0xFFFF,"", "XMLCompat.js", "XML", "xObj=" + sstr(xObj) + " xPath=" + sstr(xPath));		e = new Error();		e.message = "Exception: XML element not found while in XMLSelectNode(): xObj=" + sstr(xObj) + " xPath=" + sstr(xPath);		e.name = "XMLException";		throw e;	}	return xNode;}function XMLSelectNode2(xObj, xPath){	//Function: XMLSelectNode2	//Programmer: Daniel J. Boston	//Date: June 3, 2004	//Revision: 0.9 [Pre-Release, needs further testing and error supression]	//Purpose: Selects a node. If Mozilla codebase, will capture the first node meeting the xPath string. All other nodes in the nodelist will be ignored. Note: will not work on old browsers.	//	// Notes: xObj should only be a Node or alike, or things won't work all that too hot.	var xNode;	try	{		//IE		xNode = xObj.selectSingleNode(xPath);	}	catch(e)	{		try		{			//NS, Mozilla Codebase					//xPath should be a valid xPath statement ... starting with "//"			var xPath = xPath.substring(2, xPath.length);			var xPath2 = xPath.split("/");			var xPath3 = xObj;			var firstrun = true;						var xPath4;			var lockfound;						for (var lPath = 1; lPath < xPath2.length; lPath ++)			{				if (firstrun != true) 				{					lockfound = false;					for (var tPath = 0; tPath < xPath3.length; tPath ++)					{						xPath4 = xPath3.item(tPath).getElementsByTagName(xPath2[lPath]);												if ((xPath4.length != 0) && (lockfound == false))						{							xPath3 = xPath4;							lockfound = true;						}					}				}				else				{						xPath3 = xObj.getElementsByTagName(xPath2[lPath]);						firstrun = true;				}			}						xNode = xPath3.item(0);		}		catch(e)		{			errorHandle(false, "Error getting XML element while in XMLSelectNode2(): " + e.message,"","",e.number & 0xFFFF,"", "XMLCompat.js", "XML", "xObj=" + sstr(xObj) + " xPath=" + sstr(xPath));			e = new Error();			e.message = "Exception getting XML element while in XMLSelectNode2(): xObj=" + sstr(xObj) + " xPath=" + sstr(xPath);			e.name = "XMLException";			throw e;		}	}		if (xNode == null)	{		errorHandle(false, "XML element not found while in XMLSelectNode2() " + e.message,"","",e.number & 0xFFFF,"", "XMLCompat.js", "XML", "xObj=" + sstr(xObj) + " xPath=" + sstr(xPath));		e = new Error();		e.message = "Exception: XML element not found while in XMLSelectNode2(): xObj=" + sstr(xObj) + " xPath=" + sstr(xPath);		e.name = "XMLException";		throw e;	}	return xNode;}function XMLSetElementText(xElem, xVal){	//Function: XMLSetElementText	//Programmer: Daniel J. Boston	//Date: June 3, 2004	//Revision: 1.0 [Release]	//Purpose: Fills an Element with a value, regardless of platform. Note: will not work on old browsers.	//	// Notes: xElem needs to be of base type Node, or things won't work all that too hot.	//	// Credit: thanks to Edmund Woychowsky for the quick n' dirty browser check line.		var browserCheck = new RegExp('internet explorer','gi');		var toReturn = false;		try	{		if (browserCheck.test(navigator.appName))		{			xElem.text = xVal;		}		else		{			var replaced = false;			if (xElem.hasChildNodes())			{				xElem.normalize();											for (var tRep = 0; tRep < xElem.childNodes.length; tRep ++)				{					if (xElem.childNodes[tRep].nodeType == 3)					{						xElem.replaceChild(xElem.ownerDocument.createTextNode(xVal), xElem.childNodes[tRep]);						replaced = true;					}				}			}			if (replaced == false)			{				xElem.appendChild(xElem.ownerDocument.createTextNode(xVal));			}		}		toReturn = true;	}	catch(e)	{		errorHandle(false, "Error changing XML contents while in XMLSetElementText(): " + e.message,"","",e.number & 0xFFFF,"", "XMLCompat.js", "XML", "xElem=" + sstr(xElem) + " xVal=" + sstr(xVal));		e = new Error();		e.message = "Exception: XML element contents could not be changed while in XMLSetElemenText(): xElem=" + sstr(xElem) + " xVal=" + sstr(xVal);		e.name = "XMLException";		throw e;	}	return toReturn;}function XMLSET(xElem, xVal){	//Function: XMLSET - wrapper for XMLSetElementText	//Programmer: Daniel J. Boston	//Date: June 3, 2004 - one for all the lazy fellers out there.		return XMLSetElementText(xElem, xVal);}function XMLSET2(xObj, xPath, xVal){	//Function: XMLSET2 - convience wrapper for XMLSetElementText	//Programmer: Daniel J. Boston	//Date: June 3, 2004 - one for all the lazy fellers out there.		return XMLSetElementText(XMLSelectNode(xObj, xPath), xVal);}function XMLGetElementText(xElem){	//Function: XMLGetElementText	//Programmer: Daniel J. Boston	//Date: June 3, 2004	//Revision: 1.0 [Release]	//Purpose: Retrieves the text value of an Element, regardless of platform. Note: will not work on old browsers.	//	// Notes: xElem needs to be of base type Node, or things won't work all that too hot.	// Notes(2): Throws an error if something happens	//	// Credit: thanks to Edmund Woychowsky for the quick n' dirty browser check line.		var browserCheck = new RegExp('internet explorer','gi');		var toReturn = "";		try	{		if (browserCheck.test(navigator.appName))		{			toReturn = xElem.text;		}		else		{			try			{				if (xElem.hasChildNodes())				{					for (var fText = 0; fText < xElem.childNodes.length; fText ++)					{						if (xElem.childNodes.item(fText).nodeType == 3)						{							toReturn = toReturn + sstr(xElem.childNodes.item(fText).nodeValue);						}					}					if (toReturn == "")					{						toReturn = "";					}				}				else				{					toReturn = "";				}			}			catch(e)			{				e.message = "Error inside Netscape/Mozilla object grabcode: " + e.message;				throw e;			}		}	}	catch(e)	{		errorHandle(false, "Couldn't get element value while in XMLGetElementText(): " + e.message,"","",e.number & 0xFFFF,"", "XMLCompat.js", "XML", "xElem=" + sstr(xElem));		e.message = "Couldn't get element value while in XMLGetElementText(): " + e.message;		throw e;			}	return toReturn;}function XMLGET(xElem){	//Function: XMLGET - wrapper for XMLGetElementText	//Programmer: Daniel J. Boston	//Date: June 3, 2004 - one for all the lazy fellers out there.		return XMLGetElementText(xElem);}function XMLClearElementText(xElem){	//Function: XMLClearElementText	//Programmer: Daniel J. Boston	//Date: June 4, 2004	//Revision: 0.5 [Alpha]	//Purpose: Clears the text from an element, if text exists.	//	// Credit: thanks to Edmund Woychowsky for the quick n' dirty browser check line.		var browserCheck = new RegExp('internet explorer','gi');		var toReturn = false;		try	{		if (browserCheck.test(navigator.appName))		{			xElem.text = "";			toReturn = true;		}		else		{			try			{				if (xElem.hasChildNodes())				{					for (var fText = 0; fText < xElem.childNodes.length; fText ++)					{						if (xElem.childNodes.item(fText).nodeType == 3)						{							xElem.removeChild(xElem.childNodes.item(fText));							toReturn = true;						}					}				}			}			catch(e)			{				e.message = "Error inside Netscape/Mozilla object grabcode: " + e.message;				throw e;			}		}	}	catch(e)	{		errorHandle(false, "Couldn't erase element value while in XMLClearElementText(): " + e.message,"","",e.number & 0xFFFF,"", "XMLCompat.js", "XML", "xElem=" + sstr(xElem));		e.message = "Couldn't erase element value while in XMLClearElementText(): " + e.message;		throw e;			}	return toReturn;	}function XMLCET(xElem){	//Function: XMLCET - wrapper for XMLClearElementText	//Programmer: Daniel J. Boston	//Date: June 4, 2004 - one for all the lazy fellers out there.		return XMLClearElementText(xElem);}function XMLFillDocument(xObj, xSpecialString){	//Function: XMLFillDocument	//Programmer: Daniel J. Boston	//Date: June 4, 2004	//Revision: 0.1 [Alpha]	//Purpose: Fills an XMLDocument with values in a specific format string.	//	// Notes: xSpecialString Format is as follows:	//		[xPath]|[xVal]||[xPath2]|[xVal2]||...	//	// 	  xPath[n] needs to be in format //[root]/[elem]/[elem]/[elem]/...	//	  xVal[n] needs to be a valid string.	//		//Parse xSpecialString		xSepElems = xSpecialString.split("||");		for (var fElem = 0; fElem < xSepElems.length; fElem ++)	{		try		{			xCurElem = xSepElems[fElem].split("|");			XMLSET2(xObj, xCurElem[0], xCurElem[1]);		}		catch(e)		{			//Couldn't set it.			e.message = "Error setting " + xSepElems[fElem] + " in XMLFillDocument(): " + e.message;			throw e;		}	}}	function XMLElementsToSpecialString(xObj, xElementsToSave){	//Function: XMLElementsToSpecialString	//Programmer: Daniel J. Boston	//Date: June 4, 2004	//Revision: 0.1 [Alpha]	//Purpose: Grabs elements of an XMLDocument and formats them in xSpecialString format.	//	// Notes: xSpecialString Format is as follows:	//		[xPath]|[xVal]||[xPath2]|[xVal2]||...	//	// 	  xPath[n] needs to be in format //[root]/[elem]/[elem]/[elem]/...	//	  xVal[n] needs to be a valid string.	//	// Notes(2): This will skip and not add any null or empty elements. Otherwise, things would get sticky.	//		//Parse xElementsToSave		toReturn = "";		xSepElems = xElementsToSave.split("|");		for (var gElem = 0; gElem < xSepElems.length; gElem ++)	{		try		{			xCurElemVal = XMLGET(XMLSelectNode(xObj, xSepElems[gElem]));			if (xCurElemVal != "")			{				if (toReturn.length != 0)				{					toReturn = toReturn + "||";				}				toReturn = toReturn + xSepElems[gElem] + "|" + xCurElemVal;			}		}		catch(e)		{			//Perhaps Element doesn't exist? Regardless, fault.			e.message = "Couldn't create xSpecialString in XMLElementsToSpecialString: " + e.message;			throw e;		}	}		return toReturn;}
