/**
 * Clase InnovaAjax.
 * Esta clase encapsula una serie de funciones para facilitar el uso de las técnicas AJAX
 * en los programas.
 * Author: Gustavo Gretter.
 * Copyright: Gustavo Gretter (r) 2006 - Derechos reservados.
 * Ejemplo:
 *
 *		function buttonOnClick() {
 *			var ajax = new InnovaAjax("http://www.innovademo.com", myCallbackFunction);
 *			ajax.loadURL();
 *		}
 *
 *		function MyCallbackFunction(ajax) {
 *			var res = ajax.getResponse();
 *			... hago lo que tenga que hacer ...
 *		}
 *
 *	CONSTRUCTOR
 *	
 *		InnovaAjax(url, callback): 	url corresponde a la dirección del servicio a invocar y callback es la
 *								   	función que procesará el resultado. Si no se especifica, 
 *									únicamente se envía información al servidor.
 *
 *	METODOS:
 *		getMethod()			: Retorna el método que se usara para el envio, GET o POST. Por defecto usa POST.
 *		setMethod(method) 	: Establece el método. El parámetro puede tomar los valores GET o POST.
 *		addForm(id)			: Agrega todos los parámetros del formulario con ese id. Solo se usa cuando el método es POST.
 *		addParam(name,value): Agrega un parámetro al request. Solo se usa cuando el método es POST.
 *		getResponse()		: Retorna la respuesta del servidor.
 */
function InnovaAjax (url, callback)  {

	//Constantes
	this.READY_STATE_UNINITIALIZED=0;
	this.READY_STATE_LOADING=1;
	this.READY_STATE_LOADED=2;
	this.READY_STATE_INTERACTIVE=3;
	this.READY_STATE_COMPLETE=4;	

	//Variables
	this.ajax_url=url;
	this.ajax_req;					//Objeto XML que solicita la información.
	this.ajax_response='';			//Resultado retornado.
	this.ajax_callback=callback;	//CallBack function.
	this.ajax_param=null;			//reserved:Parámetros
	this.ajax_method="POST";
	this.msg="";
	this.contentType="application/x-www-form-urlencoded;charset=ISO-8859-1";
	if (document.charset)
		this.charset=document.charset;			//ISO-8859-1
	else if (document.characterSet)
		this.charset=document.characterSet;
	else
		this.charset='ISO-8859-1';
	
	//Métodos.
	this.getMethod=InnovaAjax_getMethod;
	this.setMethod=InnovaAjax_setMethod;
	this.getCharset=InnovaAjax_getCharset;
	this.setCharset=InnovaAjax_setCharset;
	this.getResponse=InnovaAjax_getResponsetText;
	this.loadURL=InnovaAjax_LoadURL;
	this.addParam=InnovaAjax_addParam;
	this.addForm=InnovaAjax_addForm;
	this.privateCallback=InnovaAjax_privateCallback;
	this.includeHTML=InnovaAjax_includeHTML;
}
function InnovaAjax_getMethod() {
	return this.ajax_method;
}
function InnovaAjax_setMethod(method) {
	this.ajax_method=method;
}
function InnovaAjax_setCharset(charset) {
	this.charset=charset;
	this.contentType="application/x-www-form-urlencoded;charset=" + this.charset;
}
function InnovaAjax_getCharset() {
	return this.charset;
}

function InnovaAjax_addParam(name, value) {
	if (this.charset=='UTF-8' || this.charset=="utf-8") {
		if (this.ajax_param==null) {
			this.ajax_param=name+"="+encodeURIComponent(value);
		} else {
			this.ajax_param+="&" +name+"="+encodeURIComponent(value);
		}
	} else {
		if (name.length>0 && ('a' + value).length>1) {
			if (this.ajax_param==null) {
				this.ajax_param=name+"="+escape(value).replace(/\+/g,"%2B");
			} else {
				this.ajax_param+="&"+name+"="+escape(value).replace(/\+/g,"%2B");
			}
		}
	}
}
function InnovaAjax_addParam_UTF8(name, value) {
	if (this.ajax_param==null) {
		this.ajax_param=name+"="+encodeURIComponent(value);
	} else {
		this.ajax_param+="&" +name+"="+encodeURIComponent(value);
	}
}
function InnovaAjax_addParam_ISO88591(name, value) {
	if (name.length>0 && value.length>0) {
		if (this.ajax_param==null) {
			this.ajax_param=name+"="+escape(value).replace(/\+/g,"%2B");
		} else {
			this.ajax_param+="&"+name+"="+escape(value).replace(/\+/g,"%2B");
		}
	}
}
function InnovaAjax_addForm(formId) {
	var form = document.getElementById(formId);
	for (var x=0; x < form.length; x++) { 
		var e = form.elements[x];
		if (e.type=="text") {
			this.addParam(e.name, e.value);
		} else if (e.type=="hidden") {
			this.addParam(e.name, e.value);
		} else if (e.type=="textarea") {
			this.addParam(e.name, e.value);
		} else if (e.type=="checkbox") {
			if (e.checked)
				this.addParam(e.name, e.value);
		} else if (e.type=="radio") {
			if (e.checked)
				this.addParam(e.name, e.value);
		} else if (e.type=="select-multiple") {
			
		} else if (e.type=="select-one") {
			this.addParam(e.name, e.value);
		} else if (e.type=="button") {
			this.addParam(e.name, e.value);
		} else if (e.type=="submit") {
			this.addParam(e.name, e.value);
		}
	}
}
function InnovaAjax_getResponsetText() {
		return this.ajax_response;
}
function getXMLHTTPRequest() {
	var xRequest=null;
    if (window.XMLHttpRequest) {
        xRequest = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		xRequest = new ActiveXObject("Microsoft.XMLHTTP");		
	}
	return xRequest;
}
function InnovaAjax_LoadURL2() {
	this.ajax_req=getXMLHTTPRequest();
	if (this.ajax_req!=null) {
		if (this.ajax_callback!=null && this.ajax_callback!='') 
			try {
				var currentobj = this;
				this.ajax_req.onreadystatechange = function() {
					currentobj.privateCallback.call(currentobj);
				}
			} catch (e) {
				alert(e);
			}
		else 
			this.ajax_req.onreadystatechange = function(){};
		this.ajax_req.open(this.ajax_method, this.ajax_url + "?" + this.ajax_param, true);		
		this.ajax_req.setRequestHeader("Referer", window.location);
		this.ajax_req.setRequestHeader("Content-Type", this.contentType);
		this.ajax_req.send(null);
	}
}
function InnovaAjax_LoadURL() {
	this.ajax_req=getXMLHTTPRequest();
	if (this.ajax_req!=null) {
		if (this.ajax_callback!=null && this.ajax_callback!='') 
			try {
				var currentobj = this;
				this.ajax_req.onreadystatechange = function() {
					currentobj.privateCallback.call(currentobj);
				}
			} catch (e) {
				alert(e);
			}
		else 
			this.ajax_req.onreadystatechange = function(){};		
		this.ajax_req.open(this.ajax_method, this.ajax_url, true);		
		this.ajax_req.setRequestHeader("Referer", window.location);
		this.ajax_req.setRequestHeader("Content-Type",this.contentType);
		this.ajax_req.send(this.ajax_param);
	}
}
function InnovaAjax_privateCallback() {	
	if (this.ajax_req.readyState == this.READY_STATE_COMPLETE) {
		try {
			if (this.ajax_req.status == 200) {
					this.ajax_response=this.ajax_req.responseText;
			} else {
				this.ajax_response='ERROR:'+this.ajax_req.statusText;
			}
			ajax_reading = false;
		} catch (E)	{
			ajax_reading = false;
		  return false;
		}
		if (this.ajax_callback!='')
			this.ajax_callback(this);
	}
	return false;
}
function InnovaAjax_includeHTML() {
	var auxRequest = getXMLHTTPRequest();
	auxRequest.open('POST',this.ajax_url,false);
	auxRequest.setRequestHeader("Referer", window.location);
	auxRequest.setRequestHeader("Content-Type", this.contentType);
	auxRequest.send(null);
	return auxRequest.responseText;
}
