var XmlDomHandler = {
	oXmlDomParserDoc : null	
};

function XmlDom() {
	try {
		if (window.ActiveXObject) {
			XmlDomHandler.oXmlDomParserDoc = new ActiveXObject('Microsoft.XMLDOM');				
			XmlDomHandler.oXmlDomParserDoc.async = false;
		} else {
			if(document.implementation.createDocument) {//Firefox
				XmlDomHandler.oXmlDomParserDoc = document.implementation.createDocument('', '', null);					
				XmlDomHandler.oXmlDomParserDoc.async = false;
			}
		}
	} catch(err) {
		this.reportXmlDomError(err.description, 'XmlDom()');
	}
}

XmlDom.prototype.loadXml = function(sResultXml) {
	try {
		if (sResultXml != null && sResultXml != '') {
			if (window.ActiveXObject) { 
				XmlDomHandler.oXmlDomParserDoc.loadXML(sResultXml);
			} else {
				var xmlParser = new	DOMParser();
				XmlDomHandler.oXmlDomParserDoc = xmlParser.parseFromString(sResultXml,"text/xml");
			}
		}
	} catch(err) {
		this.reportXmlDomError(err.description, 'loadXml()');
	}
}

XmlDom.prototype.selectSingleNode = function (sXmlXPath) {
	try {
		if (window.ActiveXObject) {
			return XmlDomHandler.oXmlDomParserDoc.selectSingleNode(sXmlXPath);
		} else {
			if (window.XPathEvaluator) {
				var xpe = new XPathEvaluator();
				var nsResolver = xpe.createNSResolver( XmlDomHandler.oXmlDomParserDoc.ownerDocument == null ? XmlDomHandler.oXmlDomParserDoc.documentElement : XmlDomHandler.oXmlDomParserDoc.ownerDocument.documentElement);
				var results = xpe.evaluate(sXmlXPath,XmlDomHandler.oXmlDomParserDoc,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE, null);
				return results.singleNodeValue;		
			} else {
				var oNSResolver = this.createNSResolver(XmlDomHandler.oXmlDomParserDoc)
				var aItems = this.evaluate(sXmlXPath, null, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
				var aResult = [];
				for( var i = 0; i < aItems.snapshotLength; i++)
				{
					aResult[i] =  aItems.snapshotItem(i);
				}
				return aResult;
			}
		}
	} catch(err) {
		this.reportXmlDomError(err.description, 'selectSingleNode()');
	}
}

XmlDom.prototype.selectNodes = function (sXmlXPath) {
	try {
		if (window.ActiveXObject) {
			return XmlDomHandler.oXmlDomParserDoc.selectNodes(sXmlXPath);
		} else {
			var xpe = new XPathEvaluator();
			var nsResolver = xpe.createNSResolver( XmlDomHandler.oXmlDomParserDoc.ownerDocument == null ? XmlDomHandler.oXmlDomParserDoc.documentElement : XmlDomHandler.oXmlDomParserDoc.ownerDocument.documentElement);
			var results = xpe.evaluate(sXmlXPath,XmlDomHandler.oXmlDomParserDoc,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE, null);
			alert(results.singleNodeValue);
			return results.singleNodeValue;		
		}
	} catch(err) {
		this.reportXmlDomError(err.description, 'selectNodes()');
	}
}

XmlDom.prototype.text = function (xmlNode) {
	try {
		if (window.ActiveXObject) {
			if (xmlNode != null)
				return xmlNode.text;
			else 
				return '';
		} else {
			if (xmlNode != null)
				return xmlNode.textContent;
			else
				return '';
		}
	} catch(err) {
		this.reportXmlDomError(err.description, 'text()');
	}
}

XmlDom.prototype.updateText = function (xmlFieldElem, sFieldValue) {
	try {
		if (xmlFieldElem != null && sFieldValue != '') {
			if (window.ActiveXObject) {
				xmlFieldElem.text = sFieldValue;		
				return xmlFieldElem;
			} else {
				xmlFieldElem.textContent = sFieldValue;
				return xmlFieldElem;
			}
		}
	} catch(err) {
		this.reportXmlDomError(err.description, 'updateText()');
	}
}

XmlDom.prototype.createElement = function (sFieldName) {
	try {
		if (sFieldName != '') {
			if (window.ActiveXObject) {
				return XmlDomHandler.oXmlDomParserDoc.createElement(sFieldName);
			} else {
				return XmlDomHandler.oXmlDomParserDoc.createElement(sFieldName);
			}
		}
	} catch(err) {
		this.reportXmlDomError(err.description, 'createElement()');
	}
}

XmlDom.prototype.xml = function () {
	try {
		if (window.ActiveXObject) {
			//alert(XmlDomHandler.oXmlDomParserDoc.xml());
			return XmlDomHandler.oXmlDomParserDoc.xml;
		} else {
			var sResultXml = new XMLSerializer().serializeToString(XmlDomHandler.oXmlDomParserDoc);
			//alert(sResultXml);
			return sResultXml;
		}
	} catch(err) {
		alert(err.description);
		this.reportXmlDomError(err.description, 'xml()');
	}
}

XmlDom.prototype.appendChild = function (xmlParentNode, xmlChildNode) {
	try {
		if (xmlParentNode != null && xmlChildNode != null) {
			if (window.ActiveXObject) {
				xmlParentNode.appendChild(xmlChildNode);			
			} else {
				xmlParentNode.appendChild(xmlChildNode);
			}
		}
	} catch(err) {
		this.reportXmlDomError(err.description, 'appendChild()');
	}
} 

XmlDom.prototype.reportXmlDomError = function (message, CurrentFunction) {
	try {	
		var today =new Date();
		BuildError = '<type>kiosk</type><date>' + today.toString() + '</date><errormessage>' + message + '</errormessage><page>' + CurrentPageName + '</page><pagenum>' + CurrentPage +  '</pagenum><function>'+ CurrentFunction + '</function>';
		
		alert('message - ' + BuildError + '; CurrentFunction - ' + CurrentFunction);
	} catch(e) {
		alert('test exp'+ CurrentFunction);
		return true;
	}	
    return true;
}

