// Evento y tipo de peticion establecidos por omision
var coEventoPorOmision           = '';
var inTipoPeticionAJAXPorOmision = false;

/**
 * Clase Javascript que gestiona los envios del formulario, recibe como parametro el nombre del formulario
 * y el nombre del parametro evento
 */
function GestorFormulario(vaClaveEvento, coFormulario)
{		
	//Nombre bajo el cual viaja en la peticion el evento
	this.vaClaveEvento = vaClaveEvento;
	
	this.CampoAnterior = ''
	this.primeravez = true;
	
	//Nombre del formulario que se gestiona
	this.coFormulario = coFormulario;
	
	//Gestion de campos dependientes
	this.nodo = document.getElementById(this.coFormulario);
	this.vaActual = '';

	//Valor por ddefecto
	coEventoPorOmision           = '';
	inTipoPeticionAJAXPorOmision = false;

	/**
	 * Metodo que realiza el envio del formulario mediante AJAX, de manera sincrona, para el true del parametro 'inTipoPeticionAJAX'
	 * usando el MotorAJAX. 
	 * En caso de que el parametro 'inTipoPeticionAJAX' tenga valor false:
	 *   - Se crea el campo oculto evento, si no existe, 
	 *   - Se establece el valor del evento con el valor recibido en el parametro coEvento
	 *   - Se envia el formulario
	 */
	this.enviar = function (coEvento, inTipoPeticionAJAX)
	{
		coEventoPorOmision           = '';
		inTipoPeticionAJAXPorOmision = false;

		if (inTipoPeticionAJAX)
		{
			this.enviarSincronoAsincrono(coEvento, true);
		}
		else
		{
			// Abrimos otra pagina de forma controlada, por lo que no preguntamos
			// si realmente se desea abandonar (cancelamos evento onbeforeunload)
			if (document.all)
				window.document.body.onbeforeunload=null;
			else
				window.onbeforeunload=null;

			var campoCoEvento = document.getElementById(this.vaClaveEvento)
			if (campoCoEvento == null)
			{
				campoCoEvento = document.createElement('input');
				campoCoEvento.setAttribute('type', 'hidden');
				campoCoEvento.setAttribute('name', this.vaClaveEvento);
				campoCoEvento.setAttribute('id', this.vaClaveEvento);
				document.forms[this.coFormulario].appendChild(campoCoEvento);
			}
			campoCoEvento.setAttribute('value', coEvento);
			document.forms[this.coFormulario].submit();
			document.forms[this.coFormulario].removeChild(campoCoEvento);
		}
	}
	
	/**
	 * Metodo que realiza el envio del formulario mediante AJAX, de manera sincrona o asincrona
	 * en funcion del parametro boEnvioSincrono.
	 */
	this.enviarSincronoAsincrono = function (coEvento, boEnvioSincrono)
	{
		motorAJAX.enviarSincronoAsincrono (coEvento, boEnvioSincrono);
	}
	
	/**
	 * Metodo que realiza el envio del formulario mediante AJAX, de manera sincrona,
	 * pasandole un par clave-valor para añadir a la request.
	 */
	this.enviarEnlace = function (coEvento, coClave, coValor)
	{
		motorAJAX.enviarEnlace (coEvento, coClave, coValor);
	}

	/**
	 * Metodo que gestiona un envio por cambio de valor, llamando al metodo de envio por cambio de valor simulando
	 * que se ha pulsado la tecla Intro.
	 */
	this.enviarSiCambiaValorCampo = function (coEvento, campo, inTipoPeticionAJAX)
	{
		this.enviarAlPulsarTeclaSiCambiaValorCampo(coEvento, campo, '13', inTipoPeticionAJAX);
	}

	/**
	 * Metodo que evalua si ha habido cambio de valor en un campo y se ha pulsado alguna tecla que tenga asociado
	 * enviar el formulario (Intro, Tabulador), es ese caso actualizando la variable Javascript con el nuevo valor
	 * y se llama al metodo enviar.
	 */
	this.enviarAlPulsarTeclaSiCambiaValorCampo = function (coEvento, campo, coTecla, inTipoPeticionAJAX)
	{
		nombreCampo = campo.name.replace(/\./g, '_');
		nombreCampo = nombreCampo + 'ValorActual';
		
		this.vaActual = this.nodo.getAttribute(nombreCampo);
		
		if ( this.vaActual == null )
		{
			var atr = document.createAttribute(nombreCampo);
			atr.nodeValue = campo.value;
			this.nodo.setAttributeNode(atr);
		}
		else
		{
			if ( (campo.value != this.vaActual) && ((coTecla == 13) || (coTecla == 9)) )
			{
				var atr = document.createAttribute(nombreCampo);
				atr.nodeValue = campo.value;
				this.nodo.setAttributeNode(atr);
				// El set attribute falla en algunos navegadores -chrome-, por lo que no actualizamos
				// el valor del atributo, lo creamos de nuevo.
				//this.nodo.setAttribute(nombreCampo, campo.value);
				this.enviar(coEvento, inTipoPeticionAJAX);
			}
		}
	}

	/**
	* Metodo que controla las pulsaciones de las teclas.
	* Si la tecla pulsada por el usuario es "Intro" y la pulsación no se produce sobre ningun item
	* o el item no es de tipo "submit" se realiza el envio con el evento y tipo de peticion por omision.
	*/
	this.verificarKeycode = function (evento)
	{
		var coKeycode;
		if (window.event)
		{
			evento = window.event;
			coKeycode = evento.keyCode;
		}
		else if (evento)
		{
			coKeycode = evento.which;
		}

		// tecla "Intro"
		if (coKeycode == 13 && coEventoPorOmision != '')
		{
			var elemento = (evento.target) ? evento.target : evento.srcElement;
			var tipo = elemento.getAttribute('type', false);

			/* Añadimos control para no ejecutar evento por omision cuando se pulsa intro en un textarea */
			if ( (tipo == null || tipo.toLowerCase() != 'submit') && (elemento.type != 'textarea') )
			{
				if (evento.preventDefault)
				{
					evento.preventDefault();
					evento.stopPropagation();
				}
				else
				{
					evento.keyCode = 0;
					evento.cancelBubble = true;
					evento.returnValue = false;
				}

				this.enviar(coEventoPorOmision, inTipoPeticionAJAXPorOmision);

				return false;
			}
		}
	}

	/**
	* Metodo que establece el evento por omision, el tipo de peticion AJAX por omision,
	* y la función que controla la pulsación de la tecla Intro
	*/
	this.setEventoPorOmision = function (coEventoPorOmisionL, inTipoPeticionAJAXPorOmisionL, inIntegracionL)
	{
		coEventoPorOmision           = coEventoPorOmisionL;
		inTipoPeticionAJAXPorOmision = inTipoPeticionAJAXPorOmisionL;

		if (!inIntegracionL)
		{
			// Se establece la funcion dedicada a controlar las pulsaciones de las teclas
			var gestorFormularioL = this;
			document.onkeydown = function (evento) { gestorFormularioL.verificarKeycode(evento); };
		}
	}

    /**
     * Este metodo agrega el atributo autocomplete al formulario
     */
    this.establecerAutocompletado = function(boAutocompletado)
    {
        //atributo autocomplete no funciona en IE con SSL.
        //tampoco lo acepta xhtml
        if (!boAutocompletado )
            this.nodo.setAttribute('autocomplete', 'off');
        else
            this.nodo.setAttribute('autocomplete', 'on');
    }
}
