OK, here you go:
Code:
var dates = [],datesRange=[],i=1,ir=0,d1,d2;
//fill dates
//first position in the array is the most future date, sort check.
dates[0] = [new Date(2008,05,30),new Date(2008,05,33)]
do {
d1 = new Date(2008,05,25+i); d2 = new Date(2008,05,25+i+2);
dates[i] = [d1,d2]; i++;
} while(i<5)
//adding another, separate, range. making sure they will "split"
dates[5] = [new Date(2008,04,30),new Date(2008,05,12)]
do {
d1 = new Date(2008,04,11+i); d2 = new Date(2008,05,10+i);
dates[i] = [d1,d2]; i++;
} while(i<10)
//sort the dates array
dates.sort(datesArraySort);
for(a in dates) print(dates[a][0].toUTCString(),' to ',dates[a][1].toUTCString());
print('sorted:');
//fill the first element of the final ranges array
datesRange[ir++] = dates[0];
for(i=1;i<dates.length;i++) {
d1 = dates[i][0].getTime(); //curr range start
d2 = dates[i][1].getTime(); //curr range end
dprev2 = datesRange[ir-1][1].getTime(); //prev range end
//switch ending date with current
if(dprev2 < d2 && d1 < dprev2) datesRange[ir-1][1]=dates[i][1];
//open new range, start & end from the current range
else datesRange[ir++] = dates[i];
}
for(a in datesRange) print(datesRange[a][0].toUTCString(),' to ',datesRange[a][1].toUTCString());
print('final:')
/*
sort the dates array,
first on the range start,
if ranges starts are equal, sort on ends
*/
function datesArraySort(d1,d2) {
dd1=d1[0].getTime(),dd2=d2[0].getTime();
ret=dd1-dd2;
if(ret!=0) return ret;
else {
dd1=d1[1].getTime(),dd2=d2[1].getTime();
return dd1-dd2;
}
}
Let me know if this is what you wanted.
Bookmarks