<!-- Comprobación de si un año es o no es biesiesto -->
function bisiesto (anyo) 
{
  if ((anyo % 100) == 0){
   if ((anyo % 400) == 0){ return true; }
  }
  else {
   if ((anyo % 4) == 0) { return true; }
  }
  return false;
}
<!-- Validaciónd de fecha -->
function val_fecha (vDia, vMes, vAnyo, Error)
{
 if(vDia.length!=0 && vMes.length!=0 && vAnyo.length!=0)
 {
  if ((!isNaN(vDia))&&(!isNaN(vMes))&&(!isNaN(vAnyo)))
  {
    var error=0;
    var dia=vDia
    var mes=vMes
    var anyo=vAnyo
    if ((mes<1)||(mes>12)) { error=1; }
    if ((dia<1)||(dia>31)) { error=2; }
    if ((dia>30)&&((mes==4)||(mes==6)||(mes==9)||(mes==11))){ error=3 ;}
    if ((dia>28)&&(mes==2)&&(!bisiesto(anyo))) { error=4; }
    if ((dia>29)&&(mes==2)&&(bisiesto(anyo))) { error=5; }
    if (anyo<1900){ error=6;}
    if (error != 0)
    {
       return false;
    }
    return true;
  }
  else 
  {
   return false;
  }
 }
}
function EnterQuery(form)
{
  form.reset();
  for (i=0; i<form.elements.length; i++)
  {
    if (((form.elements[i].className != "FieldOpcQu")&&(form.elements[i].className != "FieldOblQu"))&&
    (form.elements[i].type == "text"))
    { 
      form.elements[i].disabled = true;
    }
    if (form.elements[i].id == "Eq")
    {
       form.elements[i].style.display = "inline";
    }
    if (form.elements[i].id == "Qu")
    {
       form.elements[i].style.display = "none";
    }
    if ((form.elements[i].className == "FieldOblQu")&&(form.elements[i].type == "text"))
    {  
       form.elements[i].className = "FieldOblEq";
    }
    if ((form.elements[i].className == "FieldOpcQu")&&(form.elements[i].type == "text"))
    {
       form.elements[i].className = "FieldOpcEq";
    }   
  }
}
function CancelQuery(form)
{
  for (i=0; i<form.elements.length; i++)
  {
    if (form.elements[i].id == "Eq")
    {
      form.elements[i].style.display = "none";
    }
    if (form.elements[i].id == "Qu")
    {
      form.elements[i].style.display = "inline";
    }
    if ((form.elements[i].className == "FieldOblEq")&&(form.elements[i].type == "text"))
    {
      form.elements[i].className = "FieldOblQu";
    }
    if ((form.elements[i].className == "FieldOpcEq")&&(form.elements[i].type == "text"))
    {
      form.elements[i].className = "FieldOpcQu";
    }
    if (((form.elements[i].className != "FieldOpcQu")&&(form.elements[i].className != "FieldOblQu"))&&(form.elements[i].type == "text")&&(form.elements[i].className!="FieldCon"))
    {
      form.elements[i].disabled = false;
    }
 }
}
function ValFld(fld,fil)
{
  <!-- Añadiremos una "," a la cadena de los filtros para que como minimo existan 2 valores de la array -->
  fil = fil + ",#";
  opc = fil.split(",");
  var error = false;
  for (i=0; i<opc.length; i++)
  {
   if (opc[i]=="U")
   {
    fld.value = fld.value.toUpperCase();
   }
   <!-- Este condicional es el validador de direcciones de correo -->
   if (opc[i]=="@")
   {
	if (fld.value.length == 0)
	{
		return (true);
	}
	<!-- Comprobamos si existe una "@" en la dirección de correos y que es obligatoria -->
    if (fld.value.indexOf("@") > -1)
    {
	   <!-- Partimos la cadena desde la posición de la "@"(esta no inclusive) hasta el final de la cadena -->
	   var CadAux  = fld.value.substr(fld.value.indexOf("@")+1 ,fld.value.length);
	   <!-- Comprobamos si existe alguna otra "@" en la cadena ya que si así fuese la dirección seria incorrecta -->
	   if (CadAux.indexOf("@")>-1)
	   {
		 fld.focus();
		 fld.select();
		 return(false);
	   }
	   <!-- Si no tiene más que una "@" podemos pasar a la siguiente consulta para su validación -->
	   else
	   {
		 <!-- Comprobamos que al menos entre la "@" y el "." tiene que haber al menos un caracter -->
		 if (CadAux.indexOf(".")-CadAux.indexOf("@")>1)
		 {
		   <!-- Cortamos la cadena restante a partir del "." hasta el final de esta -->
	       var CadAux2 = CadAux.substr(CadAux.indexOf(".")+1 ,CadAux.length);
		   <!-- Comprobamos que al menos tiene que haber 1 caracter despues del "." -->
	       if (CadAux2.length<1)
	       {
		     fld.focus();
		     fld.select();
		     return(false);
	       }
		 }
		 else
		 {
		   fld.focus();
		   fld.select();
		   return(false);
		 }
	   }
	}
	else
	{
	  fld.focus();
	  fld.select();
	  return(false);
	}
   }
   if (opc[i]=="A")
   {
    if (fld.value.match("[*0-9]")!=null)
    {
		fld.focus();
		fld.select();
		return(false);
	}
   }
   if (opc[i]=="N")
   {
    if (isNaN(fld.value))
    {
		fld.focus();
		fld.select();
		return(false);
    }
   }
   if (opc[i].indexOf("D")>-1)
   {
    if (fld.value.length>0)
    {
     <!-- Comprobamos si nos pasan una mascara de fecha -->
     if (opc[i].indexOf("[")==(opc[i].indexOf("D")+1)&&(opc[i].indexOf("ddmmyyyy")==-1))
     {
        <!-- Primaro de todo es obtener la cadena de la mascara de para la fecha. -->
        var Cadena = opc[i].substring(opc[i].indexOf("D")+2, opc[i].length);
	    Cadena     = Cadena.substring(0,opc[i].indexOf("]")-2);
	    <!-- Declararemos las variables para buscar el separador de la fecha. -->
	    var valido = "dmy"
	    var temp;
		var Separador='';
	    Cadena = Cadena.toLowerCase();
      	<!-- Bucle que recorre la cadena de la mascara. -->
	    for (j=0; j<Cadena.length; j++)
		{
	       temp = Cadena.substring(j, j+1);
	       if (valido.indexOf(temp) == "-1")
	       { 
	         <!-- Comprobamos que siempre nos pasen el mismo separador. -->
	         if (Separador.length >0 && Separador != temp)
	         {
				fld.focus();
				fld.select();
				return(false);
	         }
	         else
	         {
    	        Separador = temp;
	         }
	       }
        }
	    <!-- Ahora con el separador descomponemos la mascara y el valor del objeto a comprobar como fecha. -->
	    var masFec = Cadena.split(Separador);
	    var Fecha = fld.value.split(Separador);
	    if (masFec.length != Fecha.length)
  	    {
		   fld.focus();
           fld.select();
		   return(false);
	    }
	    else
	    {
	      for (j=0; j<masFec.length;j++)
	      {
	         if (masFec[j].length != Fecha[j].length)
	         {
			    fld.focus();
			    fld.select();
				return(false);
	         }
             <!-- Una vez comprobado todo pasaremos  a obtener el dia el mes y el año que nos pasan -->
	         else
	         {
	           if ( masFec[j].indexOf("d") > -1 ) 
	           {
	             var vDia = Fecha[j];
	           }
	           else
	           {
	             if (masFec[j].indexOf("m")>-1)
		         {
		           var vMes = Fecha[j];
		         }
		         else
	   	         {
		           if ( masFec[j].indexOf("y")>-1)
		           {
		              var vAnyo = Fecha[j];
		           }
		         }
	           }
	         }
	      }
	    }
        <!-- Comprobamos si la fecha que nos han pasado es la correcta -->
        error = !val_fecha (vDia, vMes, vAnyo, Error);
		if (error == true)
		{
		    fld.focus();
		    fld.select();
			return(false);
		}

	 }
	 else
        <!-- Comprobamos si la fecha que nos han pasado es la correcta -->
        error = !val_fecha (fld.value.substr(0,2), fld.value.substr(2,2), fld.value.substr(4,4), Error);
		if (error == true)
		{
		    fld.focus();
		    fld.select();
			return(false);
		}
    }
   }
  }
}
function Cambio_Estado_Pestanya(Obj,Pestana)
{
  for (i=0;i<Obj.length;i++)
  {
    if (Obj(i).name==Pestana)
    {
      if ( Obj(i).src.indexOf('_off') > -1 )
      {
        Obj(i).src=Obj(i).src.substr(0,Obj(i).src.indexOf('_off'))+'_on.gif';
      }
    }
    else
    {
      if ( Obj(i).src.indexOf('_on') > -1 )
      {
        Obj(i).src=Obj(i).src.substr(0,Obj(i).src.indexOf('_on'))+'_off.gif';
      }
    }
  }
}
function Val_Fecha2 (fld,dig)
{
  if (fld.value.length == 0) {
  null;
  return(false);
  }

  if ( fld.value.length>6 )
  {
       fld.focus();
       fld.select();
 	   return(false);
  }
  else
  {
   if (eval(dig)==undefined)
   {
     var vdig = '20';
   }
   else
   {
     var vdig = dig;
   }
   var dia  = fld.value.substr(0,2);
   var mes  = fld.value.substr(2,2);
   var anyo = fld.value.substr(4,2);
   var Error = 0;
     if (val_fecha (dia, mes, vdig+anyo, Error))
     {
	   fld.value =  dia+'/'+mes+'/'+vdig+anyo;
     }
     else
     {
       fld.focus();
       fld.select();
 	   return(false);
     }
  }
}

function Val_Hora2 (fld)
{
  if ( fld.value.length>4 || fld.value.length==0 )
  {
    null;
  }
  else
  {
   var hora  = fld.value.substr(0,2);
   var minuto  = fld.value.substr(2,2);
   if ( ( hora < 0 || hora > 23 ) || ( minuto < 0 || minuto > 59 ) || fld.value.length < 2 )
   {
     fld.focus();
     fld.select();
 	 return(false);
   }
   else
   {
     if ( minuto.length==0 )
     {
        minuto = '00';
     }
	 if (minuto.length==1)
	 {
	   minuto = minuto+'0';
	 }
     fld.value = hora+':'+minuto;
   }
  }
}
function Reestablecer_Fecha (fld)
{
   Vector = fld.value.split("/");
   if (Vector.length == 3)
   {
       fld.value = Vector[0]+Vector[1]+Vector[2].substr(2,2);
       fld.focus();
       fld.select();
   }
}
function Reestablecer_Hora (fld)
{
   Vector = fld.value.split(":");
   if (Vector.length == 2)
   {
       fld.value = Vector[0]+Vector[1];
       fld.focus();
       fld.select();
   }
}

function ValidaObligatorios(form,submitform){
 //El primer formulario es el que se quiere validar y el segundo es el sobre el que se quiere
 //hacer el submit
 error=false;
 HayId=true;
 CadenaError="";
 Separador="";
 for (i=0; i<form.elements.length; i++){
  if ((form.elements[i].className == "FieldOblEq"||form.elements[i].className =="FieldOblQu"||form.elements[i].className =="FieldObl")&&((form.elements[i].value==null)||form.elements[i].value=='')){
   if (form.elements[i].id==''){
    //El elemento no tiene id y por tanto no podemos informar al usuario del nombre
    //Debe haber un alert por idioma
    alert('Faltan campos obligatorios por rellenar');
    error=true;
    HayId=false;
    break;
   }
   else {
    CadenaError=CadenaError+Separador+'\n'+form.elements[i].id;
   }
   error=true;
   Separador=", ";
  }
 }
 if (error==false) {
  submitform.submit();
  return (true);
 }
 else 
  {
  if (HayId==true) //En este caso tenemos la cadena con los nombres de los campos
   {
   //debe haber un alert por idioma
   alert('Debe rellenar los siguientes campos, son obligatorios: \n'+CadenaError);
   }
  return (false);
 }
}

function Comprobacion_Fechas(FecIni, FecFin, Separador)
{
  var Fecha1 = FecIni.split(Separador);
  var Fecha2 = FecFin.split(Separador);

  if (parseFloat(Fecha2[2] + Fecha2[1] + Fecha2[0] ) >= parseFloat(Fecha1[2] + Fecha1[1] + Fecha1[0] ))
	  return false;
  else
	  return true;
}

function Comprobacion_Fechas2(FecIni, FecFin, Separador)
{
    var Fecha1 = FecIni.split(Separador);
    var Fecha2 = FecFin.split(Separador);
  
	ff = new Date((eval(Fecha2[1])+1) + "/" + Fecha2[0] + "/" + Fecha2[2]);
	fi = new Date((eval(Fecha1[1])+1) + "/" + Fecha1[0] + "/" + Fecha1[2]);
	
	// si fecha fin - fecha ini >= 30 dias en milisegundos 
	if ((ff-fi) >= 2678400000) 
	  return true;
    else
	  return false;
}

function Comprobacion_Diff_Mostrado(fecini, fecfin, separador) {
	var dias = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    var Fecha1 = fecini.split(separador);
    var Fecha2 = fecfin.split(separador);

	ff = new Date((eval(Fecha2[1])+1) + "/" + Fecha2[0] + "/" + Fecha2[2]);
	fi = new Date((eval(Fecha1[1])+1) + "/" + Fecha1[0] + "/" + Fecha1[2]);

	if (anyoBisiesto(fi.getFullYear())) dias[1] = 29;
	if (fi.getMonth() == ff.getMonth()) {
		return false;
	} else {
		if ( ((dias[(fi.getMonth()-1)]-fi.getDate())+ff.getDate()+1) > 31 )
			return true
		else return false;
	}
}

function anyoBisiesto(anyo){
	/*
	* primera condicion: si el resto de dividir el año entre 4 no es cero > el año no es bisiesto
	* es decir, obtenemos año modulo 4, teniendo que cumplirse anyo mod(4)=0 para bisiesto
	*/
	if (anyo % 4 != 0)
		return false;
	else {
		if (anyo % 100 == 0) {
			/**
			* si el año es divisible por 4 y por 100 y divisible por 400 > es bisiesto
			*/
			if (anyo % 400 == 0) {
				return true;
			}
			/**
			* si es divisible por 4 y por 100 pero no lo es por 400 > no es bisiesto
			*/
			else {
				return false;
			}
		}
		/**
		* si es divisible por 4 y no es divisible por 100 > el año es bisiesto
		*/
		else {
			return true;
		}
	}
}