/* Validador de Labrys.

Se debe definir el validador despues del formulario para posibilitar que encuentre todos los campos que se usen en la validación.
La instanciación es la siguiente:

	var frmvalidator  = new Validacion("formulario");

A continuación se añaden las validaciones que se quieren realizar. 
	
	frmvalidator.addValidacion([Nombre del campo],[Condicion], [Texto de error]);

Por ejemplo:

	frmvalidator.addValidacion("prj_razon","maxlong=60", "La longitud maxima para la razon social del proveedor es de 60 caracteres");

Las validaciones son acumulativas y se evaluan en el orden de entrada.

Añadido (o mejor dicho REañadido) el 22/01/2007: Funcion de error

	Ahora se puede pasar una función javascript que evaluará en caso de que sea falsa la validación. La necesidad
	de este elemento viene dada de validar campos que pueden estar ocultos en pantalla. 
	
	De forma automática el validador intenta darles el foco una vez fallan para que el usuario identifique facilmente
	el campo que genera el error. Si está oculto se produce un error de javascript. 
	
	El truco consiste en poner como visible el campo o campos de forma previa a la obtención del foco, para ello se
	deberá invocar a la función que muestre este campo. Habitualmente esto sucederá en el caso de multiidioma
	cuando el panel con el campo erróneo sea el que está oculto.
	
	Las validaciones se deberan añadir con la siguiente forma.
	
	frmvalidator.addValidacion([Nombre del campo],[Condicion], [Texto de error], [Funcion de Error]);
	
	Por ejemplo.
	
	frmvalidator.addValidacion("prj_razon","maxlong=60", "La longitud maxima para la razon social del proveedor es de 60 caracteres","mostrarTabOculto('castellano')");
	
	Esta funcion es opcional y solo se evaluará si se pasa como parámetro. En caso contrario no se llevará a cabo
	ninguna ejecución de función.

LISTA DE CONDICIONES POSIBLES

        "req" / "requerido": Indica que el campo tiene que tener algun valor. En caso contrario da error.
        
		"maxlongitud" / "maxlong": Para indicar la longitud máxima de caracteres para el campo. Se indica "maxlong=[valor]".
        
		"minlongitud" / "minlong": Para indicar la longitud mínima de caracteres para el campo. Se indica "minlong=[valor]".

		"alnum" / "alfanumerico": Los valores permitidos son solo alfanuméricos.  De A-Z ó a-z ó 0-9 mas ñÑ.

		"num" / "numerico": Solo valores numéricos enteros.

		"float": Solo valores numéricos que flotantes, es decir con posibilidad de tener decimales, separado por punto.

		"texto" / "txt": Valores exclusivamente de texto, ni números ni carácteres extraños. De A-Z ó a-z más ñÑ.

		"alnumhyphen": Texto y números pero limitación de caracteres permitidos. De A-Z ó a-z ó 0-9 más \ - _ ñÑ

		"email": Comprueba que el formato introducido cumple con el esperado para un email texto@servidor.extension

		"fecha": Comprueba que cumple con el formato de fecha. Formato dd/mm/aaaa. El separador válido por defecto es /. 
				Si se indica el separados como parámetro valdrá además ese elemento: pe "fecha=-" permitira dd-mm-aaaa.

		"menor" / "menorque": Comprueba que el valor del campo sea menor que el especificado. En caso contrario da error. Se usa
							 "menor=3" de forma que el valor debe ser menor que 3 para ser aceptado.

		"mayor" / "mayorque": Comprueba que el valor del campo sea mayor que el especificado. En caso contrario da error. Se usa
							 "mayor=3" de forma que el valor debe ser mayor que 3 para ser aceptado.

		"regexp": Comprueba que el campo cumple con la expresion regular pasada como parametro. P.e. "regexp=^[\w-\.]*\.[A-Za-z]{2,4}$"

        "seleccion": Válido solo para campos de tipo selector, asegura que hay alguna opción seleccionada.

		 "seleccionMayor" / "selecMayor": Se asegura que el elemento seleccionado es mayor que el valor pasado por parámetro. Si la
		 			primera opción es un texto informativo para que seleccione si se pone "selecMayor=0" solo si escoge opciones por
					debajo pasará la seleccion.

		 "seleccionMenor" / "selecMenor": Se asegura que el elemento seleccionado es menor que el valor pasado por parámetro. Si la
		 			opción X en adelante no son válidas si se pone "selecMenor=x" solo si escoge opciones por debajo pasará la seleccion.

		Los radio button no se pueden validar ya que las referencias no se pueden mantener, posiblemente por la multiplicidad de inputs con
		el mismo nombre.

*/
function Validacion(nombreform)
{
	//alert("Creando Objeto para "+nombreform);
    this.objform=document.forms[nombreform];
	if(!this.objform)
	{
	  //alert("ERROR: No existe el formulario "+objform);
		return;
	}
 	// Es una forma de poder llamar al metodo y al hacer referencia a this se refiere al objeto creado con este metodo
	this.addValidacion = add_validacion;
	this.validaFormulario = valida_formulario;
	//this.eliminarValidaciones = eliminar_validaciones;
}

function valida_formulario()
{
	//alert("validando formulario num objetos: "+this.objform.elements.length);
	//alert("validando formulario num validaciones: "+this.objform.elements.length);
	for(var itr=0;itr < this.objform.elements.length;itr++)
	{	
		if(this.objform.elements[itr].validaciones &&
	   !this.objform.elements[itr].validaciones.validar())
		{
		  return false;
		}
	}
	return true;
}
function add_validacion(itemname,descriptor,errstr,fncError)
{
  //alert("Añadiendo validacion");
  if(!this.objform)
	{
	  alert("ERROR: el objeto formulario no ha sido definido adecuadamente");
		return;
	}//if
    //alert("Obtenienco objeto para validacion");
	var itemobj = this.objform[itemname];
  if(!itemobj)
	{
	  alert("ERROR: No se puede obtener el objeto input de nombre: "+itemname);
		return;
	}
	  //alert("Se ha recuperado algo para la validacion");

	if(!itemobj.validaciones)
	{
	    //alert("Es la primera validacion");

	  itemobj.validaciones = new GrupoValidaciones(itemobj);
	}
    //alert("Añadiendo al objeto la nueva validacion DESC: "+descriptor+" string error: "+errstr);

  itemobj.validaciones.add(descriptor,errstr,fncError);
}
function ValidationDesc(inputitem,desc,error,fncError)
{
	//alert("Se mete la validacion descrita como: "+desc+" "+error+" Input item: "+inputitem);
  	this.desc=desc;
	this.error=error;
	this.objentrada = inputitem;
	this.validar=validar_objeto;
	this.fncError = fncError;
	//alert("Sale de introducir la validacion.");
}
function validar_objeto()
{
 if(!ValidaDatos(this.desc,this.objentrada,this.error))
 {	if((this.fncError != null)&&(this.fncError != "")) eval(this.fncError);
    this.objentrada.focus();
		return false;
 }
 return true;
}
function GrupoValidaciones(inputitem)
{	//alert("Creamos el nuevo array");
    this.vSet=new Array();
	this.add= add_descvalidacion;
	this.validar= grupo_validacion;
	this.objentrada = inputitem;
}
function add_descvalidacion(desc,error,fncError)
{
 //alert("Añadiendo validacion de grupo long antes: "+this.vSet.length);
  this.vSet[this.vSet.length]= 
	  new ValidationDesc(this.objentrada,desc,error,fncError);
 //alert("Añadiendo validacion de grupo long despues: "+this.vSet.length);
}
function grupo_validacion()
{
   for(var itr=0;itr<this.vSet.length;itr++)
	 {
	   if(!this.vSet[itr].validar())
		 {
		   return false;
		 }
	 }
	 return true;
}
function validateEmailv2(email)
{
// a very simple email validation checking. 
// you can add more complex email checking if it helps 
    if(email.length <= 0)
	{
	  return true;
	}
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null )
    {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null)
    {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null) 
      {
	    var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	    if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
    }
return false;
}
function validateFecha(fecha,caracterSeparador)
{
  if ((caracterSeparador==null)||(caracterSeparador=="")) separador = "/";
  		else separador = caracterSeparador;
  contenido = fecha;
  if (contenido)
 {  
  borrar = contenido;
  if ( ((contenido.substr(2,1) == separador) && (contenido.substr(5,1) == separador))|| ((contenido.substr(2,1) == "/") && (contenido.substr(5,1) == "/")))
  {      
	 for (i=0; i<10; i++)
	 {	
		if (((contenido.substr(i,1)<"0") || (contenido.substr(i,1)>"9")) && (i != 2) && (i != 5))
		{
		   borrar = '';
		   break;  
		}  
	 }
	 if (borrar)
	 { 
		a = contenido.substr(6,4);
		m = contenido.substr(3,2);
		d = contenido.substr(0,2);
		if((a < 1900) || (a > 2050) || (m < 1) || (m > 12) || (d < 1) || (d > 31))
		   borrar = '';
		else
		{
		   if((a%4 != 0) && (m == 2) && (d > 28))	   
			  borrar = ''; // Año no viciesto y es febrero y el dia es mayor a 28
		   else	
		   {
			  if ((((m == 4) || (m == 6) || (m == 9) || (m==11)) && (d>30)) || ((m==2) && (d>29)))
				 borrar = '';	      				  	 
		   }  // else
		} // fin else
	 } // if (error)
  } // if ((contenido.substr(2,1) == \"/\") && (contenido.substr(5,1) == \"/\"))			    			
  else
	 borrar = '';
  if (borrar == ''){
	 return false;
  }
 }
  return true;	
}

function ValidaDatos(strValidateStr,objValue,strError) 
{ 
    var epos = strValidateStr.search("="); 
    var  command  = ""; 
    var  cmdvalue = ""; 
    if(epos >= 0) 
    { 
     command  = strValidateStr.substring(0,epos); 
     cmdvalue = strValidateStr.substr(epos+1); 
    } 
    else 
    { 
     command = strValidateStr; 
    } 
	//alert("COMANDO: "+command)
    switch(command) 
    { 
        case "req": 
        case "requerido": 
         { 
           if(eval(objValue.value.length) == 0) 
           { 
              if(!strError || strError.length ==0) 
              { 
                strError = objValue.name + " : Campo obligatorio"; 
              }//if 
              alert(strError); 
              return false; 
           }//if 
           break;             
         }//case requerido 
        case "maxlongitud": 
        case "maxlong": 
          { 
             if(eval(objValue.value.length) >  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : "+cmdvalue+" caracteres maximo "; 
               }//if 
               alert(strError + "\n[Longitud actual = " + objValue.value.length + " ]"); 
               return false; 
             }//if 
             break; 
          }//case maxlongitud 
        case "minlongitud": 
        case "minlong": 
           { 
             if(eval(objValue.value.length) <  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : " + cmdvalue + " caracteres minimo  "; 
               }//if               
               alert(strError + "\n[Longitud actual = " + objValue.value.length + " ]"); 
               return false;                 
             }//if 
             break; 
            }//case minlongitud 
        case "alnum": 
        case "alfanumerico": 
           { 
              var charpos = objValue.value.search("[^A-Za-z0-9]ñÑ "); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
               if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+": Solo se permiten numeros alfanumericos "; 
                }//if 
                alert(strError + "\n [Error en el caracter de la posicion " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              break; 
           }//case alfanumerico 
        case "num": 
        case "numerico": 
           { 
              var charpos = objValue.value.search("[^0-9]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+": Solo se permiten numeros "; 
                }//if               
                alert(strError + "\n [Error en el caracter de la posicion " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              break;               
           }//numerico 
		case "float":  //Hacer que solo permita un "."
           { 
              var charpos = objValue.value.search("[^0-9.]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+": Solo se permiten numeros "; 
                }//if               
                alert(strError + "\n [Error en el caracter de la posicion " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              break;               
           }//numerico 		   
        case "texto": 
        case "txt": 
           { 
              var charpos = objValue.value.search("[^A-Za-zñÑ] "); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                  if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+": Solo se permiten caracteres de letras "; 
                }//if                             
                alert(strError + "\n [Error en el caracter de la posicion " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              break; 
           }//alpha 
		case "alnumhyphen":
			{
              var charpos = objValue.value.search("[^A-Za-z0-9\-_]ñÑ "); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                  if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+": los caracteres permitidos solo son A-Z,a-z,0-9,- y _"; 
                }//if                             
                alert(strError + "\n [Error en el caracter de la posicion " + eval(charpos+1)+"]"); 
                return false; 
              }//if 			
			break;
			}
        case "email": 
          { 
               if(!validateEmailv2(objValue.value)) 
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = objValue.name+": Introduzca una direccion de email correcta "; 
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
           break; 
          }//case email 
		  case "fecha": 
		  { 
		   if(!validateFecha(objValue.value,cmdvalue)) 
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = objValue.name+": Introduzca una FECHA correcta dd/mm/aaaa"; 
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
		   break; 
		  }//case fecha 
        case "menor": 
        case "menorque": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert(objValue.name+": Debe ser un numero "); 
              return false; 
            }//if 
            if(eval(objValue.value) >=  eval(cmdvalue)) 
            { 
              if(!strError || strError.length ==0) 
              { 
                strError = objValue.name + " : el valor debe ser menor que "+ cmdvalue; 
              }//if               
              alert(strError); 
              return false;                 
             }//if             
            break; 
         }//case lessthan 
        case "mayor": 
        case "mayorque": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert(objValue.name+": Debe ser  un numero "); 
              return false; 
            }//if 
             if(eval(objValue.value) <=  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : el valor debe ser mayor que "+ cmdvalue; 
               }//if               
               alert(strError); 
               return false;                 
             }//if             
            break; 
         }//case greaterthan 
        case "regexp": 
         { 
		 	if(objValue.value.length > 0)
			{
	            if(!objValue.value.match(cmdvalue)) 
	            { 
	              if(!strError || strError.length ==0) 
	              { 
	                strError = objValue.name+": Se han encontrado caracteres erroneos "; 
	              }//if                                                               
	              alert(strError); 
	              return false;                   
	            }//if 
			}
           break; 
         }//case regexp 
        case "seleccion": 
        case "selec": 
		 { 
            if(objValue.selectedIndex == null) 
            { 
              alert("ERROR: se ha introducido una validacion de seleccion a un elementos no seleccionable"); 
              return false; 
            } 
            if(objValue.selectedIndex == eval(cmdvalue)) 
            { 
             if(!strError || strError.length ==0) 
              { 
              strError = objValue.name+": Por favor seleccione una opcion "; 
              }//if                                                               
              alert(strError); 
              return false;                                   
             } 
             break; 
         }//case dontselect
		 case "seleccionMayor": 
		 case "selecMayor": 
		 { 
            if(objValue.selectedIndex == null) 
            { 
              alert("ERROR: se ha introducido una validacion de seleccion a un elementos no seleccionable"); 
              return false; 
            } 
            if(objValue.selectedIndex <= eval(cmdvalue)) 
            { 
             if(!strError || strError.length ==0) 
              { 
              strError = objValue.name+": Por favor seleccione una opcion correcta "; 
              }//if                                                               
              alert(strError); 
              return false;                                   
             } 
             break; 
         }//case dontselect 
		 case "seleccionMenor": 
		 case "selecMenor": 
		 { 
            if(objValue.selectedIndex == null) 
            { 
              alert("ERROR: se ha introducido una validacion de seleccion a un elementos no seleccionable"); 
              return false; 
            } 
            if(objValue.selectedIndex >= eval(cmdvalue)) 
            { 
             if(!strError || strError.length ==0) 
              { 
              strError = objValue.name+": Por favor seleccione una opcion correcta "; 
              }//if                                                               
              alert(strError); 
              return false;                                   
             } 
             break; 
         }//case dontselect 
    }//switch 
    return true; 
}
