diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index 722e1cb9..39067745 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -34,6 +34,7 @@ class calendar extends rcube_plugin public $task = '?(?!logout).*'; public $rc; + public $lib; public $driver; public $home; // declare public to be used in other classes public $urlbase; @@ -46,29 +47,13 @@ class calendar extends rcube_plugin public $defaults = array( 'calendar_default_view' => "agendaWeek", - 'calendar_date_format' => "yyyy-MM-dd", - 'calendar_date_short' => "M-d", - 'calendar_date_long' => "MMM d yyyy", - 'calendar_date_agenda' => "ddd MM-dd", - 'calendar_time_format' => "HH:mm", 'calendar_timeslots' => 2, - 'calendar_first_day' => 1, - 'calendar_first_hour' => 6, 'calendar_work_start' => 6, 'calendar_work_end' => 18, 'calendar_agenda_range' => 60, 'calendar_agenda_sections' => 'smart', 'calendar_event_coloring' => 0, 'calendar_time_indicator' => true, - 'calendar_date_format_sets' => array( - 'yyyy-MM-dd' => array('MMM d yyyy', 'M-d', 'ddd MM-dd'), - 'dd-MM-yyyy' => array('d MMM yyyy', 'd-M', 'ddd dd-MM'), - 'yyyy/MM/dd' => array('MMM d yyyy', 'M/d', 'ddd MM/dd'), - 'MM/dd/yyyy' => array('MMM d yyyy', 'M/d', 'ddd MM/dd'), - 'dd/MM/yyyy' => array('d MMM yyyy', 'd/M', 'ddd dd/MM'), - 'dd.MM.yyyy' => array('dd. MMM yyyy', 'd.M', 'ddd dd.MM.'), - 'd.M.yyyy' => array('d. MMM yyyy', 'd.M', 'ddd d.MM.'), - ), ); private $default_categories = array( @@ -86,7 +71,10 @@ class calendar extends rcube_plugin */ function init() { + $this->require_plugin('libcalendaring'); + $this->rc = rcmail::get_instance(); + $this->lib = libcalendaring::get_instance(); $this->register_task('calendar', 'calendar'); @@ -96,11 +84,9 @@ class calendar extends rcube_plugin // load localizations $this->add_texts('localization/', $this->rc->task == 'calendar' && (!$this->rc->action || $this->rc->action == 'print')); - // set user's timezone - $this->timezone = new DateTimeZone($this->rc->config->get('timezone', 'GMT')); - $now = new DateTime('now', $this->timezone); - $this->gmt_offset = $now->getOffset(); - $this->dst_active = $now->format('I'); + $this->timezone = $this->lib->timezone; + $this->gmt_offset = $this->lib->gmt_offset; + $this->dst_active = $this->lib->dst_active; $this->timezone_offset = $this->gmt_offset / 3600 - $this->dst_active; require($this->home . '/lib/calendar_ui.php'); @@ -108,8 +94,6 @@ class calendar extends rcube_plugin // load Calendar user interface which includes jquery-ui if (!$this->rc->output->ajax_call && !$this->rc->output->env['framed']) { - $this->require_plugin('jqueryui'); - $this->ui->init(); // settings are required in (almost) every GUI step @@ -185,8 +169,9 @@ class calendar extends rcube_plugin } } - // add hook to display alarms - $this->add_hook('keep_alive', array($this, 'keep_alive')); + // add hooks to display alarms + $this->add_hook('pending_alarms', array($this, 'pending_alarms')); + $this->add_hook('dismiss_alarms', array($this, 'dismiss_alarms')); } /** @@ -358,7 +343,7 @@ class calendar extends rcube_plugin 'content' => $select->show(strval($this->rc->config->get('calendar_first_day', $this->defaults['calendar_first_day']))), ); - $time_format = $this->rc->config->get('time_format', self::to_php_date_format($this->rc->config->get('calendar_time_format', $this->defaults['calendar_time_format']))); + $time_format = $this->rc->config->get('time_format', libcalendaring::to_php_date_format($this->rc->config->get('calendar_time_format', $this->defaults['calendar_time_format']))); $select_hours = new html_select(); for ($h = 0; $h < 24; $h++) $select_hours->add(date($time_format, mktime($h, 0, 0)), $h); @@ -403,7 +388,7 @@ class calendar extends rcube_plugin 'title' => html::label($field_id, Q($this->gettext('defaultalarmtype'))), 'content' => $select_type->show($this->rc->config->get('calendar_default_alarm_type', '')), ); - $preset = self::parse_alaram_value($this->rc->config->get('calendar_default_alarm_offset', '-15M')); + $preset = libcalendaring::parse_alaram_value($this->rc->config->get('calendar_default_alarm_offset', '-15M')); $p['blocks']['view']['options']['alarmoffset'] = array( 'title' => html::label($field_id . 'value', Q($this->gettext('defaultalarmoffset'))), 'content' => $input_value->show($preset[0]) . ' ' . $select_offset->show($preset[1]), @@ -831,35 +816,38 @@ class calendar extends rcube_plugin echo $this->encode($events, !empty($query)); exit; } - + /** - * Handler for keep-alive requests + * Handler for pending_alarms plugin hook triggered by the calendar module on keep-alive requests. * This will check for pending notifications and pass them to the client */ - function keep_alive($attr) + public function pending_alarms($p) { - $timestamp = time(); $this->load_driver(); - $alarms = (array)$this->driver->pending_alarms($timestamp); - foreach ($alarms as $i => $alarm) { - $alarms[$i]['id'] = 'cal:' . $alarm['id']; // prefix ID with cal: - } - - $plugin = $this->rc->plugins->exec_hook('pending_alarms', array( - 'time' => $timestamp, - 'alarms' => $alarms, - )); - - if (!$plugin['abort'] && $plugin['alarms']) { - // make sure texts and env vars are available on client - if ($this->rc->task != 'calendar') { - $this->add_texts('localization/', true); - $this->rc->output->set_env('snooze_select', $this->ui->snooze_select()); + if ($alarms = $this->driver->pending_alarms($p['time'] ?: time())) { + foreach ($alarms as $i => $alarm) { + $alarm['id'] = 'cal:' . $alarm['id']; // prefix ID with cal: + $p['alarms'][] = $alarm; } - $this->rc->output->command('plugin.display_alarms', $this->_alarms_output($plugin['alarms'])); } + + return $p; } - + + /** + * Handler for alarm dismiss hook triggered by libcalendaring + */ + public function dismiss_alarms($p) + { + $this->load_driver(); + foreach ((array)$p['ids'] as $id) { + if (strpos($id, 'cal:') === 0) + $p['success'] |= $this->driver->dismiss_alarm(substr($id, 4), $p['snooze']); + } + + return $p; + } + /** * Handler for check-recent requests which are accidentally sent to calendar taks */ @@ -1021,20 +1009,16 @@ class calendar extends rcube_plugin */ function load_settings() { - $this->date_format_defaults(); + $this->lib->load_settings(); + $this->defaults += $this->lib->defaults; + $settings = array(); - + // configuration $settings['default_calendar'] = $this->rc->config->get('calendar_default_calendar'); $settings['default_view'] = (string)$this->rc->config->get('calendar_default_view', $this->defaults['calendar_default_view']); - - $settings['date_format'] = (string)$this->rc->config->get('calendar_date_format', $this->defaults['calendar_date_format']); - $settings['time_format'] = (string)$this->rc->config->get('calendar_time_format', $this->defaults['calendar_time_format']); - $settings['date_short'] = (string)$this->rc->config->get('calendar_date_short', $this->defaults['calendar_date_short']); - $settings['date_long'] = (string)$this->rc->config->get('calendar_date_long', $this->defaults['calendar_date_long']); - $settings['dates_long'] = str_replace(' yyyy', '[ yyyy]', $settings['date_long']) . "{ '—' " . $settings['date_long'] . '}'; $settings['date_agenda'] = (string)$this->rc->config->get('calendar_date_agenda', $this->defaults['calendar_date_agenda']); - + $settings['timeslots'] = (int)$this->rc->config->get('calendar_timeslots', $this->defaults['calendar_timeslots']); $settings['first_day'] = (int)$this->rc->config->get('calendar_first_day', $this->defaults['calendar_first_day']); $settings['first_hour'] = (int)$this->rc->config->get('calendar_first_hour', $this->defaults['calendar_first_hour']); @@ -1044,39 +1028,6 @@ class calendar extends rcube_plugin $settings['agenda_sections'] = $this->rc->config->get('calendar_agenda_sections', $this->defaults['calendar_agenda_sections']); $settings['event_coloring'] = (int)$this->rc->config->get('calendar_event_coloring', $this->defaults['calendar_event_coloring']); $settings['time_indicator'] = (int)$this->rc->config->get('calendar_time_indicator', $this->defaults['calendar_time_indicator']); - $settings['timezone'] = $this->timezone_offset; - $settings['dst'] = $this->dst_active; - - // localization - $settings['days'] = array( - rcube_label('sunday'), rcube_label('monday'), - rcube_label('tuesday'), rcube_label('wednesday'), - rcube_label('thursday'), rcube_label('friday'), - rcube_label('saturday') - ); - $settings['days_short'] = array( - rcube_label('sun'), rcube_label('mon'), - rcube_label('tue'), rcube_label('wed'), - rcube_label('thu'), rcube_label('fri'), - rcube_label('sat') - ); - $settings['months'] = array( - $this->rc->gettext('longjan'), $this->rc->gettext('longfeb'), - $this->rc->gettext('longmar'), $this->rc->gettext('longapr'), - $this->rc->gettext('longmay'), $this->rc->gettext('longjun'), - $this->rc->gettext('longjul'), $this->rc->gettext('longaug'), - $this->rc->gettext('longsep'), $this->rc->gettext('longoct'), - $this->rc->gettext('longnov'), $this->rc->gettext('longdec') - ); - $settings['months_short'] = array( - $this->rc->gettext('jan'), $this->rc->gettext('feb'), - $this->rc->gettext('mar'), $this->rc->gettext('apr'), - $this->rc->gettext('may'), $this->rc->gettext('jun'), - $this->rc->gettext('jul'), $this->rc->gettext('aug'), - $this->rc->gettext('sep'), $this->rc->gettext('oct'), - $this->rc->gettext('nov'), $this->rc->gettext('dec') - ); - $settings['today'] = $this->rc->gettext('today'); // get user identity to create default attendee if ($this->ui->screen == 'calendar') { @@ -1089,56 +1040,8 @@ class calendar extends rcube_plugin $settings['identity'] = array('name' => $identity['name'], 'email' => $identity['email'], 'emails' => ';' . join(';', $identity['emails'])); } - // define list of file types which can be displayed inline - // same as in program/steps/mail/show.inc - $mimetypes = $this->rc->config->get('client_mimetypes', 'text/plain,text/html,text/xml,image/jpeg,image/gif,image/png,application/x-javascript,application/pdf,application/x-shockwave-flash'); - $settings['mimetypes'] = is_string($mimetypes) ? explode(',', $mimetypes) : (array)$mimetypes; - return $settings; } - - /** - * Helper function to set date/time format according to config and user preferences - */ - private function date_format_defaults() - { - static $defaults = array(); - - // nothing to be done - if (isset($defaults['date_format'])) - return; - - $defaults['date_format'] = $this->rc->config->get('calendar_date_format', self::from_php_date_format($this->rc->config->get('date_format'))); - $defaults['time_format'] = $this->rc->config->get('calendar_time_format', self::from_php_date_format($this->rc->config->get('time_format'))); - - // override defaults - if ($defaults['date_format']) - $this->defaults['calendar_date_format'] = $defaults['date_format']; - if ($defaults['time_format']) - $this->defaults['calendar_time_format'] = $defaults['time_format']; - - // derive format variants from basic date format - $format_sets = $this->rc->config->get('calendar_date_format_sets', $this->defaults['calendar_date_format_sets']); - if ($format_set = $format_sets[$this->defaults['calendar_date_format']]) { - $this->defaults['calendar_date_long'] = $format_set[0]; - $this->defaults['calendar_date_short'] = $format_set[1]; - $this->defaults['calendar_date_agenda'] = $format_set[2]; - } - } - - /** - * Shift dates into user's current timezone - */ - private function adjust_timezone($dt) - { - if (is_numeric($dt)) - $dt = new DateTime('@'.$td); - else if (is_string($dt)) - $dt = new DateTime($dt); - - $dt->setTimezone($this->timezone); - return $dt; - } /** * Encode events as JSON @@ -1163,11 +1066,11 @@ class calendar extends rcube_plugin { // compose a human readable strings for alarms_text and recurrence_text if ($event['alarms']) - $event['alarms_text'] = self::alarms_text($event['alarms']); + $event['alarms_text'] = libcalendaring::alarms_text($event['alarms']); if ($event['recurrence']) { $event['recurrence_text'] = $this->_recurrence_text($event['recurrence']); if ($event['recurrence']['UNTIL']) - $event['recurrence']['UNTIL'] = $this->adjust_timezone($event['recurrence']['UNTIL'])->format('c'); + $event['recurrence']['UNTIL'] = $this->lib->adjust_timezone($event['recurrence']['UNTIL'])->format('c'); } foreach ((array)$event['attachments'] as $k => $attachment) { @@ -1176,8 +1079,8 @@ class calendar extends rcube_plugin return array( '_id' => $event['calendar'] . ':' . $event['id'], // unique identifier for fullcalendar - 'start' => $this->adjust_timezone($event['start'])->format('c'), - 'end' => $this->adjust_timezone($event['end'])->format('c'), + 'start' => $this->lib->adjust_timezone($event['start'])->format('c'), + 'end' => $this->lib->adjust_timezone($event['end'])->format('c'), 'title' => strval($event['title']), 'description' => strval($event['description']), 'location' => strval($event['location']), @@ -1187,56 +1090,6 @@ class calendar extends rcube_plugin } - /** - * Generate reduced and streamlined output for pending alarms - */ - private function _alarms_output($alarms) - { - $out = array(); - foreach ($alarms as $alarm) { - $out[] = array( - 'id' => $alarm['id'], - 'start' => $alarm['start'] ? $this->adjust_timezone($alarm['start'])->format('c') : '', - 'end' => $alarm['end'] ? $this->adjust_timezone($alarm['end'])->format('c') : '', - 'allDay' => ($alarm['allday'] == 1)?true:false, - 'title' => $alarm['title'], - 'location' => $alarm['location'], - 'calendar' => $alarm['calendar'], - ); - } - - return $out; - } - - /** - * Render localized text for alarm settings - */ - public static function alarms_text($alarm) - { - list($trigger, $action) = explode(':', $alarm); - - $text = ''; - switch ($action) { - case 'EMAIL': - $text = rcube_label('calendar.alarmemail'); - break; - case 'DISPLAY': - $text = rcube_label('calendar.alarmdisplay'); - break; - } - - if (preg_match('/@(\d+)/', $trigger, $m)) { - $text .= ' ' . rcube_label(array('name' => 'calendar.alarmat', 'vars' => array('datetime' => format_date($m[1])))); - } - else if ($val = self::parse_alaram_value($trigger)) { - $text .= ' ' . intval($val[0]) . ' ' . rcube_label('calendar.trigger' . $val[1]); - } - else - return false; - - return $text; - } - /** * Render localized text describing the recurrence rule of an event */ @@ -1266,7 +1119,7 @@ class calendar extends rcube_plugin if ($rrule['COUNT']) $until = $this->gettext(array('name' => 'forntimes', 'vars' => array('nr' => $rrule['COUNT']))); else if ($rrule['UNTIL']) - $until = $this->gettext('recurrencend') . ' ' . format_date($rrule['UNTIL'], self::to_php_date_format($this->rc->config->get('calendar_date_format', $this->defaults['calendar_date_format']))); + $until = $this->gettext('recurrencend') . ' ' . format_date($rrule['UNTIL'], libcalendaring::to_php_date_format($this->rc->config->get('calendar_date_format', $this->defaults['calendar_date_format']))); else $until = $this->gettext('forever'); @@ -1281,148 +1134,7 @@ class calendar extends rcube_plugin return strtoupper(md5(time() . uniqid(rand())) . '-' . substr(md5($this->rc->user->get_username()), 0, 16)); } - /** - * Helper function to convert alarm trigger strings - * into two-field values (e.g. "-45M" => 45, "-M") - */ - public static function parse_alaram_value($val) - { - if ($val[0] == '@') - return array(substr($val, 1)); - else if (preg_match('/([+-])(\d+)([HMD])/', $val, $m)) - return array($m[2], $m[1].$m[3]); - - return false; - } - /** - * Get the next alarm (time & action) for the given event - * - * @param array Event data - * @return array Hash array with alarm time/type or null if no alarms are configured - */ - public static function get_next_alarm($event) - { - if (!$event['alarms']) - return null; - - // TODO: handle multiple alarms (currently not supported) - list($trigger, $action) = explode(':', $event['alarms'], 2); - - $notify = self::parse_alaram_value($trigger); - if (!empty($notify[1])){ // offset - $mult = 1; - switch ($notify[1]) { - case '-S': $mult = -1; break; - case '+S': $mult = 1; break; - case '-M': $mult = -60; break; - case '+M': $mult = 60; break; - case '-H': $mult = -3600; break; - case '+H': $mult = 3600; break; - case '-D': $mult = -86400; break; - case '+D': $mult = 86400; break; - case '-W': $mult = -604800; break; - case '+W': $mult = 604800; break; - } - $offset = $notify[0] * $mult; - $refdate = $mult > 0 ? $event['end'] : $event['start']; - $notify_at = $refdate->format('U') + $offset; - } - else { // absolute timestamp - $notify_at = $notify[0]; - } - - return array('time' => $notify_at, 'action' => $action ? strtoupper($action) : 'DISPLAY'); - } - - /** - * Convert the internal structured data into a vcalendar rrule 2.0 string - */ - public static function to_rrule($recurrence) - { - if (is_string($recurrence)) - return $recurrence; - - $rrule = ''; - foreach ((array)$recurrence as $k => $val) { - $k = strtoupper($k); - switch ($k) { - case 'UNTIL': - $val = $val->format('Ymd\THis'); - break; - case 'EXDATE': - foreach ((array)$val as $i => $ex) - $val[$i] = $ex->format('Ymd\THis'); - $val = join(',', (array)$val); - break; - } - $rrule .= $k . '=' . $val . ';'; - } - - return rtrim($rrule, ';'); - } - - /** - * Convert from fullcalendar date format to PHP date() format string - */ - private static function to_php_date_format($from) - { - // "dd.MM.yyyy HH:mm:ss" => "d.m.Y H:i:s" - return strtr(strtr($from, array( - 'yyyy' => 'Y', - 'yy' => 'y', - 'MMMM' => 'F', - 'MMM' => 'M', - 'MM' => 'm', - 'M' => 'n', - 'dddd' => 'l', - 'ddd' => 'D', - 'dd' => 'd', - 'HH' => '**', - 'hh' => '%%', - 'H' => 'G', - 'h' => 'g', - 'mm' => 'i', - 'ss' => 's', - 'TT' => 'A', - 'tt' => 'a', - 'T' => 'A', - 't' => 'a', - 'u' => 'c', - )), array( - '**' => 'H', - '%%' => 'h', - )); - } - - /** - * Convert from PHP date() format to fullcalendar format string - */ - private static function from_php_date_format($from) - { - // "d.m.Y H:i:s" => "dd.MM.yyyy HH:mm:ss" - return strtr($from, array( - 'y' => 'yy', - 'Y' => 'yyyy', - 'M' => 'MMM', - 'F' => 'MMMM', - 'm' => 'MM', - 'n' => 'M', - 'd' => 'dd', - 'D' => 'ddd', - 'l' => 'dddd', - 'H' => 'HH', - 'h' => 'hh', - 'G' => 'H', - 'g' => 'h', - 'i' => 'mm', - 's' => 'ss', - 'A' => 'TT', - 'a' => 'tt', - 'c' => 'u', - )); - } - /** * TEMPORARY: generate random event data for testing * Create events by opening http:///?_task=calendar&_action=randomdata&_num=500 @@ -1812,40 +1524,6 @@ class calendar extends rcube_plugin return $sent; } - - /** - * Compose a date string for the given event - */ - public function event_date_text($event, $tzinfo = false) - { - $fromto = ''; - $duration = $event['start']->diff($event['end'])->format('s'); - - $this->date_format_defaults(); - $date_format = self::to_php_date_format($this->rc->config->get('calendar_date_format', $this->defaults['calendar_date_format'])); - $time_format = self::to_php_date_format($this->rc->config->get('calendar_time_format', $this->defaults['calendar_time_format'])); - - if ($event['allday']) { - $fromto = format_date($event['start'], $date_format); - if (($todate = format_date($event['end'], $date_format)) != $fromto) - $fromto .= ' - ' . $todate; - } - else if ($duration < 86400 && $event['start']->format('d') == $event['end']->format('d')) { - $fromto = format_date($event['start'], $date_format) . ' ' . format_date($event['start'], $time_format) . - ' - ' . format_date($event['end'], $time_format); - } - else { - $fromto = format_date($event['start'], $date_format) . ' ' . format_date($event['start'], $time_format) . - ' - ' . format_date($event['end'], $date_format) . ' ' . format_date($event['end'], $time_format); - } - - // add timezone information - if ($tzinfo && ($tzname = $this->timezone->getName())) { - $fromto .= ' (' . strtr($tzname, '_', ' ') . ')'; - } - - return $fromto; - } /** * Echo simple free/busy status text for the given user and time range diff --git a/plugins/calendar/calendar_base.js b/plugins/calendar/calendar_base.js index 48c43b6b..0b8c904a 100644 --- a/plugins/calendar/calendar_base.js +++ b/plugins/calendar/calendar_base.js @@ -25,158 +25,16 @@ // Basic setup for Roundcube calendar client class function rcube_calendar(settings) { + // extend base class + rcube_libcalendaring.call(this, settings); + // member vars this.ui; this.ui_loaded = false; - this.settings = settings; - this.alarm_ids = []; - this.alarm_dialog = null; - this.snooze_popup = null; - this.dismiss_link = null; // private vars var me = this; - // quote html entities - var Q = this.quote_html = function(str) - { - return String(str).replace(//g, '>').replace(/"/g, '"'); - }; - - // create a nice human-readable string for the date/time range - this.event_date_text = function(event) - { - if (!event.start) - return ''; - if (!event.end) - event.end = event.start; - - var fromto, duration = event.end.getTime() / 1000 - event.start.getTime() / 1000; - if (event.allDay) { - fromto = $.fullCalendar.formatDate(event.start, settings['date_format']) - + (duration > 86400 || event.start.getDay() != event.end.getDay() ? ' — ' + $.fullCalendar.formatDate(event.end, settings['date_format']) : ''); - } - else if (duration < 86400 && event.start.getDay() == event.end.getDay()) { - fromto = $.fullCalendar.formatDate(event.start, settings['date_format']) + ' ' + $.fullCalendar.formatDate(event.start, settings['time_format']) - + (duration > 0 ? ' — ' + $.fullCalendar.formatDate(event.end, settings['time_format']) : ''); - } - else { - fromto = $.fullCalendar.formatDate(event.start, settings['date_format']) + ' ' + $.fullCalendar.formatDate(event.start, settings['time_format']) - + (duration > 0 ? ' — ' + $.fullCalendar.formatDate(event.end, settings['date_format']) + ' ' + $.fullCalendar.formatDate(event.end, settings['time_format']) : ''); - } - - return fromto; - }; - - // display a notification for the given pending alarms - this.display_alarms = function(alarms) { - // clear old alert first - if (this.alarm_dialog) - this.alarm_dialog.dialog('destroy'); - - this.alarm_dialog = $('
').attr('id', 'alarm-display'); - - var actions, adismiss, asnooze, alarm, html, event_ids = []; - for (var actions, html, alarm, i=0; i < alarms.length; i++) { - alarm = alarms[i]; - alarm.start = $.fullCalendar.parseISO8601(alarm.start, true); - alarm.end = $.fullCalendar.parseISO8601(alarm.end, true); - event_ids.push(alarm.id); - - html = '

' + Q(alarm.title) + '

'; - html += '
' + Q(alarm.location || '') + '
'; - html += '
' + Q(this.event_date_text(alarm)) + '
'; - - adismiss = $('').html(rcmail.gettext('dismiss','calendar')).click(function(){ - me.dismiss_link = $(this); - me.dismiss_alarm(me.dismiss_link.data('id'), 0); - }); - asnooze = $('').html(rcmail.gettext('snooze','calendar')).click(function(e){ - me.snooze_dropdown($(this)); - e.stopPropagation(); - return false; - }); - actions = $('
').addClass('alarm-actions').append(adismiss.data('id', alarm.id)).append(asnooze.data('id', alarm.id)); - - $('
').addClass('alarm-item').html(html).append(actions).appendTo(this.alarm_dialog); - } - - var buttons = {}; - buttons[rcmail.gettext('dismissall','calendar')] = function() { - // submit dismissed event_ids to server - me.dismiss_alarm(me.alarm_ids.join(','), 0); - $(this).dialog('close'); - }; - - this.alarm_dialog.appendTo(document.body).dialog({ - modal: false, - resizable: true, - closeOnEscape: false, - dialogClass: 'alarm', - title: '' + rcmail.gettext('alarmtitle', 'calendar'), - buttons: buttons, - close: function() { - $('#alarm-snooze-dropdown').hide(); - $(this).dialog('destroy').remove(); - me.alarm_dialog = null; - me.alarm_ids = null; - }, - drag: function(event, ui) { - $('#alarm-snooze-dropdown').hide(); - } - }); - this.alarm_ids = event_ids; - }; - - // show a drop-down menu with a selection of snooze times - this.snooze_dropdown = function(link) - { - if (!this.snooze_popup) { - this.snooze_popup = $('#alarm-snooze-dropdown'); - // create popup if not found - if (!this.snooze_popup.length) { - this.snooze_popup = $('
').attr('id', 'alarm-snooze-dropdown').addClass('popupmenu').appendTo(document.body); - this.snooze_popup.html(rcmail.env.snooze_select) - } - $('#alarm-snooze-dropdown a').click(function(e){ - var time = String(this.href).replace(/.+#/, ''); - me.dismiss_alarm($('#alarm-snooze-dropdown').data('id'), time); - return false; - }); - } - - // hide visible popup - if (this.snooze_popup.is(':visible') && this.snooze_popup.data('id') == link.data('id')) { - this.snooze_popup.hide(); - this.dismiss_link = null; - } - else { // open popup below the clicked link - var pos = link.offset(); - pos.top += link.height() + 2; - this.snooze_popup.data('id', link.data('id')).css({ top:Math.floor(pos.top)+'px', left:Math.floor(pos.left)+'px' }).show(); - this.dismiss_link = link; - } - }; - - // dismiss or snooze alarms for the given event - this.dismiss_alarm = function(id, snooze) - { - $('#alarm-snooze-dropdown').hide(); - rcmail.http_post('calendar/event', { action:'dismiss', e:{ id:id, snooze:snooze } }); - - // remove dismissed alarm from list - if (this.dismiss_link) { - this.dismiss_link.closest('div.alarm-item').hide(); - var new_ids = jQuery.grep(this.alarm_ids, function(v){ return v != id; }); - if (new_ids.length) - this.alarm_ids = new_ids; - else - this.alarm_dialog.dialog('close'); - } - - this.dismiss_link = null; - }; - // create new event from current mail message this.create_from_mail = function() { @@ -186,6 +44,7 @@ function rcube_calendar(settings) if (!this.ui_loaded) { $.when( $.getScript('./plugins/calendar/calendar_ui.js'), + $.getScript('./plugins/calendar/lib/js/fullcalendar.js'), $.get(rcmail.url('calendar/inlineui'), function(html){ $(document.body).append(html); }, 'html') ).then(function() { // register attachments form @@ -261,24 +120,11 @@ rcube_calendar.fetch_event_rsvp_status = function(event) }; -// extend jQuery -(function($){ - $.fn.serializeJSON = function(){ - var json = {}; - jQuery.map($(this).serializeArray(), function(n, i) { - json[n['name']] = n['value']; - }); - return json; - }; -})(jQuery); - /* calendar plugin initialization (for non-calendar tasks) */ window.rcmail && rcmail.addEventListener('init', function(evt) { if (rcmail.task != 'calendar') { - var cal = new rcube_calendar(rcmail.env.calendar_settings); + var cal = new rcube_calendar($.extend(rcmail.env.calendar_settings, rcmail.env.libcal_settings)); - rcmail.addEventListener('plugin.display_alarms', function(alarms){ cal.display_alarms(alarms); }); - rcmail.addEventListener('plugin.update_event_rsvp_status', function(p){ if (p.html) $('#loading-'+p.id).hide().after(p.html); diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 1f9d4484..ce993e51 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -67,64 +67,18 @@ function rcube_calendar_ui(settings) selectOtherMonths: true }; + /*** imports ***/ + var Q = this.quote_html; + var text2html = this.text2html; + var event_date_text = this.event_date_text; + var parse_datetime = this.parse_datetime; + var date2unixtime = this.date2unixtime; + var fromunixtime = this.fromunixtime; + var init_alarms_edit = this.init_alarms_edit; + /*** private methods ***/ - var Q = this.quote_html; - var event_date_text = this.event_date_text; - - var text2html = function(str, maxlen, maxlines) - { - var html = Q(String(str)); - - // limit visible text length - if (maxlen) { - var morelink = ' '+rcmail.gettext('showmore','calendar')+'', - lines = html.split(/\r?\n/), - words, out = '', len = 0; - - for (var i=0; i < lines.length; i++) { - len += lines[i].length; - if (maxlines && i == maxlines - 1) { - out += lines[i] + '\n' + morelink; - maxlen = html.length * 2; - } - else if (len > maxlen) { - len = out.length; - words = lines[i].split(' '); - for (var j=0; j < words.length; j++) { - len += words[j].length + 1; - out += words[j] + ' '; - if (len > maxlen) { - out += morelink; - maxlen = html.length * 2; - } - } - out += '\n'; - } - else - out += lines[i] + '\n'; - } - - if (maxlen > str.length) - out += ''; - - html = out; - } - - // simple link parser (similar to rcube_string_replacer class in PHP) - var utf_domain = '[^?&@"\'/\\(\\)\\s\\r\\t\\n]+\\.([^\x00-\x2f\x3b-\x40\x5b-\x60\x7b-\x7f]{2,}|xn--[a-z0-9]{2,})'; - var url1 = '.:;,', url2 = 'a-z0-9%=#@+?&/_~\\[\\]-'; - var link_pattern = new RegExp('([hf]t+ps?://)('+utf_domain+'(['+url1+']?['+url2+']+)*)?', 'ig'); - var mailto_pattern = new RegExp('([^\\s\\n\\(\\);]+@'+utf_domain+')', 'ig'); - - return html - .replace(link_pattern, '$1$2') - .replace(mailto_pattern, '$1') - .replace(/(mailto:)([^"]+)"/g, '$1$2" onclick="rcmail.command(\'compose\', \'$2\');return false"') - .replace(/\n/g, "
"); - }; - // same as str.split(delimiter) but it ignores delimiters within quoted strings var explode_quoted_string = function(str, delimiter) { @@ -148,25 +102,6 @@ function rcube_calendar_ui(settings) return result; }; - // from time and date strings to a real date object - var parse_datetime = function(time, date) - { - // we use the utility function from datepicker to parse dates - var date = date ? $.datepicker.parseDate(datepicker_settings.dateFormat, date, datepicker_settings) : new Date(); - - var time_arr = time.replace(/\s*[ap][.m]*/i, '').replace(/0([0-9])/g, '$1').split(/[:.]/); - if (!isNaN(time_arr[0])) { - date.setHours(time_arr[0]); - if (time.match(/p[.m]*/i) && date.getHours() < 12) - date.setHours(parseInt(time_arr[0]) + 12); - else if (time.match(/a[.m]*/i) && date.getHours() == 12) - date.setHours(0); - } - if (!isNaN(time_arr[1])) - date.setMinutes(time_arr[1]); - - return date; - }; // clone the given date object and optionally adjust time var clone_date = function(date, adjust) @@ -194,23 +129,6 @@ function rcube_calendar_ui(settings) + 'T'+date.getHours()+':'+date.getMinutes()+':'+date.getSeconds(); } - // convert the given Date object into a unix timestamp respecting browser's and user's timezone settings - var date2unixtime = function(date) - { - var dst_offset = (client_timezone - date.getTimezoneOffset()) * 60; // adjust DST offset - return Math.round(date.getTime()/1000 + gmt_offset * 3600 + dst_offset); - }; - - var fromunixtime = function(ts) - { - ts -= gmt_offset * 3600; - var date = new Date(ts * 1000), - dst_offset = (client_timezone - date.getTimezoneOffset()) * 60; - if (dst_offset) // adjust DST offset - date.setTime((ts + 3600) * 1000); - return date; - }; - // determine whether the given date is on a weekend var is_weekend = function(date) { @@ -2561,7 +2479,7 @@ function rcube_calendar_ui(settings) } } }); - $('#edit-enddate, input.edit-alarm-date').datepicker(datepicker_settings); + $('#edit-enddate').datepicker(datepicker_settings); $('#edit-startdate').datepicker(datepicker_settings).datepicker('option', 'onSelect', shift_enddate).change(function(){ shift_enddate(this.value); }); $('#edit-enddate').datepicker('option', 'onSelect', event_times_changed).change(event_times_changed); $('#edit-allday').click(function(){ $('#edit-starttime, #edit-endtime')[(this.checked?'hide':'show')](); event_times_changed(); }); @@ -2592,14 +2510,7 @@ function rcube_calendar_ui(settings) }); // register events on alarm fields - $('#eventedit select.edit-alarm-type').change(function(){ - $(this).parent().find('span.edit-alarm-values')[(this.selectedIndex>0?'show':'hide')](); - }); - $('#eventedit select.edit-alarm-offset').change(function(){ - var mode = $(this).val() == '@' ? 'show' : 'hide'; - $(this).parent().find('.edit-alarm-date, .edit-alarm-time')[mode](); - $(this).parent().find('.edit-alarm-value').prop('disabled', mode == 'show'); - }); + init_alarms_edit('#eventedit'); // toggle recurrence frequency forms $('#edit-recurrence-frequency').change(function(e){ @@ -2721,7 +2632,7 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { rcmail.addEventListener('plugin.import_success', function(p){ cal.import_success(p); }); // let's go - var cal = new rcube_calendar_ui(rcmail.env.calendar_settings); + var cal = new rcube_calendar_ui($.extend(rcmail.env.calendar_settings, rcmail.env.libcal_settings)); $(window).resize(function(e) { // check target due to bugs in jquery diff --git a/plugins/calendar/drivers/database/database_driver.php b/plugins/calendar/drivers/database/database_driver.php index 039276ed..6d3a5a88 100644 --- a/plugins/calendar/drivers/database/database_driver.php +++ b/plugins/calendar/drivers/database/database_driver.php @@ -378,7 +378,7 @@ class database_driver extends calendar_driver $event['end']->setTimezone($this->server_timezone); // compose vcalendar-style recurrencue rule from structured data - $rrule = $event['recurrence'] ? calendar::to_rrule($event['recurrence']) : ''; + $rrule = $event['recurrence'] ? libcalendaring::to_rrule($event['recurrence']) : ''; $event['_recurrence'] = rtrim($rrule, ';'); $event['free_busy'] = intval($this->free_busy_map[strtolower($event['free_busy'])]); @@ -411,7 +411,7 @@ class database_driver extends calendar_driver private function _get_notification($event) { if ($event['alarms'] && $event['start'] > new DateTime()) { - $alarm = calendar::get_next_alarm($event); + $alarm = libcalendaring::get_next_alarm($event); if ($alarm['time'] && $alarm['action'] == 'DISPLAY') return date('Y-m-d H:i:s', $alarm['time']); diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php index 9346f820..bdf22502 100644 --- a/plugins/calendar/drivers/kolab/kolab_driver.php +++ b/plugins/calendar/drivers/kolab/kolab_driver.php @@ -680,7 +680,7 @@ class kolab_driver extends calendar_driver foreach ($calendar->list_events($time, $time + 86400 * 365, null, 1, $query) as $e) { // add to list if alarm is set - $alarm = calendar::get_next_alarm($e); + $alarm = calendarlibcalendaring::get_next_alarm($e); if ($alarm && $alarm['time'] && $alarm['time'] <= $time && $alarm['action'] == 'DISPLAY') { $id = $e['id']; $events[$id] = $e; diff --git a/plugins/calendar/lib/calendar_ical.php b/plugins/calendar/lib/calendar_ical.php index 83ff1be4..719c1dc6 100644 --- a/plugins/calendar/lib/calendar_ical.php +++ b/plugins/calendar/lib/calendar_ical.php @@ -124,7 +124,7 @@ class calendar_ical public function get_parser() { // use Horde:iCalendar to parse vcalendar file format - @include_once('Horde/iCalendar.php'); + // @include_once('Horde/iCalendar.php'); if (!class_exists('Horde_iCalendar')) require_once($this->cal->home . '/lib/Horde_iCalendar.php'); @@ -377,7 +377,7 @@ class calendar_ical $vevent .= "LOCATION:" . self::escpape($event['location']) . self::EOL; } if ($event['recurrence']) { - $vevent .= "RRULE:" . calendar::to_rrule($event['recurrence'], self::EOL) . self::EOL; + $vevent .= "RRULE:" . libcalendaring::to_rrule($event['recurrence'], self::EOL) . self::EOL; } if(!empty($event['categories'])) { $vevent .= "CATEGORIES:" . self::escpape(strtoupper($event['categories'])) . self::EOL; @@ -387,7 +387,7 @@ class calendar_ical } if ($event['alarms']) { list($trigger, $action) = explode(':', $event['alarms']); - $val = calendar::parse_alaram_value($trigger); + $val = libcalendaring::parse_alaram_value($trigger); $vevent .= "BEGIN:VALARM\n"; if ($val[1]) $vevent .= "TRIGGER:" . preg_replace('/^([-+])(.+)/', '\\1PT\\2', $trigger) . self::EOL; diff --git a/plugins/calendar/lib/calendar_itip.php b/plugins/calendar/lib/calendar_itip.php index 8008aaef..b27c17cd 100644 --- a/plugins/calendar/lib/calendar_itip.php +++ b/plugins/calendar/lib/calendar_itip.php @@ -77,7 +77,7 @@ class calendar_itip 'name' => $bodytext, 'vars' => array( 'title' => $event['title'], - 'date' => $this->cal->event_date_text($event, true), + 'date' => $this->cal->lib->event_date_text($event, true), 'attendees' => join(', ', $attendees_list), 'sender' => $this->sender['name'], 'organizer' => $this->sender['name'], diff --git a/plugins/calendar/lib/calendar_recurrence.php b/plugins/calendar/lib/calendar_recurrence.php index 73267171..03831c19 100644 --- a/plugins/calendar/lib/calendar_recurrence.php +++ b/plugins/calendar/lib/calendar_recurrence.php @@ -54,7 +54,7 @@ class calendar_recurrence require_once($this->cal->home . '/lib/Horde_Date_Recurrence.php'); $this->engine = new Horde_Date_Recurrence($event['start']); - $this->engine->fromRRule20(calendar::to_rrule($event['recurrence'])); + $this->engine->fromRRule20(libcalendaring::to_rrule($event['recurrence'])); if (is_array($event['recurrence']['EXDATE'])) { foreach ($event['recurrence']['EXDATE'] as $exdate) diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php index 1cbcf0a9..34e0dd39 100644 --- a/plugins/calendar/lib/calendar_ui.php +++ b/plugins/calendar/lib/calendar_ui.php @@ -55,8 +55,7 @@ class calendar_ui 'label' => 'calendar.calendar', ), 'taskbar'); - // load basic client script (which - unfortunately - requires fullcalendar) - $this->cal->include_script('lib/js/fullcalendar.js'); + // load basic client script $this->cal->include_script('calendar_base.js'); $skin_path = $this->cal->local_skin_path(); @@ -78,7 +77,6 @@ class calendar_ui $this->cal->register_handler('plugin.priority_select', array($this, 'priority_select')); $this->cal->register_handler('plugin.sensitivity_select', array($this, 'sensitivity_select')); $this->cal->register_handler('plugin.alarm_select', array($this, 'alarm_select')); - $this->cal->register_handler('plugin.snooze_select', array($this, 'snooze_select')); $this->cal->register_handler('plugin.recurrence_form', array($this, 'recurrence_form')); $this->cal->register_handler('plugin.attachments_form', array($this, 'attachments_form')); $this->cal->register_handler('plugin.attachments_list', array($this, 'attachments_list')); @@ -110,6 +108,7 @@ class calendar_ui public function addJS() { $this->cal->include_script('calendar_ui.js'); + $this->cal->include_script('lib/js/fullcalendar.js'); $this->cal->include_script('lib/js/jquery.miniColors.min.js'); } @@ -326,63 +325,9 @@ class calendar_ui */ function alarm_select($attrib = array()) { - unset($attrib['name']); - $select_type = new html_select(array('name' => 'alarmtype[]', 'class' => 'edit-alarm-type')); - $select_type->add($this->cal->gettext('none'), ''); - foreach ($this->cal->driver->alarm_types as $type) - $select_type->add($this->cal->gettext(strtolower("alarm{$type}option")), $type); - - $input_value = new html_inputfield(array('name' => 'alarmvalue[]', 'class' => 'edit-alarm-value', 'size' => 3)); - $input_date = new html_inputfield(array('name' => 'alarmdate[]', 'class' => 'edit-alarm-date', 'size' => 10)); - $input_time = new html_inputfield(array('name' => 'alarmtime[]', 'class' => 'edit-alarm-time', 'size' => 6)); - - $select_offset = new html_select(array('name' => 'alarmoffset[]', 'class' => 'edit-alarm-offset')); - foreach (array('-M','-H','-D','+M','+H','+D','@') as $trigger) - $select_offset->add($this->cal->gettext('trigger' . $trigger), $trigger); - - // pre-set with default values from user settings - $preset = calendar::parse_alaram_value($this->rc->config->get('calendar_default_alarm_offset', '-15M')); - $hidden = array('style' => 'display:none'); - $html = html::span('edit-alarm-set', - $select_type->show($this->rc->config->get('calendar_default_alarm_type', '')) . ' ' . - html::span(array('class' => 'edit-alarm-values', 'style' => 'display:none'), - $input_value->show($preset[0]) . ' ' . - $select_offset->show($preset[1]) . ' ' . - $input_date->show('', $hidden) . ' ' . - $input_time->show('', $hidden) - ) - ); - - // TODO: support adding more alarms - #$html .= html::a(array('href' => '#', 'id' => 'edit-alam-add', 'title' => $this->cal->gettext('addalarm')), - # $attrib['addicon'] ? html::img(array('src' => $attrib['addicon'], 'alt' => 'add')) : '(+)'); - - return $html; + return $this->cal->lib->alarm_select($attrib, $this->cal->driver->alarm_types); } - function snooze_select($attrib = array()) - { - $steps = array( - 5 => 'repeatinmin', - 10 => 'repeatinmin', - 15 => 'repeatinmin', - 20 => 'repeatinmin', - 30 => 'repeatinmin', - 60 => 'repeatinhr', - 120 => 'repeatinhrs', - 1440 => 'repeattomorrow', - 10080 => 'repeatinweek', - ); - - $items = array(); - foreach ($steps as $n => $label) { - $items[] = html::tag('li', null, html::a(array('href' => "#" . ($n * 60), 'class' => 'active'), - $this->cal->gettext(array('name' => $label, 'vars' => array('min' => $n % 60, 'hrs' => intval($n / 60)))))); - } - - return html::tag('ul', $attrib + array('class' => 'toolbarmenu'), join("\n", $items), html::$common_attrib); - } - /** * */ @@ -780,7 +725,7 @@ class calendar_ui $table->add('ititle', $title); $table->add('title', Q($event['title'])); $table->add('label', $this->cal->gettext('date')); - $table->add('location', Q($this->cal->event_date_text($event))); + $table->add('location', Q($this->cal->lib->event_date_text($event))); if ($event['location']) { $table->add('label', $this->cal->gettext('location')); $table->add('location', Q($event['location'])); diff --git a/plugins/calendar/localization/de_CH.inc b/plugins/calendar/localization/de_CH.inc index 37ace18e..12614dd5 100644 --- a/plugins/calendar/localization/de_CH.inc +++ b/plugins/calendar/localization/de_CH.inc @@ -68,7 +68,6 @@ $labels['parentcalendar'] = 'Erstellen in'; $labels['searchearlierdates'] = '« Frühere Termine suchen'; $labels['searchlaterdates'] = 'Spätere Termine suchen »'; $labels['andnmore'] = '$nr weitere...'; -$labels['showmore'] = 'Mehr anzeigen...'; $labels['togglerole'] = 'Zum Ändern der Rolle klicken'; $labels['createfrommail'] = 'Als Termin speichern'; $labels['importevents'] = 'Termine importieren'; @@ -95,30 +94,8 @@ $labels['futureevents'] = 'Zukünftige'; // alarm/reminder settings $labels['showalarms'] = 'Erinnerungen anzeigen'; -$labels['alarmemail'] = 'E-Mail senden'; -$labels['alarmdisplay'] = 'Nachricht anzeigen'; -$labels['alarmdisplayoption'] = 'Nachricht'; -$labels['alarmemailoption'] = 'E-Mail'; -$labels['alarmat'] = 'um $datetime'; -$labels['trigger@'] = 'genau um'; -$labels['trigger-M'] = 'Minuten davor'; -$labels['trigger-H'] = 'Stunden davor'; -$labels['trigger-D'] = 'Tage davor'; -$labels['trigger+M'] = 'Minuten danach'; -$labels['trigger+H'] = 'Stunden danach'; -$labels['trigger+D'] = 'Tage danach'; -$labels['addalarm'] = 'Erinnerung hinzufügen'; $labels['defaultalarmtype'] = 'Standard-Erinnerungseinstellung'; $labels['defaultalarmoffset'] = 'Standard-Erinnerungszeit'; -$labels['dismissall'] = 'Alle ignorieren'; -$labels['dismiss'] = 'Ignorieren'; -$labels['snooze'] = 'Später erinnern'; -$labels['repeatinmin'] = 'Wiederholung in $min Minuten'; -$labels['repeatinhr'] = 'Wiederholung in 1 Stunde'; -$labels['repeatinhrs'] = 'Wiederholung in $hrs Stunden'; -$labels['repeattomorrow'] = 'Wiederholung morgen'; -$labels['repeatinweek'] = 'Wiederholung in einer Woche'; -$labels['alarmtitle'] = 'Anstehende Termine'; // attendees $labels['attendee'] = 'Teilnehmer'; diff --git a/plugins/calendar/localization/de_DE.inc b/plugins/calendar/localization/de_DE.inc index 0cadf517..7c0d00f6 100644 --- a/plugins/calendar/localization/de_DE.inc +++ b/plugins/calendar/localization/de_DE.inc @@ -68,7 +68,6 @@ $labels['parentcalendar'] = 'Erstellen in'; $labels['searchearlierdates'] = '« Frühere Termine suchen'; $labels['searchlaterdates'] = 'Spätere Termine suchen »'; $labels['andnmore'] = '$nr weitere...'; -$labels['showmore'] = 'Mehr anzeigen...'; $labels['togglerole'] = 'Zum Ändern der Rolle klicken'; $labels['createfrommail'] = 'Als Termin speichern'; $labels['importevents'] = 'Termine importieren'; @@ -95,30 +94,8 @@ $labels['futureevents'] = 'Zukünftige'; // alarm/reminder settings $labels['showalarms'] = 'Erinnerungen anzeigen'; -$labels['alarmemail'] = 'E-Mail senden'; -$labels['alarmdisplay'] = 'Nachricht anzeigen'; -$labels['alarmdisplayoption'] = 'Nachricht'; -$labels['alarmemailoption'] = 'E-Mail'; -$labels['alarmat'] = 'um $datetime'; -$labels['trigger@'] = 'genau um'; -$labels['trigger-M'] = 'Minuten davor'; -$labels['trigger-H'] = 'Stunden davor'; -$labels['trigger-D'] = 'Tage davor'; -$labels['trigger+M'] = 'Minuten danach'; -$labels['trigger+H'] = 'Stunden danach'; -$labels['trigger+D'] = 'Tage danach'; -$labels['addalarm'] = 'Erinnerung hinzufügen'; $labels['defaultalarmtype'] = 'Standard-Erinnerungseinstellung'; $labels['defaultalarmoffset'] = 'Standard-Erinnerungszeit'; -$labels['dismissall'] = 'Alle ignorieren'; -$labels['dismiss'] = 'Ignorieren'; -$labels['snooze'] = 'Später erinnern'; -$labels['repeatinmin'] = 'Wiederholung in $min Minuten'; -$labels['repeatinhr'] = 'Wiederholung in 1 Stunde'; -$labels['repeatinhrs'] = 'Wiederholung in $hrs Stunden'; -$labels['repeattomorrow'] = 'Wiederholung morgen'; -$labels['repeatinweek'] = 'Wiederholung in einer Woche'; -$labels['alarmtitle'] = 'Anstehende Termine'; // attendees $labels['attendee'] = 'Teilnehmer'; diff --git a/plugins/calendar/localization/en_US.inc b/plugins/calendar/localization/en_US.inc index e13cd88b..2137b390 100644 --- a/plugins/calendar/localization/en_US.inc +++ b/plugins/calendar/localization/en_US.inc @@ -68,7 +68,6 @@ $labels['parentcalendar'] = 'Insert inside'; $labels['searchearlierdates'] = '« Search for earlier events'; $labels['searchlaterdates'] = 'Search for later events »'; $labels['andnmore'] = '$nr more...'; -$labels['showmore'] = 'Show more...'; $labels['togglerole'] = 'Click to toggle role'; $labels['createfrommail'] = 'Save as event'; $labels['importevents'] = 'Import events'; @@ -95,30 +94,8 @@ $labels['futureevents'] = 'Future'; // alarm/reminder settings $labels['showalarms'] = 'Show alarms'; -$labels['alarmemail'] = 'Send Email'; -$labels['alarmdisplay'] = 'Show message'; -$labels['alarmdisplayoption'] = 'Message'; -$labels['alarmemailoption'] = 'Email'; -$labels['alarmat'] = 'at $datetime'; -$labels['trigger@'] = 'on date'; -$labels['trigger-M'] = 'minutes before'; -$labels['trigger-H'] = 'hours before'; -$labels['trigger-D'] = 'days before'; -$labels['trigger+M'] = 'minutes after'; -$labels['trigger+H'] = 'hours after'; -$labels['trigger+D'] = 'days after'; -$labels['addalarm'] = 'add alarm'; $labels['defaultalarmtype'] = 'Default reminder setting'; $labels['defaultalarmoffset'] = 'Default reminder time'; -$labels['dismissall'] = 'Dismiss all'; -$labels['dismiss'] = 'Dismiss'; -$labels['snooze'] = 'Snooze'; -$labels['repeatinmin'] = 'Repeat in $min minutes'; -$labels['repeatinhr'] = 'Repeat in 1 hour'; -$labels['repeatinhrs'] = 'Repeat in $hrs hours'; -$labels['repeattomorrow'] = 'Repeat tomorrow'; -$labels['repeatinweek'] = 'Repeat in a week'; -$labels['alarmtitle'] = 'Upcoming events'; // attendees $labels['attendee'] = 'Participant'; diff --git a/plugins/calendar/localization/pl_PL.inc b/plugins/calendar/localization/pl_PL.inc index 706e9990..3403ea5a 100644 --- a/plugins/calendar/localization/pl_PL.inc +++ b/plugins/calendar/localization/pl_PL.inc @@ -90,30 +90,8 @@ $labels['futureevents'] = 'Przyszłość'; // alarm/reminder settings $labels['showalarms'] = 'Wyświetlaj alarmy'; -$labels['alarmemail'] = 'Wyślij pocztę'; -$labels['alarmdisplay'] = 'Pokaż wiadomość'; -$labels['alarmdisplayoption'] = 'Wiadomość'; -$labels['alarmemailoption'] = 'Poczta'; -$labels['alarmat'] = 'o $datetime'; -$labels['trigger@'] = 'w dniu'; -$labels['trigger-M'] = 'minuty przed'; -$labels['trigger-H'] = 'godziny przed'; -$labels['trigger-D'] = 'dni przed'; -$labels['trigger+M'] = 'minut po'; -$labels['trigger+H'] = 'godziny po'; -$labels['trigger+D'] = 'dni po'; -$labels['addalarm'] = 'dodaj alarm'; $labels['defaultalarmtype'] = 'Domyślne ustawienia przypomnienia'; $labels['defaultalarmoffset'] = 'Domyślny czas przypomnienia'; -$labels['dismissall'] = 'Odrzuć wszystkie'; -$labels['dismiss'] = 'Odrzuć'; -$labels['snooze'] = 'Odłóż'; -$labels['repeatinmin'] = 'Powtórz po $min minutach'; -$labels['repeatinhr'] = 'Powtórz po godzinie'; -$labels['repeatinhrs'] = 'Powtórz po $hrs godzinach'; -$labels['repeattomorrow'] = 'Powtórz jutro'; -$labels['repeatinweek'] = 'Powtórz za tydzień'; -$labels['alarmtitle'] = 'Nadchodzące zdarzenia'; // attendees $labels['attendee'] = 'Uczestnik'; diff --git a/plugins/calendar/skins/classic/templates/calendar.html b/plugins/calendar/skins/classic/templates/calendar.html index a22056dd..59b880d8 100644 --- a/plugins/calendar/skins/classic/templates/calendar.html +++ b/plugins/calendar/skins/classic/templates/calendar.html @@ -148,10 +148,6 @@
-
- -
-
diff --git a/plugins/calendar/skins/larry/calendar.css b/plugins/calendar/skins/larry/calendar.css index 67652114..1a7325e4 100644 --- a/plugins/calendar/skins/larry/calendar.css +++ b/plugins/calendar/skins/larry/calendar.css @@ -1,15 +1,13 @@ /** * Roundcube Calendar plugin styles for skin "Larry" * - * Copyright (c) 2012, The Roundcube Dev Team + * Copyright (c) 2012, Kolab Systems AG * Screendesign by FLINT / Büro für Gestaltung, bueroflint.com * * The contents are subject to the Creative Commons Attribution-ShareAlike * License. It is allowed to copy, distribute, transmit and to adapt the work * by keeping credits to the original autors in the README file. * See http://creativecommons.org/licenses/by-sa/3.0/ for details. - * - * $Id$ */ body.calendarmain { @@ -887,10 +885,6 @@ td.topalign { text-align: center; } -span.edit-alarm-set { - white-space: nowrap; -} - a.dropdown-link { font-size: 12px; text-decoration: none; @@ -906,39 +900,6 @@ a.dropdown-link:after { min-height: 24em; } -.alarm-item { - margin: 0.4em 0 1em 0; -} - -.alarm-item .event-title { - font-size: 14px; - margin: 0.1em 0 0.3em 0; -} - -.alarm-item div.event-section { - margin-top: 0.1em; - margin-bottom: 0.3em; -} - -.alarm-item .alarm-actions { - margin-top: 0.4em; -} - -.alarm-item div.alarm-actions a { - margin-right: 0.8em; - text-decoration: none; -} - -a.alarm-action-snooze:after { - content: ' ▼'; - font-size: 10px; - color: #666; -} - -#alarm-snooze-dropdown { - z-index: 5000; -} - .ui-dialog-buttonset a.dropdown-link { margin-right: 1em; } diff --git a/plugins/calendar/skins/larry/templates/calendar.html b/plugins/calendar/skins/larry/templates/calendar.html index ecc6e5f7..e4df042e 100644 --- a/plugins/calendar/skins/larry/templates/calendar.html +++ b/plugins/calendar/skins/larry/templates/calendar.html @@ -161,10 +161,6 @@
-
- -
-