Te lo he comentado para que lo entiendas un poquito mejor, seguro que leyéndolo bien te haces con ello:
Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> Página nueva </title>
<meta name="Author" content="derkeNuke">
<style type="text/css">
</style>
</head>
<body>
<script type="text/javascript">
/* La función e(q,br) escribe algo en el documento aunque ya tengamos el documento cargado, se basa en el DOM, y es así de dinámico
q - el texto que vamos a escribir (etiquetas HTML no se interpretarán)
br - boolean opcional: false > No se escribe salto; true o indefinido > Se escribe salto de línea
*/
function e(q,br) {
document.body.appendChild( document.createTextNode(q) );
if(!br) document.body.appendChild( document.createElement("BR") );
}
/* id(x), un acortamiento de document.getElementById(x) */
function id(x) { return document.getElementById(x); }
/* DEFINICIÓN DE LOS INTERVALOS BASE (método de escritura de objetos JSON)
Conseguiremos un Array de objetos. Cada elemento del array (P[x]) será un objeto con dos propiedades: 'inicio' y 'fin'.
De esta manera P[0].inicio (ó P[0]["inicio"]) nos retornará el objeto Date que tiene la fecha del inicio del intervalo P[0].
A su vez Date también es un objeto con sus métodos y propiedades, de manera que, como en cualquier fecha podemos hacer getFullYear(), con P[0].fin también podremos utilizar ese método: P[0].fin.getFullYear() (=2007)
Recordar que para iniciar un objeto date con un String de formato inglés mm/dd/aaaa
*/
var P = new Array();
P[0] = {inicio: new Date('05/05/2007'), fin: new Date('05/30/2007') }; // se solapa con 2
P[1] = {inicio: new Date('06/01/2007'), fin: new Date('06/30/2007') }; // no se solapa con 3, contiene a 3 entero
P[2] = {inicio: new Date('04/01/2007'), fin: new Date('05/05/2007') }; // se solapa con 0
P[3] = {inicio: new Date('06/15/2007'), fin: new Date('06/20/2007') }; // se solapa con 1
/* FUNCIÓN PARA AHORRARNOS OPERACIONES
Ejecuta getTime() y devuelve el mismo esquema de objeto de antes (un objeto con propiedades 'inicio' y 'fin') pero estas propiedades ya no serán objetos Date, sino números (milisegundos obtenidos desde getTime() > ms desde 1970).
Esto es para no hacer getTime() mil veces dentro de los bucles de abajo, pero bueno, podríamos haberlo puesto a lo bestia luego.
*/
function getIntervaloMS( intervalo ) {
dev = new Object();
for( var i in intervalo )
dev[i] = intervalo[i].getTime();
return dev;
}
/* FUNCIÓN MÉTODO DE CUALQUIER NÚMERO QUE NOS DEVUELVE TRUE EN CASO DE QUE UN NÚMERO ESTÉ CONTENIDO EN EL INTERVALO (a,b) Ó (b,a). a Y b CONTENIDOS EN ESE INTERVALO.
4.estaEntre(1,6) >> true
6.estaEntre(5,6) >> true
8.estaEntre(1,4) >> false
*/
Number.prototype.estaEntre = function(a,b) {
return ( (Math.min(a,b)<=this) && (this<=Math.max(a,b)) );
}
/* TRANSFORMAMOS CADA INTERVALO QUE TENGAMOS A MILISEGUNDOS CON LA FUNCIÓN getIntervaloMS()
Un bucle for para recorrer todos los elementos de P, y a cada elemento de P le aplicamos getIntervaloMS(), guardando el resultado en otro array que llamaremos PMS y que será tan largo como P.
*/
for(var i=0, PMS = new Array(); i<P.length; i++) // hallamos cada P en milisegundos (ms)
PMS[i] = getIntervaloMS( P[i] );
/* RECORREMOS PMS PARA VER SI HAY INTERVALOS QUE SE PISAN */
for(var i=0; i<PMS.length; i++) {
//cada PMS lo comprobamos con los demás, es decir, hacemos otra vez un bucle con todos los PMS
for(var j=0; j<PMS.length; j++) {
// Compararemos PMS[i] con los 4 PMS[j]
if( i==j ) continue; //estamos comparando uno consigo mismo
else {
// inicioSePisa será true si el valor de inicio de PMS[i] está entre los valores de inicio y fin de PMS[j] (si no false)
var inicioSePisa = PMS[i].inicio.estaEntre( PMS[j].inicio, PMS[j].fin );
// finSePisa será true si el valor de fin de PMS[i] está entre los valores de inicio y fin de PMS[j] (si no false)
var finSePisa = PMS[i].fin.estaEntre( PMS[j].inicio, PMS[j].fin );
// Si se pisa inicio ó se pisa fin, pero no los dos a la vez, está solapado
if( inicioSePisa ^ finSePisa )
e(' Se han encontrado fechas solapadas: '+i+' con '+j+'. ');
// Si se pisa inicio y a la vez se pisa fin, es que una contiene a la otra
else if( inicioSePisa && finSePisa )
e(' La primera está contenida en la segunda: '+i+' en '+j+'. ');
// En otro caso, no estarán solapadas
else
e(' No están solapadas : '+i+' con '+j+'. ');
}
}
}
//fin
e("fin");
</script>
</body>
</html>
Si no has entendido algún punto te lo explicaré con gusto.
Un saludo.