diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index a8642617..fe2b89e8 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -604,7 +604,7 @@ function rcube_calendar_ui(settings) priority: priority.val(), sensitivity: sensitivity.val(), status: eventstatus.val(), - recurrence: me.serialize_recurrence(), + recurrence: me.serialize_recurrence(endtime.val()), valarms: me.serialize_alarms('#edit-alarms'), attendees: event_attendees, deleted_attachments: rcmail.env.deleted_attachments, diff --git a/plugins/calendar/lib/calendar_recurrence.php b/plugins/calendar/lib/calendar_recurrence.php index b31026a8..fae98bbe 100644 --- a/plugins/calendar/lib/calendar_recurrence.php +++ b/plugins/calendar/lib/calendar_recurrence.php @@ -48,6 +48,16 @@ class calendar_recurrence extends libcalendaring_recurrence $this->init($event['recurrence'], $event['start']); } + /** + * Alias of libcalendaring_recurrence::next() + * + * @return mixed DateTime object or False if recurrence ended + */ + public function next_start() + { + return $this->next(); + } + /** * Get the next recurring instance of this event * @@ -55,7 +65,7 @@ class calendar_recurrence extends libcalendaring_recurrence */ public function next_instance() { - if ($next_start = $this->next_start()) { + if ($next_start = $this->next()) { $next = $this->event; $next['recurrence_id'] = $next_start->format('Y-m-d'); $next['start'] = $next_start; diff --git a/plugins/libcalendaring/lib/libcalendaring_recurrence.php b/plugins/libcalendaring/lib/libcalendaring_recurrence.php index 3423ae75..bbc4976c 100644 --- a/plugins/libcalendaring/lib/libcalendaring_recurrence.php +++ b/plugins/libcalendaring/lib/libcalendaring_recurrence.php @@ -52,17 +52,15 @@ class libcalendaring_recurrence * @param array The recurrence properties * @param object DateTime The recurrence start date */ - public function init($recurrence, $start) + public function init($recurrence, $start = null) { - $this->start = $start; $this->recurrence = $recurrence; - $this->dateonly = $start->_dateonly; - $this->next = new Horde_Date($start, $this->lib->timezone->getName()); - $this->hour = $this->next->hour; $this->engine = new Horde_Date_Recurrence($start); $this->engine->fromRRule20(libcalendaring::to_rrule($recurrence)); + $this->set_start($start); + if (is_array($recurrence['EXDATE'])) { foreach ($recurrence['EXDATE'] as $exdate) { if (is_a($exdate, 'DateTime')) { @@ -79,12 +77,26 @@ class libcalendaring_recurrence } } + /** + * Setter for (new) recurrence start date + * + * @param object DateTime The recurrence start date + */ + public function set_start($start) + { + $this->start = $start; + $this->dateonly = $start->_dateonly; + $this->next = new Horde_Date($start, $this->lib->timezone->getName()); + $this->hour = $this->next->hour; + $this->engine->setRecurStart($this->next); + } + /** * Get date/time of the next occurence of this event * * @return mixed DateTime object or False if recurrence ended */ - public function next_start() + public function next() { $time = false; $after = clone $this->next; @@ -131,7 +143,7 @@ class libcalendaring_recurrence if ($this->recurrence['COUNT']) { $last = $this->start; $this->next = new Horde_Date($this->start, $this->lib->timezone->getName()); - while (($next = $this->next_start()) && $c < 1000) { + while (($next = $this->next()) && $c < 1000) { $last = $next; $c++; } diff --git a/plugins/libcalendaring/libcalendaring.js b/plugins/libcalendaring/libcalendaring.js index c3386845..1d93c13c 100644 --- a/plugins/libcalendaring/libcalendaring.js +++ b/plugins/libcalendaring/libcalendaring.js @@ -615,7 +615,7 @@ function rcube_libcalendaring(settings) /** * Gather recurrence settings from form */ - this.serialize_recurrence = function() + this.serialize_recurrence = function(timestr) { var recurrence = '', freq = $('#edit-recurrence-frequency').val(); @@ -630,7 +630,7 @@ function rcube_libcalendaring(settings) if (until == 'count') recurrence.COUNT = $('#edit-recurrence-repeat-times').val(); else if (until == 'until') - recurrence.UNTIL = me.date2ISO8601(me.parse_datetime(endtime.val(), $('#edit-recurrence-enddate').val())); + recurrence.UNTIL = me.date2ISO8601(me.parse_datetime(timestr || '00:00', $('#edit-recurrence-enddate').val())); if (freq == 'WEEKLY') { var byday = []; diff --git a/plugins/libcalendaring/libcalendaring.php b/plugins/libcalendaring/libcalendaring.php index 1b680a56..09a9c688 100644 --- a/plugins/libcalendaring/libcalendaring.php +++ b/plugins/libcalendaring/libcalendaring.php @@ -397,7 +397,10 @@ class libcalendaring extends rcube_plugin { return array_map(function($alarm){ if ($alarm['trigger'][0] == '@') { - try { $alarm['trigger'] = new DateTime($alarm['trigger']); } + try { + $alarm['trigger'] = new DateTime($alarm['trigger']); + $alarm['trigger']->setTimezone(new DateTimeZone('UTC')); + } catch (Exception $e) { /* handle this ? */ } } else if ($trigger = libcalendaring::parse_alaram_value($alarm['trigger'])) {