/****************************************************************************
Nombre del Archivo..........: validateform.js

Empresa.....................: QS·media, info@qsmedia.es

Autor: Antonio Alcaide, aalcaide@qsmedia.es

Fecha de creación...........: 12/09/2001

Fecha última modificación...: 12/09/2001

FUNCIONALIDAD: archivo que contiene el código JavaScript necesario para validar 
un formulario dado

ARGUMENTOS DE ENTRADA: no tiene

DEVUELVE: un cuadro de mensaje con el resultado de la validación

HISTORIAL DE MODIFICACIONES:
*****************************************************************************
	
	
*****************************************************************************
*****************************************************************************
********* CÓMO UTILIZAR EL PROGRAMA *****************************************
*****************************************************************************	
*****************************************************************************
	
	1) hacer un <script language="javascript" src="/path/validateform.js">
	
	2) llenar el vector de JavaScript "props" (creado en esta página) con los parámetros de cada
	   elemento del formulario a validar, es decir:
	   		· Nombre que tiene el elemento en el formulario a validar
			· Etiqueta que saldrá en el mensaje de error que referenciará al elemento a validar
				Ej. Teléfono, E-mail, 1er Apellido, etc.
			· Cadena que identificará a un mensaje especial de error. No se aconseja.
				Ej. si queremos que el mensaje de un campo requerido no sea el estándar				
			. Lista de validaciones (hasta 5)
					"required" -> campo requerido
					"integer" -> campo entero
					"kblimit" -> campo entero excepto cero
					"numeric" -> campo numérico
					"formatdate" -> formato correcto de fecha
					"comparedate" -> comprueba que la fecha 1 es anterior a la fecha 2
									 No hace falta utilizar formatdate. Lo hace comparedate.
					"mail" -> formato correcto de e-mail				 
		
	3) hacer un </script>	
	
	4) hacer la siguiente llamada en el botón desde el cual se haga la validación:
		"javascript:validate_form(A,B,C):"
	   donde:
		A es el nombre del formulario a validar
		B es, si la hubiera, la función a ejecutar una vez validados los datos (inserciones...)
		C es el action del formulario a validar (en el formulario se deberá quitar el action)

***** EJEMPLO DE LLENADO DEL VECTOR PARA UN ELEMENTO CON 2 VALIDACIONES (paso 2) *****

props[0] = new properties("USER_NAME","Nombre del usuario","","required","integer");

NOTA: cada fila representa un elemento de formulario. Si el formulario tiene 
	  7 elementos a validar, tendremos que rellenar props[0]..props[6]


/****************************************************************************
*****************************************************************************
********** COMIENZO DEL PROGRAMA ********************************************
*****************************************************************************
****************************************************************************/


/****************************************************************************
********** INSERCIÓN EN VARIABLES DE LOS MENSAJES DE ERROR FIJOS ************
****************************************************************************/

/*** Metemos en variables los mensajes de error estándar */

//título del mensaje de error
var messtitle = "-- Errores producidos: --";
//pie del mensaje de error 
var messbuttom = "Repase el contenido de los campos indicados";
//mensaje de validación pasada con éxito 
var messconfirm = "¿Seguro que los datos son correctos?";
//requerido 
var messrequired = "Debe rellenar el campo";
//entero
var messinteger = "El campo sólo puede contener un número entero";
//entero sin cero 
var messintegerzero = "El campo debe contener un número entero positivo";
//numérico 
var messnumeric = "El campo sólo puede contener números";
//fecha europea errónea 
var messeuropedate = "La fecha no tiene el formato correcto";
//fecha americana errónea 
var messusadate = "La fecha no tiene el formato correcto";
//restricción temporal 
var messtimerest = "La fecha B no puede ser inferior a A";
//e-mail erróneo
var messmail = "El e-mail introducido no es correcto";

/*** Metemos en variables otras palabras necesarias */

//palabra "Campo" 
var messfield = "Campo";
//palabra "Campos"
var messfields = "Campos";


/****************************************************************************
*****************************************************************************
********** PROGRAMACIÓN DE LAS VALIDACIONES *********************************
*****************************************************************************
****************************************************************************/


/****************************************************************************
********** VALIDACIÓN 1) CAMPO REQUERIDO ************************************
****************************************************************************/

//función necesaria para validate_required: indica si el campo está lleno con espacios en blanco
function validate_whites(formname,i) {
	var aux=0; var exit3=false; 
	eval("var value = document."+formname+"."+props[i].name+".value");
	while (aux < value.length && exit3 == false) {
		var character = value.substring(aux,aux+1);
		if (character!=" ") {
			exit3=true;
			return false;
		}else{
			aux++;
		}//if
	}//while
	if (!exit3) {
		return true;
	}
}//validate_whites	

function validate_required(formname,i) {
	eval("var value = document."+formname+"."+props[i].name+".value");
	if (value=="" || validate_whites(formname,i)) {	//validación
		if (!elementerror) {	//si es el primer error encontrado en el elemento	
			message = message + "\n" + "  " + messfield + " " + eval("props[i].label") + ":";
		}	
		if (props[i].message == "") {	//si no hay mensaje especial saca el estándar
			 message = message + "\n" + messrequired;
		}else{
			message = message +  "\n" + props[i].message;
		}
		return true;		
	}else{
		return false;
	}
}//validate_required


/****************************************************************************
********** VALIDACIÓN 2) CAMPO ENTERO ***************************************
****************************************************************************/

function validate_integer(formname,i) {
	eval("var value = document."+formname+"."+props[i].name+".value");
	if (value!="" && (parseInt(value)==NaN || parseInt(value)!=value || value.indexOf(".")!=-1)) {	//validación
		if (!elementerror) {	//si es el primer error encontrado en el elemento
			message = message + "\n" + "  " + messfield + " " + eval("props[i].label") + ":";
		}	
		if (props[i].message == "") {	//si no hay mensaje especial saca el estándar
			message = message + "\n" + messinteger;
		}else{
			message = message + "\n" + props[i].message;
		}
		return true;		
	}else{
		return false;
	}
}//validate_integer


/****************************************************************************
********** VALIDACIÓN 3) CAMPO ENTERO EXCEPTO EL CERO ***********************
****************************************************************************/

function validate_integernozero(formname,i) {
	eval("var value = document."+formname+"."+props[i].name+".value");
	if (value!="" && (parseInt(value)==NaN || parseInt(value)!=value || value.indexOf(".")!=-1 || value==0)) {	//validación
		if (!elementerror) {	//si es el primer error encontrado en el elemento
			message = message + "\n" + "  " + messfield + " " + eval("props[i].label") + ":";
		}	
		if (props[i].message == "") {	//si no hay mensaje especial saca el estándar
			message = message + "\n" + messintegerzero;
		}else{
			message = message + "\n" + props[i].message;
		}
		return true;		
	}else{
		return false;
	}
}//validate_integernozero


/****************************************************************************
********** VALIDACIÓN 4) CAMPO REAL *****************************************
****************************************************************************/

function validate_numeric(formname,i) {
	eval("var value = document."+formname+"."+props[i].name+".value");
	if (value!="" && isNaN(value)) {	//validación
		if (!elementerror) {	//si es el primer error encontrado en el elemento
			message = message + "\n" + "  " + messfield + " " + eval("props[i].label") + ":";	
		}
		if (props[i].message == "") {	//si no hay mensaje especial saca el estándar
			message = message + "\n" + messnumeric;
		}else{
			message = message + "\n" + props[i].message;
		}
		return true;		
	}else{
		return false;
	}
}//validate_numeric


/****************************************************************************
********** VALIDACIÓN 5) CAMPO FECHA CORRECTA *******************************
****************************************************************************/

function validate_formatdate(formname,i) {
	eval("var value = document."+formname+"."+props[i].name+".value");
	if(int_datetype == 1) {
		//fechas en formato europeo: dd/mm/aaaa o d/m/aa
		var mes31dias = /^([1-3]0|[0-2][1-9]|31|[0-9])\/(1|01|3|03|5|05|7|07|8|08|10|12)\/(19[0-9][0-9]|20[0-9][0-9]|2100)$/
		var mes30dias = /^([1-3]0|[0-2][1-9]|[0-9])\/(4|04|6|06|9|09|11)\/(19[0-9][0-9]|20[0-9][0-9]|2100)$/
		var mes28dias = /^([1-2]0|[0-2][1-8]|[0-1]9|[0-9])\/(02|2)\/(190[0-3]|190[5-7]|1909|191[0-1]|191[3-5]|191[7-9]|192[1-3]|192[5-7]|1929|193[0-1]|193[3-5]|194[7-9]|194[1-3]|194[5-7]|1949|195[0-1]|195[3-5]|195[7-9]|196[1-3]|196[5-7]|1969|197[0-1]|197[3-5]|198[7-9]|198[1-3]|198[5-7]|1989|199[0-1]|199[3-5]|199[7-9]|200[1-3]|200[5-7]|2009|201[0-1]|201[3-5]|201[7-9]|202[1-3]|202[5-7]|2029|203[0-1]|203[3-5]|203[7-9]|204[1-3]|204[5-7]|2049|205[0-1]|205[3-5]|205[7-9]|206[1-3]|206[5-7]|2069|207[0-1]|207[3-5]|207[7-9]|208[1-3]|208[5-7]|2089|209[0-1]|209[3-5]|209[7-9]|2100)$/
		var mes29dias = /^([1-2]0|[0-2][1-9]|[0-9])\/(02|2)\/(1904|1908|1912|1916|1920|1924|1928|1932|1936|1940|1944|1948|1952|1956|1960|1964|1968|1972|1976|1980|1984|1988|1992|1996|2000|2004|2008|2012|2016|2020|2024|2028|2032|2036|2040|2044|2048|2052|2056|2060|2064|2068|2072|2076|2080|2084|2088|2092|2096)$/
		var messdate = messeuropedate;
	}	
	if(int_datetype == 2) {
		//fechas en formato americano: mm/dd/aaaa o m/d/aa
		var mes31dias = /^(1|01|3|03|5|05|7|07|8|08|10|12)\/([1-3]0|[0-2][1-9]|31|[0-9])\/(19[0-9][0-9]|20[0-9][0-9]|2100)$/
		var mes30dias = /^(4|04|6|06|9|09|11)\/([1-3]0|[0-2][1-9]|[0-9])\/(19[0-9][0-9]|20[0-9][0-9]|2100)$/
		var mes28dias = /^(02|2)\/([1-2]0|[0-2][1-8]|[0-1]9|[0-9])\/(190[0-3]|190[5-7]|1909|191[0-1]|191[3-5]|191[7-9]|192[1-3]|192[5-7]|1929|193[0-1]|193[3-5]|194[7-9]|194[1-3]|194[5-7]|1949|195[0-1]|195[3-5]|195[7-9]|196[1-3]|196[5-7]|1969|197[0-1]|197[3-5]|198[7-9]|198[1-3]|198[5-7]|1989|199[0-1]|199[3-5]|199[7-9]|200[1-3]|200[5-7]|2009|201[0-1]|201[3-5]|201[7-9]|202[1-3]|202[5-7]|2029|203[0-1]|203[3-5]|203[7-9]|204[1-3]|204[5-7]|2049|205[0-1]|205[3-5]|205[7-9]|206[1-3]|206[5-7]|2069|207[0-1]|207[3-5]|207[7-9]|208[1-3]|208[5-7]|2089|209[0-1]|209[3-5]|209[7-9]|2100)$/
		var mes29dias = /^(02|2)\/([1-2]0|[0-2][1-9]|[0-9])\/(1904|1908|1912|1916|1920|1924|1928|1932|1936|1940|1944|1948|1952|1956|1960|1964|1968|1972|1976|1980|1984|1988|1992|1996|2000|2004|2008|2012|2016|2020|2024|2028|2032|2036|2040|2044|2048|2052|2056|2060|2064|2068|2072|2076|2080|2084|2088|2092|2096)$/
		var messdate = messusadate;
	}
	
	//comprueba la fecha segun calendario (hasta el 2020, ojo)
	if (value!="" && !(	mes31dias.test(value) || 
						mes30dias.test(value) ||
      					mes29dias.test(value) ||
      					mes28dias.test(value)	)) {	//validación
		if (!elementerror) {	//si es el primer error encontrado en el elemento
				message = message + "\n" + "  " + messfield + " " + eval("props[i].label") + ":";	
			}
			if (props[i].message == "") {	//si no hay mensaje especial saca el estándar
				message = message + "\n" + messdate;
			}else{
				message = message + "\n" + props[i].message;
			}
			return true;		
		}else{
			return false;
	}
}//validate_formdate


/****************************************************************************
********** VALIDACIÓN 6) COMPARACIÓN DE FECHAS ******************************
****************************************************************************/

function validate_comparedate(formname,i) {
	
	//DECLARACIÓN DE VARIABLES
	eval("var fielddate1 = document."+formname+"."+props[i].name+".value");
	if(props[i].val0=="required") {
		eval("var fielddate2 = document."+formname+"."+props[i].val2+".value");
		var labeldate2 = eval(eval("props[i].val3"));	
		var str_noformat = eval(eval("props[i].val4"));		
	}else{
		eval("var fielddate2 = document."+formname+"."+props[i].val1+".value");			
		var labeldate2 = eval(eval("props[i].val2"));
		var str_noformat = eval("props[i].val3");
	}	
	
	//esta función comprueba antes que el formato de las fechas es correcto
	function formatdate(formname,i) {
		
		var error=false;
		if(int_datetype == 1) {
			//fechas en formato europeo: dd/mm/aaaa o d/m/aa
			var mes31dias = /^([1-3]0|[0-2][1-9]|31|[0-9])\/(1|01|3|03|5|05|7|07|8|08|10|12)\/(19[0-9][0-9]|20[0-9][0-9]|2100)$/
			var mes30dias = /^([1-3]0|[0-2][1-9]|[0-9])\/(4|04|6|06|9|09|11)\/(19[0-9][0-9]|20[0-9][0-9]|2100)$/
			var mes28dias = /^([1-2]0|[0-2][1-8]|[0-1]9|[0-9])\/(02|2)\/(190[0-3]|190[5-7]|1909|191[0-1]|191[3-5]|191[7-9]|192[1-3]|192[5-7]|1929|193[0-1]|193[3-5]|194[7-9]|194[1-3]|194[5-7]|1949|195[0-1]|195[3-5]|195[7-9]|196[1-3]|196[5-7]|1969|197[0-1]|197[3-5]|198[7-9]|198[1-3]|198[5-7]|1989|199[0-1]|199[3-5]|199[7-9]|200[1-3]|200[5-7]|2009|201[0-1]|201[3-5]|201[7-9]|202[1-3]|202[5-7]|2029|203[0-1]|203[3-5]|203[7-9]|204[1-3]|204[5-7]|2049|205[0-1]|205[3-5]|205[7-9]|206[1-3]|206[5-7]|2069|207[0-1]|207[3-5]|207[7-9]|208[1-3]|208[5-7]|2089|209[0-1]|209[3-5]|209[7-9]|2100)$/
			var mes29dias = /^([1-2]0|[0-2][1-9]|[0-9])\/(02|2)\/(1904|1908|1912|1916|1920|1924|1928|1932|1936|1940|1944|1948|1952|1956|1960|1964|1968|1972|1976|1980|1984|1988|1992|1996|2000|2004|2008|2012|2016|2020|2024|2028|2032|2036|2040|2044|2048|2052|2056|2060|2064|2068|2072|2076|2080|2084|2088|2092|2096)$/
			var messdate = messeuropedate;
		}	
		if(int_datetype == 2) {
			//fechas en formato americano: mm/dd/aaaa o m/d/aa
			var mes31dias = /^(1|01|3|03|5|05|7|07|8|08|10|12)\/([1-3]0|[0-2][1-9]|31|[0-9])\/(19[0-9][0-9]|20[0-9][0-9]|2100)$/
			var mes30dias = /^(4|04|6|06|9|09|11)\/([1-3]0|[0-2][1-9]|[0-9])\/(19[0-9][0-9]|20[0-9][0-9]|2100)$/
			var mes28dias = /^(02|2)\/([1-2]0|[0-2][1-8]|[0-1]9|[0-9])\/(190[0-3]|190[5-7]|1909|191[0-1]|191[3-5]|191[7-9]|192[1-3]|192[5-7]|1929|193[0-1]|193[3-5]|194[7-9]|194[1-3]|194[5-7]|1949|195[0-1]|195[3-5]|195[7-9]|196[1-3]|196[5-7]|1969|197[0-1]|197[3-5]|198[7-9]|198[1-3]|198[5-7]|1989|199[0-1]|199[3-5]|199[7-9]|200[1-3]|200[5-7]|2009|201[0-1]|201[3-5]|201[7-9]|202[1-3]|202[5-7]|2029|203[0-1]|203[3-5]|203[7-9]|204[1-3]|204[5-7]|2049|205[0-1]|205[3-5]|205[7-9]|206[1-3]|206[5-7]|2069|207[0-1]|207[3-5]|207[7-9]|208[1-3]|208[5-7]|2089|209[0-1]|209[3-5]|209[7-9]|2100)$/
			var mes29dias = /^(02|2)\/([1-2]0|[0-2][1-9]|[0-9])\/(1904|1908|1912|1916|1920|1924|1928|1932|1936|1940|1944|1948|1952|1956|1960|1964|1968|1972|1976|1980|1984|1988|1992|1996|2000|2004|2008|2012|2016|2020|2024|2028|2032|2036|2040|2044|2048|2052|2056|2060|2064|2068|2072|2076|2080|2084|2088|2092|2096)$/
			var messdate = messusadate;
		}
		
		//comprueba la fecha del primer campo segun calendario (hasta el 2020, ojo)
		if (fielddate1!="" && !( mes31dias.test(fielddate1) || 
							 	 mes30dias.test(fielddate1) ||
	    					     mes29dias.test(fielddate1) ||
	     					     mes28dias.test(fielddate1)	)) {	//validación
			//if (!elementerror) {	//si es el primer error encontrado en el elemento
			message = message + "\n" + "  " + messfield + " " + eval("props[i].label") + ":";	
			//}
			if (props[i].message == "") {	//si no hay mensaje especial saca el estándar
				message = message + "\n" + messdate;
			}else{
				message = message + "\n" + props[i].message;
			}
			error=true;
		}

		//comprueba la fecha del segundo campo 
		if (fielddate2!="" && !( mes31dias.test(fielddate2) || 
						     	 mes30dias.test(fielddate2) ||
	    					     mes29dias.test(fielddate2) ||
	     					     mes28dias.test(fielddate2)	)) {	//validación
			//if (!elementerror) {	//si es el primer error encontrado en el elemento
			message = message + "\n" + "  " + messfield + " " + labeldate2 + ":";	
			//}
			if (props[i].message == "") {	//si no hay mensaje especial saca el estándar
				message = message + "\n" + messdate;
			}else{
				message = message + "\n" + props[i].message;
			}
			error=true;
		}		

		if (error==true) {
			return true;
		}
	}//formatdate

	//COMIENZO DE LA FUNCIÓN DE COMPARACION DE FECHAS
	if (str_noformat!="noformat") {
		if (formatdate(formname,i)) {
			return true;
		}
	}
	
	//antes de crear los dos objetos Date, compruebo si el formato es europeo.
	//En ese caso transformo la cadena al formato americano para 
	//poder utilizar utilizar el objeto Date
	if (int_datetype==1) {
		//primera fecha
		var int_firstbar1 = fielddate1.indexOf("/",0);
		var int_secondbar1 = fielddate1.indexOf("/",int_firstbar1+1);
		var str_day1 = fielddate1.substring(0,int_firstbar1);
		var str_month1 = fielddate1.substring(int_firstbar1+1,int_secondbar1); 
		var str_year1 = fielddate1.substr(int_secondbar1+1,4);
		var newfield1 = str_month1 + "/" + str_day1 + "/" + str_year1; 
		//segunda fecha
		var int_firstbar2 = fielddate2.indexOf("/",0);
		var int_secondbar2 = fielddate2.indexOf("/",int_firstbar2+1);
		var str_day2 = fielddate2.substring(0,int_firstbar2);
		var str_month2 = fielddate2.substring(int_firstbar2+1,int_secondbar2);
		var str_year2 = fielddate2.substr(int_secondbar2+1,4);
		var newfield2 = str_month2 + "/" + str_day2 + "/" + str_year2;
		//creamos los objetos
		Date1 = new Date(newfield1);
		Date2 = new Date(newfield2);
	}else{
		Date1 = new Date(fielddate1);
		Date2 = new Date(fielddate2);
	}
	
	if ((fielddate1!="" && fielddate2!="") && Date1>=Date2) {		//validación
		if (!elementerror) {	//si es el primer error encontrado en el elemento
			message = message + "\n" + "  " + messfields + " " + eval("props[i].label") + 
				" " + "--" + " " + labeldate2 + ":";	
		}
		if (props[i].message == "") {	//si no hay mensaje especial saca el estándar
			message = message + "\n" + labeldate2 + " " + messtimerest + " " + 
					  eval(eval("props[i].label"));
		}else{
			message = message + "\n" + props[i].message;
	}
		return true;		
	}else{
		return false;
	}
}//validate_comparedate


/****************************************************************************
********** VALIDACIÓN 7) CAMPO E-MAIL CORRECTO ******************************
****************************************************************************/

function validate_mail(formname,i) {
	eval("var value = document."+formname+"."+props[i].name+".value");
	
	//sirve para saber si la dirección tiene @. o .@
	var arrobapunto = "@.";
	var puntoarroba = ".@";
	var str_arrobapunto = value.match(arrobapunto);
	var str_puntoarroba = value.match(puntoarroba);
	
	//sirve para saber si la dirección tiene dos puntos seguidos	
	var str_puntopunto = false; var k=0;
	while (str_puntopunto == false && k<=value.length-1) {
		var character = value.substring(k,k+1);
		if (character == ".") {
			var character = value.substring(k+1,k+2);
			if (character == ".") {
				str_puntopunto = true;
			}
		}
		k=k+1;
	}//fin del while	

	//sirve para saber si la dirección tiene dos arrobas o más
	var str_arrobaarroba = false; var int_arrobas = 0; var k=0;
	while (str_arrobaarroba == false && k<=value.length-1) {
		var character = value.substring(k,k+1);
		if (character == "@") {
			int_arrobas = int_arrobas + 1;
			if (int_arrobas == 2) {
				str_arrobaarroba = true;
			}
		}
		k=k+1;
	}//fin del while

	if (value!="" &&
		
		(	value.indexOf("@") == -1			||	//si no hay arroba
			value.indexOf(".") == -1			||	//si no hay punto
			value.charAt(0) == "@"				||	//si la arroba está al principio
			value.charAt(0) == "."				||	//si el punto está al principio
			str_arrobapunto == arrobapunto		||	//si aparece @.
			str_puntoarroba == puntoarroba		||	//si aparece .@
			str_puntopunto == true 				||	//si aparecen dos puntos seguidos
			str_arrobaarroba == true			||	//si aparecen dos arrobas o más (seguidas o no)
			value.charAt(value.length-1) == "@"	||	//si la arroba está al final		
			value.charAt(value.length-1) == "."	 )	//si el punto está al final
		)	{	//validación
	
		if (!elementerror) {	//si es el primer error encontrado en el elemento
			message = message + "\n" + "  " + messfield + " " + eval("props[i].label") + ":";
		}	
		if (props[i].message == "") {	//si no hay mensaje especial saca el estándar
			message = message + "\n" + messmail;
		}else{
			message = message + "\n" + props[i].message;
		}
		return true;		
	}else{
		return false;
	}//fin del if principal
		
}//validate_mail


/****************************************************************************
*****************************************************************************
********** FUNCIÓN QUE LLAMA A LAS ANTERIORES FUNCIONES *********************
*****************************************************************************
****************************************************************************/

/* Rutina que elige qué validación concreta debe pasar un elemento de formulario */
function validate_element(evaluate,form,aux1) {
	switch(evaluate) {
		case "required":
				var valreq = validate_required(form,aux1);
				elementerror = valreq;
				break;
		case "integer":
				var valint = validate_integer(form,aux1);
				elementerror = valint;
				break;		
		case "numeric":
				var valnum = validate_numeric(form,aux1);
				elementerror = valnum;
				break;		
		case "integernozero":
				var valintnz = validate_integernozero(form,aux1);
				elementerror = valintnz;
				break;		
		case "formatdate":
				var valformatdate = validate_formatdate(form,aux1);
				elementerror = valformatdate;
				break;		
		case "comparedate":
				var valcomparedate = validate_comparedate(form,aux1);
				elementerror = valcomparedate;
				break;		
		case "mail":
				var valmail = validate_mail(form,aux1);
				elementerror = valmail;
				break;
	}//switch
	if (valreq == true || valint == true || valnum == true || valintnz == true || 
		valformatdate == true || valcomparedate == true || valmail == true) {
		formerror = true;
	}
}//validate_element


/****************************************************************************
*****************************************************************************
********** PROGRAMA PRINCIPAL ***********************************************
*****************************************************************************
****************************************************************************/


/****************************************************************************
********** PREPARACIÓN DEL VECTOR DE PROPIEDADES ****************************
****************************************************************************/

// El vector de propiedades almacena las propiedades de cada elemento del formulario
//	a) declaración del vector. 2 pasos:
//	1er paso:
function properties(name,label,message,val0,val1,val2,val3,val4) {
	this.name = name;
	this.label = label;
	this.message = message;
	this.val0 = val0;
	this.val1 = val1;
	this.val2 = val2;					
	this.val3 = val3;
	this.val4 = val4;
}
//	2o paso:
var numelements = 50;	//50 elementos de formulario como mucho
var props = new Array(numelements); 

//	b)inicialización del vector
function iniArrayProp(){
	var len = props.length;
	for(var i=0;i<=len;i++) {
		props[i] = new properties("","","","","","","","");
	}
	return props;
}
iniArrayProp();


/****************************************************************************
********** DECLARACIÓN DE VARIABLES GLOBALES ********************************
****************************************************************************/

//VARIABLE QUE ALMACENA LA CADENA DE SALIDA
var	message;
//VARIABLE QUE INDICA SI EL FORMULARIO TIENE ALGUN ERROR
var formerror;
//VARIABLE QUE INDICA SI UN ELEMENTO DE FORMULARIO TIENE ALGUN ERROR
var elementerror;


/****************************************************************************
********** VALIDACION DEL FORMULARIO ****************************************
****************************************************************************/

function validate_form(formname,execution,action) {
	//actualizamos para machacar el valor de la variable en las antiguas validaciones
	message = messtitle + "\n";
	//lo mismo
	formerror = false; elementerror = false;
	var i=0;var exit=false;
	while(i<=numelements && exit==false) {
		//si el parámetro i está lleno...
		if (props[i].name != "") {
			//validar el elemento
			var j=3;var exit2=false;
			while(j<=7 && exit2==false) {
				//haremos tantas validaciones del elemento como parámetros de validación 
				//(elementos del 3 al 7 del vector de propiedades) estén llenos
				eval("var evaluatetype = props["+i+"].val"+(j-3));
				if (evaluatetype != "") {
					validate_element(evaluatetype,formname,i);
					j++;
				}else{
					//termina la validacion del elemento
					exit2=true;
				}
			}
			elementerror = false;
			i++;			
		}else{
			//termina la validación del formulario
			exit = true;
		}	
	}
	if (formerror == true) {
		message = message + "\n" + "\n" + messbuttom;	
		alert(message);
	}
	else{
		if (confirm(messconfirm)) {
			if (execution != "") {
				//si hay que hacer algo despues de validar y antes de pasar página (o sea inserciones)
				eval(execution);
			}
			eval ("document." + formname + ".action = " + "'" + action + "'" + ";");
			eval ("document." + formname + ".submit();");			
		}	
	}
}//validate_form

/****************************************************************************
********** FIN DEL PROGRAMA *************************************************
****************************************************************************/
