Fix free/busy finder for all-day events

This commit is contained in:
Thomas Bruederli 2013-03-06 11:45:40 +01:00 committed by Thomas Bruederli
parent 7e4b581b4e
commit 7678954ba3

View file

@ -1232,10 +1232,10 @@ function rcube_calendar_ui(settings)
{ {
// fix all-day evebt times // fix all-day evebt times
if (me.selected_event.allDay) { if (me.selected_event.allDay) {
var numdays = Math.floor((me.selected_event.end.getTime() - me.selected_event.start.getTime()) / DAY_MS);
start.setHours(12); start.setHours(12);
start.setMinutes(0); start.setMinutes(0);
if (end.getHours() == 0) end.setTime(start.getTime() + numdays * DAY_MS);
end.setHours(-1);
end.setHours(13); end.setHours(13);
end.setMinutes(0); end.setMinutes(0);
} }
@ -1252,13 +1252,13 @@ function rcube_calendar_ui(settings)
var freebusy_find_slot = function(dir) var freebusy_find_slot = function(dir)
{ {
var event = me.selected_event, var event = me.selected_event,
eventstart = event.start.getTime(), // calculate with integers eventstart = clone_date(event.start, event.allDay ? 1 : 0).getTime(), // calculate with integers
eventend = event.end.getTime(), eventend = clone_date(event.end, event.allDay ? 2 : 0).getTime(),
duration = eventend - eventstart, duration = eventend - eventstart - (event.allDay ? HOUR_MS : 0), // make sure we don't cross day borders on DST change
sinterval = freebusy_data.interval * 60000, sinterval = freebusy_data.interval * 60000,
intvlslots = 1, intvlslots = 1,
numslots = Math.ceil(duration / sinterval), numslots = Math.ceil(duration / sinterval),
checkdate, slotend, email, ts, slot, slotdate = new Date(), slotenddate = new Date(); checkdate, slotend, email, ts, slot, slotdate = new Date();
// shift event times to next possible slot // shift event times to next possible slot
eventstart += sinterval * intvlslots * dir; eventstart += sinterval * intvlslots * dir;
@ -1269,9 +1269,13 @@ function rcube_calendar_ui(settings)
for (slot = dir > 0 ? freebusy_data.start.getTime() : freebusy_data.end.getTime() - sinterval; for (slot = dir > 0 ? freebusy_data.start.getTime() : freebusy_data.end.getTime() - sinterval;
(dir > 0 && slot < freebusy_data.end.getTime()) || (dir < 0 && slot >= freebusy_data.start.getTime()); (dir > 0 && slot < freebusy_data.end.getTime()) || (dir < 0 && slot >= freebusy_data.start.getTime());
slot += sinterval * dir) { slot += sinterval * dir) {
slotend = slot + sinterval;
slotdate.setTime(slot); slotdate.setTime(slot);
slotenddate.setTime(slotend); // fix slot if just crossed a DST change
if (event.allDay) {
fix_date(slotdate);
slot = slotdate.getTime();
}
slotend = slot + sinterval;
if ((dir > 0 && slotend <= eventstart) || (dir < 0 && slot >= eventend)) // skip if ((dir > 0 && slotend <= eventstart) || (dir < 0 && slot >= eventend)) // skip
continue; continue;