
function initXMLhttp() {
	//Based on code courtesy of Jim Ley (Jibbering.com)
	//http://jibbering.com/2002/4/httprequest.html

	var xmlhttp = false;

	//for IE
	/*@cc_on @*/	//This is MS JScript's "Conditional Compilation" that lets us test for a version of JScript and whether or
					//not we're permitted to initialize an XMLHTTP object, which may be blocked by end-user security settings.
					//  (It's commented out to block it from other browsers.}
					//  see: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/js56jsconconditionalcompilation.asp

	/*@if (@_jscript_version >= 5)
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (E) {
				xmlhttp = false;
			}
		}
	@else
		xmlhttp = false;
	@end @*/

	//for Mozilla/Safari
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') { //'undefined' is in quotes to avoid the "undefined is undefined" error message in IE5/Mac
		xmlhttp = new XMLHttpRequest();
	}

	return xmlhttp;
}


function xmlParse(text) {
	//http://www.w3schools.com/xml/xml_parser.asp
	// code for IE
	if (window.ActiveXObject)
	  {
	  var doc=new ActiveXObject("Microsoft.XMLDOM");
	  doc.async="false";
	  doc.loadXML(text);
	  }
	// code for Mozilla, Firefox, Opera, etc.
	else
	  {
	  var parser=new DOMParser();
	  var doc=parser.parseFromString(text,"text/xml");
	  }

	// documentElement always represents the root node
	//return doc.documentElement;
	return doc;
}

/*
function importXmlNodes(node) {
	var outNode = document.createDocumentFragment();
	if (node.hasChildNodes()) {
		for (var i=0;i<node.childNodes.length;i++) {
			if (node.childNodes[i].nodeType==1) {
				var kiddie = document.createElement(node.childNodes[i].nodeName);
				var attrs = node.childNodes[i].attributes;
				for (var j=0;j<attrs.length;j++) kiddie.setAttribute(attrs[j].name,attrs[j].value);
				kiddie.appendChild(importXmlNodes(node.childNodes[i]));
				outNode.appendChild(kiddie);
			} else {
				if (node.childNodes[i].nodeType==3) {
					var kiddie = document.createTextNode(node.childNodes[i].nodeValue);
					outNode.appendChild(kiddie);
				}
			}
		}
	}
	return outNode;
}
*/

function importXmlNodes(node) {

	if (document.importNode) { //native functionality, for browsers that support it
		try { //Safari will claim support, but will throw a "NOT SUPPORTED" exception
			return document.importNode(node,true);
		} catch (e) {
		}
	}

	//importNode() not supported by IE<=7 (and Safari support is buggy - see try/catch above)
	switch(node.nodeType) {
		case 1: //element
			var outNode = document.createElement(node.nodeName);
			var attrs = node.attributes;
			for (var i=0;i<attrs.length;i++) outNode.setAttribute(attrs[i].name,attrs[i].value);
			for (var i=0;i<node.childNodes.length;i++) {
				outNode.appendChild(importXmlNodes(node.childNodes[i]));
			}
			return outNode;
			break;
		case 3: //text
			return document.createTextNode(node.nodeValue);
			break;
		case 4: //cdata
			if ((typeof document.createCDATASection)!='undefined') { //IE<=7 doesn't support this
				try { //Safari will claim support, but will throw a "NOT SUPPORTED" exception
					return document.createCDATASection(node.nodeValue);
				} catch (e) {
					return document.createTextNode('<![CDATA['+node.nodeValue+']]>');
				}
			} else {
				return document.createTextNode('<![CDATA['+node.nodeValue+']]>');
			}
			break;
		case 8: //comment
			if (document.createComment) return document.createComment(node.nodeValue);
			break;
	}
}


function sendXMLhttp(url,data,mode) {
	xmlhttp = initXMLhttp(); //initialize an XMLHttpRequest object (returns false if not supported)
	if(xmlhttp.overrideMimeType) xmlhttp.overrideMimeType('text/xml'); //force the response to an XML mime-type, regardless of server headers; not supported in IE<=7
	switch (mode) {
		case 'GET':
			xmlhttp.open("GET", url+'?'+data, false); //3rd param ('false') is whether or not to continue before getting a response
			xmlhttp.send(null);
			break;
		case 'POST':
		default:
			xmlhttp.open("POST", url, false); //3rd param ('false') is whether or not to continue before getting a response
			xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xmlhttp.send(data);
			break;
	}
	var response = new Array;
	if (xmlhttp.status=='200') {
		//var responseNode = xmlhttp.responseXML.getElementsByTagName('results')[0]; //"responseXML()" not supported by IE6
		var responseNode = xmlParse(xmlhttp.responseText).getElementsByTagName('results')[0];
		response[0] = responseNode.getAttribute('status');
		if (first_child(responseNode)) response[1] = first_child(responseNode).nodeValue;
		if (responseNode.hasChildNodes()) {
			var responseWrapper = document.createDocumentFragment();
			for (var i=0;i<responseNode.childNodes.length;i++) responseWrapper.appendChild(importXmlNodes(responseNode.childNodes[i]));
			response[2] = responseWrapper;
		}
	} else {
		response[0] = xmlhttp.status;
		response[1] = 'Server error: '+xmlhttp.statusText;
	}
	return response;
}

