/**
 * hml_ajax.js (2008-oct-28)
 * (c) by Alejandro Gudiel
 * All Rights Reserved
 * License does not permit use by third parties
**/
function hmlAjax_createXHR() {
	var objXHR;

	try {
		objXHR = new XMLHttpRequest();
	}
	catch (error) {
		try {
			objXHR = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (error) {
			alert("El navegador no soporta XHR");
			objXHR = null;
		}
	}

	return objXHR;
}

function hmlXHRObject() {
	this.objXHR = hmlAjax_createXHR();
	this.strMethod = "GET";

	var objXHR = this.objXHR;
	var objXHRObject = this;
	this.objXHR.onreadystatechange = function () {
		if (objXHR.readyState == 1) {
			// Object Open
			objXHRObject.onStatusOpen();

			if (objXHRObject.boolSendPending) {
				objXHRObject.boolSendPending = false;
				objXHRObject.send(objXHRObject.strSendPendingParam);
				objXHRObject.strSendPendingParam = false;
			}
		}
		else if (objXHR.readyState == 2) {
			// Sending
			objXHRObject.onStatusSending();
		}
		else if (objXHR.readyState == 3) {
			// Recieving
			objXHRObject.onStatusRecieving();
		}
		else if (objXHR.readyState == 4) {
			// Loaded
			if ((objXHR.status == 200 || objXHR.status == 304)) {
				objXHRObject.onStatusOK();
			}
			else {
				objXHRObject.onStatusFail();
			}
		}		
	}

	this.boolSendPending = false;
	this.strSendPendingParam = false;

	this.open = hmlXHRObject_open;
	this.send = hmlXHRObject_send;
	this.getResponseXMLObject = hmlXHRObject_getResponseXMLObject;

	this.getResponseText = hmlXHRObject_getResponseText;
	this.parseCodeIntoInterfaceObject = hmlXHRObject_parseCodeIntoInterfaceObject;

	this.getStatusText = hmlXHRObject_getStatusText;

	this.onStatusOpen = function () {
	};
	this.onStatusSending = function () {
	};
	this.onStatusRecieving = function () {
	};
	this.onStatusOK = function () {
	};
	this.onStatusFail = function () {
	};
}

function hmlXHRObject_open(strTarget, strMethod) {
	if (!strMethod) strMethod = "GET";

	this.strMethod = strMethod;
	this.objXHR.open(strMethod, strTarget, true);
}

function hmlXHRObject_send(varSend) {
	if (!varSend) varSend = null;

	if (this.objXHR.readyState != 1) {
		this.boolSendPending = true;
		this.strSendPendingParam = varSend;
	}
	else {
		if (varSend != null && typeof(varSend) == "object" && this.strMethod == "POST") {
			var intTMP = 0;
			var strParams = "";
			var boolFirst = true;
			var strValue = "";
			var objElement = false;
			for (intTMP = 0; intTMP < varSend.elements.length; intTMP++) {
				objElement = varSend.elements[intTMP];
				if ((objElement.type == "checkbox" || objElement.type == "radio") && !objElement.checked) continue;
					
				strValue = objElement.value.htmlEntities_decode();
				if (boolFirst) {
					strParams = objElement.name + "=" + strValue;
					boolFirst = false;
				}
				else {
					strParams += "&" + objElement.name + "=" + strValue;
				}
			}
			
			this.objXHR.setRequestHeader("Content-type", "application/x-www-form-urlencoded;");
			this.objXHR.setRequestHeader("Content-length", strParams.length);
			this.objXHR.setRequestHeader("Connection", "close");
			
			this.objXHR.send(strParams);
		}
		else {
			this.objXHR.send(varSend);
		}
	}
}

function hmlXHRObject_getResponseXMLObject() {
	return this.objXHR.responseXML;
}

function hmlXHRObject_getResponseText() {
	return this.objXHR.responseText;
}

function hmlXHRObject_getStatusText() {
	return this.objXHR.statusText;
}

function hmlXHRObject_parseCodeIntoInterfaceObject(objInterface) {
	var strResponceText = this.getResponseText();
	
	var strPaternA = /<script[^>]*>/i;
	var strPaternB = /<\/script>/i;
	var intPosS = strResponceText.search(strPaternA);
	var intPosE = 0;
	
	var strHTML = "";
	var strJava = "";
	var strCurrJava = "";
	var strCurrHTML = "";
	var intCycles = 0;
	while (intPosS >= 0 && intCycles < 100) {		
		strCurrHTML = strResponceText.substr(0, intPosS);
		strCurrHTML = strCurrHTML.replace(strPaternB, "");		
		strHTML += JavaScriptTextTrim(strCurrHTML);
		
		intPosE = strResponceText.search(strPaternB);
		strCurrJava = strResponceText.substr(intPosS, (intPosE - intPosS));
		strCurrJava = strCurrJava.replace(strPaternA, "");
		strJava += JavaScriptTextTrim(strCurrJava);
				
		strResponceText = strResponceText.substr(intPosE);
		strResponceText = strResponceText.replace(strPaternB, "");		
		
		intPosS = strResponceText.search(strPaternA);				
		intCycles++;
	}
	strHTML += JavaScriptTextTrim(strResponceText);
	strHTML = strHTML.replace(strPaternB, "");	
	
	objInterface.innerHTML = strHTML;
	
	var objScript = document.createElement("script");
	objScript.language = "Javascript";
	objScript.type = "text/javascript";
	objScript.text = strJava;	
	objInterface.appendChild(objScript);	
}