	//original code: 
	//http://developer.apple.com/internet/webcontent/xmlhttpreq.html
	//http://developer.apple.com/internet/webcontent/XMLHttpRequestExample/example.html
	//modified by calvin lough
	
	// global flag
	var isIE = false;
	
	// global request and XML document objects
	var req;
	
	// retrieve XML document (reusable generic function);
	// parameter is URL string (relative or complete) to
	// an .xml file whose Content-Type is a valid XML
	// type, such as text/xml; XML source must be from
	// same domain as HTML file
	function loadXMLDoc(url) {
	    // branch for native XMLHttpRequest object
	    if (window.XMLHttpRequest) {
	        req = new XMLHttpRequest();
	        req.onreadystatechange = processReqChange;
	        req.open("GET", url, true);
	        req.send(null);
	    // branch for IE/Windows ActiveX version
	    } else if (window.ActiveXObject) {
	        isIE = true;
	        req = new ActiveXObject("Microsoft.XMLHTTP");
	        if (req) {
	            req.onreadystatechange = processReqChange;
	            req.open("GET", url, true);
	            req.send();
	        }
	    }
	}
	
	// retrieve text of an XML document element, including
	// elements using namespaces
	function getElementTextNS(prefix, local, parentElem, index) {
	    var result = "";
	    if (prefix && isIE) {
	        // IE/Windows way of handling namespaces
	        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
	    } else {
	        // the namespace versions of this method 
	        // (getElementsByTagNameNS()) operate
	        // differently in Safari and Mozilla, but both
	        // return value with just local name, provided 
	        // there aren't conflicts with non-namespace element
	        // names
	        result = parentElem.getElementsByTagName(local)[index];
	    }
	    if (result) {
	        // get text, accounting for possible
	        // whitespace (carriage return) text nodes 
	        if (result.childNodes.length > 1) {
	            return result.childNodes[1].nodeValue;
	        } else {
	            return result.firstChild.nodeValue;    		
	        }
	    } else {
	        return "n/a";
	    }
	}
