/********************************************************
 * @Author mpoisson
 *
 * Clase para enviar un formulario html utilizando Ajax
 ********************************************************/

// Constructor de la clase
function AjaxForm() {
	_formItemCount = 0;
	_handlerScript = '';
	_containerID = '';
	_waitHtml = '<img src=\"images/bigrotation2.gif\" >';
	_contentTypeHeader = 'application/x-www-form-urlencoded';

	this.keyArray = new Array();
	this.valueArray = new Array();
	_xHttp = getXhttp();

	this.setHandlerScript = setHandlerScript;
	this.getHandlerScript = getHandlerScript;
	this.setContainerID = setContainerID;
	this.getContainerID = getContainerID;
	this.addFormItem = addFormItem;
	this.getFormItem = getFormItem;
	this.getWaitHtml = getWaitHtml;
	this.setWaitHtml = setWaitHtml;
	this.getFormItemCount = getFormItemCount;
	this.getContentTypeHeader = getContentTypeHeader;
	this.send = send;

}

/********************************************************
 * Funciones Publicas
 ********************************************************/

// setea el archivo de manejo del lado del server
function setHandlerScript(script) {
	_handlerScript = script;
}

// devuelve el archivo de manejo seteado del lado del server
function getHandlerScript() {
	return _handlerScript;
}

// setea el ID del elemento html a usar como contenedor de respuestas
function setContainerID(id) {
	_containerID = id;
}

// devuelve el ID del elemento html a usar como contenedor de respuestas
function getContainerID() {
	return _containerID;
}

// Agrega un elemento del formulario para enviar
function addFormItem(key, value) {
	this.keyArray[getFormItemCount()] = key;
	this.valueArray[getFormItemCount()] = value;
	_formItemCount++;

}

// devuelve el valor de un elemento del formulario a partir de la clave
function getFormItem(key) {
	var value = "";
	for (i=0; i< this.keyArray.length; i++) {
		if (this.keyArray[i] == key) {
			value = this.valueArray[i];
		}
	}
	return value;
}

// devuelve el header de content-type
function getContentTypeHeader() {
	return _contentTypeHeader;
}

// setea el header de content-type
function setContentTypeHeader(value) {
	_contentTypeHeader = value;
}

// devuelve el html de wait (mientras se procesa)
function getWaitHtml() {
	return _waitHtml;
}

// setea el html de wait (mientras se procesa)
function setWaitHtml(value) {
	_waitHtml = value;
}

// Devuelve la cantidad de parametros en la lista a enviar
function getFormItemCount() {
	return _formItemCount;
}

// Envia el formulario html al servidor
function send() {

	if ( !_xHttp) {
	   alert('Error retrieving xHttpRequest object')
       return false;
	} else {

		_xHttp.open('POST', getHandlerScript());
	    _xHttp.setRequestHeader('Content-Type', getContentTypeHeader());

	    var parameters = "";
	    for (i=0; i < this.keyArray.length; i++) {
	    	if (i>0) parameters += "&";
			parameters += this.keyArray[i] + "=" + this.valueArray[i];
		}

		if (parameters.length > 0) {
    		//Pongo la ruedita de proceso
    		var ajaxDisplay = document.getElementById(getContainerID());
			ajaxDisplay.innerHTML = getWaitHtml();

    		_xHttp.send(parameters);

			_xHttp.onreadystatechange = function()	{
				if(_xHttp.readyState == 4 && _xHttp.status == 200) {
					setTimeout("writeResponse()" , 1500);
				}
			}
	    }

	}
}

/********************************************************
 * Funciones Privadas
 ********************************************************/

// Devuelve un objeto XmlHttpRequest segun el navegador
function getXhttp () {
	var ajax_request;

	if ( window.ActiveXObject )  {

        var mSoftVersions = ['MSXML2.DOMDocument.5.0','MSXML2.DOMDocument.4.0', 'MSXML2.DOMDocument.3.0',
         					 'MSXML2.DOMDocument.2.0','MSXML2.DOMDocument','Microsoft.XmlDom',
         					 'Msxml2.XMLHTTP','Microsoft.XMLHTTP'];

        for (i=0; i<mSoftVersions.length; i++)  {
            try {
                ajax_request = new ActiveXObject (mSoftVersions[i]);
            }  catch (  e  )  {    }
        }
    }  else if (  !ajax_request && typeof XMLHttpRequest != 'undefined'  )  {
        try {
            ajax_request = new XMLHttpRequest;
        }  catch (  e  )  {    }
    }  else if (  !ajax_request && window.createRequest  )  {
        try {
            ajax_request = window.createRequest;
        }  catch (  e  )  {    }
    }  else  {
        ajax_request = false;
    }

    return ajax_request;
}

// imprime el resultado devuelto por el servidor
function writeResponse() {
	var response = _xHttp.responseText;
	if (response) {
		var ajaxDisplay = document.getElementById(getContainerID());
		ajaxDisplay.innerHTML = response;
	}
}

