/*******************************************************************************************
	IMPORTANTE PARA KE FUNCIONE

	El nombre de los campos debe construirse de la siguiente forma :

- Campos obligatorios 			--> Nombre_Campo + "@o"
- Campos numericos    			--> Nombre_Campo + "@n"
- Campos email				--> Nombre_Campo + "@e"
- Campos fecha				--> Nombre_Campo + "@f"
- Campos DNI				--> Nombre_Campo + "@d"
- Campos numeros cuenta bancaria:
	* Posibilidad campo único		--> Nombre_Campo + "@c"
	* Posibilidad 4 campos:
		+ Campo Banco						--> Nombre_Campo + "@c1"
		+ Campo Oficina						--> Nombre_Campo + "@c2"
		+ Campo DC						--> Nombre_Campo + "@c3"
		+ Campo Cuenta						--> Nombre_Campo + "@c4"
- Campos obligatorios y numericos	--> Nombre_Campo + "@o@n"
- Campos obligatorios y email		--> Nombre_Campo + "@o@e"
- Campos obligatorios y fecha		--> Nombre_Campo + "@o@f"
- Campos obligatorios y DNI		--> Nombre_Campo + "@o@d"
- Campos obligatorios y numeros cuenta bancaria:
	* Posibilidad campo único		--> Nombre_Campo + "@o@c"
	* Posibilidad 4 campos:
		+ Campo Banco						--> Nombre_Campo + "@o@c1"
		+ Campo Oficina						--> Nombre_Campo + "@o@c2"
		+ Campo DC						--> Nombre_Campo + "@o@c3"
		+ Campo Cuenta						--> Nombre_Campo + "@o@c4"

*******************************************************************************************/

var numero1 = "";
var numero4 = "";


//funcion principal:le pasamos el formulario y nos devuelve el resultado de la validacion
function validaform(item) {

	//bucle ke recorre todos los campos
	for (var i=0; i < item.length; i++) {
		if (ValidaCampo(item[i],item[i].name,extrae_nombre(item[i].id),extrae_tipo(item[i].name))==false)
			return false
	}
	return true
}


//funcion que valida los campos de un formulario sin usar expresiones regulares
function ValidaCampo(campo,nombre_campo,nombre,tipo) {
    
    var error = false;
    
    //dependiendo del tipo de campo se muestra un mensaje u otro y la 
    //validacion devuelve false

	switch(tipo) {
		
		case 1 : if (campo.value == "") {
					alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
					return false					
				 }
				 break;
				 
		case 2 : if (isNaN(PuntosPorComas(campo.value))) {
					alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
					return false	
				 }
				 break;
		case 3 : if (isMail(campo.value)==false) {
					alert("ERROR: El campo '"+ nombre +"' es una dirección de correo incorrecta");
					return false
				 }
				 break;
		case 4 : return checkdate(campo)				
				 break;
		case 5 : numero1 = extrae_numero(campo.value);
				 if (isNaN(numero1)) {
					alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
					return false	
				 }
				 if (numero1.length != 20) {
					alert("ERROR: El campo '"+nombre+"' debe contener 20 cifras");
					return false;
				 }
				 else {
					if (valida_cuenta(numero1.substring(0,8),numero1.substring(8,9),false) == false)
						error = true;
					if (valida_cuenta(numero1.substring(10,20),numero1.substring(9,10),true) == false)
						error = true;
					if (error == true)
						alert("ERROR: El campo '"+nombre+"' es un número de cuenta incorrecto");
					return !error
				 }
				 break;
		case 6 : if (isNaN(PuntosPorComas(campo.value))) {
					alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
					return false	
				 }
				 switch(nombre_campo.substring(nombre_campo.length-1,nombre_campo.length)) {
				 
					case "1": if (campo.value.length != 4) {
								alert("ERROR: El campo '"+ nombre +"' debe contener 4 cifras");
								return false
							}
							else {
								numero4 = campo.value;
					
							}
							break;
					case "2": if (campo.value.length != 4) {
								alert("ERROR: El campo '"+ nombre +"' debe contener 4 cifras");
								return false
							}
							else {
								numero4 = numero4 + campo.value;
					
							}
							break;
					case "3": if (campo.value.length != 2) {
								alert("ERROR: El campo '"+ nombre +"' debe contener 2 cifras");
								return false
							}
							else {
								numero4 = numero4 + campo.value;
					
							}
							break;
					case "4": if (campo.value.length != 10) {
								alert("ERROR: El campo '"+ nombre +"' debe contener 10 cifras");
								return false
							}
							else {
								numero4 = numero4 + campo.value;
					
								if (numero4.length != 20){
									alert("ERROR: El campo '"+nombre+"' debe contener 20 cifras");
									return false
								}
								else {
									if (valida_cuenta(numero4.substring(0,8),numero4.substring(8,9),false) == false)
										error = true;
									if (valida_cuenta(numero4.substring(10,20),numero4.substring(9,10),true) == false)
										error = true;
									if (error == true)
										alert("ERROR: El campo '"+nombre+"' es un número de cuenta incorrecto");
									return !error
								}
							}
							break;
				 }
				 break;
		case 7 : if ((campo.value == "") || (isNaN(PuntosPorComas(campo.value)))) {
					if (campo.value == "") 
						alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio")
					if (isNaN(PuntosPorComas(campo.value))) 
						alert("ERROR: El campo '"+ nombre +"' debe ser numerico")
					return false
				 }
				 break;
		case 8 : if ((campo.value == "") || (isMail(campo.value)==false)) {
					if (campo.value == "") 
						alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio")
					if (isMail(campo.value)==false) 
						alert("ERROR: El campo '"+ nombre +"' es una dirección de correo incorrecta")
					return false
				 }
				 break;
		case 9 : if (campo.value == "") {
					alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
					return false
				 }
				 return checkdate(campo) 
				 break;			
		case 10: if (campo.value == "") {
					alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
					return false
				 }
				 numero1 = extrae_numero(campo.value);
				 if (isNaN(PuntosPorComas(numero1))) {
					alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
					return false	
				 }
				 if (numero1.length != 20) {
					alert("ERROR: El campo '"+nombre+"' debe contener 20 cifras");
					return false;
				 }
				 else {
					if (valida_cuenta(numero1.substring(0,8),numero1.substring(8,9),false) == false)
						error = true;
					if (valida_cuenta(numero1.substring(10,20),numero1.substring(9,10),true) == false)
						error = true;
					if (error == true)
						alert("ERROR: El campo '"+nombre+"' es un número de cuenta incorrecto");
					return !error
				 }
				 break;
		case 11: if (campo.value == "") {
					alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
					return false
				 }
				 if (isNaN(PuntosPorComas(campo.value))) {
					alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
					return false	
				 }
				 switch(nombre_campo.substring(nombre_campo.length-1,nombre_campo.length)) {
				 
					case "1": if (campo.value.length != 4) {
								alert("ERROR: El campo '"+ nombre +"' debe contener 4 cifras");
								return false
							}
							else {
								numero4 = campo.value;
					
							}
							break;
					case "2": if (campo.value.length != 4) {
								alert("ERROR: El campo '"+ nombre +"' debe contener 4 cifras");
								return false
							}
							else {
								numero4 = numero4 + campo.value;
					
							}
							break;
					case "3": if (campo.value.length != 2) {
								alert("ERROR: El campo '"+ nombre +"' debe contener 2 cifras");
								return false
							}
							else {
								numero4 = numero4 + campo.value;
					
							}
							break;
					case "4": if (campo.value.length != 10) {
								alert("ERROR: El campo '"+ nombre +"' debe contener 10 cifras");
								return false
							}
							else {
								numero4 = numero4 + campo.value;
								if (numero4.length != 20){
									alert("ERROR: El campo '"+nombre+"' debe contener 20 cifras");
									return false
								}
								else {
									if (valida_cuenta(numero4.substring(0,8),numero4.substring(8,9),false) == false)
										error = true;
									if (valida_cuenta(numero4.substring(10,20),numero4.substring(9,10),true) == false)
										error = true;
									if (error == true)
										alert("ERROR: El campo cuenta corriente es un número de cuenta incorrecto");
									return !error
								}
							}
							break;
				 }
				 break;

		case 12 : if (campo.value == "") {
					alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
					return false
				  }
				  if (isDNI(campo.value) == false) {
					alert("ERROR: El campo '"+ nombre +"' no es un DNI correcto");
					return false;
				  }
				  else return true;
				  break;			

		case 13 : if (isDNI(campo.value) == false) {
					alert("ERROR: El campo '"+ nombre +"' no es un DNI correcto");
					return false;
				  }
				  else return true;
				  break;			

				 
	}

//si no hay ningun error de tipos de campo comprobamos que no haya caracteres invalidos

  var ubicacion
  var enter = "\n"
//  var caracteres = "abcdefghijklmnopqrstuvwxyzñ1234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZÑáéíóúÁÉÍÓÚ@." + String.fromCharCode(13) + enter
  var invalidos = "<>'" + String.fromCharCode(34)
  
  var contador = 0
	
  if ((campo.value != null)&&(campo.type != "button"))
	  for (var i=0; i < campo.value.length; i++) {
	    ubicacion = campo.value.substring(i, i + 1)
	//    if (caracteres.indexOf(ubicacion) != -1) {
		if (invalidos.indexOf(ubicacion)==-1) {
	      contador++
	    } else {
	      alert("ERROR: No se acepta el caracter (" + ubicacion + ") en el campo '"+ nombre +"'.")
	      return false
	    }
	  }

}

//funcion que elimina cualquier caracter no numerico del campo cuenta.
function extrae_numero(campo) {
	
	var num = "";
	
	for(var i=0; i < campo.length; i++) {
		
		if (!(isNaN(campo.substring(i,i+1))))
			num = num + campo.substring(i,i+1);
			
	}

return num
}

function valida_cuenta(num,cc,cuenta) {

	var pesos = new Array(11);
	var contpesos, contnum;
	var suma, resto, ccc;
		
	pesos[0] = 0 ; pesos[1] = 6 ; pesos[2] = 3 ; pesos[3] = 7 ; pesos[4] = 9 ; 
	pesos[5] = 10 ; pesos[6] = 5 ; pesos[7] = 8 ; pesos[8] = 4 ; pesos[9] = 2 ;
	pesos[10] = 1; 
	
	if (cuenta == true)
		contpesos = 10;
	else
		contpesos = 8;
		
	suma = 0;
	for(contnum = 1; contnum <= num.length; contnum ++) {
		suma = suma + (pesos[contpesos] * parseInt(num.substring(contnum-1,contnum)));
		contpesos = contpesos - 1;
	}
	
	resto = suma % 11;
	ccc = 11 - resto
	
	if (ccc == 10) ccc = 1;
	if (ccc == 11) ccc = 0;
		
	if (ccc == parseInt(cc)) 
		return true
	else 
		return false
	
}


//funcion que extrae el tipo del campo a partir del nombre del campo
function extrae_tipo(nombre) {

	var i,tipo;
	i = nombre.indexOf("@");
	tipo = 0;

	while (i > -1) {
	
		switch(nombre.substring(i+1,i+2)) {
		
			case "o" : tipo = 1;
					   break; 
			case "n" : if (tipo == 1) tipo = 7;
					   else tipo = 2;
					   return tipo
					   break;
			case "e" : if (tipo == 1) tipo = 8;
					   else tipo = 3;
					   return tipo
					   break;
			case "f" : if (tipo == 1) tipo = 9;
					   else tipo = 4;
					   return tipo
					   break;
			case "c" : switch(nombre.substring(i+2,i+3)) {
			
							case "" : if (tipo == 1) tipo = 10;
									  else tipo = 5;
									  break;
										  
							default : if (tipo == 1) tipo = 11;
									  else tipo = 6;
									  break;
						
					   }
					   break;
			case "d" : if (tipo == 1) tipo = 12;
					   else tipo = 13;
					   return tipo;
					   break;
		}
	
		i = nombre.indexOf("@",i+1);
	}

	return tipo
}

//funcion ke devuelve el nombre del campo sin _ ni cosas raras
function extrae_nombre(nombre) {

	var i;
	var cadena;
	
	i = nombre.indexOf("@");
	if (i == -1) 
		cadena = nombre
	else 
		cadena = nombre.substring(0,i);
	while (cadena.indexOf("_") > 0)
	{
		cadena = cadena.replace ("_"," ");
	}
	return cadena;
		
}


//funcion ke valida ke una direccion de correo este bien escrita
function isMail(Cadena) {

	valido = true
	
	if (Cadena != "") {

		Punto = Cadena.substring(Cadena.lastIndexOf('.') + 1, Cadena.length)			// Cadena del .com
		Dominio = Cadena.substring(Cadena.lastIndexOf('@') + 1, Cadena.lastIndexOf('.')) 	// Dominio @lala.com
		Usuario = Cadena.substring(0, Cadena.lastIndexOf('@'))					// Cadena lalala@
		Reserv = "@/º\"\'+*{}\\<>?¿[]áéíóú#·¡!^*;,:"						// Letras Reservadas
	
		// Añadida por El Codigo para poder emitir un alert en funcion de si email valido o no

	
		// verifica qie el Usuario no tenga un caracter especial
		for (var Cont=0; Cont<Usuario.length; Cont++) {
			X = Usuario.substring(Cont,Cont+1)
			if (Reserv.indexOf(X)!=-1)
		            	valido = false
		}

		// verifica qie el Punto no tenga un caracter especial
		for (var Cont=0; Cont<Punto.length; Cont++) {
			X=Punto.substring(Cont,Cont+1)
			if (Reserv.indexOf(X)!=-1)
				valido = false
		}
		                    
		// verifica qie el Dominio no tenga un caracter especial
		for (var Cont=0; Cont<Dominio.length; Cont++) {
			X=Dominio.substring(Cont,Cont+1)
			if (Reserv.indexOf(X)!=-1)
				valido = false
		}

		// Verifica la sintaxis básica.....
		if (Punto.length<2 || Dominio <1 || Cadena.lastIndexOf('.')<0 || Cadena.lastIndexOf('@')<0 || Usuario<1) {
			valido = false
		}
	}
		
	return valido	
}


//funcion que valida que el dni sea correcto
function isDNI(dni) {  

	var cadena ="TRWAGMYFPDXBNJZSQVHLCKE";  
	var n_dni = '';
	var l_dni = '';
	var letra = '';
	
	n_dni = dni.substring(0,dni.length-1);
	
	if (isNaN(n_dni))
		return false;
	
	if (dni.substring(dni.length-1,dni.length) == "") {
		alert("ERROR: Debe introducir la letra del NIF");
		return false
	}	
	else {
		 letra = (dni.substring(dni.length-1,dni.length)).toUpperCase(dni.substring(dni.length-1,dni.length));
		 if (cadena.indexOf(letra)==-1) 
			return false;
		 else
			l_dni = cadena.substring(parseInt(n_dni) % 23,parseInt(n_dni) % 23+1);
	}

	if (letra != l_dni) 
		return false;
	
	return true

}  



//funciones ke validan ke la fecha sea una fecha correcta
function checkdate(objName) {
	var err = 0;
	var datefield = objName;

	err = true;
	if (datefield.value.length>0) {
		if (chkdate(objName) == false) {
		 datefield.select();
		 alert("Fecha incorrecta. Introduzcala de nuevo!.");
		 datefield.focus();
		 err = false;
		}
		else {
		 err = true;
		}
	}

	 return err; 

}


function chkdate(objName) {
	var strDatestyle = "eu"; 
	var strDate;
	var strDateArray;
	var strDay;
	var strMonth;
	var strYear;
	var intday;
	var intMonth;
	var intYear;
	var booFound = false;
	var datefield = objName;
	var strSeparatorArray = new Array("-"," ","/",".");
	var intElementNr;
	var err = 0;
	var strMonthArray = new Array(12);

	strMonthArray[0] = "/01/";
	strMonthArray[1] = "/2/";
	strMonthArray[2] = "/3/";
	strMonthArray[3] = "/4/";
	strMonthArray[4] = "/5/";
	strMonthArray[5] = "/6/";
	strMonthArray[6] = "/7/";
	strMonthArray[7] = "/8/";
	strMonthArray[8] = "/9/";
	strMonthArray[9] = "/10/";
	strMonthArray[10] = "/11/";
	strMonthArray[11] = "/12/";
	strDate = datefield.value;

	if (strDate.length < 6) {
		return false;
	}

	for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
		if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
			strDateArray = strDate.split(strSeparatorArray[intElementNr]);
			if (strDateArray.length != 3) {
				err = 1;
				return false;
			}
			else {
				strDay = strDateArray[0];
				strMonth = strDateArray[1];
				strYear = strDateArray[2];
			}
			booFound = true;
		}
	}

	if (booFound == false) {
		if (strDate.length>5) {
			strDay = strDate.substr(0, 2);
			strMonth = strDate.substr(2, 2);
			strYear = strDate.substr(4);
		}
	}

	if (strYear.length == 2) {
		strYear = '20' + strYear;
	}

	// US style
	if (strDatestyle == "US") {
		strTemp = strDay;
		strDay = strMonth;
		strMonth = strTemp;
	}
	
	intday = parseInt(strDay, 10);
	if (isNaN(intday)) {
		err = 2;
		return false;
	}
	
	intMonth = parseInt(strMonth, 10);
	if (isNaN(intMonth)) {
		for (i = 0;i<12;i++) {
			if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
				intMonth = i+1;
				strMonth = strMonthArray[i];
				i = 12;
	        }
		}
		if (isNaN(intMonth)) {
			err = 3;
			return false;
        }
	}
	
	intYear = parseInt(strYear, 10);
	if (isNaN(intYear)) {
		err = 4;
		return false;
	}

	if (intMonth>12 || intMonth<1) {
		err = 5;
		return false;
	}

	if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
		err = 6;
		return false;
	}

	if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
		err = 7;
		return false;
	}

	if (intMonth == 2) {
		if (intday < 1) {
			err = 8;
			return false;
		}
		if (LeapYear(intYear) == true) {
			if (intday > 29) {
				err = 9;
				return false;
			}
		}
		else {
			if (intday > 28) {
				err = 10;
				return false;
			}
		}
	}

	if (strDatestyle == "US") {
		datefield.value = strMonthArray[intMonth-1] + "" + intday+"" + strYear;
	}
	else {
		datefield.value = intday + "" + strMonthArray[intMonth-1] + "" + strYear;
	}
	return true;
}


function LeapYear(intYear) {
	if (intYear % 100 == 0) {
		if (intYear % 400 == 0) { return true; }
	}
	else {
		if ((intYear % 4) == 0) { return true; }
	}
	return false;
}

//funcion que cambia las comas por puntos en los valores enteros
function PuntosPorComas(s) {

	pos = s.indexOf(","); 
	if (pos > 0)
		return (s.substring(0,pos-1)+'.'+s.substring(pos+1,s.length));
	else
		return s;	
}