var zXml = 
{
	useActiveX: (typeof ActiveXObject != "undefined"),
	useDom: document.implementation && document.implementation.createDocument,
	useXmlHttp: (typeof XMLHttpRequest != "undefined")
};
zXml.ARR_XMLHTTP_VERS = ["MSXML2.XmlHttp.6.0", "MSXML2.XmlHttp.3.0"];
zXml.ARR_DOM_VERS = ["MSXML2.DOMDocument.6.0", "MSXML2.DOMDocument.3.0"];
function zXmlHttp()
{
}

zXmlHttp.createRequest = function()
{
	if (zXml.useXmlHttp) 
	{
		return new XMLHttpRequest();
	}
	else 
		if (zXml.useActiveX) 
		{
			if (!zXml.XMLHTTP_VER) 
			{
				for (var i = 0; i < zXml.ARR_XMLHTTP_VERS.length; i++) 
				{
					try 
					{
						new ActiveXObject(zXml.ARR_XMLHTTP_VERS[i]);
						zXml.XMLHTTP_VER = zXml.ARR_XMLHTTP_VERS[i];
						break;
					} 
					catch (oError) 
					{
						;
					}
				}
			}
			if (zXml.XMLHTTP_VER) 
			{
				return new ActiveXObject(zXml.XMLHTTP_VER);
			}
			else 
			{
				throw new Error("Could not create XML HTTP Request.");
			}
		}
		else 
		{
			throw new Error("Your browser doesn't support an XML HTTP Request.");
		}
};
zXmlHttp.isSupported = function()
{
	return zXml.useXmlHttp || zXml.useActiveX;
};
function zXmlDom()
{
}

zXmlDom.createDocument = function()
{
	if (zXml.useDom) 
	{
		var oXmlDom = document.implementation.createDocument("", "", null);
		oXmlDom.parseError = 
		{
			valueOf: function()
			{
				return this.errorCode;
			},
			toString: function()
			{
				return this.errorCode.toString()
			}
		};
		oXmlDom.__initError__();
		oXmlDom.addEventListener("load", function()
		{
			this.__checkForErrors__();
			this.__changeReadyState__(4);
		}, false);
		return oXmlDom;
		;
	}
	else 
		if (zXml.useActiveX) 
		{
			if (!zXml.DOM_VER) 
			{
				for (var i = 0; i < zXml.ARR_DOM_VERS.length; i++) 
				{
					try 
					{
						new ActiveXObject(zXml.ARR_DOM_VERS[i]);
						zXml.DOM_VER = zXml.ARR_DOM_VERS[i];
						break;
					} 
					catch (oError) 
					{
						;
					}
				}
			}
			if (zXml.DOM_VER) 
			{
				return new ActiveXObject(zXml.DOM_VER);
			}
			else 
			{
				throw new Error("Could not create XML DOM document.");
			}
		}
		else 
		{
			throw new Error("Your browser doesn't support an XML DOM document.");
		}
};
zXmlDom.isSupported = function()
{
	return zXml.useDom || zXml.useActiveX;
};
var oMozDocument = null;
if (typeof XMLDocument != "undefined") 
{
	oMozDocument = XMLDocument;
}
else 
	if (typeof Document != "undefined") 
	{
		oMozDocument = Document;
	}
if (oMozDocument && !window.opera) 
{
	oMozDocument.prototype.readyState = 0;
	oMozDocument.prototype.onreadystatechange = null;
	oMozDocument.prototype.__changeReadyState__ = function(iReadyState)
	{
		this.readyState = iReadyState;
		if (typeof this.onreadystatechange == "function") 
		{
			this.onreadystatechange();
		}
	};
	oMozDocument.prototype.__initError__ = function()
	{
		this.parseError.errorCode = 0;
		this.parseError.filepos = -1;
		this.parseError.line = -1;
		this.parseError.linepos = -1;
		this.parseError.reason = null;
		this.parseError.srcText = null;
		this.parseError.url = null;
	};
	oMozDocument.prototype.__checkForErrors__ = function()
	{
		if (this.documentElement.tagName == "parsererror") 
		{
			var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number(\d+),Column(\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;
			reError.test(this.xml);
			this.parseError.errorCode = -999999;
			this.parseError.reason = RegExp.$1;
			this.parseError.url = RegExp.$2;
			this.parseError.line = parseInt(RegExp.$3);
			this.parseError.linepos = parseInt(RegExp.$4);
			this.parseError.srcText = RegExp.$5;
		}
	};
	oMozDocument.prototype.loadXML = function(sXml)
	{
		this.__initError__();
		this.__changeReadyState__(1);
		var oParser = new DOMParser();
		var oXmlDom = oParser.parseFromString(sXml, "text/xml");
		while (this.firstChild) 
		{
			this.removeChild(this.firstChild);
		}
		for (var i = 0; i < oXmlDom.childNodes.length; i++) 
		{
			var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
			this.appendChild(oNewNode);
		}
		this.__checkForErrors__();
		this.__changeReadyState__(4);
	};
	oMozDocument.prototype.__load__ = oMozDocument.prototype.load;
	oMozDocument.prototype.load = function(sURL)
	{
		this.__initError__();
		this.__changeReadyState__(1);
		this.__load__(sURL);
	};
	Node.prototype.__defineGetter__("xml", function()
	{
		var oSerializer = new XMLSerializer();
		return oSerializer.serializeToString(this, "text/xml");
	});
	Node.prototype.__defineGetter__("text", function()
	{
		var sText = "";
		for (var i = 0; i < this.childNodes.length; i++) 
		{
			if (this.childNodes[i].hasChildNodes()) 
			{
				sText += this.childNodes[i].text;
			}
			else 
			{
				sText += this.childNodes[i].nodeValue;
			}
		}
		return sText;
	});
}
function zXslt()
{
}

zXslt.transformToText = function(oXml, oXslt)
{
	if (typeof XSLTProcessor != "undefined") 
	{
		var oProcessor = new XSLTProcessor();
		oProcessor.importStylesheet(oXslt);
		var oResultDom = oProcessor.transformToDocument(oXml);
		var sResult = oResultDom.xml;
		if (sResult.indexOf("<transformiix:result") > -1) 
		{
			sResult = sResult.substring(sResult.indexOf(">") + 1, sResult.lastIndexOf("<"));
		}
		return sResult;
		;
	}
	else 
		if (zXml.useActiveX) 
		{
			return oXml.transformNode(oXslt);
		}
		else 
		{
			throw new Error("No XSLT engine found.");
		}
};
function zXPath()
{
}

zXPath.selectNodes = function(oRefNode, sXPath, oXmlNs)
{
	if (typeof XPathEvaluator != "undefined") 
	{
		oXmlNs = oXmlNs ||
		{};
		var nsResolver = function(sPrefix)
		{
			return oXmlNs[sPrefix];
		};
		var oEvaluator = new XPathEvaluator();
		var oResult = oEvaluator.evaluate(sXPath, oRefNode, nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
		var aNodes = new Array;
		if (oResult != null) 
		{
			var oElement = oResult.iterateNext();
			while (oElement) 
			{
				aNodes.push(oElement);
				oElement = oResult.iterateNext();
			}
		}
		return aNodes;
	}
	else 
		if (zXml.useActiveX) 
		{
			if (oXmlNs) 
			{
				var sXmlNs = "";
				for (var sProp in oXmlNs) 
				{
					sXmlNs += "xmlns:" + sProp + "=\'" + oXmlNs[sProp] + "\' ";
				}
				oRefNode.ownerDocument.setProperty("SelectionNamespaces", sXmlNs);
			};
			return oRefNode.selectNodes(sXPath);
		}
		else 
		{
			throw new Error("No XPath engine found.");
		}
};
zXPath.selectSingleNode = function(oRefNode, sXPath, oXmlNs)
{
	if (typeof XPathEvaluator != "undefined") 
	{
		;
		oXmlNs = oXmlNs ||
		{};
		var nsResolver = function(sPrefix)
		{
			return oXmlNs[sPrefix];
		};
		var oEvaluator = new XPathEvaluator();
		var oResult = oEvaluator.evaluate(sXPath, oRefNode, nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
		if (oResult != null) 
		{
			return oResult.singleNodeValue;
		}
		else 
		{
			return null;
		};
			}
	else 
		if (zXml.useActiveX) 
		{
			if (oXmlNs) 
			{
				var sXmlNs = "";
				for (var sProp in oXmlNs) 
				{
					sXmlNs += "xmlns:\'" + sProp + "=" + oXmlNs[sProp] + "\' ";
				}
				oRefNode.ownerDocument.setProperty("SelectionNamespaces", sXmlNs);
			};
			return oRefNode.selectSingleNode(sXPath);
		}
		else 
		{
			throw new Error("No XPath engine found.");
		}
};
function zXMLSerializer()
{
}

zXMLSerializer.prototype.serializeToString = function(oNode)
{
	var sXml = "";
	switch (oNode.nodeType)
	{
		case 1:
			sXml = "<" + oNode.tagName;
			for (var i = 0; i < oNode.attributes.length; i++) 
			{
				sXml += " " + oNode.attributes[i].name + "=\"" + oNode.attributes[i].value + "\"";
			}
			sXml += ">";
			for (var i = 0; i < oNode.childNodes.length; i++) 
			{
				sXml += this.serializeToString(oNode.childNodes[i]);
			}
			sXml += "</" + oNode.tagName + ">";
			break;
		case 3:
			sXml = oNode.nodeValue;
			break;
		case 4:
			sXml = "<![CDATA[" + oNode.nodeValue + "]]>";
			break;
		case 7:
			sXml = "<?" + oNode.nodevalue + "?>";
			break;
		case 8:
			sXml = "<!--" + oNode.nodevalue + "-->";
			break;
		case 9:
			for (var i = 0; i < oNode.childNodes.length; i++) 
			{
				sXml += this.serializeToString(oNode.childNodes[i]);
			}
			break;
	};
	return sXml;
};

