/*
	Clase para la generación de formularios ocultos dinámicamente
	
	El formulario se crea con xfdFormulario. Los campos se añaden con el método addCampo
	y se procede al envío con enviaFormulario.
		
	@param metodo	 post ó get
	@param accion	 Página a la que se pasa el control
	@param nombre	 Nombre que se le da al formulario
	@param base		 Objeto de la página sobre el que se creará el formulario
	Dependencias: ninguna.
*/
	function xfdFormulario(metodo,accion,nombre,base)
	{
		// Variables de la clase
		this.metodo = metodo;
		this.accion=accion;
		this.nombre=nombre;
		this.base = base;
		this.formulario=null;
		this.campoActual = 0;
		this.parametros = new Array();
		this.relacionActual = 0;
		this.relaciones=new Array();
		
		// MÉTODOS DE LA CLASE
		
		/**
			Añade un campo al formulario.
			
			@param nombre	Nombre del campo a añadir.
			@param valor 	Valor del campo.
		*/
		this.addCampo=function(campo,valor)
		{
			this.parametros[this.campoActual] = new xfdCampo(campo,valor);
			this.campoActual ++;
		}
		
		/**
			Cambia el valor de un campo. Busca en la matríz de campos un nombre
			igual y sustituye su valor
			@param nombre	Nombre del campo a cambiar.
			@param valor 	Valor del campo.
		*/
		this.setCampo=function(nombre,valor)
		{
			var i=0;
			for (i=0; i <this.campoActual; i++)
			{
				if (this.parametros[i].getNombre()== nombre) break;
			}
			this.parametros[i].setValor(valor);
		}
		
		/**
			Muestra la lista de campos del formulario.
		*/
		this.muestraCampos=function()
		{
			var cadena="";
			var maxCaracteres = 0;
			for (i=0; i <this.campoActual; i++)
			{
				cadena + this.parametros[i].getNombre();
				if ( maxCaracteres < cadena.length) maxCaracteres = cadena.length;
				
			}
			var tabuladores = (maxCaracteres/8)+1
			cadena="";
			for (i=0; i <this.campoActual; i++)
			{
				cadena = cadena + this.parametros[i].getNombre()+"\t"+this.parametros[i].getValor()+"\n";
			}
			alert(nombre+"\n"+"-------------------------------------------"+"\n"+cadena);
		}
		
		/** 
			Añade una relación al formulario. Permite relacionar un campo de un formulario
			visible con un campo visible.
			
			@param item nombre del campo del formulario oculto
			@param referencia objeto que referencia al campo del formulario visible
		*/
		this.addRelacion=function(item,referencia)
		{
			this.relaciones[this.relacionActual] = new xfdRelacion(item,referencia);
			this.relacionActual ++;
		}
		
		/**
		 	Realiza el envio del formulario
		*/
		this.enviaFormulario=function()
		{
			// Primero ajustamos valores en función de las relaciones
			for (i=0; i < this.relacionActual; i++)
			{
				var nuevoValor = this.relaciones[i].getReferencia();
				this.setCampo(this.relaciones[i].getItem(),nuevoValor.value);
			}
			
			//Creamos el formulario y lo enviamos
			this.formulario=document.createElement("FORM");
			this.formulario.method=this.metodo;
			this.formulario.action=this.accion;
			this.formulario.id=this.nombre;
			this.formulario.name=this.nombre;
			
			for (i=0; i <this.campoActual; i++)
			{
				var input = document.createElement("INPUT");
				input.type = "hidden";
				input.name = this.parametros[i].getNombre();
				input.value = this.parametros[i].getValor();
				this.formulario.appendChild(input);
			}
			this.base.appendChild(this.formulario);
			
			this.formulario.submit();
		}
		
		/**
			Borra el objeto formulario de la pantalla.
		*/
		this.borraFormulario=function()
		{
			if (this.formulario == null) return;
			if (this.base == null) return;
			this.base.removeChild(this.formulario);
		}	
		
				
		return this;
	}
	
	/*
		Clase para la gestión de los campos del formulario
		
		Dependencias: ninguna.
	*/
	function xfdCampo(campo, valor)
	{
		this.campo = campo;
		this.valor = valor;
		this.getNombre = function(){return this.campo;}
		this.setNombre = function(nombre){this.campo=nombre;}
		this.getValor = function(){return this.valor;}
		this.setValor = function(valor){this.valor = valor;}
		return this;
	}
	
	
	/**
		Clase auxiliar para gestionar la estrucutura relación. Esta realiza una
		asociación entre el campo visible y el oculto.
		
		@param item nombre del campo del formulario oculto
		@param referencia objeto que referencia al campo del formulario visible
	*/
	function xfdRelacion(item, referencia)
	{
		this.item = item;
		this.referencia = referencia;
		
		// Pbtiene el valor del item
		this.getItem=function(){ return this.item;}
		
		// Obtiene el valor de la referencia
		this.getReferencia=function(){ return this.referencia;}
		
		
	}