/*******************************************************************************************
        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].name),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: Please introduce '"+ nombre +"' ");
                                        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:  '"+ nombre +"' this is not a correct e-mail address");
                                        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: Please introduce '"+ nombre +"' ")
                                        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: Please introduce '"+ nombre +"' ")
                                        if (isMail(campo.value)==false)
                                                alert("ERROR:  '"+ nombre +"' this is not a correct e-mail address")
                                        return false
                                 }
                                 break;
                case 9 : if (campo.value == "") {
                                        alert("ERROR: Please introduce '"+ nombre +"' ");
                                        return false
                                 }
                                 return checkdate(campo)
                                 break;
                case 10: if (campo.value == "") {
                                        alert("ERROR: Please introduce '"+ nombre +"' ");
                                        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: Please introduce '"+ nombre +"' ");
                                        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: Please introduce '"+ nombre +"' ");
                                        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("x");
        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("x",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("x");
        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] = "/02/";
        strMonthArray[2] = "/03/";
        strMonthArray[3] = "/04/";
        strMonthArray[4] = "/05/";
        strMonthArray[5] = "/06/";
        strMonthArray[6] = "/07/";
        strMonthArray[7] = "/08/";
        strMonthArray[8] = "/09/";
        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 {
        	if (intday<10) {
        		 intday = "0" + intday;	
        	}
                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;
}