var MXml = function()
{}

MXml.prototype.GetHttpRequest = function() {
	if (window.XMLHttpRequest) // Gecko
		return new XMLHttpRequest();
	else if (window.ActiveXObject) // IE
		return new ActiveXObject("MsXml2.XmlHttp");
}

MXml.prototype.LoadUrl = function(urlToCall, asyncFunctionPointer) {
	var oMXml = this;
	var bAsync = (typeof(asyncFunctionPointer) == 'function');
	var oXmlHttp = this.GetHttpRequest();
		
	oXmlHttp.open("GET", urlToCall, bAsync);
	if (bAsync) {	
		oXmlHttp.onreadystatechange = function() {
			if (oXmlHttp.readyState == 4) {
				switch(oXmlHttp.status) {
					case 12029:
					case 12030:
					case 12031:
					case 12152:
					case 12159:
						oXmlHttp.send(postParameters);	
						return;
				}
				
				oMXml.DOMDocument = oXmlHttp.responseXML;
				if (oXmlHttp.status == 200 || oXmlHttp.status == 304)
					asyncFunctionPointer(oMXml);
				else
					alert('XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')');
			}
		}
	}
	oXmlHttp.send(null);
	if (!bAsync) {
		if (oXmlHttp.status == 200 || oXmlHttp.status == 304)
			this.DOMDocument = oXmlHttp.responseXML;
		else {
			alert('XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')');
		}
	}
}

MXml.prototype.LoadPOSTUrl = function(urlToCall, postParameters, asyncFunctionPointer) {
	var oMXml = this;
	var bAsync = (typeof(asyncFunctionPointer) == 'function');
	var oXmlHttp = this.GetHttpRequest();
		
	oXmlHttp.open("POST", urlToCall, bAsync);
	if (bAsync) {	
		oXmlHttp.onreadystatechange = function() {						
			if (oXmlHttp.readyState == 4) {
				switch(oXmlHttp.status) {
					case 12029:
					case 12030:
					case 12031:
					case 12152:
					case 12159:
						oXmlHttp.send(postParameters);	
						return;
				}
				
				oMXml.DOMDocument = oXmlHttp.responseXML;
				if (oXmlHttp.status == 200 || oXmlHttp.status == 304)
					asyncFunctionPointer(oMXml);
				else {
					alert('XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')');
				}
			}
		}
	}
	
	oXmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    oXmlHttp.setRequestHeader("Content-length", postParameters.length);
    oXmlHttp.setRequestHeader("Connection", "close");
	oXmlHttp.send(postParameters);
	if (!bAsync) {
		if (oXmlHttp.status == 200 || oXmlHttp.status == 304)
			this.DOMDocument = oXmlHttp.responseXML;
		else {
			alert('XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')');
		}
	}
}

MXml.prototype.SelectNodes = function(xpath) {
	if (document.all) // IE
		return this.DOMDocument.selectNodes(xpath);
	else { // Gecko
		var aNodeArray = new Array();
		var xPathResult = this.DOMDocument.evaluate(xpath, this.DOMDocument, 
				this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
		if (xPathResult) {
			var oNode = xPathResult.iterateNext();
 			while(oNode) {
 				aNodeArray[aNodeArray.length] = oNode;
 				oNode = xPathResult.iterateNext();
 			}
		} 
		return aNodeArray;
	}
}

MXml.prototype.SelectSingleNode = function(xpath) {
	if (document.all) // IE
		return this.DOMDocument.selectSingleNode(xpath);
	else {	// Gecko
		var xPathResult = this.DOMDocument.evaluate(xpath, this.DOMDocument,
				this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), 9, null);

		if (xPathResult && xPathResult.singleNodeValue)
			return xPathResult.singleNodeValue;
		else	
			return null;
	}
}

