/*******************************************************************************************
        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"

*******************************************************************************************/


function Trim(TRIM_VALUE){
if(TRIM_VALUE.length < 1){
return"";
}
TRIM_VALUE = RTrim(TRIM_VALUE);
TRIM_VALUE = LTrim(TRIM_VALUE);
if(TRIM_VALUE==""){
return "";
}
else{
return TRIM_VALUE;
}
} //End Function

function RTrim(VALUE){
var w_space = String.fromCharCode(32);
var v_length = VALUE.length;
var strTemp = "";
if(v_length < 0){
return"";
}
var iTemp = v_length -1;

while(iTemp > -1){
if(VALUE.charAt(iTemp) == w_space){
}
else{
strTemp = VALUE.substring(0,iTemp +1);
break;
}
iTemp = iTemp-1;

} //End While
return strTemp;

} //End Function

function LTrim(VALUE){
var w_space = String.fromCharCode(32);
if(v_length < 1){
return"";
}
var v_length = VALUE.length;
var strTemp = "";

var iTemp = 0;

while(iTemp < v_length){
if(VALUE.charAt(iTemp) == w_space){
}
else{
strTemp = VALUE.substring(iTemp,v_length);
break;
}
iTemp = iTemp + 1;
} //End While
return strTemp;
} //End Function


var numero1 = "";
var numero4 = "";
var formulario = "";

//funcion principal:le pasamos el formulario y nos devuelve el resultado de la validacion
function validaform(item) {
  formulario = 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 Poner_Foco(nombre_campo) {
  for (f = 0; f < document.forms.length; f++) {
    var Field = document.forms[f];
    if (Field==formulario) {
      for (i = 0; i < Field.length; i++) {
        if (document.forms[f].elements[i].name == nombre_campo) {
          document.forms[f].elements[i].focus();
        }
      }
    }
  }
}

//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 (Trim(campo.value) == "") {
          alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
          Poner_Foco(nombre_campo);
          return false
         }
         break;

    case 2 : if (isNaN(PuntosPorComas(campo.value))) {
          alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
          Poner_Foco(nombre_campo);
          return false
         }
         break;
    case 3 : if (isMail(campo.value)==false) {
          alert("ERROR: El campo '"+ nombre +"' es una dirección de correo incorrecta");
          Poner_Foco(nombre_campo);
          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");
          Poner_Foco(nombre_campo);
          return false
         }
         if (numero1.length != 20) {
          alert("ERROR: El campo '"+nombre+"' debe contener 20 cifras");
          Poner_Foco(nombre_campo);
          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");
            Poner_Foco(nombre_campo);
          }
          return !error
         }
         break;
    case 6 : if (isNaN(PuntosPorComas(campo.value))) {
          alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
          Poner_Foco(nombre_campo);
          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");
                Poner_Foco(nombre_campo);
                return false
              }
              else {
                numero4 = campo.value;

              }
              break;
          case "2": if (campo.value.length != 4) {
                alert("ERROR: El campo '"+ nombre +"' debe contener 4 cifras");
                Poner_Foco(nombre_campo);
                return false
              }
              else {
                numero4 = numero4 + campo.value;

              }
              break;
          case "3": if (campo.value.length != 2) {
                alert("ERROR: El campo '"+ nombre +"' debe contener 2 cifras");
                Poner_Foco(nombre_campo);
                return false
              }
              else {
                numero4 = numero4 + campo.value;

              }
              break;
          case "4": if (campo.value.length != 10) {
                alert("ERROR: El campo '"+ nombre +"' debe contener 10 cifras");
                Poner_Foco(nombre_campo);
                return false
              }
              else {
                numero4 = numero4 + campo.value;

                if (numero4.length != 20){
                  alert("ERROR: El campo '"+nombre+"' debe contener 20 cifras");
                  Poner_Foco(nombre_campo);
                  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");
                    Poner_Foco(nombre_campo);
                  }
                  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");
            Poner_Foco(nombre_campo);
          }
          if (isNaN(PuntosPorComas(campo.value))) {
            alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
            Poner_Foco(nombre_campo);
          }
          return false
         }
         break;
    case 8 : if ((campo.value == "") || (isMail(campo.value)==false)) {
          if (campo.value == "") {
            alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
            Poner_Foco(nombre_campo);
          }
          if (isMail(campo.value)==false) {
            alert("ERROR: El campo '"+ nombre +"' es una dirección de correo incorrecta");
            Poner_Foco(nombre_campo);
          }
          return false
         }
         break;
    case 9 : if (campo.value == "") {
          alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
          Poner_Foco(nombre_campo);
          return false
         }
         return checkdate(campo)
         break;
    case 10: if (campo.value == "") {
          alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
          Poner_Foco(nombre_campo);
          return false
         }
         numero1 = extrae_numero(campo.value);
         if (isNaN(PuntosPorComas(numero1))) {
          alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
          Poner_Foco(nombre_campo);
          return false
         }
         if (numero1.length != 20) {
          alert("ERROR: El campo '"+nombre+"' debe contener 20 cifras");
          Poner_Foco(nombre_campo);
          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");
            Poner_Foco(nombre_campo);
          }
          return !error
         }
         break;
    case 11: if (campo.value == "") {
          alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
          Poner_Foco(nombre_campo);
          return false
         }
         if (isNaN(PuntosPorComas(campo.value))) {
          alert("ERROR: El campo '"+ nombre +"' debe ser numerico");
          Poner_Foco(nombre_campo);
          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");
                Poner_Foco(nombre_campo);
                return false
              }
              else {
                numero4 = campo.value;

              }
              break;
          case "2": if (campo.value.length != 4) {
                alert("ERROR: El campo '"+ nombre +"' debe contener 4 cifras");
                Poner_Foco(nombre_campo);
                return false
              }
              else {
                numero4 = numero4 + campo.value;

              }
              break;
          case "3": if (campo.value.length != 2) {
                alert("ERROR: El campo '"+ nombre +"' debe contener 2 cifras");
                Poner_Foco(nombre_campo);
                return false
              }
              else {
                numero4 = numero4 + campo.value;

              }
              break;
          case "4": if (campo.value.length != 10) {
                alert("ERROR: El campo '"+ nombre +"' debe contener 10 cifras");
                Poner_Foco(nombre_campo);
                return false
              }
              else {
                numero4 = numero4 + campo.value;
                if (numero4.length != 20){
                  alert("ERROR: El campo '"+nombre+"' debe contener 20 cifras");
                  Poner_Foco(nombre_campo);
                  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");
                    Poner_Foco(nombre_campo);
                  }
                  return !error
                }
              }
              break;
         }
         break;

    case 12 : if (campo.value == "") {
          alert("ERROR: No puede dejar el campo '"+ nombre +"' vacio");
          Poner_Foco(nombre_campo);
          return false
          }
          if (isDNI(campo.value) == false) {
          alert("ERROR: El campo '"+ nombre +"' no es un DNI correcto");
          Poner_Foco(nombre_campo);
          return false;
          }
          else return true;
          break;

    case 13 : if (isDNI(campo.value) == false) {
          alert("ERROR: El campo '"+ nombre +"' no es un DNI correcto");
          Poner_Foco(nombre_campo);
          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 = ""

  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 {
  	if (!olvidar_invalidos) {
    alert("ERROR: No se acepta el caracter (" + ubicacion + ") en el campo '"+ nombre +"'.");
    Poner_Foco(nombre_campo);
    return false;
  } else {
  }
  }
  }

}

//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) {

  if (dni.length==0) return true;
  
  var cadena ="TRWAGMYFPDXBNJZSQVHLCKE";
  var n_dni = '';
  var l_dni = '';
  var letra = '';

  //si empieza por letra y el resto es numero lo damos por valido
  if (cadena.indexOf(dni.substring(0,1).toUpperCase())>0 && (!isNaN(dni.substring(1,dni.length)))) return true

  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;
}
