/*  Tecknosfera DBNET S.L.
	Element: LIB Form Validation
	Programed by: francisco_javier_martinez@hotmail.com
	To : Tecknosfera DBNET S.L.
*/

/*
	Formato de un campo configurado del formulario
	ID = nombre_del_campo¬OB¬Tipo_de_dato
*/

// Clase Current Form
function currentForm()
{
	// Objeto Público de definición de tipos de datos y sus longitudes
	this.lengthTypes = new Object();
	this.lengthTypes["cp"] = 5;
	this.lengthTypes["tlf"] = 9;

	// Elemento separador de atributos en los campos del formulario
	this.configSeparator = "¬";
	
	// Vector donde guardamos los elementos MAL RELLENOS del formulario
	var arrayBadElements = new Array(); // Este objeto consta de: Nombre del campo mal relleno
										//                        Su posición en el formulario
										// 						  El mensaje correspondiente al tipo de dato validado

	// Objeto que define el formato en que se mostrará el error de los campos
	var error = new Object();
	error.type = new Object();
	error.type["makeAlert"] = new Object();
	error.type["makeAlert"].activate = true;

	error.type["remarkFields"] = new Object();
	error.type["remarkFields"].activate = false;
	error.type["remarkFields"].borderFieldSelected = "4px solid Green";
	error.type["remarkFields"].borderInitial = "4px solid #990100";
										
	// variable de control de la cantidad de elementos mal rellenos
	var countBadElements = -1;
		
	// Función para validar los campos del formulario
	this.validateForm = function(formNumber)
	{
		// Limpiamos los errores guardados de anteriores ejecuciones
		cleanErrors();
		
		for(var contElements = 0;contElements < document.forms[formNumber].length;contElements++)
		{
			var actualElement = document.forms[formNumber].elements[contElements]
			// Si el elemento que recorremos NO ES UN BOTON
			if(actualElement.type.toLowerCase() != "button")
			{
				// SI el elemento Actual es OBLIGATORIO
				if(actualElement.id.split(currentForm.configSeparator)[1] == "OB")
				{
					validateElement(contElements,actualElement.id.split(currentForm.configSeparator)[0].replace("_"," ") , actualElement.id.split(currentForm.configSeparator)[2], actualElement.value);
				}
			}
		}
		
		// Comprobamos si hay errores en el formulario
		if(arrayBadElements.length > -1 && arrayBadElements[0])
		{
			// Mostramos los errores
			showFormErrors();
		}
		else
		{
			document.forms[formNumber].submit();
		}
	}
	
	// Función que valida el campo segun su tipo de dato.
	function validateElement(positionInForm, nameElement, typeElement, valueElement)
	{
		// Si el elemento pasado como parámetro está vacio...
		if(valueElement == "")
		{
			setError(getContBadElement(nameElement), nameElement, positionInForm, "Rellene el campo");
		}
		else
		{
			// Validamos el TIPO del campo
			switch(typeElement)
			{
				case "cp":
					if(!valueElement.toLowerCase().match("([0-9]){1,5}"))
					{
						setError(getContBadElement(nameElement), nameElement, positionInForm, "Mal formato en el campo");
					}
				break;
				case "email":
					if(!valueElement.toLowerCase().match("([a-z0-9]){2,}(@)([a-z0-9\-]){2,}(\.)([a-z]){2,}"))
					{
						setError(getContBadElement(nameElement), nameElement, positionInForm, "Formato del e-mail Incorrecto");
					}
				break;
				
				case "text":
				
				break;
			}
		}
	}
	
	// Función que pone el error en la posición que le corresponde del vector
	function setError(posError, nameElementError, positionInForm, menssajeError)
	{
		// Compruebo si NO existe un elemento en esa posición, por lo que crearía uno nuevo...
		if(!arrayBadElements[posError])
		{
			arrayBadElements[posError] = new Object();
		}
		// Pongo los atributos del error correspondiente
		arrayBadElements[posError].nameField = nameElementError;
		arrayBadElements[posError].positionInForm = positionInForm;
		arrayBadElements[posError].menssaje = menssajeError;
	}
	
	// Función que busca en el Vector de elementos mal reyenos que posición ha de tomar el objeto a validar ahora.
	// Si el elemento ya tiene un error asociado, le añadimos mas mensaje a ese elemento
	function getContBadElement(nameBadElement)
	{
		var nexBadPosition = null;
		// Si hay elementos en el array lo recorremos para ver si ESTE está ya dado de alta
		if(arrayBadElements.length > 0)
		{
			var contBad = 0
			var foundedBad = false;
			while(contBad < arrayBadElements.length && foundedBad == false)
			{
				if(arrayBadElements[contBad].nameField == nameBadElement)
				{
					foundedBad = true;
					nexBadPosition = contBad;
				}
				contBad++
			}
			// Si el elemento que estamos validando NO está como error anterior ...
			if(foundedBad == false)
			{
				nexBadPosition = arrayBadElements.length
			}
		}
		else // Si no hay elemento, retornamos la posición siguiente del contador;
		{
			nexBadPosition = countBadElements+1;
		}
		return(nexBadPosition);
	}
	
	// Función que borra el Vector de Errores, de lo que tubiera de otra ejecución
	function cleanErrors()
	{
		arrayBadElements = null;
		arrayBadElements = new Array();

		if(error.type["remarkFields"].activate == true)
		{
			// Ponemos las cajas de texto y todos los elementos en su estado inicial
			for(i=0;i<document.forms[0].length;i++)
			{
				document.forms[0].elements[i].style.border = error.type["remarkFields"].borderInitial;
			}
		}
	}
	
	// Función uqe muestra los errores del formulario.
	// El formato de mostrarlos viene configurado en el objeto Formulario
	function showFormErrors()
	{
		// Comprobamos el formato de salida del mensaje
		
		// Si es mensaje por ALERTA
		if(error.type["makeAlert"].activate == true)
		{
			var menssajeError = "";
			for(i=0;i<arrayBadElements.length;i++)
			{
				menssajeError += "Error en el campo " + arrayBadElements[i].nameField + ". " + arrayBadElements[i].menssaje + ".\n";
			}
			alert(menssajeError)
		}
		// SI es mensaje RESALTANDO CAMPOS
		if(error.type["remarkFields"].activate == true)
		{
			for(i=0;i<arrayBadElements.length;i++)
			{
				document.forms[0].elements[arrayBadElements[i].positionInForm].style.border = error.type["remarkFields"].borderFieldSelected;
			}
		}
	}
	
	
	// ************************************* FUNCIONES PARA VALIDAR LA ENTRADA DE DATOS POR TECLADO *******************************************
	
	// Validar la entrada de ENTEROS por teclado
	this.isInteger = function(evt)
	{
		// Capturamos el evento producido
		var e = (window.event) ? window.event : evt;
		var codeKey = LIB_navigator.getKeyCode(e);

		if (codeKey < 48 || codeKey > 57)
		{
			switch(LIB_navigator.getName())
			{
				case "Microsoft Internet Explorer":
					e.returnValue = false;
				break;
				
				case "Firefox":
					// TENGO QUE CANCELAR EL EVENTO DE PULSAR LA TECLA
				break;
			}
		}
	}
}

// Instanciamos el objeto de la clase CurrentForm
var currentForm = new currentForm();

// Añadimos al formulario una nueva función, despues de que todo esté cargado
window.onload = function(evt)
{
	var contForms = 0;
	for(contForms = 0;contForms<document.forms.legth;contForms++)
	{
		document.forms[contForms].validateForm = currentForm.validateForm;
		for(i=0;i<document.forms[contForms].elements.length;i++)
		{
			actualElement = document.forms[contForms].elements[i];
			// Verificamos que el elemento actual no esté oculto
			if(actualElement.type.toLowerCase() != "hidden")
			{
				// Verificamos que no sea ni un boton de RESET ni un boton de SUBMIT
				if(actualElement.type.toLowerCase() != "button" && actualElement.type.toLowerCase() != "reset")
				{
					var typeElement = actualElement.id.split(currentForm.configSeparator)[2].toLowerCase();
					switch(typeElement)
					{
						case "number":
							actualElement.onkeypress = currentForm.isInteger(evt)
						break;
						case "cp":
							actualElement.onkeypress = function(evt){currentForm.isInteger(evt)};
							actualElement.maxLength = currentForm.lengthTypes[typeElement];
						break;
						case "tlf":
							actualElement.onkeypress = function(evt){currentForm.isInteger(evt)};
							actualElement.maxLength = currentForm.lengthTypes[typeElement];
						break;
					}
				}
			}
		}
	}
}
