// Perfijos especiales que se tienen que añadir a los nombres de los campos para que sean correctamente validados
//
// Ch_Tx_  -> Campo obligatorio
// Ch_Em_  -> Campo de texto como dirección de email
// Ch_Se_  -> Campo select
// Ch_Sm_  -> Campo select multiple
// Ch_Ps_  -> Campo password
// Ch_Al_  -> Campo estrictamente alfabético
// Ch_Nu_  -> Campo estrictamente numérico


// Función principal que valida todos los tipos de campos del formulario
// La llamada en el formulario es: <form ... onsubmit="return validar(this)" ... >

function validar(todo)
{
  if(validar_text(todo)==false)
    exit();
  else
  {
    if(validar_select(todo)==false)
      exit();
	   else
	   {
	     if(validar_select_m(todo)==false)
	       exit();
      else
      {
        if(chequea_numeros(todo)==false)
          exit();
        else
        {
          if(chequea_letras(todo)==false)
            exit();
          else
          {
            if(chequea_pass(todo)==false)
              exit();
            else
              todo.submit();
          }
        }
      }
	   }
	 }
}


// Función para validar cualquier campo texto de un formulario
// Para que el campo sea validado el nombre del campo tiene que ser del tipo Ch_Nombre ej. <input type="text" name="Ch_Nombre">
// Si es una dirección de email y se quiere validar, el nombre del campo tiene que ser del tipo Ch_Em_Nombre ej. <input type="text" name="Ch_Em_Correo">

function validar_text(formulario)
{
  campos_txt=formulario.elements;
  for (i=0;i<=campos_txt.length-1;i++)
  {
    nombre_campo=(campos_txt[i].name.substring(6,campos_txt[i].name.length)); // Obtiene el nombre del campo sin las palabras claves
				if(((campos_txt[i].type=="text") || (campos_txt[i].type=="textarea")) && (campos_txt[i].name.substring(0,3)=="Ch_")) // Comprueba cuales son text o textarea y que además sean obligatorios
    {
 	    if(campos_txt[i].value.length==0)
 	    {
 	      alert("El campo " + nombre_campo + " NO debe estar vacio.");
 		     campos_txt[i].focus();
     		 return false
 	    }
 	    if(campos_txt[i].name.substring(3,6)=="Em_") // Comprueba si el campo es una dirección de email
 	    {
  		    pos_arroba=campos_txt[i].value.indexOf("@");
   		   if(pos_arroba<1) // Chequea la @
  	     {
  		      alert("El valor introducido en el campo " + nombre_campo + " no es correcto. Por favor revisa el prefijo y luego coloca el simbolo '@'.");
  			     campos_txt[i].focus();
    		    return false
        }
  		    cadena=campos_txt[i].value.substring(pos_arroba+1,campos_txt[i].value.length); // Obtiene la cadena que hay despues de la arroba
  		    if(cadena.indexOf("@")!=-1) // Chequea la si hay más de una @
  	     {
  		      alert("El valor introducido en el campo " + nombre_campo + " no es correcto. Por favor revisa que no has escrito más de una '@'.");
  			     campos_txt[i].focus();
    		    return false
        }
        if(((campos_txt[i].value.indexOf(".")-pos_arroba)<=1) || ((campos_txt[i].value.indexOf(".")+1)==campos_txt[i].value.length) || (((campos_txt[i].value.length)-(campos_txt[i].value.indexOf(".")+1))<2)) // chequea que entre la @ y el . haya al menos un carécter, que haya un . y que haya al menos un caracter de servidor
  		    { 
          alert("El valor introducido en el campo " + nombre_campo + " no es correcto. Por favor revisa el nombre del servidor, el punto '.' y el sufijo que esta despues del simbolo '@'."); 
          campos_txt[i].focus();
  			     return false
 	      } 
	     }
	   }
	 }
	 return true
}

// Función para validar cualquier campo select de un formulario
// Para que el campo sea validado, el nombre del campo tiene que ser del tipo Ch_Nombre ej. <select name="Ch_Tipo">

function validar_select(formulario)
{ 
  campos_select=formulario.elements;
  for(i=0;i<campos_select.length;i++)
  {
    nombre_campo=(campos_select[i].name.substring(6,campos_select[i].name.length)); // Obtinene el nombre del campo sin las palabras claves
    if((campos_select[i].type=="select-one") && (campos_txt[i].name.substring(0,3)=="Ch_")) // Comprueba cuales son select y que además sean obligatorios
 	  {
 	    if(campos_select[i].options.selectedIndex==0)
 	    {
 	      alert("Debes seleccionar algo en " + nombre_campo + ".");
 		     campos_select[i].focus();
 		     return false
 	    }
 	  }
  }
	return true
}

// Función para validar cualquier campo select multiple de un formulario
// Para que el campo sea validado, el nombre del campo tiene que ser del tipo Ch_Nombre ej. <select multiple="2" name="Ch_Ciudades">

function validar_select_m(formulario)
{ 
  campos_select_m=formulario.elements;

	 for (i=0;i<campos_select_m.length;i++)
		{ 
    nombre_campo=(campos_select_m[i].name.substring(6,campos_select_m[i].name.length)); // Obtiene el nombre del campo sin las palabras claves	
		  
				if((campos_select_m[i].type=="select-multiple") && (campos_select_m[i].name.substring(0,3)=="Ch_") ) // Comprueba cuales son select y que además sean obligatorios
		  {	
		    if (campos_select_m[i].options.selectedIndex==-1)
				  {
				    alert("Debes seleccionar algo en " + nombre_campo + ".");
					   campos_select_m[i].focus();
  					 return false
				  }
	   }
		}
	 return true
}

// Función para chequear un campo numérico. Elimina los caracteres incorrectos
// Para que el campo sea validado, el nombre del campo tiene que ser del tipo Ch_Nu_Nombre ej. <input type="text" name="Ch_Nu_Edad">

function chequea_numeros(formulario) 
{ 
  campos_txt=formulario.elements;
  for (i=0;i<=campos_txt.length-1;i++)
  {
    nombre_campo=(campos_txt[i].name.substring(6,campos_txt[i].name.length)); // Obtiene el nombre del campo sin las palabras claves
				if((campos_txt[i].type=="text") && (campos_txt[i].name.substring(0,6)=="Ch_Nu_")) // Comprueba cuales son text y que además sean numéricos
    {
      cadena_nueva=""; 
      for(j=0;j<campos_txt[i].value.length;j++)
      {
        ch=campos_txt[i].value.substring(j,j+1);
         
        if((ch>="0" && ch<="9") || (ch==".") || (ch==",")) // Crea una nueva cadena con los números, los puntos y las comas
        { 
          cadena_nueva += ch; 
        } 
      }
      if (campos_txt[i].value != cadena_nueva)
      { 
        if(confirm("El valor del campo " + nombre_campo + " no es correcto.\nEste campo tiene caracteres invalidos.\n¿Está de acuerdo en que sean eliminados dichos caracteres?")) 
        {
          campos_txt[i].value=cadena_nueva;
          return false
        }
        else 
          return false
       } 
    }
  }
}

// Función para chequear un campo estrictamente alfabético. Elimina los caracteres incorrectos
// Para que el campo sea validado, el nombre del campo tiene que ser del tipo Ch_Al_Nombre ej. <input type="text" name="Ch_Al_Nombre">
// No permite caractéres acentuados
// Permite espacios en blanco

function chequea_letras(formulario) 
{ 
  campos_txt=formulario.elements;
  for (i=0;i<=campos_txt.length-1;i++)
  {
    nombre_campo=(campos_txt[i].name.substring(6,campos_txt[i].name.length)); // Obtiene el nombre del campo sin las palabras claves
				if((campos_txt[i].type=="text") && (campos_txt[i].name.substring(0,6)=="Ch_Al_")) // Comprueba cuales son text y que además sean numéricos
    {
      cadena_nueva=""; 
      for(j=0;j<campos_txt[i].value.length;j++)
      {
        ch=campos_txt[i].value.substring(j,j+1);
         
        if((ch>="a" && ch<="z") || (ch>="A" && ch<="Z") || (ch==" ")) // Crea una nueva cadena con los números, los puntos y las comas
        { 
          cadena_nueva += ch; 
        } 
      }
      if (campos_txt[i].value != cadena_nueva)
      { 
        if(confirm("El valor del campo " + nombre_campo + " no es correcto.\nEste campo tiene caracteres invalidos.\n¿Está de acuerdo en que sean eliminados dichos caracteres?")) 
        {
          campos_txt[i].value=cadena_nueva;
          return false
        }
        else 
          return false
       } 
    }
  }
}

// Función para chequear un campo de tipo password.
// Para que el campo sea validado, el nombre del campo tiene que ser del tipo Ch_Ps_Nombre ej. <input type="text" name="Ch_Ps_Nombre">

function chequea_pass(formulario) 
{ 
  campos_txt=formulario.elements;
  for (i=0;i<=campos_txt.length-1;i++)
  {
    nombre_campo=(campos_txt[i].name.substring(6,campos_txt[i].name.length)); // Obtiene el nombre del campo sin las palabras claves
				if((campos_txt[i].type=="password") && (campos_txt[i].name.substring(0,6)=="Ch_Ps_")) // Comprueba cuales son text y que además sean numéricos
    {
      if(campos_txt[i].value.length==0)
 	    {
 	      alert("El campo " + nombre_campo + " NO debe estar vacio.");
 		     campos_txt[i].focus();
     		 return false
 	    }
 	    if(campos_txt[i].value.length<5)
 	    {
 	     alert("El campo " + nombre_campo + " debe tener al menos 6 caracteres.");
 		     campos_txt[i].focus();
     		 return false
     	}
    }
  }
}

// Función que desmarca todos los campos de tipo checkbox de un formulario
// Se le pasa el nombre del formulario

function limpia_box(formulario)
{
 	campos_box=formulario.elements;
 	
 	for(i=0;i<=campos_box.length-1;i++)
  {
 	  if(campos_box[i].type=="checkbox")
    {
 		   if(campos_box[i].checked==true)
      {
 		  	  campos_box[i].checked=false;
      }
 		 }
  }
}

// Función que marca todos los campos de tipo checkbox de un formulario
// Se le pasa el nombre del formulario

function marca_box(formulario)
{
 	campos_box=formulario.elements;
 	
 	for(i=0;i<=campos_box.length-1;i++)
  {
 	  if(campos_box[i].type=="checkbox")
    {
 		   if(campos_box[i].checked==false)
      {
 		  	  campos_box[i].checked=true;
      }
 		 }
  }
}
