function validar_submit(form)
{

	/*
		Modificaciones:
		3.7	Fecha: 17-06-2009 "customErrMsg" tambien se añade a elementos de texto (sólo para detectar si son requeridos)
		3.6 Fecha: 25-03-2009 Se añade una nueva propiedad "customErrMsg" que puede usar cada elemento, sirve para personalizar el mensaje de error
										que se mostrará. Ej.: Obj.dato.customErrMsg = "Mensaje personalizado de error";
										DE MOMENTO SOLO SE IMPLEMENTA PARA ELEMENTOS TIPO RADIO Y CHEKBOX
		3.5 Fecha: 04-12-2008  Se añade "maxcar" como opción para indicar un número máximo de caracteres
		3.4 Fecha: 21-10-2008 Se añade "cp" como tipo y valida que el Codigo Postal sea valido.
		3.3 Fecha: 26-05-2008 se validan la longitud y primer digito de los campos telefono y telefono movil, el tipo Telefono_no, es para casos en los que 
						no sea obligatorio introducirlo, pero si lo introduce, es validado
		3.2	Fecha: 16-03-2007 hay elementos requeridos del fomulario que  pueden o no estar (por ejemplo, el nif). Se comprueba esto antes de validar.
		3.1.1	Fecha: 13-03-2007 Se añade "checkbox" como tipo. Su comportamiento es igual al de "radio"; se rehace su validacion
		3.1	Fecha: 13-03-2007 La funcion presupone la existencia de un objeto Obj donde estan todas las propiedades
											particulares de los elementos del formulario. Ejemplo de creacion de objeto:
														var Obj = new Object();
														Obj.dato = new Object();
															Obj.dato.contenido = "El Dato";
															Obj.dato.requerido = "si";
															Obj.dato.tipo = "email";
															Obj.dato.mincar = "8";
											donde 'dato' es el nombre del elemento del fomulario el cual queremos validar
		3.0	Fecha: 08-03-2007 Se cambia el comportamiento interno de la funcion: ahora existen dos funciones, validar()
											y validar_submit(); esta ultima se puede usar para los botones submit, poniendo en el tag
											<form> el evento onSubmit="return validar_submit(this)". validar() se puede usar de la manera
											habitual; esta funcion hace referencia a validar_submit().
		2.7	Fecha 07-03-2007 Se arregla bug en checkfields
		2.6	Fecha: 16-12-2006  se corrige mensaje de error para DNI; se cambia el formato del control de modificaciones
		2.5.1	Fecha: 11-12-2006  se corrigen bugs en validacion de radio buttons
		2.5	fecha: 05-12-2006  se añade validacion para los radio buttons
		2.4	Fecha: 05-12-2006  se controla que el el atributo 'type' tiene atributos (para fieldset)
		2.3	Fecha: 23-03-2006  se anyade el tipo='cif_nif' como "tipo"	
		2.2	Fecha: 05-10-2005  se anyade el tipo='dni' como "tipo"
		2.1	Fecha: 22-09-2005  se anyade el type=textarea como tipo de elemento a evaluar
		2.0	Fecha: 08-09-2005  se modifica el validador para que sea compatible con Firefox.
												Para ello hay que hacer varias cosas: una, ya NO es necesario
												indicar a form que 'validar=si'.
												En el href. se pone simplemente "javascript:validar(document.formulario)",
												la funcion ya se encarga de realizar el submit una vez validado el formulario
		1.2	Fecha: 20-12-2004  se anyade "alfanumerico" como "tipo". 
		1.1	Fecha: 29-09-2004  se modifica la validacion de fecha, se estaba usando parseInt para "convertir" a 
												numero y se debe usar Number. 
		1.0.1	Fecha: 2-09-2004   pequenyos cambios en el comentario al respecto del onSubmit() y onsubmit() 
		1.0	Version inicial
		
		COMUNES A TODOS LOS CONTROLES:
		
		contenido="" 		<- Indica la leyenda que precede al campo en el formulario HTML. Sirve para 
							poder mostrar el nomre del campo sin recurrir al atributo name en el alert
							que sirve de aviso.

		CAMPOS TIPO TEXT Y PASSWORD
		
		requerido="si"		<- Si se escribe (tal como se indica) hace que en el campo sea obligatorio 
							escribir al menos un caracter. 
		mincar="(n)"		<- donde (n) es un número entero positivo superior a 0: comprueba que el 
							campo tenga al menos (n) caracteres.
		maxcar="(n)"		<- donde (n) es un número entero positivo superior a 0: comprueba que el 
							campo tenga un maximo de (n) caracteres.					
		tipo="(x)"  		<- Donde (x) es "texto", "numero", "email", "fecha" o "alfanumerico". Indica el tipo de dato que va 
							a contener, y le permite realizar distintas validaciones. En caso de que 
							el tipo se "texto" no realizarÂ· ningË™n tipo de comprobaciÃ›n extraordinaria,
							pero en caso de ser "numero" verificarÂ· que todos los caracteres introducidos 
							sean numÃˆricos, y en caso de ser "fecha", que posea el formato "dd/mm/aaaa",
							que el dÃ­a sea menor a 31 y mayor a 0, que el mes sea menor que 12 y mayor
							que cero y que el aÃ’o sea mayor que 1800. En tipo="email" verifica que tenga una arroba
							y un punto despues de la arroba. En tipo "alfanumerico" verifica que solo hay letras y numeros.
							En tipo "dni" se verifica que la letra del NIF es correcta (se permite NIF y NIE, sin guiones ni
							espacios)
								
		CAMPOS TIPO SELECT
		
		seleccionable="no"	<- Escrito tal cual en un elemento option verifica que al enviar el 
							formulario ese elemnto no estÃˆ seleccionado

	*/
	/*
		MEJORA PARA EL EMAIL E EMAIL CONFIRMACION.
		siemplemente tener dos inputs uno llamado "email" y otro "email2"
	*/

	var email_error=0;
	var arrayRadios = new Array();
	error = "";
	
	for(var objeto in Obj) //recorremos cada uno de los elementos
	{
		//validando los elementos de radio
		//pero solo los requeridos
		
		if((Obj[objeto].tipo == 'radio' || Obj[objeto].tipo == 'checkbox') && Obj[objeto].requerido == "si")
		{
			l = arrayRadios.length;
			arrayRadios[l] = new Array(3);
			arrayRadios[l][0] = false;
			
			//si solo hay un elemento radio/checkbox, no se crea el array,
			if(!form[objeto].length) {
				arrayRadios[l][0] = form[objeto].checked;
				arrayRadios[l][1] = form[objeto].name;
				arrayRadios[l][2] = Obj[objeto].contenido;
			} else {
				for(var j = 0; j < form[objeto].length; j++)
				{
					if(form[objeto][j].checked)
					{
						arrayRadios[l][0] = true;
						break;
					}
				}
				arrayRadios[l][1] = form[objeto][0].name;
				arrayRadios[l][2] = Obj[objeto].contenido;
			}
			if(Obj[objeto].customErrMsg) {
				arrayRadios[l][3] = Obj[objeto].customErrMsg;
			} else {
				arrayRadios[l][3] = false;
			}
		}

		//validaciones varias de los campos de texto
		if (form[objeto] && (form[objeto].type == "text" || form[objeto].type == "password" || form[objeto].type == "textarea" || form[objeto].type == "select-one") )
		{
			//caracteres minimos
			minCaracteres = parseInt(Obj[objeto].mincar);
			if(!isNaN(minCaracteres) && form[objeto].value.length<minCaracteres) 
				error += "El campo '" + Obj[objeto].contenido + "' debe tener al menos " + minCaracteres + " caracteres\n";
				
			//caracteres maximos
			maxCaracteres = parseInt(Obj[objeto].maxcar);
			if(!isNaN(maxCaracteres) && form[objeto].value.length > maxCaracteres) 
				error += "El campo '" + Obj[objeto].contenido + "' debe tener menos de " + maxCaracteres + " caracteres\n";
			
			//alfanumerico y dni solo deben ser alfanumericos
			if (Obj[objeto].tipo == "alfanumerico" || Obj[objeto].tipo == "dni" || Obj[objeto].tipo == "cif_nif") 
			{
				if (!form[objeto].value.match(/^\w+$/) && form[objeto].value != "") 
					error+="El campo '" + Obj[objeto].contenido + "' solo debe contener letras y numeros\n";
			}
            
            //Codigo Postal valido (España y Portugal)
            if (form[objeto] && Obj[objeto].tipo == "cp") {
                if(!form[objeto].value.match(/^\d{5}$/) && !form[objeto].value.match(/^\d{4}-\d{3}$/)) {
                    error += "Codigo Postal NO valido\n";
                }
            }
			
			//numero debe ser numerico
			if (form[objeto] && Obj[objeto].tipo == "numero") 
			{
				if (!form[objeto].value.match(/^\d+$/) && form[objeto].value != "") 
					error += "El campo '" + Obj[objeto].contenido + "' solo debe contener numeros\n";
			}
			
			//telefono movil
			if (form[objeto] && Obj[objeto].tipo == "Telefono_movil") 
			{
				if (!form[objeto].value.match(/^\d+$/) && form[objeto].value != "") 
					error += "El campo '" + Obj[objeto].contenido + "' solo debe contener numeros\n";
					
				if (form[objeto].value.length!=9 && form[objeto].value.length!=""){
					error += "El campo '" + Obj[objeto].contenido + "' debe contener 9 carácteres\n";				
				}else{//si cumple las condiciones compruebo el primer digito
					if (form[objeto].value.slice(0,1)!=6)
						error += "El campo '" + Obj[objeto].contenido + "' debe comenzar por 6\n";													
				}
				
			}
			//para telefono fijo no requerido, si lo escribe se lo valido
			if (form[objeto] && Obj[objeto].tipo == "Telefono_no") 
			{
				if (form[objeto].value.length!=""){
					if (form[objeto].value.length!=9){
						error += "El campo '" + Obj[objeto].contenido + "' debe contener 9 carácteres\n";				
					}else{//si cumple las condiciones compruebo el primer digito
						if (form[objeto].value.slice(0,1)!=9)
							error += "El campo '" + Obj[objeto].contenido + "' debe comenzar por 9\n";													
					}		
				}
			}
			
			//valida telefonos fijos
			if (form[objeto] && Obj[objeto].tipo == "Telefono_fijo") 
			{
					if (form[objeto].value.length!=9){
						error += "El campo '" + Obj[objeto].contenido + "' debe contener 9 carácteres\n";				
					}else{//si cumple las condiciones compruebo el primer digito
						if (form[objeto].value.slice(0,1)!=9)
							error += "El campo '" + Obj[objeto].contenido + "' debe comenzar por 9\n";													
					}		
			}
			
			//la fecha debe ser correcta
			if (form[objeto] && Obj[objeto].tipo == "fecha" && form[objeto].value != "") 
			{
				var dmA = form[objeto].value.split("/");
				if (dmA.length < 3) 
					error+="El campo '" + Obj[objeto].contenido + "' debe ser una fecha en formato 'dd/mm/aaaa' \n";
				else if (dmA[0].length != "2" || dmA[1].length != "2" || dmA[2].length != "4" ) 
					error+="El campo '" + Obj[objeto].contenido + "' debe ser una fecha en formato 'dd/mm/aaaa' \n";
				else if (isNaN(Number(dmA[0])) || Number(dmA[0]) > 31 || Number(dmA[0]) < 1) 
					error+="El campo '" + Obj[objeto].contenido + "' no es una fecha correcta (debe ser en formato numerico 'dd/mm/aaaa') \n";
				else if (isNaN(Number(dmA[1])) || Number(dmA[1]) > 12 || Number(dmA[1]) < 1) 
					error+="El campo '" + Obj[objeto].contenido + "' no es una fecha correcta (debe ser en formato numerico 'dd/mm/aaaa')\n";
				else if (isNaN(Number(dmA[2])) || Number(dmA[2]) < 1900) 
					error+="El campo '" + Obj[objeto].contenido + "' no es una fecha correcta (debe ser en formato numerico 'dd/mm/aaaa')\n";				
			}
		}

		//el email debe ser valido (con arroba y punto)
		if (form[objeto] && Obj[objeto].tipo == "email" && form[objeto].value != "")
		{
			var email = form[objeto].value.split("@");
			if (email.length < 2) 
				error += "El campo '" + Obj[objeto].contenido + "' debe ser una email valido \n"; //falta la arroba
			else if (email[1].split(".").length < 2) 
				error += "El campo '" + Obj[objeto].contenido + "' debe ser una email valido \n"; //falta el punto
			
			//si hay email2, email y email2 deben ser iguales
			if(form.elements['email2'] && email_error == 0)
			{
				if(form.elements['email'].value != form.elements['email2'].value)
				{
					error += "El campo " + Obj.email.contenido + " y " + Obj.email2.contenido + " son diferentes\n"; 
					email_error=1;
				}
			}
		}

		//para validar cif y nif y nie
		if (form[objeto] && (Obj[objeto].tipo == "cif_nif" || Obj[objeto].tipo == "dni") && form[objeto].value != "") 
		{
			//cif = form[objeto].value;
			let = form[objeto].value.charAt(0);
			var cifError = 0;
			if (!isNaN(let) || let .toUpperCase() == 'X')
			{
				if(form[objeto].value.length != 9)
					cifError++;
				else
				{
					var cadena="TRWAGMYFPDXBNJZSQVHLCKET";
					var inicial = form[objeto].value.substring(0,1);
					if(isNaN(parseInt(form[objeto].value)))
					{
						letra_inicial = inicial.toUpperCase();
						el_nif = form[objeto].value.substring(1, form[objeto].value.length-1);
					}
					else
					{
						letra_inicial = '';
						el_nif = form[objeto].value.substring(0, form[objeto].value.length-1);
					}
					var posicion = el_nif % 23;
					var letra = cadena.substring(posicion, posicion+1);
					var nif_verdadero = letra_inicial + el_nif + letra;
					if(form[objeto].value.toUpperCase() != nif_verdadero)
						cifError++;
				}
				if (cifError > 0)
					error += "El campo '" + Obj[objeto].contenido + "' debe ser un NIF/NIE valido \n";
			}
			else
			{
				par = 0
				non = 0				
				letras = "ABCDEFGHKLMNPQS"				

				if (form[objeto].value.length != 9)
					cifError++;
				if (letras.indexOf(let.toUpperCase()) == -1)
					cifError++;
				for (zz = 2; zz < 8; zz += 2)
				{
				  par = par + parseInt(form[objeto].value.charAt(zz));
				}
				for (zz = 1; zz < 9; zz += 2)
				{
				  nn = 2 * parseInt(form[objeto].value.charAt(zz));
				  if (nn > 9) 
				  	nn = 1 + (nn-10);
				  non = non + nn;
				}
				parcial = par + non;
				control = (10 - ( parcial % 10));
				if (control == 10) 
					control = 0;
				if (control != form[objeto].value.charAt(8))
					cifError++;
					
				if (cifError > 0)
					error += "El campo '" + Obj[objeto].contenido + "' debe ser un CIF valido \n";
			}
		
				
		}
		if (form[objeto] && Obj[objeto].tipo == "nif" && form[objeto].value != ""){
			
			let = form[objeto].value.charAt(0);
			var nifError = 0;
			if (!isNaN(let) || let .toUpperCase() == 'X')
			{
				if(form[objeto].value.length != 9)
					nifError++;
				else
				{
					var cadena="TRWAGMYFPDXBNJZSQVHLCKET";
					var inicial = form[objeto].value.substring(0,1);
					if(isNaN(parseInt(form[objeto].value)))
					{
						letra_inicial = inicial.toUpperCase();
						el_nif = form[objeto].value.substring(1, form[objeto].value.length-1);
					}
					else
					{
						letra_inicial = '';
						el_nif = form[objeto].value.substring(0, form[objeto].value.length-1);
					}
					var posicion = el_nif % 23;
					var letra = cadena.substring(posicion, posicion+1);
					var nif_verdadero = letra_inicial + el_nif + letra;
					if(form[objeto].value.toUpperCase() != nif_verdadero)
						nifError++;
				}
				
			}else{
				nifError++;
			}
			if (nifError > 0)
					error += "El campo '" + Obj[objeto].contenido + "' debe ser un NIF/NIE valido \n";
		}
		if (form[objeto] && Obj[objeto].tipo == "nif_portugal" && form[objeto].value != ""){
			var valor;
			var nifError = 0;
			var ValidChars = "0123456789";
  			var IsNumber=true;
 			var Char;
			for (i = 0; i < form[objeto].value.length; i++){ 
      				Char = form[objeto].value.charAt(i); 
      				if (ValidChars.indexOf(Char) == -1)  {
         					IsNumber = false;
      			   	}
      		}
			
			if (!IsNumber){
				nifError++;
			}else{
					if(form[objeto].value.length != 9)
						nifError++;						
					valor = ((parseInt(form[objeto].value.charAt(0)))*9)+((parseInt(form[objeto].value.charAt(1)))*8)+((parseInt(form[objeto].value.charAt(2)))*7)+((parseInt(form[objeto].value.charAt(3)))*6)+((parseInt(form[objeto].value.charAt(4)))*5)+((parseInt(form[objeto].value.charAt(5)))*4)	+((parseInt(form[objeto].value.charAt(6)))*3)+((parseInt(form[objeto].value.charAt(7)))*2)+((parseInt(form[objeto].value.charAt(8)))*1);
					valor =11-(valor%11);
					if ( valor == 10||  valor == 11)
						valor=0;
					if ( parseInt(form[objeto].value.charAt(9)) != valor)
						nifError++;
			}				
			if (nifError > 0)
					error += "O campo '" + Obj[objeto].contenido + "' deve ser sido valor  \n";
		}	
		//validacion del combo
		if (form[objeto] && Obj[objeto].tipo == "combo" && form[objeto].value == "off") 
			error += "Seleccione '" + Obj[objeto].contenido + "' del desplegable \n"; 

		//validacion de los campos requeridos
		if (form[objeto] && Obj[objeto].requerido == "si" && form[objeto].value == "" && Obj[objeto].tipo != "Telefono_no") { //si es telefono no, no es requerido
			if (Obj[objeto].customErrMsg) {
				error += Obj[objeto].customErrMsg + "'\n";
			} else {
				error += "Debe rellenar el campo '" + Obj[objeto].contenido + "'\n";
			}
		}
            
        //de momento NO SE USA
		/*if (eActual.type && eActual.type.indexOf("select") != -1) 
		{
				if(eActual.options[eActual.options.selectedIndex].getAttribute('seleccionable')=="no") 
				{
					error+="Debe seleccionar una opci\363n v\341lida en el campo '" +eActual.getAttribute('contenido')+ "'\n";
				}
		}*/
	} //fin del recorrido por el Obj[objeto] Obj
	
	//mensaje de error para los radio buttons
	for (k = 0; k < arrayRadios.length; k++)
	{
		if (!arrayRadios[k][0]) {
			if (arrayRadios[k][3]) {
				error += arrayRadios[k][3] + "'\n";
			} else {
				error += "Debe seleccionar una opci\363n en el campo '" + arrayRadios[k][2] + "\n";
			}
		}
	}

	//validacion final
	if (error != "") 
	{
		alert(error);
		return false;
	} 
	else
		return true;
} //fin de la funcion validar_submit()


//funcion para usar cuando el boton para enviar el formulario es un href
function validar(form)
{
if(validar_submit(form) == true)
		form.submit();
}
	
	
function checkFields() 
{
	missinginfo = "";	
	if (document.frm_recordar_clave.login.value == "" && document.frm_recordar_clave.email.value == "") 
		missinginfo = "\n     -  Debe rellenar al menos uno de los campos: el Login o el Email ";
		
	if (missinginfo != "") 
	{ 
		missinginfo ="Por favor revise los campos:\n" + missinginfo;
		alert(missinginfo);
		//return false;
	} 
	else
	{
		document.frm_recordar_clave.submit();
		//if(!validar(document.frm_recordar_clave)) return false;
	} 
}


function letternumber(e)
{
	var key;
	var keychar;
	
	if (window.event) 
		key = window.event.keyCode;
	else if (e) 
		key = e.which;
	else 
		return true;
	
	keychar = String.fromCharCode(key);
	keychar = keychar.toLowerCase();
	
	// control keys
	if ((key==null) || (key==0) || (key==8) ||  (key==9) || (key==13) || (key==27) ) 
		return true;
	// alphas and numbers que se permiten
	else if ((("_abcdefghijklmnopqrstuvwxyzáéíóúüñ@0123456789.,- º/'").indexOf(keychar) > -1)) 
		return true;
	else 
		return false;
}


//esta funcion solo permite numeros y  un solo '.'.
function justNumbers(e,o)
{
	var key;
	var keychar;
	
	if (window.event) 
		key = window.event.keyCode;
	else if (e) 
		key = e.which;
	else 
		return true;
	
	keychar = String.fromCharCode(key);
	keychar = keychar.toLowerCase();
	
	// control keys
	if ((key==null) || (key==0) || (key==8) ||  (key==9) || (key==13) || (key==27) ) 
		return true;
	// alphas and numbers que se permiten
	else 
	{
		if(o.value.indexOf('.')==-1)
		{
			if ((("01234567893.").indexOf(keychar) > -1)) 	
				return true;	
			else 		
				return false;
		} 
		else 
		{
			if ((("01234567893").indexOf(keychar) > -1)) 	
				return true;	
			else 		
				return false;
		}
	}
}