/*
Función para validar campos en cualquier Página
Observaciones de los parámetros
Por cada campo de tipo text se deberá ingresar, de manera obligatoria, un campo de tipo hidden,
el cual va a contener los parámetros necesarios para el despliegue de errores, en sus atributos VALUE y NAME.
A continuación se lista los parámetros ingresados en el atributo VALUE de los campos hidden :
        Listado de Parámetros utilizados actualmente
                        R = Campo Requerido
                        N = Campo Numérico
                        O = Campo Numérico Positivo
                        C = Campo para Cédula
                        U = Campo para Ruc
                        E = Campo para Direcciones E-Mail
                        P = Campo para Contraseñas
                        V = Campo para Confirmar Contraseñas
                        F = Campo para fechas con formato aaaa-mm-dd
                Combinaciones
                        RN = Campo Requerido para Caracteres Numéricos
                        RO = Campo Requerido para Caracteres Numéricos Positivos
                        RC = Campo Requerido para Cédula
                        RU = Campo Requerido para Ruc
                        RE = Campo Requerido para Direcciones E_Mail
                        RP = Campo Requerido para Contraseñas
                        RV = Campo Requerido para Confirmar Contraseñas
                        RF = Campo Requerido para fechas con formato aaaa-mm-dd
Estos parámetros pueden ser incrementados, según la necesidad, dependiendo del tipo de validación de los campos.
En el atributo NAME de los campos hidden, se deberá ingresar los nombres correspondientes
a los campos text, que queremos que se desplieguen en el listado de errores(errors).
Para el caso de los combobox, si el usuario está obligado a escoger una opción,
el parámetro será ingresado en la propiedad size de la lista y su valor será 1, si la selección del combobox,
no es obligatoria para el usuario, simplemente no se colocará la propiedad size=1.  En esta validación no nos hace
falta ingresar el valor de la propiedad value del objeto hidden del combobox, ya que no deseamos obtener su valor.

Actualmente esta función valida:
        campos que contengan sólo caracteres
        campos que contengan sólo números
        que la cédula contenga 10 números, y comprueba el dígito verificador
        que el ruc contenga 13 números
        que la dirección e-mail contenga el signo arroba en medio de dos cadenas de caracteres
        que la confirmación de la contraseña sea correcta
        que el campo de la contraseñatenga 8 dígitos con un mínimo de dos caracteres numéricos y un caracter especial
        que los campos requeridos sean llenados
        que el usuario escoja las opciones de los combobox
*/
// Seteo de Variables para cheqeo de fechas.
var minanifec = "",maxanifec="";
var banminani = typeof minani;
var banmaxani = typeof maxani;
var radname = "";
var radchec = false;
var inderr = -1;
if (banminani=='undefined')
{
    minanifec='1900';
}//if
else
{
    minanifec=minani;
}//else

function validate(form)
{
  var p, val, c, confirma='', countchar=0, countesp=0, errors='', fechaserver='';
  inderr = -1;
  //Captura de todos los elementos de la forma
  for (var i=0; i < form.elements.length; i++)
  {
    //alert('Elemento de tipo: '+form.elements[i].type+' de nombre: '+form.elements[i].name+' con valor: '+form.elements[i].value );
    //Seleciona sólo los campos de tipo text
    if(form.elements[i].type == 'text' || form.elements[i].type == 'password')
    {
      if(form.elements[i].value != "")
      {
        //Incremento la variable i, para acceder al campo hidden y evaluarlo con su atributo VALUE
        i++;
        if(form.elements[i].type=='hidden')
        {
          //Valida campos para direcciones e-mail
          if(form.elements[i].value.toUpperCase() == 'RE' || form.elements[i].value.toUpperCase() == 'E')
          {
            //Decremento la variable i, para acceder al valor ingresado por el usuario en el campo text
            i--;
            //La función indexOf guarda en p el índice del caracter @.  Luego p es evaluado,
            //si está en la primera o última posición de la cadena, incrementa errors
            p=form.elements[i].value.indexOf('@');
            if (p<1 || p==(form.elements[i].value.length-1))
            {
              errors+='-'+' El e-mail'+' '+form.elements[i].value+' NO es válido.\n';
              inderr = (inderr!=-1?inderr:i);
            }//if indexof @
            continue;
          }//if RE
          //Valida campos para caracteres numéricos
          if(form.elements[i].value.toUpperCase() == 'RN' || form.elements[i].value.toUpperCase() == 'N')
          {
            i--;
            //La Función isNaN evalúa y determina si hay un caracter en la cadena, dando true si lo encuentra
            if(isNaN(form.elements[i].value))
            {
              errors+='-'+' El campo'+' '+form.elements[i+1].name+' SOLO puede contener números.\n';
              inderr = (inderr!=-1?inderr:i);
            }//if
            continue;
          }//if RN
          //Valida campos para caracteres numéricos positivos
          if(form.elements[i].value.toUpperCase() == 'RO' || form.elements[i].value.toUpperCase() == 'O')
          {
            i--;
            //La Función isNaN evalúa y determina si hay un caracter en la cadena, dando true si lo encuentra
            if(isNaN(form.elements[i].value))
            {
              errors+='-'+' El campo'+' '+form.elements[i+1].name+' SOLO puede contener números.\n';
              inderr = (inderr!=-1?inderr:i);
            }//if
            else if(form.elements[i].value<0)
                 {
                   errors+='-'+' El campo'+' '+form.elements[i+1].name+' SOLO puede contener números positivos.\n';
                   inderr = (inderr!=-1?inderr:i);
                 }//IF
            continue;
          }//if RO
          //Valida campos para cédulas
          if(form.elements[i].value.toUpperCase() == 'RC' || form.elements[i].value.toUpperCase() == 'C')
          {
            i--;
            if(isNaN(form.elements[i].value))
            {
              errors+='-'+' El campo'+' '+form.elements[i+1].name+' SOLO puede contener números.\n';
              inderr = (inderr!=-1?inderr:i);
            }//if
            else if(form.elements[i].value.length != 10)
                 {
                   errors+='-'+' El Número de Cédula'+' '+form.elements[i].value+' NO es válido, debe tener 10 dígitos.\n';
                   inderr = (inderr!=-1?inderr:i);
                 }//if
                 // Código de validación del dígito verificador de la cedula.
                 else
                 {
                   var vscedide = form.elements[i].value;
                   var viced = new Array(9);
                   vedigver=0;
                   for(var veaux=0;veaux<9;veaux++)
                     viced[veaux]=parseInt(vscedide.charAt(veaux));
                   vedigver=parseInt(vscedide.charAt(9));
                   var sumatotal=0;
                   for(veaux=0;veaux<9;veaux++)
                   {
                     if((veaux%2)==0)                     // Verifica los indices pares del vector
                     {
                       viced[veaux]*=2;                   //Multiplica los indices pares del vector por 2
                       if(viced[veaux]>=10)               //Verifica si la cantidad obtenida es mayor o igual a 10
                         viced[veaux]=viced[veaux]%10+1 ; //Si es mayor que 10 suma la decena y la unidad y la guarda en el vector (ej.  14 el valor guardado es 5)
                     }//if
                   }//for
                   for(veaux=0;veaux<9;veaux++)           //Recorre todo el vector y va sumando cada uno de los valores guardados,
                     sumatotal+=viced[veaux];             //almacenando el total en la variable sumatotal
                   if((sumatotal+vedigver)%10!=0)         // Suma el total con el digito verificador de la cedula, y si el modulo 10 de esta suma es igual a 0 la cedula es correcta, caso contrario es incorrecta.
                   {
                     errors+='-'+' El Número de Cédula'+' '+form.elements[i].value+' NO es válido, el dígito verificador es incorrecto.\n';
                     inderr = (inderr!=-1?inderr:i);
                   }
                 }
            continue;
          }//if RC
          //Valida campos para Ruc
          if(form.elements[i].type=='hidden' && (form.elements[i].value.toUpperCase() == 'RU' || form.elements[i].value.toUpperCase() == 'U') )
          {
            i--;
            if(isNaN(form.elements[i].value))
            {
              errors+='-'+' El campo'+' '+form.elements[i+1].name+' SOLO puede contener números.\n';
              inderr = (inderr!=-1?inderr:i);
            }
            else if(form.elements[i].value.length != 13)
                 {
                   errors+='-'+' El Número de Ruc'+' '+form.elements[i].value+' NO es válido, debe tener 13 dígitos.\n';
                   inderr = (inderr!=-1?inderr:i);
                 }
            continue;
          }//if RU
          //Valida campo para contraseña, que tenga 8 dígitos con un mínimo de dos números y un caracter especial
          if(form.elements[i].value.toUpperCase() == 'RP' || form.elements[i].value.toUpperCase() == 'P')
          {
            i--;
            if(form.elements[i].value.length != 8)
            {
              errors+='-'+' La Contraseña'+' '+form.elements[i].value+' NO es válida, debe tener 8 dígitos.\n';
              inderr = (inderr!=-1?inderr:i);
            }//if length!=8
            else
            {
              val=form.elements[i].value;
              for(var j=0;j<8;j++)
              {
                c=val.charAt(j);
                if(isNaN(c))
                {
                  countchar++;
                  if(
                      c=='!' || c=='#' || c=='$' || c=='%' || c=='&' || c=='/' || c=='(' || c==')' || c=='=' || c=='?' || c=='.' || c==',' || c==';' || c==':' ||
                      c=='{' || c=='}' || c=='[' || c==']' || c=='+' || c=='*' || c=='~' || c=='@' || c=='>' || c=='<' || c=='_' || c=='-' || c=='|' || c=='\\'
                    )
                    countesp++;
                }//if isNAN(c)
              }//for
            }//else length!=8
            if(countchar>6)
            {
              if(countesp == 0)
              {
                errors+='-'+' La Contraseña'+' '+form.elements[i].value+' NO es válida.\n';
                inderr = (inderr!=-1?inderr:i);
              }//ifcountesp == 0
              else
              {
                errors+='-'+' La Contraseña'+' '+form.elements[i].value+' NO es válida.\n';
                inderr = (inderr!=-1?inderr:i);
              }//else countesp==0
            }//ifcountchar>6
            else
              if(countesp == 0)
              {
                errors+='-'+' La Contraseña'+' '+form.elements[i].value+' NO es válida.\n';
                inderr = (inderr!=-1?inderr:i);
              }//ifcountesp==0
              else
                confirma=val;
            continue;
          }//if RP
          //Valida campo para Confirmar Contraseña
          if(form.elements[i].value.toUpperCase() == 'RV' || form.elements[i].value.toUpperCase() == 'V')
          {
            i--;
            if(form.elements[i].value != confirma)
            {
              errors+='-'+' La Confirmación NO es válida, NO coincide con la contraseña.\n';
              inderr = (inderr!=-1?inderr:i);
            }
            continue;
          }//if RV
          //validación de Campo para Años
          if(form.elements[i].value.toUpperCase() == 'RA' || form.elements[i].value.toUpperCase() == 'A')
          {
            i--;
            var anioini=1900;
            if(fechaserver != '')
              aniotop=fechaserver.getYear();
            else
              aniotop=2010;
            if(form.elements[i].value < anioini || form.elements[i].value > aniotop || isNaN(form.elements[i].value))
            {
              errors+='-'+' El AÑO ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';
              inderr = (inderr!=-1?inderr:i);
            }
            else
              var anio=form.elements[i].value;
            continue;
          }//if RA
          //Valida campo para meses
          if(form.elements[i].value.toUpperCase() == 'RM' || form.elements[i].value.toUpperCase() == 'M')
          {
            i--;
            if(form.elements[i].value < 1 || form.elements[i].value > 12 || isNaN(form.elements[i].value))
            {
              errors+='-'+' El MES ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';
              inderr = (inderr!=-1?inderr:i);
            }
            else
              var mes=form.elements[i].value;
            continue;
          }//if RM
          // Valida campo para días
          if(form.elements[i].value.toUpperCase() == 'RD' || form.elements[i].value.toUpperCase() == 'D')
          {
            i--;
            if(isNaN(form.elements[i].value) || form.elements[i].value>31 || form.elements[i].value<1)
            {
              errors+='-'+' El DIA ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';
              inderr = (inderr!=-1?inderr:i);
            }
            else
            {
              if(mes=='1' || mes=='01' || mes=='3' || mes=='03' || mes=='5' || mes=='05' || mes=='7' || mes=='07' || mes=='8' || mes=='08' || mes=='10' || mes=='12')
              {
                var diaini=1, diatop=31;
                if(form.elements[i].value < diaini || form.elements[i].value > diatop  || isNaN(form.elements[i].value))
                {
                  errors+='-'+' El DIA ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';
                  inderr = (inderr!=-1?inderr:i);
                }
              }
              if(mes=='4' || mes=='04' || mes=='6' || mes=='06' || mes=='9' || mes=='09' || mes=='11')
              {
                var diaini=1, diatop=30;
                if(form.elements[i].value < diaini || form.elements[i].value > diatop || isNaN(form.elements[i].value))
                {
                  errors+='-'+' El DIA ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';
                  inderr = (inderr!=-1?inderr:i);
                }
              }
              if(mes=='2' || mes=='02')
              {
                if(anio%4==0)
                {
                  var diaini=1, diatop=29;
                  if(form.elements[i].value < diaini || form.elements[i].value > diatop || isNaN(form.elements[i].value))
                  {
                    errors+='-'+' El DIA ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';
                    inderr = (inderr!=-1?inderr:i);
                  }
                }
                if(anio%4!=0)
                {
                  var diaini=1, diatop=28;
                  if(form.elements[i].value < diaini || form.elements[i].value > diatop || isNaN(form.elements[i].value))
                  {
                    errors+='-'+' El DIA ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';inderr = (inderr!=-1?inderr:i);
                    inderr = (inderr!=-1?inderr:i);
                  }
                }
              }
            }
            continue;
          }//if RD
          //Valida Campos para Fechas
          if(form.elements[i].value.toUpperCase() == 'RF' || form.elements[i].value.toUpperCase() == 'F')
          {
            i--;
            var anioini=1900;
            if(fechaserver != '')
              aniotop=fechaserver.getYear();
            else
              aniotop=2010;
            var diasmes = new Array (31,28,31,30,31,30,31,31,30,31,30,31);
            if(form.elements[i].value.length<10)
            {
              errors+='-'+' La FECHA ingresada en el campo '+form.elements[i+1].name+' no tiene el formato correcto aaaa-mm-dd.\n';
              inderr = (inderr!=-1?inderr:i);
            }
            else
            {
              var fecha = form.elements[i].value.split('-');
              if(fecha.length!=3)
              {
                errors+='-'+' La FECHA ingresada en el campo '+form.elements[i+1].name+' no tiene el formato correcto aaaa-mm-dd.\n';
                inderr = (inderr!=-1?inderr:i);
              }
              else
              {
                if( isNaN(fecha[0])  || isNaN(fecha[1].substr(0,1)) || isNaN(fecha[1].substr(1,1)) || isNaN(fecha[2].substr(0,1)) || isNaN(fecha[2].substr(1,1)) )
                {
                  errors+='-'+' La FECHA ingresada en el campo '+form.elements[i+1].name+' no tiene el formato correcto aaaa-mm-dd.\n   AÑO, MES y DIA deben ser numéricos.';
                  inderr = (inderr!=-1?inderr:i);
                }
                else
                {
                  if(fecha[0] < anioini || fecha[0] > aniotop)
                  {
                    errors+='-'+' El AÑO ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';
                    inderr = (inderr!=-1?inderr:i);
                  }
                  if(fecha[0]%4==0) diasmes[1] = 29;
                  if(fecha[1]<1 || fecha[1]>12)
                  {
                    errors+='-'+' El MES ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';
                    inderr = (inderr!=-1?inderr:i);
                  }
                  else if(fecha[2]<1 || fecha[2]>diasmes[fecha[1]-1])
                  {
                    errors+='-'+' El DIA ingresado en el campo '+form.elements[i+1].name+' no es válido.\n';
                    inderr = (inderr!=-1?inderr:i);
                  }
                }//else isNaN
              }//else fecha.length!=3
            }//else length<10
            continue;
          }//if RF
        } //if tipo hidden
        else
        {
          i--;
        }
        //En esta sección podemos ingresar métodos o código para incrementar la efectividad de la función VALIDATE(), para campos de typo text
      }//if !=""
      else
      {
        //Valida que todos los campos requeridos sean llenados.  Todos los campos que en el atributo VALUE
        //del hidden tengan antepuesto la "R", se deben incrementar en la condición if.
        i++;
        if(form.elements[i].type=='hidden')
        {
          if(
              form.elements[i].value.toUpperCase() =='R'  || form.elements[i].value.toUpperCase() =='RN' ||
              form.elements[i].value.toUpperCase() =='RE' || form.elements[i].value.toUpperCase() =='RC' ||
              form.elements[i].value.toUpperCase() =='RU' || form.elements[i].value.toUpperCase() =='RP' ||
              form.elements[i].value.toUpperCase() =='RV' || form.elements[i].value.toUpperCase() =='RA' ||
              form.elements[i].value.toUpperCase() =='RM' || form.elements[i].value.toUpperCase() =='RD' ||
              form.elements[i].value.toUpperCase() =='RO' || form.elements[i].value.toUpperCase() =='RF'
            )
          {
            errors+='-'+' El campo'+' '+form.elements[i].name+' '+ 'DEBE ser ingresado.\n';
            inderr = (inderr!=-1?inderr:i-1);
          }//if R, RN, ...... RF
        }//if hidden
        else
        {
          i--;
        }//else hidden
      }//else
    }//if text
    // Validación de menús de seleccion múltiple
    if(form.elements[i].type=='select-one' || form.elements[i].type=='select-multiple')
    {
      //alert ("Elemento: " + form.elements[i].name + " de tipo: " + form.elements[i].type + " con valor: " + form.elements[i].options[form.elements[i].selectedIndex].text);
      i++;
      if(form.elements[i].type=='hidden')
      {
        //Valida que se seleccione un item de la lista
        if(form.elements[i].value.toUpperCase() == 'R')
        {
          //Decremento la variable i, para acceder al valor selecconado por el usuario en el campo select
          i--;
          if (form.elements[i].options[form.elements[i].selectedIndex].value.toUpperCase()=='SELECCIONE' || form.elements[i].options[form.elements[i].selectedIndex].value.toUpperCase()=='SELECCIONAR')
          {
            errors+='-'+' Debe escoger una opción de la lista'+' '+form.elements[i+1].name+'.\n';
            inderr = (inderr!=-1?inderr:i);
          }
        }
        else
        {
          i--;
        }
      }
      else
      {
        i--;
      }
      continue;
    }// if es un select
    // Validación de radio buttons
    if(form.elements[i].type=='radio')
    {
      //alert ("Elemento: " + form.elements[i].name + " de tipo: " + form.elements[i].type + " con valor: " + form.elements[i].value + ' - '+form.elements[i].checked);
      if(radname==form.elements[i].name)
      {
        if(form.elements[i].checked)
          radchec = true;
      }
      else
      {
        radname = form.elements[i].name;
        radchec = form.elements[i].checked;
      }
      i++;
      if(form.elements[i].type=='hidden')
      {
        //Valida que se seleccione un item de la lista
        if(form.elements[i].value.toUpperCase() == 'R')
        {
          //Decremento la variable i, para acceder al valor selecconado por el usuario en el campo select
          i--;
          var nombre = form.elements[i].name;
          if(!radchec)
          {
            errors+='-'+' Debe escoger una opción de '+' '+form.elements[i+1].name+'.\n';
            inderr = (inderr!=-1?inderr:i);
          }
        }
        else
        {
          i--;
        }
      }
      else
      {
        i--;
      }
      continue;
    }// if es un radio button
    // Validación de checkbox
    if(form.elements[i].type=='checkbox')
    {
      //alert ("Elemento: " + form.elements[i].name + " de tipo: " + form.elements[i].type + " con valor: " + form.elements[i].value + ' - '+form.elements[i].checked);
      i++;
      if(form.elements[i] != null){
        if(form.elements[i].type=='hidden')
        {
          //Valida que se seleccione un item de la lista
          if(form.elements[i].value.toUpperCase() == 'R')
          {
            //Decremento la variable i, para acceder al valor selecconado por el usuario en el campo select
            i--;
            if(!form.elements[i].checked)
            {
              errors+='-'+' Debe seleccionar '+' '+form.elements[i+1].name+'.\n';
              inderr = (inderr!=-1?inderr:i);
            }
          }
        }
        else
        {
          i--;
        }
        continue;
      }else{
       i--;
      }//if form.elements es diferente de nulo 
      
    }// if es un checkbox
    // Validación de textarea
    if(form.elements[i].type=='textarea')
    {
      //alert ("Elemento: " + form.elements[i].name + " de tipo: " + form.elements[i].type + " con valor: " + form.elements[i].value );
      i++;
      if(form.elements[i].type=='hidden')
      {
        //Valida que se seleccione un item de la lista
        if(form.elements[i].value.toUpperCase() == 'R')
        {
          //Decremento la variable i, para acceder al valor del campo texarea
          i--;
          if(!form.elements[i].value)
          {
            errors+='-'+' El campo'+' '+form.elements[i+1].name+' '+ 'DEBE ser ingresado.\n';
            inderr = (inderr!=-1?inderr:i);
          }
        }
      }
      else
      {
        i--;
      }
      continue;
    }// if es un texarea
  //////////////// Fin de las valadaciones
  }
  //Si encontró errores, los despliega
  if(errors)
  {
    if(form.elements[inderr].type!="hidden")
    {
      if(form.elements[inderr].type=="text" || form.elements[inderr].type=="password")
      {
        form.elements[inderr].select();
      }
      form.elements[inderr].focus();
    }
    alert('Se han producido los siguientes errores :\n\n'+errors);
  }
  //Permite que los datos ingresados en todos los campos no se borren al retornar del alert()
  document.MM_returnValue = (errors == '');
}