He arreglado un poco la funcion, que me parecia un poco chapucera. Tambien he incluido la funcion anyoBisiesto, que falta. Y la expresion regular.. me sonaba a inventada, asi que he puesto una correcta.
Tambien he añadido un return false siempre que la validacion sea fallida, ya que se devolvia el true pero no el false. He quitado alguna que otra validacion inutil (como la primera de saber si esta vacio, ya se comprueba con la expresion regular) y creo que nada mas.
Funciona en IE, Firefox y Opera, los he probado yo:
Código PHP:
<script>
function anyoBisiesto(anyo){
//si el año introducido es de dos cifras lo pasamos al periodo de 1900. Ejemplo: 25 > 1925
if (anyo < 100)
var fin=anyo+1900;
else
var fin=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 (fin % 4 != 0)
return false;
else {
if (fin % 100 == 0){
//si el año es divisible por 4 y por 100 y divisible por 400 > es bisiesto
if (fin % 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;
}
}
function validarFecha( campo ){
/* Comprobar que el formato es dd/mm/aaaa, aunque si el formato de
fecha que utilizas es otro, puedes cambiar esta parte de comprobación
*/
campo.value = campo.value.replace(/./g, '/');
campo.value = campo.value.replace(/-/g, '/');
var fechaexp = new RegExp('^[0-9]{2}/[0-9]{2}/[0-9]{4}$');
if (!fechaexp.test(campo.value)){
alert("La fecha de tener el formato dd/mm/aaaa");
campo.focus();
campo.select();
return false;
}
/* Obtener la fecha introducida y se separa en dia, mes y año */
a = campo.value;
dia=a.split("/")[0];
mes=a.split("/")[1];
anyo=a.split("/")[2];
if(anyoBisiesto(anyo))
febrero=29;
else
febrero=28;
/* si el mes introducido es negativo, 0 o mayor que 12, se avisa y se para
la ejecución */
if ((mes<1) || (mes>12)){
alert("El mes introducido no es valido. Por favor, introduzca un mes correcto");
campo.focus();
campo.select();
return false;
}
/* si el mes introducido es febrero y el dia es mayor que el
correspondiente al año introducido se avisa y se para la ejecucion */
if ((mes==2) && ((dia<1) || (dia>febrero))){
alert("El dia introducido no es valido. Por favor, introduzca un dia correcto");
campo.focus();
campo.select();
return false;
}
/* si el mes introducido es de 31 dias y el dia introducido es mayor de
31 se avisa y se para la ejecucion
*/
if (((mes==1) || (mes==3) || (mes==5) || (mes==7) || (mes==8) || (mes==10) || (mes==12)) && ((dia<1) || (dia>31))){
alert("El dia introducido no es valido. Por favor, introduzca un dia correcto");
campo.focus();
campo.select();
return false;
}
/* si el mes introducido es de 30 dias y el dia introducido es mayor de
30 se avisa y se para la ejecucion
*/
if (((mes==4) || (mes==6) || (mes==9) || (mes==11)) && ((dia<1) || (dia>30))){
alert("El dia introducido no es valido. Por favor, introduzca un dia correcto");
campo.focus();
campo.select();
return false;
}
/* si el mes año introducido es menor que 1900 o mayor que 2100 se
avisa y se para la ejecución
NOTA: estos valores son una elección, en realidad no son años
erróneos, solo sirve para validar un intervalo de años en caso de ser
necesario */
if ((anyo<1900) || (anyo>2100)){
alert("El año introducido no es valido. Por favor, introduzca un año entre 1900 y 2100");
campo.focus();
campo.select();
return false;
}
/* Si ha superado todas las condiciones anteriores es que la fecha
introducida es correcta */
return true;
}
</script>
<input type="text" onchange="alert( validarFecha(this) )" size="52">
saludos, a ver si ahora funciona todo bien...