/**
 *	History:	1.0.0	Tom Polchowski	December 30, 2008
*/

if(typeof DOMParser == "undefined"){
	DOMParser = function (){}
 	DOMParser.prototype.parseFromString = function (str, contentType){
		if(typeof ActiveXObject != "undefined") {
			var d = new ActiveXObject("MSXML.DomDocument");
			d.loadXML(str); 
			return d;
		}
    		else if(typeof XMLHttpRequest != "undefined"){
      			var req = new XMLHttpRequest;
      			req.open("GET", "data:" + (contentType || "application/xml") + ";charset=utf-8," + encodeURIComponent(str), false);
      			if (req.overrideMimeType) {
				req.overrideMimeType(contentType);
			}
			req.send(null);
			return req.responseXML;
		}
	}
}

function createXmlHttp(){
	var xmlHttp;
	try{
		xmlHttp=new XMLHttpRequest();
		return xmlHttp;
	}
	catch(e){
		try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
		try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
		try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
		try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
	}
	return null;
}

function AjaxRequest(vurl, vsuccessFunction, verrorFunction, vtimeoutFunction, vtimeout, vpostParams){
	var xmlHttp = createXmlHttp();
	var url = vurl;
	var successFunction = vsuccessFunction;
	var errorFunction = verrorFunction;
	var timeoutFunction = vtimeoutFunction;
	var timeout = vtimeout;
	var postParams = vpostParams;
	var timeoutId = null;
	
	if(xmlHttp == null){
		alert("This site requires that you enable JavaScript in your browser.");
		return false;
	}

	//Disable for IE
	var clientInformation = new ClientInformation();
	if(clientInformation.isInternetExplorer()){
		timeoutFunction = null;
		timeout = null;
	}

	try{
		xmlHttp.ajaxObject = this;
	}
	catch(e) {
		timeoutFunction = null;
		timeout = null;
		timeoutId = null;
	} 

	this.getTimeoutId = function(){
		return timeoutId;
	}

	xmlHttp.onreadystatechange=function(){
		/*
			0 = uninitialized
			1 = loading
			2 = loaded
			3 = interactive
			4 = complete
			
			Properties:
				responseText
				responseXML
				status
				statusText
		*/
		if(xmlHttp.readyState == 4){
			try{
				var ajaxObject = xmlHttp.ajaxObject;
				var timeoutId = ajaxObject.getTimeoutId();
				
				if(timeoutId != null){
					clearTimeout(timeoutId);
				}
			}
			catch(e) {} 

			
			var resp = xmlHttp.responseText;
			var xmlObject = (new DOMParser()).parseFromString(resp, "text/xml");
			if(xmlHttp.status == 200){
				successFunction(xmlHttp, xmlObject);
			}
			else{
				errorFunction(xmlHttp, xmlObject);
			}
		}
		else{
			
		}
	};

	
	this.exec = 
	function (){
		if(postParams == null){
			xmlHttp.open("GET", url, true);
			xmlHttp.send(null);
		}
		else{
			xmlHttp.open("POST", url, true);
			xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xmlHttp.setRequestHeader("Connection", "close");
			var paramString = '';
			for(var i = 0; i < postParams.length; i++){
				if(i > 0) paramString = paramString + '&';
				paramString = paramString + postParams[i][0] + '=' + postParams[i][1];
			}
			xmlHttp.send(paramString);
		}
		
		/* Start up the timeout function */
		if(timeout != null && timeout > 0 && timeoutFunction != null){
			timeoutId = setTimeout(timeoutFunction, timeout);
		}
	};
}

function AjaxXmlParser(){
}

AjaxXmlParser.getFirstNode = 
function getFirstNode(element){
	return AjaxXmlParser.getNode(element, 0);
}

AjaxXmlParser.getNode = 
function getNode(element, node){
	if(!element || !element.childNodes) return null; 

	var counter = 0;
	for(var i = 0; i < element.childNodes.length; i++){
		if(element.childNodes[i]){
			if(element.childNodes[i].nodeType == 1){
				if(counter == node) return element.childNodes[i];
				counter++
			}
		}
	}

	return null;
}

AjaxXmlParser.getText = 
function getText(element){
	if(!element || !element.childNodes) return null; 
	if(!element.childNodes[0]) return null; 
	
	
	return element.childNodes[0];
}
