diff --git a/calendar.php b/calendar.php index 2ce4f7f..d1b8eab 100644 --- a/calendar.php +++ b/calendar.php @@ -857,8 +857,8 @@ class calendar extends rcube_plugin if ($success && $reload) $this->rc->output->command('plugin.reload_view'); } - - + + /** * Dispatcher for event actions initiated by the client */ @@ -867,7 +867,7 @@ class calendar extends rcube_plugin $action = rcube_utils::get_input_value('action', rcube_utils::INPUT_GPC); $event = rcube_utils::get_input_value('e', rcube_utils::INPUT_POST, true); $success = $reload = $got_msg = false; - + // force notify if hidden + active if ((int)$this->rc->config->get('calendar_itip_send_option', $this->defaults['calendar_itip_send_option']) === 1) $event['_notify'] = 1; @@ -887,8 +887,10 @@ class calendar extends rcube_plugin case "new": // create UID for new event $event['uid'] = $this->generate_uid(); - $this->write_preprocess($event, $action); - if ($success = $this->driver->new_event($event)) { + if (!$this->write_preprocess($event, $action)) { + $got_msg = true; + } + else if ($success = $this->driver->new_event($event)) { $event['id'] = $event['uid']; $event['_savemode'] = 'all'; $this->cleanup_event($event); @@ -898,8 +900,10 @@ class calendar extends rcube_plugin break; case "edit": - $this->write_preprocess($event, $action); - if ($success = $this->driver->edit_event($event)) { + if (!$this->write_preprocess($event, $action)) { + $got_msg = true; + } + else if ($success = $this->driver->edit_event($event)) { $this->cleanup_event($event); $this->event_save_success($event, $old, $action, $success); } @@ -907,19 +911,23 @@ class calendar extends rcube_plugin break; case "resize": - $this->write_preprocess($event, $action); - if ($success = $this->driver->resize_event($event)) { + if (!$this->write_preprocess($event, $action)) { + $got_msg = true; + } + else if ($success = $this->driver->resize_event($event)) { $this->event_save_success($event, $old, $action, $success); } $reload = $event['_savemode'] ? 2 : 1; break; case "move": - $this->write_preprocess($event, $action); - if ($success = $this->driver->move_event($event)) { + if (!$this->write_preprocess($event, $action)) { + $got_msg = true; + } + else if ($success = $this->driver->move_event($event)) { $this->event_save_success($event, $old, $action, $success); } - $reload = $success && $event['_savemode'] ? 2 : 1; + $reload = $success && $event['_savemode'] ? 2 : 1; break; case "remove": @@ -1184,7 +1192,7 @@ class calendar extends rcube_plugin // unlock client $this->rc->output->command('plugin.unlock_saving'); - // update event object on the client or trigger a complete refretch if too complicated + // update event object on the client or trigger a complete refresh if too complicated if ($reload) { $args = array('source' => $event['calendar']); if ($reload > 1) @@ -1732,6 +1740,18 @@ class calendar extends rcube_plugin $settings['identity'] = array('name' => $identity['name'], 'email' => strtolower($identity['email']), 'emails' => ';' . strtolower(join(';', $identity['emails']))); } + // freebusy token authentication URL + if (($url = $this->rc->config->get('calendar_freebusy_session_auth_url')) + && ($uniqueid = $this->rc->config->get('kolab_uniqueid')) + ) { + if ($url === true) $url = '/freebusy'; + $url = rtrim(rcube_utils::resolve_url($url), '/ '); + $url .= '/' . urlencode($this->rc->get_user_name()); + $url .= '/' . urlencode($uniqueid); + + $settings['freebusy_url'] = $url; + } + return $settings; } @@ -1981,12 +2001,31 @@ class calendar extends rcube_plugin // start/end is all we need for 'move' action (#1480) if ($action == 'move') { - return; + return true; } // convert the submitted recurrence settings if (is_array($event['recurrence'])) { $event['recurrence'] = $this->lib->from_client_recurrence($event['recurrence'], $event['start']); + + // align start date with the first occurrence + if (!empty($event['recurrence']) && !empty($event['syncstart']) + && (empty($event['_savemode']) || $event['_savemode'] == 'all') + ) { + $next = $this->find_first_occurrence($event); + + if (!$next) { + $this->rc->output->show_message('calendar.recurrenceerror', 'error'); + return false; + } + else if ($event['start'] != $next) { + $diff = $event['start']->diff($event['end'], true); + + $event['start'] = $next; + $event['end'] = clone $next; + $event['end']->add($diff); + } + } } // convert the submitted alarm values @@ -2063,6 +2102,8 @@ class calendar extends rcube_plugin $event['url'] = $event['vurl']; unset($event['vurl']); } + + return true; } /** @@ -3435,6 +3476,35 @@ class calendar extends rcube_plugin return $this->driver->user_delete($args); } + /** + * Find first occurrence of a recurring event excluding start date + * + * @param array $event Event data (with 'start' and 'recurrence') + * + * @return DateTime Date of the first occurrence + */ + public function find_first_occurrence($event) + { + // Make sure libkolab plugin is loaded in case of Kolab driver + $this->load_driver(); + + // Use libkolab to compute recurring events (and libkolab plugin) + // Horde-based fallback has many bugs + if (class_exists('kolabformat') && class_exists('kolabcalendaring') && class_exists('kolab_date_recurrence')) { + $object = kolab_format::factory('event', 3.0); + $object->set($event); + + $recurrence = new kolab_date_recurrence($object); + } + else { + // fallback to libcalendaring (Horde-based) recurrence implementation + require_once(__DIR__ . '/lib/calendar_recurrence.php'); + $recurrence = new calendar_recurrence($this, $event); + } + + return $recurrence->first_occurrence(); + } + /** * Magic getter for public access to protected members */ diff --git a/calendar_ui.js b/calendar_ui.js index 68661a7..73bb81b 100644 --- a/calendar_ui.js +++ b/calendar_ui.js @@ -477,7 +477,7 @@ function rcube_calendar_ui(settings) data = event.attendees[j]; if (data.email) { if (data.role != 'ORGANIZER' && settings.identity.emails.indexOf(';'+data.email) >= 0) { - mystatus = data.status.toLowerCase(); + mystatus = (data.status || 'UNKNOWN').toLowerCase(); if (data.status == 'NEEDS-ACTION' || data.status == 'TENTATIVE' || data.rsvp) rsvp = mystatus; } @@ -519,7 +519,7 @@ function rcube_calendar_ui(settings) if (mystatus && !rsvp) { $('#event-partstat').show().children('.changersvp') - .removeClass('accepted tentative declined delegated needs-action') + .removeClass('accepted tentative declined delegated needs-action unknown') .addClass(mystatus) .children('.event-text') .text(rcmail.gettext('status' + mystatus, 'libcalendaring')); @@ -527,7 +527,7 @@ function rcube_calendar_ui(settings) var show_rsvp = rsvp && !organizer && event.status != 'CANCELLED' && me.has_permission(calendar, 'v'); $('#event-rsvp')[(show_rsvp ? 'show' : 'hide')](); - $('#event-rsvp .rsvp-buttons input').prop('disabled', false).filter('input[rel='+mystatus+']').prop('disabled', true); + $('#event-rsvp .rsvp-buttons input').prop('disabled', false).filter('input[rel="'+(mystatus || '')+'"]').prop('disabled', true); if (show_rsvp && event.comment) $('#event-rsvp-comment').show().children('.event-text').html(Q(event.comment)); @@ -678,7 +678,7 @@ function rcube_calendar_ui(settings) var freebusy = $('#edit-free-busy').val(event.free_busy); var priority = $('#edit-priority').val(event.priority); var sensitivity = $('#edit-sensitivity').val(event.sensitivity); - + var syncstart = $('#edit-recurrence-syncstart input'); var duration = Math.round((event.end.getTime() - event.start.getTime()) / 1000); var startdate = $('#edit-startdate').val($.fullCalendar.formatDate(event.start, settings['date_format'])).data('duration', duration); var starttime = $('#edit-starttime').val($.fullCalendar.formatDate(event.start, settings['time_format'])).show(); @@ -898,6 +898,9 @@ function rcube_calendar_ui(settings) data._fromcalendar = event.calendar; } + if (data.recurrence && syncstart.is(':checked')) + data.syncstart = 1; + update_event(action, data); $dialog.dialog("close"); } // end click: @@ -3200,6 +3203,27 @@ function rcube_calendar_ui(settings) } }; + // show free-busy URL in a dialog box + this.showfburl = function() + { + var $dialog = $('#fburlbox'); + + if ($dialog.is(':ui-dialog')) + $dialog.dialog('close'); + + $dialog.dialog({ + resizable: true, + closeOnEscape: true, + title: rcmail.gettext('showfburl', 'calendar'), + close: function() { + $dialog.dialog("destroy").hide(); + }, + width: 520 + }).show(); + + $('#fburl').val(settings.freebusy_url).select(); + }; + // refresh the calendar view after saving event data this.refresh = function(p) { @@ -3601,7 +3625,7 @@ function rcube_calendar_ui(settings) calendars_list.addEventListener('select', function(node) { if (node && node.id && me.calendars[node.id]) { me.select_calendar(node.id, true); - rcmail.enable_command('calendar-edit', 'calendar-showurl', true); + rcmail.enable_command('calendar-edit', 'calendar-showurl', 'calendar-showfburl', true); rcmail.enable_command('calendar-delete', me.calendars[node.id].editable); rcmail.enable_command('calendar-remove', me.calendars[node.id] && me.calendars[node.id].removable); } @@ -3953,8 +3977,15 @@ function rcube_calendar_ui(settings) $('#edit-attendees-form .attendees-invitebox').show(); } } + // reset autocompletion on tab change (#3389) rcmail.ksearch_blur(); + + // display recurrence warning in recurrence tab only + if (tab == 'recurrence') + $('#edit-recurrence-frequency').change(); + else + $('#edit-recurrence-syncstart').hide(); } }); $('#edit-enddate').datepicker(datepicker_settings); @@ -4162,6 +4193,7 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { rcmail.register_command('calendar-delete', function(){ cal.calendar_delete(cal.calendars[cal.selected_calendar]); }, false); rcmail.register_command('events-import', function(){ cal.import_events(cal.calendars[cal.selected_calendar]); }, true); rcmail.register_command('calendar-showurl', function(){ cal.showurl(cal.calendars[cal.selected_calendar]); }, false); + rcmail.register_command('calendar-showfburl', function(){ cal.showfburl(); }, false); rcmail.register_command('event-download', function(){ cal.event_download(cal.selected_event); }, true); rcmail.register_command('event-sendbymail', function(p, obj, e){ cal.event_sendbymail(cal.selected_event, e); }, true); rcmail.register_command('event-copy', function(){ cal.event_copy(cal.selected_event); }, true); diff --git a/config.inc.php.dist b/config.inc.php.dist index 83864ed..99da1ed 100644 --- a/config.inc.php.dist +++ b/config.inc.php.dist @@ -166,4 +166,9 @@ $config['kolab_invitation_calendars'] = false; // LDAP directory configuration to find avilable resources for events // $config['calendar_resources_directory'] = array(/* ldap_public-like address book configuration */); +// Enables displaying of free-busy URL with token-based authentication +// Set it to the prefix URL, e.g. 'https://hostname/freebusy' or just '/freebusy'. +// See freebusy_session_auth in configuration of kolab_auth plugin. +$config['calendar_freebusy_session_auth_url'] = null; + ?> diff --git a/drivers/database/SQL/mysql/2013071800.sql b/drivers/database/SQL/mysql/2013071800.sql deleted file mode 100644 index a051c6a..0000000 --- a/drivers/database/SQL/mysql/2013071800.sql +++ /dev/null @@ -1,3 +0,0 @@ --- MySQL database updates since version 0.9.1 - -ALTER TABLE `events` ADD `custom` TEXT NULL AFTER `attendees`; diff --git a/drivers/database/SQL/postgres/2013071800.sql b/drivers/database/SQL/postgres/2013071800.sql deleted file mode 100644 index e286daa..0000000 --- a/drivers/database/SQL/postgres/2013071800.sql +++ /dev/null @@ -1,3 +0,0 @@ --- Postgres database updates since version 0.9.1 - -ALTER TABLE events ADD custom text DEFAULT NULL; diff --git a/drivers/database/SQL/sqlite/2013071800.sql b/drivers/database/SQL/sqlite/2013071800.sql deleted file mode 100644 index 317b955..0000000 --- a/drivers/database/SQL/sqlite/2013071800.sql +++ /dev/null @@ -1,64 +0,0 @@ --- SQLite database updates since version 0.9.1 - --- ALTER TABLE events ADD custom text DEFAULT NULL AFTER attendees; - -CREATE TABLE temp_events ( - event_id integer NOT NULL PRIMARY KEY, - calendar_id integer NOT NULL default '0', - recurrence_id integer NOT NULL default '0', - uid varchar(255) NOT NULL default '', - created datetime NOT NULL default '1000-01-01 00:00:00', - changed datetime NOT NULL default '1000-01-01 00:00:00', - sequence integer NOT NULL default '0', - start datetime NOT NULL default '1000-01-01 00:00:00', - end datetime NOT NULL default '1000-01-01 00:00:00', - recurrence varchar(255) default NULL, - title varchar(255) NOT NULL, - description text NOT NULL, - location varchar(255) NOT NULL default '', - categories varchar(255) NOT NULL default '', - all_day tinyint(1) NOT NULL default '0', - free_busy tinyint(1) NOT NULL default '0', - priority tinyint(1) NOT NULL default '0', - sensitivity tinyint(1) NOT NULL default '0', - alarms varchar(255) default NULL, - attendees text default NULL, - notifyat datetime default NULL -); - -INSERT INTO temp_events (event_id, calendar_id, recurrence_id, uid, created, changed, sequence, start, end, recurrence, title, description, location, categories, all_day, free_busy, priority, sensitivity, alarms, attendees, notifyat) - SELECT event_id, calendar_id, recurrence_id, uid, created, changed, sequence, start, end, recurrence, title, description, location, categories, all_day, free_busy, priority, sensitivity, alarms, attendees, notifyat FROM events; - -DROP TABLE events; - -CREATE TABLE events ( - event_id integer NOT NULL PRIMARY KEY, - calendar_id integer NOT NULL default '0', - recurrence_id integer NOT NULL default '0', - uid varchar(255) NOT NULL default '', - created datetime NOT NULL default '1000-01-01 00:00:00', - changed datetime NOT NULL default '1000-01-01 00:00:00', - sequence integer NOT NULL default '0', - start datetime NOT NULL default '1000-01-01 00:00:00', - end datetime NOT NULL default '1000-01-01 00:00:00', - recurrence varchar(255) default NULL, - title varchar(255) NOT NULL, - description text NOT NULL, - location varchar(255) NOT NULL default '', - categories varchar(255) NOT NULL default '', - url varchar(255) NOT NULL default '', - all_day tinyint(1) NOT NULL default '0', - free_busy tinyint(1) NOT NULL default '0', - priority tinyint(1) NOT NULL default '0', - sensitivity tinyint(1) NOT NULL default '0', - alarms varchar(255) default NULL, - attendees text default NULL, - custom text default NULL, - notifyat datetime default NULL, - CONSTRAINT fk_events_calendar_id FOREIGN KEY (calendar_id) - REFERENCES calendars(calendar_id) -); - -INSERT INTO events (event_id, calendar_id, recurrence_id, uid, created, changed, sequence, start, end, recurrence, title, description, location, categories, all_day, free_busy, priority, sensitivity, alarms, attendees, notifyat) - SELECT event_id, calendar_id, recurrence_id, uid, created, changed, sequence, start, end, recurrence, title, description, location, categories, all_day, free_busy, priority, sensitivity, alarms, attendees, notifyat FROM temp_events; - diff --git a/drivers/kolab/SQL/sqlite.initial.sql b/drivers/kolab/SQL/sqlite.initial.sql new file mode 100644 index 0000000..b6067d7 --- /dev/null +++ b/drivers/kolab/SQL/sqlite.initial.sql @@ -0,0 +1,30 @@ +/** + * Roundcube Calendar Kolab backend + * + * @version @package_version@ + * @author Thomas Bruederli + * @licence GNU AGPL + **/ + +CREATE TABLE kolab_alarms ( + alarm_id VARCHAR(255) NOT NULL, + user_id INTEGER NOT NULL, + notifyat DATETIME DEFAULT NULL, + dismissed TINYINT(3) NOT NULL DEFAULT '0', + PRIMARY KEY(alarm_id,user_id) +); + +CREATE INDEX ix_kolab_alarms_user_id ON kolab_alarms(user_id); + +CREATE TABLE itipinvitations ( + token VARCHAR(64) NOT NULL PRIMARY KEY, + event_uid VARCHAR(255) NOT NULL, + user_id INTEGER NOT NULL DEFAULT '0', + event TEXT NOT NULL, + expires DATETIME DEFAULT NULL, + cancelled TINYINT(3) NOT NULL DEFAULT '0' +); + +CREATE INDEX ix_itipinvitations_uid ON itipinvitations(event_uid,user_id); + +INSERT INTO system (name, value) VALUES ('calendar-kolab-version', '2014041700'); diff --git a/drivers/kolab/kolab_calendar.php b/drivers/kolab/kolab_calendar.php index 11ec1f4..d6500ab 100644 --- a/drivers/kolab/kolab_calendar.php +++ b/drivers/kolab/kolab_calendar.php @@ -659,14 +659,7 @@ class kolab_calendar extends kolab_storage_folder_api } // use libkolab to compute recurring events - if (class_exists('kolabcalendaring')) { - $recurrence = new kolab_date_recurrence($object); - } - else { - // fallback to local recurrence implementation - require_once($this->cal->home . '/lib/calendar_recurrence.php'); - $recurrence = new calendar_recurrence($this->cal, $event); - } + $recurrence = new kolab_date_recurrence($object); $i = 0; while ($next_event = $recurrence->next_instance()) { @@ -717,7 +710,7 @@ class kolab_calendar extends kolab_storage_folder_api if (++$i > 100000) break; } - + return $events; } @@ -732,9 +725,18 @@ class kolab_calendar extends kolab_storage_folder_api $record['links'] = $this->get_links($record['uid']); } - if ($this->get_namespace() == 'other') { + $ns = $this->get_namespace(); + + if ($ns == 'other') { $record['className'] = 'fc-event-ns-other'; - $record = kolab_driver::add_partstat_class($record, array('NEEDS-ACTION','DECLINED'), $this->get_owner()); + } + + if ($ns == 'other' || !$this->cal->rc->config->get('kolab_invitation_calendars')) { + $record = kolab_driver::add_partstat_class($record, array('NEEDS-ACTION', 'DECLINED'), $this->get_owner()); + + // Modify invitation status class name, when invitation calendars are disabled + // we'll use opacity only for declined/needs-action events + $record['className'] = str_replace('-invitation', '', $record['className']); } // add instance identifier to first occurrence (master event) diff --git a/drivers/kolab/kolab_driver.php b/drivers/kolab/kolab_driver.php index 1dba9c8..31aa47e 100644 --- a/drivers/kolab/kolab_driver.php +++ b/drivers/kolab/kolab_driver.php @@ -1157,7 +1157,7 @@ class kolab_driver extends calendar_driver $event['end']->add(new DateInterval($new_duration)); // remove fixed weekday, will be re-set to the new weekday in kolab_calendar::update_event() - if ($old_start_date != $new_start_date) { + if ($old_start_date != $new_start_date && $event['recurrence']) { if (strlen($event['recurrence']['BYDAY']) == 2) unset($event['recurrence']['BYDAY']); if ($old['recurrence']['BYMONTH'] == $old['start']->format('n')) @@ -1784,15 +1784,15 @@ class kolab_driver extends calendar_driver */ private function get_recurrence_count($event, $dtstart) { + // load the given event data into a libkolabxml container + if (!$event['_formatobj']) { + $event_xml = new kolab_format_event(); + $event_xml->set($event); + $event['_formatobj'] = $event_xml; + } + // use libkolab to compute recurring events - if (class_exists('kolabcalendaring') && $event['_formatobj']) { - $recurrence = new kolab_date_recurrence($event['_formatobj']); - } - else { - // fallback to local recurrence implementation - require_once($this->cal->home . '/lib/calendar_recurrence.php'); - $recurrence = new calendar_recurrence($this->cal, $event); - } + $recurrence = new kolab_date_recurrence($event['_formatobj']); $count = 0; while (($next_event = $recurrence->next_instance()) && $next_event['start'] <= $dtstart && $count < 1000) { diff --git a/lib/Horde_Date.php b/lib/Horde_Date.php deleted file mode 100644 index 9197f84..0000000 --- a/lib/Horde_Date.php +++ /dev/null @@ -1,1304 +0,0 @@ - self::MASK_YEAR, - 'month' => self::MASK_MONTH, - 'mday' => self::MASK_DAY, - 'hour' => self::MASK_HOUR, - 'min' => self::MASK_MINUTE, - 'sec' => self::MASK_SECOND, - ); - - protected $_formatCache = array(); - - /** - * Builds a new date object. If $date contains date parts, use them to - * initialize the object. - * - * Recognized formats: - * - arrays with keys 'year', 'month', 'mday', 'day' - * 'hour', 'min', 'minute', 'sec' - * - objects with properties 'year', 'month', 'mday', 'hour', 'min', 'sec' - * - yyyy-mm-dd hh:mm:ss - * - yyyymmddhhmmss - * - yyyymmddThhmmssZ - * - yyyymmdd (might conflict with unix timestamps between 31 Oct 1966 and - * 03 Mar 1973) - * - unix timestamps - * - anything parsed by strtotime()/DateTime. - * - * @throws Horde_Date_Exception - */ - public function __construct($date = null, $timezone = null) - { - if (!self::$_supportedSpecs) { - self::$_supportedSpecs = self::$_defaultSpecs; - if (function_exists('nl_langinfo')) { - self::$_supportedSpecs .= 'bBpxX'; - } - } - - if (func_num_args() > 2) { - // Handle args in order: year month day hour min sec tz - $this->_initializeFromArgs(func_get_args()); - return; - } - - $this->_initializeTimezone($timezone); - - if (is_null($date)) { - return; - } - - if (is_string($date)) { - $date = trim($date, '"'); - } - - if (is_object($date)) { - $this->_initializeFromObject($date); - } elseif (is_array($date)) { - $this->_initializeFromArray($date); - } elseif (preg_match('/^(\d{4})-?(\d{2})-?(\d{2})T? ?(\d{2}):?(\d{2}):?(\d{2})(?:\.\d+)?(Z?)$/', $date, $parts)) { - $this->_year = (int)$parts[1]; - $this->_month = (int)$parts[2]; - $this->_mday = (int)$parts[3]; - $this->_hour = (int)$parts[4]; - $this->_min = (int)$parts[5]; - $this->_sec = (int)$parts[6]; - if ($parts[7]) { - $this->_initializeTimezone('UTC'); - } - } elseif (preg_match('/^(\d{4})-?(\d{2})-?(\d{2})$/', $date, $parts) && - $parts[2] > 0 && $parts[2] <= 12 && - $parts[3] > 0 && $parts[3] <= 31) { - $this->_year = (int)$parts[1]; - $this->_month = (int)$parts[2]; - $this->_mday = (int)$parts[3]; - $this->_hour = $this->_min = $this->_sec = 0; - } elseif ((string)(int)$date == $date) { - // Try as a timestamp. - $parts = @getdate($date); - if ($parts) { - $this->_year = $parts['year']; - $this->_month = $parts['mon']; - $this->_mday = $parts['mday']; - $this->_hour = $parts['hours']; - $this->_min = $parts['minutes']; - $this->_sec = $parts['seconds']; - } - } else { - // Use date_create() so we can catch errors with PHP 5.2. Use - // "new DateTime() once we require 5.3. - $parsed = date_create($date); - if (!$parsed) { - throw new Horde_Date_Exception(sprintf(Horde_Date_Translation::t("Failed to parse time string (%s)"), $date)); - } - $parsed->setTimezone(new DateTimeZone(date_default_timezone_get())); - $this->_year = (int)$parsed->format('Y'); - $this->_month = (int)$parsed->format('m'); - $this->_mday = (int)$parsed->format('d'); - $this->_hour = (int)$parsed->format('H'); - $this->_min = (int)$parsed->format('i'); - $this->_sec = (int)$parsed->format('s'); - $this->_initializeTimezone(date_default_timezone_get()); - } - } - - /** - * Returns a simple string representation of the date object - * - * @return string This object converted to a string. - */ - public function __toString() - { - try { - return $this->format($this->_defaultFormat); - } catch (Exception $e) { - return ''; - } - } - - /** - * Returns a DateTime object representing this object. - * - * @return DateTime - */ - public function toDateTime() - { - $date = new DateTime(null, new DateTimeZone($this->_timezone)); - $date->setDate($this->_year, $this->_month, $this->_mday); - $date->setTime($this->_hour, $this->_min, $this->_sec); - return $date; - } - - /** - * Converts a date in the proleptic Gregorian calendar to the no of days - * since 24th November, 4714 B.C. - * - * Returns the no of days since Monday, 24th November, 4714 B.C. in the - * proleptic Gregorian calendar (which is 24th November, -4713 using - * 'Astronomical' year numbering, and 1st January, 4713 B.C. in the - * proleptic Julian calendar). This is also the first day of the 'Julian - * Period' proposed by Joseph Scaliger in 1583, and the number of days - * since this date is known as the 'Julian Day'. (It is not directly - * to do with the Julian calendar, although this is where the name - * is derived from.) - * - * The algorithm is valid for all years (positive and negative), and - * also for years preceding 4714 B.C. - * - * Algorithm is from PEAR::Date_Calc - * - * @author Monte Ohrt - * @author Pierre-Alain Joye - * @author Daniel Convissor - * @author C.A. Woodcock - * - * @return integer The number of days since 24th November, 4714 B.C. - */ - public function toDays() - { - if (function_exists('GregorianToJD')) { - return gregoriantojd($this->_month, $this->_mday, $this->_year); - } - - $day = $this->_mday; - $month = $this->_month; - $year = $this->_year; - - if ($month > 2) { - // March = 0, April = 1, ..., December = 9, - // January = 10, February = 11 - $month -= 3; - } else { - $month += 9; - --$year; - } - - $hb_negativeyear = $year < 0; - $century = intval($year / 100); - $year = $year % 100; - - if ($hb_negativeyear) { - // Subtract 1 because year 0 is a leap year; - // And N.B. that we must treat the leap years as occurring - // one year earlier than they do, because for the purposes - // of calculation, the year starts on 1st March: - // - return intval((14609700 * $century + ($year == 0 ? 1 : 0)) / 400) + - intval((1461 * $year + 1) / 4) + - intval((153 * $month + 2) / 5) + - $day + 1721118; - } else { - return intval(146097 * $century / 4) + - intval(1461 * $year / 4) + - intval((153 * $month + 2) / 5) + - $day + 1721119; - } - } - - /** - * Converts number of days since 24th November, 4714 B.C. (in the proleptic - * Gregorian calendar, which is year -4713 using 'Astronomical' year - * numbering) to Gregorian calendar date. - * - * Returned date belongs to the proleptic Gregorian calendar, using - * 'Astronomical' year numbering. - * - * The algorithm is valid for all years (positive and negative), and - * also for years preceding 4714 B.C. (i.e. for negative 'Julian Days'), - * and so the only limitation is platform-dependent (for 32-bit systems - * the maximum year would be something like about 1,465,190 A.D.). - * - * N.B. Monday, 24th November, 4714 B.C. is Julian Day '0'. - * - * Algorithm is from PEAR::Date_Calc - * - * @author Monte Ohrt - * @author Pierre-Alain Joye - * @author Daniel Convissor - * @author C.A. Woodcock - * - * @param int $days the number of days since 24th November, 4714 B.C. - * @param string $format the string indicating how to format the output - * - * @return Horde_Date A Horde_Date object representing the date. - */ - public static function fromDays($days) - { - if (function_exists('JDToGregorian')) { - list($month, $day, $year) = explode('/', JDToGregorian($days)); - } else { - $days = intval($days); - - $days -= 1721119; - $century = floor((4 * $days - 1) / 146097); - $days = floor(4 * $days - 1 - 146097 * $century); - $day = floor($days / 4); - - $year = floor((4 * $day + 3) / 1461); - $day = floor(4 * $day + 3 - 1461 * $year); - $day = floor(($day + 4) / 4); - - $month = floor((5 * $day - 3) / 153); - $day = floor(5 * $day - 3 - 153 * $month); - $day = floor(($day + 5) / 5); - - $year = $century * 100 + $year; - if ($month < 10) { - $month +=3; - } else { - $month -=9; - ++$year; - } - } - - return new Horde_Date($year, $month, $day); - } - - /** - * Getter for the date and time properties. - * - * @param string $name One of 'year', 'month', 'mday', 'hour', 'min' or - * 'sec'. - * - * @return integer The property value, or null if not set. - */ - public function __get($name) - { - if ($name == 'day') { - $name = 'mday'; - } - - return $this->{'_' . $name}; - } - - /** - * Setter for the date and time properties. - * - * @param string $name One of 'year', 'month', 'mday', 'hour', 'min' or - * 'sec'. - * @param integer $value The property value. - */ - public function __set($name, $value) - { - if ($name == 'timezone') { - $this->_initializeTimezone($value); - return; - } - if ($name == 'day') { - $name = 'mday'; - } - - if ($name != 'year' && $name != 'month' && $name != 'mday' && - $name != 'hour' && $name != 'min' && $name != 'sec') { - throw new InvalidArgumentException('Undefined property ' . $name); - } - - $down = $value < $this->{'_' . $name}; - $this->{'_' . $name} = $value; - $this->_correct(self::$_corrections[$name], $down); - $this->_formatCache = array(); - } - - /** - * Returns whether a date or time property exists. - * - * @param string $name One of 'year', 'month', 'mday', 'hour', 'min' or - * 'sec'. - * - * @return boolen True if the property exists and is set. - */ - public function __isset($name) - { - if ($name == 'day') { - $name = 'mday'; - } - return ($name == 'year' || $name == 'month' || $name == 'mday' || - $name == 'hour' || $name == 'min' || $name == 'sec') && - isset($this->{'_' . $name}); - } - - /** - * Adds a number of seconds or units to this date, returning a new Date - * object. - */ - public function add($factor) - { - $d = clone($this); - if (is_array($factor) || is_object($factor)) { - foreach ($factor as $property => $value) { - $d->$property += $value; - } - } else { - $d->sec += $factor; - } - - return $d; - } - - /** - * Subtracts a number of seconds or units from this date, returning a new - * Horde_Date object. - */ - public function sub($factor) - { - if (is_array($factor)) { - foreach ($factor as &$value) { - $value *= -1; - } - } else { - $factor *= -1; - } - - return $this->add($factor); - } - - /** - * Converts this object to a different timezone. - * - * @param string $timezone The new timezone. - * - * @return Horde_Date This object. - */ - public function setTimezone($timezone) - { - $date = $this->toDateTime(); - $date->setTimezone(new DateTimeZone($timezone)); - $this->_timezone = $timezone; - $this->_year = (int)$date->format('Y'); - $this->_month = (int)$date->format('m'); - $this->_mday = (int)$date->format('d'); - $this->_hour = (int)$date->format('H'); - $this->_min = (int)$date->format('i'); - $this->_sec = (int)$date->format('s'); - $this->_formatCache = array(); - return $this; - } - - /** - * Sets the default date format used in __toString() - * - * @param string $format - */ - public function setDefaultFormat($format) - { - $this->_defaultFormat = $format; - } - - /** - * Returns the day of the week (0 = Sunday, 6 = Saturday) of this date. - * - * @return integer The day of the week. - */ - public function dayOfWeek() - { - if ($this->_month > 2) { - $month = $this->_month - 2; - $year = $this->_year; - } else { - $month = $this->_month + 10; - $year = $this->_year - 1; - } - - $day = (floor((13 * $month - 1) / 5) + - $this->_mday + ($year % 100) + - floor(($year % 100) / 4) + - floor(($year / 100) / 4) - 2 * - floor($year / 100) + 77); - - return (int)($day - 7 * floor($day / 7)); - } - - /** - * Returns the day number of the year (1 to 365/366). - * - * @return integer The day of the year. - */ - public function dayOfYear() - { - return $this->format('z') + 1; - } - - /** - * Returns the week of the month. - * - * @return integer The week number. - */ - public function weekOfMonth() - { - return ceil($this->_mday / 7); - } - - /** - * Returns the week of the year, first Monday is first day of first week. - * - * @return integer The week number. - */ - public function weekOfYear() - { - return $this->format('W'); - } - - /** - * Returns the number of weeks in the given year (52 or 53). - * - * @param integer $year The year to count the number of weeks in. - * - * @return integer $numWeeks The number of weeks in $year. - */ - public static function weeksInYear($year) - { - // Find the last Thursday of the year. - $date = new Horde_Date($year . '-12-31'); - while ($date->dayOfWeek() != self::DATE_THURSDAY) { - --$date->mday; - } - return $date->weekOfYear(); - } - - /** - * Sets the date of this object to the $nth weekday of $weekday. - * - * @param integer $weekday The day of the week (0 = Sunday, etc). - * @param integer $nth The $nth $weekday to set to (defaults to 1). - */ - public function setNthWeekday($weekday, $nth = 1) - { - if ($weekday < self::DATE_SUNDAY || $weekday > self::DATE_SATURDAY) { - return; - } - - if ($nth < 0) { // last $weekday of month - $this->_mday = $lastday = Horde_Date_Utils::daysInMonth($this->_month, $this->_year); - $last = $this->dayOfWeek(); - $this->_mday += ($weekday - $last); - if ($this->_mday > $lastday) - $this->_mday -= 7; - } - else { - $this->_mday = 1; - $first = $this->dayOfWeek(); - if ($weekday < $first) { - $this->_mday = 8 + $weekday - $first; - } else { - $this->_mday = $weekday - $first + 1; - } - $diff = 7 * $nth - 7; - $this->_mday += $diff; - $this->_correct(self::MASK_DAY, $diff < 0); - } - } - - /** - * Is the date currently represented by this object a valid date? - * - * @return boolean Validity, counting leap years, etc. - */ - public function isValid() - { - return ($this->_year >= 0 && $this->_year <= 9999); - } - - /** - * Compares this date to another date object to see which one is - * greater (later). Assumes that the dates are in the same - * timezone. - * - * @param mixed $other The date to compare to. - * - * @return integer == 0 if they are on the same date - * >= 1 if $this is greater (later) - * <= -1 if $other is greater (later) - */ - public function compareDate($other) - { - if (!($other instanceof Horde_Date)) { - $other = new Horde_Date($other); - } - - if ($this->_year != $other->year) { - return $this->_year - $other->year; - } - if ($this->_month != $other->month) { - return $this->_month - $other->month; - } - - return $this->_mday - $other->mday; - } - - /** - * Returns whether this date is after the other. - * - * @param mixed $other The date to compare to. - * - * @return boolean True if this date is after the other. - */ - public function after($other) - { - return $this->compareDate($other) > 0; - } - - /** - * Returns whether this date is before the other. - * - * @param mixed $other The date to compare to. - * - * @return boolean True if this date is before the other. - */ - public function before($other) - { - return $this->compareDate($other) < 0; - } - - /** - * Returns whether this date is the same like the other. - * - * @param mixed $other The date to compare to. - * - * @return boolean True if this date is the same like the other. - */ - public function equals($other) - { - return $this->compareDate($other) == 0; - } - - /** - * Compares this to another date object by time, to see which one - * is greater (later). Assumes that the dates are in the same - * timezone. - * - * @param mixed $other The date to compare to. - * - * @return integer == 0 if they are at the same time - * >= 1 if $this is greater (later) - * <= -1 if $other is greater (later) - */ - public function compareTime($other) - { - if (!($other instanceof Horde_Date)) { - $other = new Horde_Date($other); - } - - if ($this->_hour != $other->hour) { - return $this->_hour - $other->hour; - } - if ($this->_min != $other->min) { - return $this->_min - $other->min; - } - - return $this->_sec - $other->sec; - } - - /** - * Compares this to another date object, including times, to see - * which one is greater (later). Assumes that the dates are in the - * same timezone. - * - * @param mixed $other The date to compare to. - * - * @return integer == 0 if they are equal - * >= 1 if $this is greater (later) - * <= -1 if $other is greater (later) - */ - public function compareDateTime($other) - { - if (!($other instanceof Horde_Date)) { - $other = new Horde_Date($other); - } - - if ($diff = $this->compareDate($other)) { - return $diff; - } - - return $this->compareTime($other); - } - - /** - * Returns number of days between this date and another. - * - * @param Horde_Date $other The other day to diff with. - * - * @return integer The absolute number of days between the two dates. - */ - public function diff($other) - { - return abs($this->toDays() - $other->toDays()); - } - - /** - * Returns the time offset for local time zone. - * - * @param boolean $colon Place a colon between hours and minutes? - * - * @return string Timezone offset as a string in the format +HH:MM. - */ - public function tzOffset($colon = true) - { - return $colon ? $this->format('P') : $this->format('O'); - } - - /** - * Returns the unix timestamp representation of this date. - * - * @return integer A unix timestamp. - */ - public function timestamp() - { - if ($this->_year >= 1970 && $this->_year < 2038) { - return mktime($this->_hour, $this->_min, $this->_sec, - $this->_month, $this->_mday, $this->_year); - } - return $this->format('U'); - } - - /** - * Returns the unix timestamp representation of this date, 12:00am. - * - * @return integer A unix timestamp. - */ - public function datestamp() - { - if ($this->_year >= 1970 && $this->_year < 2038) { - return mktime(0, 0, 0, $this->_month, $this->_mday, $this->_year); - } - $date = new DateTime($this->format('Y-m-d')); - return $date->format('U'); - } - - /** - * Formats date and time to be passed around as a short url parameter. - * - * @return string Date and time. - */ - public function dateString() - { - return sprintf('%04d%02d%02d', $this->_year, $this->_month, $this->_mday); - } - - /** - * Formats date and time to the ISO format used by JSON. - * - * @return string Date and time. - */ - public function toJson() - { - return $this->format(self::DATE_JSON); - } - - /** - * Formats date and time to the RFC 2445 iCalendar DATE-TIME format. - * - * @param boolean $floating Whether to return a floating date-time - * (without time zone information). - * - * @return string Date and time. - */ - public function toiCalendar($floating = false) - { - if ($floating) { - return $this->format('Ymd\THis'); - } - $dateTime = $this->toDateTime(); - $dateTime->setTimezone(new DateTimeZone('UTC')); - return $dateTime->format('Ymd\THis\Z'); - } - - /** - * Formats time using the specifiers available in date() or in the DateTime - * class' format() method. - * - * To format in languages other than English, use strftime() instead. - * - * @param string $format - * - * @return string Formatted time. - */ - public function format($format) - { - if (!isset($this->_formatCache[$format])) { - $this->_formatCache[$format] = $this->toDateTime()->format($format); - } - return $this->_formatCache[$format]; - } - - /** - * Formats date and time using strftime() format. - * - * @return string strftime() formatted date and time. - */ - public function strftime($format) - { - if (preg_match('/%[^' . self::$_supportedSpecs . ']/', $format)) { - return strftime($format, $this->timestamp()); - } else { - return $this->_strftime($format); - } - } - - /** - * Formats date and time using a limited set of the strftime() format. - * - * @return string strftime() formatted date and time. - */ - protected function _strftime($format) - { - return preg_replace( - array('/%b/e', - '/%B/e', - '/%C/e', - '/%d/e', - '/%D/e', - '/%e/e', - '/%H/e', - '/%I/e', - '/%m/e', - '/%M/e', - '/%n/', - '/%p/e', - '/%R/e', - '/%S/e', - '/%t/', - '/%T/e', - '/%x/e', - '/%X/e', - '/%y/e', - '/%Y/', - '/%%/'), - array('$this->_strftime(Horde_Nls::getLangInfo(constant(\'ABMON_\' . (int)$this->_month)))', - '$this->_strftime(Horde_Nls::getLangInfo(constant(\'MON_\' . (int)$this->_month)))', - '(int)($this->_year / 100)', - 'sprintf(\'%02d\', $this->_mday)', - '$this->_strftime(\'%m/%d/%y\')', - 'sprintf(\'%2d\', $this->_mday)', - 'sprintf(\'%02d\', $this->_hour)', - 'sprintf(\'%02d\', $this->_hour == 0 ? 12 : ($this->_hour > 12 ? $this->_hour - 12 : $this->_hour))', - 'sprintf(\'%02d\', $this->_month)', - 'sprintf(\'%02d\', $this->_min)', - "\n", - '$this->_strftime(Horde_Nls::getLangInfo($this->_hour < 12 ? AM_STR : PM_STR))', - '$this->_strftime(\'%H:%M\')', - 'sprintf(\'%02d\', $this->_sec)', - "\t", - '$this->_strftime(\'%H:%M:%S\')', - '$this->_strftime(Horde_Nls::getLangInfo(D_FMT))', - '$this->_strftime(Horde_Nls::getLangInfo(T_FMT))', - 'substr(sprintf(\'%04d\', $this->_year), -2)', - (int)$this->_year, - '%'), - $format); - } - - /** - * Corrects any over- or underflows in any of the date's members. - * - * @param integer $mask We may not want to correct some overflows. - * @param integer $down Whether to correct the date up or down. - */ - protected function _correct($mask = self::MASK_ALLPARTS, $down = false) - { - if ($mask & self::MASK_SECOND) { - if ($this->_sec < 0 || $this->_sec > 59) { - $mask |= self::MASK_MINUTE; - - $this->_min += (int)($this->_sec / 60); - $this->_sec %= 60; - if ($this->_sec < 0) { - $this->_min--; - $this->_sec += 60; - } - } - } - - if ($mask & self::MASK_MINUTE) { - if ($this->_min < 0 || $this->_min > 59) { - $mask |= self::MASK_HOUR; - - $this->_hour += (int)($this->_min / 60); - $this->_min %= 60; - if ($this->_min < 0) { - $this->_hour--; - $this->_min += 60; - } - } - } - - if ($mask & self::MASK_HOUR) { - if ($this->_hour < 0 || $this->_hour > 23) { - $mask |= self::MASK_DAY; - - $this->_mday += (int)($this->_hour / 24); - $this->_hour %= 24; - if ($this->_hour < 0) { - $this->_mday--; - $this->_hour += 24; - } - } - } - - if ($mask & self::MASK_MONTH) { - $this->_correctMonth($down); - /* When correcting the month, always correct the day too. Months - * have different numbers of days. */ - $mask |= self::MASK_DAY; - } - - if ($mask & self::MASK_DAY) { - while ($this->_mday > 28 && - $this->_mday > Horde_Date_Utils::daysInMonth($this->_month, $this->_year)) { - if ($down) { - $this->_mday -= Horde_Date_Utils::daysInMonth($this->_month + 1, $this->_year) - Horde_Date_Utils::daysInMonth($this->_month, $this->_year); - } else { - $this->_mday -= Horde_Date_Utils::daysInMonth($this->_month, $this->_year); - $this->_month++; - } - $this->_correctMonth($down); - } - while ($this->_mday < 1) { - --$this->_month; - $this->_correctMonth($down); - $this->_mday += Horde_Date_Utils::daysInMonth($this->_month, $this->_year); - } - } - } - - /** - * Corrects the current month. - * - * This cannot be done in _correct() because that would also trigger a - * correction of the day, which would result in an infinite loop. - * - * @param integer $down Whether to correct the date up or down. - */ - protected function _correctMonth($down = false) - { - $this->_year += (int)($this->_month / 12); - $this->_month %= 12; - if ($this->_month < 1) { - $this->_year--; - $this->_month += 12; - } - } - - /** - * Handles args in order: year month day hour min sec tz - */ - protected function _initializeFromArgs($args) - { - $tz = (isset($args[6])) ? array_pop($args) : null; - $this->_initializeTimezone($tz); - - $args = array_slice($args, 0, 6); - $keys = array('year' => 1, 'month' => 1, 'mday' => 1, 'hour' => 0, 'min' => 0, 'sec' => 0); - $date = array_combine(array_slice(array_keys($keys), 0, count($args)), $args); - $date = array_merge($keys, $date); - - $this->_initializeFromArray($date); - } - - protected function _initializeFromArray($date) - { - if (isset($date['year']) && is_string($date['year']) && strlen($date['year']) == 2) { - if ($date['year'] > 70) { - $date['year'] += 1900; - } else { - $date['year'] += 2000; - } - } - - foreach ($date as $key => $val) { - if (in_array($key, array('year', 'month', 'mday', 'hour', 'min', 'sec'))) { - $this->{'_'. $key} = (int)$val; - } - } - - // If $date['day'] is present and numeric we may have been passed - // a Horde_Form_datetime array. - if (isset($date['day']) && - (string)(int)$date['day'] == $date['day']) { - $this->_mday = (int)$date['day']; - } - // 'minute' key also from Horde_Form_datetime - if (isset($date['minute']) && - (string)(int)$date['minute'] == $date['minute']) { - $this->_min = (int)$date['minute']; - } - - $this->_correct(); - } - - protected function _initializeFromObject($date) - { - if ($date instanceof DateTime) { - $this->_year = (int)$date->format('Y'); - $this->_month = (int)$date->format('m'); - $this->_mday = (int)$date->format('d'); - $this->_hour = (int)$date->format('H'); - $this->_min = (int)$date->format('i'); - $this->_sec = (int)$date->format('s'); - $this->_initializeTimezone($date->getTimezone()->getName()); - } else { - $is_horde_date = $date instanceof Horde_Date; - foreach (array('year', 'month', 'mday', 'hour', 'min', 'sec') as $key) { - if ($is_horde_date || isset($date->$key)) { - $this->{'_' . $key} = (int)$date->$key; - } - } - if (!$is_horde_date) { - $this->_correct(); - } else { - $this->_initializeTimezone($date->timezone); - } - } - } - - protected function _initializeTimezone($timezone) - { - if (empty($timezone)) { - $timezone = date_default_timezone_get(); - } - $this->_timezone = $timezone; - } - -} - -/** - * @category Horde - * @package Date - */ - -/** - * Horde Date wrapper/logic class, including some calculation - * functions. - * - * @category Horde - * @package Date - */ -class Horde_Date_Utils -{ - /** - * Returns whether a year is a leap year. - * - * @param integer $year The year. - * - * @return boolean True if the year is a leap year. - */ - public static function isLeapYear($year) - { - if (strlen($year) != 4 || preg_match('/\D/', $year)) { - return false; - } - - return (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0); - } - - /** - * Returns the date of the year that corresponds to the first day of the - * given week. - * - * @param integer $week The week of the year to find the first day of. - * @param integer $year The year to calculate for. - * - * @return Horde_Date The date of the first day of the given week. - */ - public static function firstDayOfWeek($week, $year) - { - return new Horde_Date(sprintf('%04dW%02d', $year, $week)); - } - - /** - * Returns the number of days in the specified month. - * - * @param integer $month The month - * @param integer $year The year. - * - * @return integer The number of days in the month. - */ - public static function daysInMonth($month, $year) - { - static $cache = array(); - if (!isset($cache[$year][$month])) { - $date = new DateTime(sprintf('%04d-%02d-01', $year, $month)); - $cache[$year][$month] = $date->format('t'); - } - return $cache[$year][$month]; - } - - /** - * Returns a relative, natural language representation of a timestamp - * - * @todo Wider range of values ... maybe future time as well? - * @todo Support minimum resolution parameter. - * - * @param mixed $time The time. Any format accepted by Horde_Date. - * @param string $date_format Format to display date if timestamp is - * more then 1 day old. - * @param string $time_format Format to display time if timestamp is 1 - * day old. - * - * @return string The relative time (i.e. 2 minutes ago) - */ - public static function relativeDateTime($time, $date_format = '%x', - $time_format = '%X') - { - $date = new Horde_Date($time); - - $delta = time() - $date->timestamp(); - if ($delta < 60) { - return sprintf(Horde_Date_Translation::ngettext("%d second ago", "%d seconds ago", $delta), $delta); - } - - $delta = round($delta / 60); - if ($delta < 60) { - return sprintf(Horde_Date_Translation::ngettext("%d minute ago", "%d minutes ago", $delta), $delta); - } - - $delta = round($delta / 60); - if ($delta < 24) { - return sprintf(Horde_Date_Translation::ngettext("%d hour ago", "%d hours ago", $delta), $delta); - } - - if ($delta > 24 && $delta < 48) { - $date = new Horde_Date($time); - return sprintf(Horde_Date_Translation::t("yesterday at %s"), $date->strftime($time_format)); - } - - $delta = round($delta / 24); - if ($delta < 7) { - return sprintf(Horde_Date_Translation::t("%d days ago"), $delta); - } - - if (round($delta / 7) < 5) { - $delta = round($delta / 7); - return sprintf(Horde_Date_Translation::ngettext("%d week ago", "%d weeks ago", $delta), $delta); - } - - // Default to the user specified date format. - return $date->strftime($date_format); - } - - /** - * Tries to convert strftime() formatters to date() formatters. - * - * Unsupported formatters will be removed. - * - * @param string $format A strftime() formatting string. - * - * @return string A date() formatting string. - */ - public static function strftime2date($format) - { - $replace = array( - '/%a/' => 'D', - '/%A/' => 'l', - '/%d/' => 'd', - '/%e/' => 'j', - '/%j/' => 'z', - '/%u/' => 'N', - '/%w/' => 'w', - '/%U/' => '', - '/%V/' => 'W', - '/%W/' => '', - '/%b/' => 'M', - '/%B/' => 'F', - '/%h/' => 'M', - '/%m/' => 'm', - '/%C/' => '', - '/%g/' => '', - '/%G/' => 'o', - '/%y/' => 'y', - '/%Y/' => 'Y', - '/%H/' => 'H', - '/%I/' => 'h', - '/%i/' => 'g', - '/%M/' => 'i', - '/%p/' => 'A', - '/%P/' => 'a', - '/%r/' => 'h:i:s A', - '/%R/' => 'H:i', - '/%S/' => 's', - '/%T/' => 'H:i:s', - '/%X/e' => 'Horde_Date_Utils::strftime2date(Horde_Nls::getLangInfo(T_FMT))', - '/%z/' => 'O', - '/%Z/' => '', - '/%c/' => '', - '/%D/' => 'm/d/y', - '/%F/' => 'Y-m-d', - '/%s/' => 'U', - '/%x/e' => 'Horde_Date_Utils::strftime2date(Horde_Nls::getLangInfo(D_FMT))', - '/%n/' => "\n", - '/%t/' => "\t", - '/%%/' => '%' - ); - - return preg_replace(array_keys($replace), array_values($replace), $format); - } - -} diff --git a/lib/Horde_Date_Recurrence.php b/lib/Horde_Date_Recurrence.php deleted file mode 100644 index 35f884c..0000000 --- a/lib/Horde_Date_Recurrence.php +++ /dev/null @@ -1,1705 +0,0 @@ - 1 ? $plur : $sing); } -} - - -/** - * This file contains the Horde_Date_Recurrence class and according constants. - * - * Copyright 2007-2012 Horde LLC (http://www.horde.org/) - * - * See the enclosed file COPYING for license information (LGPL). If you - * did not receive this file, see http://www.horde.org/licenses/lgpl21. - * - * @category Horde - * @package Date - */ - -/** - * The Horde_Date_Recurrence class implements algorithms for calculating - * recurrences of events, including several recurrence types, intervals, - * exceptions, and conversion from and to vCalendar and iCalendar recurrence - * rules. - * - * All methods expecting dates as parameters accept all values that the - * Horde_Date constructor accepts, i.e. a timestamp, another Horde_Date - * object, an ISO time string or a hash. - * - * @author Jan Schneider - * @category Horde - * @package Date - */ -class Horde_Date_Recurrence -{ - /** No Recurrence **/ - const RECUR_NONE = 0; - - /** Recurs daily. */ - const RECUR_DAILY = 1; - - /** Recurs weekly. */ - const RECUR_WEEKLY = 2; - - /** Recurs monthly on the same date. */ - const RECUR_MONTHLY_DATE = 3; - - /** Recurs monthly on the same week day. */ - const RECUR_MONTHLY_WEEKDAY = 4; - - /** Recurs yearly on the same date. */ - const RECUR_YEARLY_DATE = 5; - - /** Recurs yearly on the same day of the year. */ - const RECUR_YEARLY_DAY = 6; - - /** Recurs yearly on the same week day. */ - const RECUR_YEARLY_WEEKDAY = 7; - - /** - * The start time of the event. - * - * @var Horde_Date - */ - public $start; - - /** - * The end date of the recurrence interval. - * - * @var Horde_Date - */ - public $recurEnd = null; - - /** - * The number of recurrences. - * - * @var integer - */ - public $recurCount = null; - - /** - * The type of recurrence this event follows. RECUR_* constant. - * - * @var integer - */ - public $recurType = self::RECUR_NONE; - - /** - * The length of time between recurrences. The time unit depends on the - * recurrence type. - * - * @var integer - */ - public $recurInterval = 1; - - /** - * Any additional recurrence data. - * - * @var integer - */ - public $recurData = null; - - /** - * BYDAY recurrence number - * - * @var integer - */ - public $recurNthDay = null; - - /** - * BYMONTH recurrence data - * - * @var array - */ - public $recurMonths = array(); - - /** - * RDATE recurrence values - * - * @var array - */ - public $rdates = array(); - - /** - * All the exceptions from recurrence for this event. - * - * @var array - */ - public $exceptions = array(); - - /** - * All the dates this recurrence has been marked as completed. - * - * @var array - */ - public $completions = array(); - - /** - * Constructor. - * - * @param Horde_Date $start Start of the recurring event. - */ - public function __construct($start) - { - $this->start = new Horde_Date($start); - } - - /** - * Resets the class properties. - */ - public function reset() - { - $this->recurEnd = null; - $this->recurCount = null; - $this->recurType = self::RECUR_NONE; - $this->recurInterval = 1; - $this->recurData = null; - $this->exceptions = array(); - $this->completions = array(); - } - - /** - * Checks if this event recurs on a given day of the week. - * - * @param integer $dayMask A mask consisting of Horde_Date::MASK_* - * constants specifying the day(s) to check. - * - * @return boolean True if this event recurs on the given day(s). - */ - public function recurOnDay($dayMask) - { - return ($this->recurData & $dayMask); - } - - /** - * Specifies the days this event recurs on. - * - * @param integer $dayMask A mask consisting of Horde_Date::MASK_* - * constants specifying the day(s) to recur on. - */ - public function setRecurOnDay($dayMask) - { - $this->recurData = $dayMask; - } - - /** - * - * @param integer $nthDay The nth weekday of month to repeat events on - */ - public function setRecurNthWeekday($nth) - { - $this->recurNthDay = (int)$nth; - } - - /** - * - * @return integer The nth weekday of month to repeat events. - */ - public function getRecurNthWeekday() - { - return isset($this->recurNthDay) ? $this->recurNthDay : ceil($this->start->mday / 7); - } - - /** - * Specifies the months for yearly (weekday) recurrence - * - * @param array $months List of months (integers) this event recurs on. - */ - function setRecurByMonth($months) - { - $this->recurMonths = (array)$months; - } - - /** - * Returns a list of months this yearly event recurs on - * - * @return array List of months (integers) this event recurs on. - */ - function getRecurByMonth() - { - return $this->recurMonths; - } - - /** - * Returns the days this event recurs on. - * - * @return integer A mask consisting of Horde_Date::MASK_* constants - * specifying the day(s) this event recurs on. - */ - public function getRecurOnDays() - { - return $this->recurData; - } - - /** - * Returns whether this event has a specific recurrence type. - * - * @param integer $recurrence RECUR_* constant of the - * recurrence type to check for. - * - * @return boolean True if the event has the specified recurrence type. - */ - public function hasRecurType($recurrence) - { - return ($recurrence == $this->recurType); - } - - /** - * Sets a recurrence type for this event. - * - * @param integer $recurrence A RECUR_* constant. - */ - public function setRecurType($recurrence) - { - $this->recurType = $recurrence; - } - - /** - * Returns recurrence type of this event. - * - * @return integer A RECUR_* constant. - */ - public function getRecurType() - { - return $this->recurType; - } - - /** - * Returns a description of this event's recurring type. - * - * @return string Human readable recurring type. - */ - public function getRecurName() - { - switch ($this->getRecurType()) { - case self::RECUR_NONE: return Horde_Date_Translation::t("No recurrence"); - case self::RECUR_DAILY: return Horde_Date_Translation::t("Daily"); - case self::RECUR_WEEKLY: return Horde_Date_Translation::t("Weekly"); - case self::RECUR_MONTHLY_DATE: - case self::RECUR_MONTHLY_WEEKDAY: return Horde_Date_Translation::t("Monthly"); - case self::RECUR_YEARLY_DATE: - case self::RECUR_YEARLY_DAY: - case self::RECUR_YEARLY_WEEKDAY: return Horde_Date_Translation::t("Yearly"); - } - } - - /** - * Sets the length of time between recurrences of this event. - * - * @param integer $interval The time between recurrences. - */ - public function setRecurInterval($interval) - { - if ($interval > 0) { - $this->recurInterval = $interval; - } - } - - /** - * Retrieves the length of time between recurrences of this event. - * - * @return integer The number of seconds between recurrences. - */ - public function getRecurInterval() - { - return $this->recurInterval; - } - - /** - * Sets the number of recurrences of this event. - * - * @param integer $count The number of recurrences. - */ - public function setRecurCount($count) - { - if ($count > 0) { - $this->recurCount = (int)$count; - // Recurrence counts and end dates are mutually exclusive. - $this->recurEnd = null; - } else { - $this->recurCount = null; - } - } - - /** - * Retrieves the number of recurrences of this event. - * - * @return integer The number recurrences. - */ - public function getRecurCount() - { - return $this->recurCount; - } - - /** - * Returns whether this event has a recurrence with a fixed count. - * - * @return boolean True if this recurrence has a fixed count. - */ - public function hasRecurCount() - { - return isset($this->recurCount); - } - - /** - * Sets the start date of the recurrence interval. - * - * @param Horde_Date $start The recurrence start. - */ - public function setRecurStart($start) - { - $this->start = clone $start; - } - - /** - * Retrieves the start date of the recurrence interval. - * - * @return Horde_Date The recurrence start. - */ - public function getRecurStart() - { - return $this->start; - } - - /** - * Sets the end date of the recurrence interval. - * - * @param Horde_Date $end The recurrence end. - */ - public function setRecurEnd($end) - { - if (!empty($end)) { - // Recurrence counts and end dates are mutually exclusive. - $this->recurCount = null; - $this->recurEnd = clone $end; - } else { - $this->recurEnd = $end; - } - } - - /** - * Retrieves the end date of the recurrence interval. - * - * @return Horde_Date The recurrence end. - */ - public function getRecurEnd() - { - return $this->recurEnd; - } - - /** - * Returns whether this event has a recurrence end. - * - * @return boolean True if this recurrence ends. - */ - public function hasRecurEnd() - { - return isset($this->recurEnd) && isset($this->recurEnd->year) && - $this->recurEnd->year != 9999; - } - - /** - * Finds the next recurrence of this event that's after $afterDate. - * - * @param Horde_Date|string $after Return events after this date. - * - * @return Horde_Date|boolean The date of the next recurrence or false - * if the event does not recur after - * $afterDate. - */ - public function nextRecurrence($after) - { - if (!($after instanceof Horde_Date)) { - $after = new Horde_Date($after); - } else { - $after = clone($after); - } - - // Make sure $after and $this->start are in the same TZ - $after->setTimezone($this->start->timezone); - if ($this->start->compareDateTime($after) >= 0) { - return clone $this->start; - } - - if ($this->recurInterval == 0 && empty($this->rdates)) { - return false; - } - - switch ($this->getRecurType()) { - case self::RECUR_DAILY: - $diff = $this->start->diff($after); - $recur = ceil($diff / $this->recurInterval); - if ($this->recurCount && $recur >= $this->recurCount) { - return false; - } - - $recur *= $this->recurInterval; - $next = $this->start->add(array('day' => $recur)); - if ((!$this->hasRecurEnd() || - $next->compareDateTime($this->recurEnd) <= 0) && - $next->compareDateTime($after) >= 0) { - return $next; - } - break; - - case self::RECUR_WEEKLY: - if (empty($this->recurData)) { - return false; - } - - $start_week = Horde_Date_Utils::firstDayOfWeek($this->start->format('W'), - $this->start->year); - $start_week->timezone = $this->start->timezone; - $start_week->hour = $this->start->hour; - $start_week->min = $this->start->min; - $start_week->sec = $this->start->sec; - - // Make sure we are not at the ISO-8601 first week of year while - // still in month 12...OR in the ISO-8601 last week of year while - // in month 1 and adjust the year accordingly. - $week = $after->format('W'); - if ($week == 1 && $after->month == 12) { - $theYear = $after->year + 1; - } elseif ($week >= 52 && $after->month == 1) { - $theYear = $after->year - 1; - } else { - $theYear = $after->year; - } - - $after_week = Horde_Date_Utils::firstDayOfWeek($week, $theYear); - $after_week->timezone = $this->start->timezone; - $after_week_end = clone $after_week; - $after_week_end->mday += 7; - - $diff = $start_week->diff($after_week); - $interval = $this->recurInterval * 7; - $repeats = floor($diff / $interval); - if ($diff % $interval < 7) { - $recur = $diff; - } else { - /** - * If the after_week is not in the first week interval the - * search needs to skip ahead a complete interval. The way it is - * calculated here means that an event that occurs every second - * week on Monday and Wednesday with the event actually starting - * on Tuesday or Wednesday will only have one incidence in the - * first week. - */ - $recur = $interval * ($repeats + 1); - } - - if ($this->hasRecurCount()) { - $recurrences = 0; - /** - * Correct the number of recurrences by the number of events - * that lay between the start of the start week and the - * recurrence start. - */ - $next = clone $start_week; - while ($next->compareDateTime($this->start) < 0) { - if ($this->recurOnDay((int)pow(2, $next->dayOfWeek()))) { - $recurrences--; - } - ++$next->mday; - } - if ($repeats > 0) { - $weekdays = $this->recurData; - $total_recurrences_per_week = 0; - while ($weekdays > 0) { - if ($weekdays % 2) { - $total_recurrences_per_week++; - } - $weekdays = ($weekdays - ($weekdays % 2)) / 2; - } - $recurrences += $total_recurrences_per_week * $repeats; - } - } - - $next = clone $start_week; - $next->mday += $recur; - while ($next->compareDateTime($after) < 0 && - $next->compareDateTime($after_week_end) < 0) { - if ($this->hasRecurCount() - && $next->compareDateTime($after) < 0 - && $this->recurOnDay((int)pow(2, $next->dayOfWeek()))) { - $recurrences++; - } - ++$next->mday; - } - if ($this->hasRecurCount() && - $recurrences >= $this->recurCount) { - return false; - } - if (!$this->hasRecurEnd() || - $next->compareDateTime($this->recurEnd) <= 0) { - if ($next->compareDateTime($after_week_end) >= 0) { - return $this->nextRecurrence($after_week_end); - } - while (!$this->recurOnDay((int)pow(2, $next->dayOfWeek())) && - $next->compareDateTime($after_week_end) < 0) { - ++$next->mday; - } - if (!$this->hasRecurEnd() || - $next->compareDateTime($this->recurEnd) <= 0) { - if ($next->compareDateTime($after_week_end) >= 0) { - return $this->nextRecurrence($after_week_end); - } else { - return $next; - } - } - } - break; - - case self::RECUR_MONTHLY_DATE: - $start = clone $this->start; - if ($after->compareDateTime($start) < 0) { - $after = clone $start; - } else { - $after = clone $after; - } - - // If we're starting past this month's recurrence of the event, - // look in the next month on the day the event recurs. - if ($after->mday > $start->mday) { - ++$after->month; - $after->mday = $start->mday; - } - - // Adjust $start to be the first match. - $offset = ($after->month - $start->month) + ($after->year - $start->year) * 12; - $offset = floor(($offset + $this->recurInterval - 1) / $this->recurInterval) * $this->recurInterval; - - if ($this->recurCount && - ($offset / $this->recurInterval) >= $this->recurCount) { - return false; - } - $start->month += $offset; - $count = $offset / $this->recurInterval; - - do { - if ($this->recurCount && - $count++ >= $this->recurCount) { - return false; - } - - // Bail if we've gone past the end of recurrence. - if ($this->hasRecurEnd() && - $this->recurEnd->compareDateTime($start) < 0) { - return false; - } - if ($start->isValid()) { - return $start; - } - - // If the interval is 12, and the date isn't valid, then we - // need to see if February 29th is an option. If not, then the - // event will _never_ recur, and we need to stop checking to - // avoid an infinite loop. - if ($this->recurInterval == 12 && ($start->month != 2 || $start->mday > 29)) { - return false; - } - - // Add the recurrence interval. - $start->month += $this->recurInterval; - } while (true); - - break; - - case self::RECUR_MONTHLY_WEEKDAY: - // Start with the start date of the event. - $estart = clone $this->start; - - // What day of the week, and week of the month, do we recur on? - if (isset($this->recurNthDay)) { - $nth = $this->recurNthDay; - $weekday = log($this->recurData, 2); - } else { - $nth = ceil($this->start->mday / 7); - $weekday = $estart->dayOfWeek(); - } - - // Adjust $estart to be the first candidate. - $offset = ($after->month - $estart->month) + ($after->year - $estart->year) * 12; - $offset = floor(($offset + $this->recurInterval - 1) / $this->recurInterval) * $this->recurInterval; - - // Adjust our working date until it's after $after. - $estart->month += $offset - $this->recurInterval; - - $count = $offset / $this->recurInterval; - do { - if ($this->recurCount && - $count++ >= $this->recurCount) { - return false; - } - - $estart->month += $this->recurInterval; - - $next = clone $estart; - $next->setNthWeekday($weekday, $nth); - - if ($next->compareDateTime($after) < 0) { - // We haven't made it past $after yet, try again. - continue; - } - if ($this->hasRecurEnd() && - $next->compareDateTime($this->recurEnd) > 0) { - // We've gone past the end of recurrence; we can give up - // now. - return false; - } - - // We have a candidate to return. - break; - } while (true); - - return $next; - - case self::RECUR_YEARLY_DATE: - // Start with the start date of the event. - $estart = clone $this->start; - $after = clone $after; - - if ($after->month > $estart->month || - ($after->month == $estart->month && $after->mday > $estart->mday)) { - ++$after->year; - $after->month = $estart->month; - $after->mday = $estart->mday; - } - - // Seperate case here for February 29th - if ($estart->month == 2 && $estart->mday == 29) { - while (!Horde_Date_Utils::isLeapYear($after->year)) { - ++$after->year; - } - } - - // Adjust $estart to be the first candidate. - $offset = $after->year - $estart->year; - if ($offset > 0) { - $offset = floor(($offset + $this->recurInterval - 1) / $this->recurInterval) * $this->recurInterval; - $estart->year += $offset; - } - - // We've gone past the end of recurrence; give up. - if ($this->recurCount && - $offset >= $this->recurCount) { - return false; - } - if ($this->hasRecurEnd() && - $this->recurEnd->compareDateTime($estart) < 0) { - return false; - } - - return $estart; - - case self::RECUR_YEARLY_DAY: - // Check count first. - $dayofyear = $this->start->dayOfYear(); - $count = ($after->year - $this->start->year) / $this->recurInterval + 1; - if ($this->recurCount && - ($count > $this->recurCount || - ($count == $this->recurCount && - $after->dayOfYear() > $dayofyear))) { - return false; - } - - // Start with a rough interval. - $estart = clone $this->start; - $estart->year += floor($count - 1) * $this->recurInterval; - - // Now add the difference to the required day of year. - $estart->mday += $dayofyear - $estart->dayOfYear(); - - // Add an interval if the estimation was wrong. - if ($estart->compareDate($after) < 0) { - $estart->year += $this->recurInterval; - $estart->mday += $dayofyear - $estart->dayOfYear(); - } - - // We've gone past the end of recurrence; give up. - if ($this->hasRecurEnd() && - $this->recurEnd->compareDateTime($estart) < 0) { - return false; - } - - return $estart; - - case self::RECUR_YEARLY_WEEKDAY: - // Start with the start date of the event. - $estart = clone $this->start; - - // What day of the week, and week of the month, do we recur on? - if (isset($this->recurNthDay)) { - $nth = $this->recurNthDay; - $weekday = log($this->recurData, 2); - } else { - $nth = ceil($this->start->mday / 7); - $weekday = $estart->dayOfWeek(); - } - - // Adjust $estart to be the first candidate. - $offset = floor(($after->year - $estart->year + $this->recurInterval - 1) / $this->recurInterval) * $this->recurInterval; - - // Adjust our working date until it's after $after. - $estart->year += $offset - $this->recurInterval; - - $count = $offset / $this->recurInterval; - do { - if ($this->recurCount && - $count++ >= $this->recurCount) { - return false; - } - - $estart->year += $this->recurInterval; - - $next = clone $estart; - $next->setNthWeekday($weekday, $nth); - - if ($next->compareDateTime($after) < 0) { - // We haven't made it past $after yet, try again. - continue; - } - if ($this->hasRecurEnd() && - $next->compareDateTime($this->recurEnd) > 0) { - // We've gone past the end of recurrence; we can give up - // now. - return false; - } - - // We have a candidate to return. - break; - } while (true); - - return $next; - } - - // fall-back to RDATE properties - if (!empty($this->rdates)) { - $next = clone $this->start; - foreach ($this->rdates as $rdate) { - $next->year = $rdate->year; - $next->month = $rdate->month; - $next->mday = $rdate->mday; - if ($next->compareDateTime($after) > 0) { - return $next; - } - } - } - - // We didn't find anything, the recurType was bad, or something else - // went wrong - return false. - return false; - } - - /** - * Returns whether this event has any date that matches the recurrence - * rules and is not an exception. - * - * @return boolean True if an active recurrence exists. - */ - public function hasActiveRecurrence() - { - if (!$this->hasRecurEnd()) { - return true; - } - - $next = $this->nextRecurrence(new Horde_Date($this->start)); - while (is_object($next)) { - if (!$this->hasException($next->year, $next->month, $next->mday) && - !$this->hasCompletion($next->year, $next->month, $next->mday)) { - return true; - } - - $next = $this->nextRecurrence($next->add(array('day' => 1))); - } - - return false; - } - - /** - * Returns the next active recurrence. - * - * @param Horde_Date $afterDate Return events after this date. - * - * @return Horde_Date|boolean The date of the next active - * recurrence or false if the event - * has no active recurrence after - * $afterDate. - */ - public function nextActiveRecurrence($afterDate) - { - $next = $this->nextRecurrence($afterDate); - while (is_object($next)) { - if (!$this->hasException($next->year, $next->month, $next->mday) && - !$this->hasCompletion($next->year, $next->month, $next->mday)) { - return $next; - } - $next->mday++; - $next = $this->nextRecurrence($next); - } - - return false; - } - - /** - * Adds an absolute recurrence date. - * - * @param integer $year The year of the instance. - * @param integer $month The month of the instance. - * @param integer $mday The day of the month of the instance. - */ - public function addRDate($year, $month, $mday) - { - $this->rdates[] = new Horde_Date($year, $month, $mday); - } - - /** - * Adds an exception to a recurring event. - * - * @param integer $year The year of the execption. - * @param integer $month The month of the execption. - * @param integer $mday The day of the month of the exception. - */ - public function addException($year, $month, $mday) - { - $this->exceptions[] = sprintf('%04d%02d%02d', $year, $month, $mday); - } - - /** - * Deletes an exception from a recurring event. - * - * @param integer $year The year of the execption. - * @param integer $month The month of the execption. - * @param integer $mday The day of the month of the exception. - */ - public function deleteException($year, $month, $mday) - { - $key = array_search(sprintf('%04d%02d%02d', $year, $month, $mday), $this->exceptions); - if ($key !== false) { - unset($this->exceptions[$key]); - } - } - - /** - * Checks if an exception exists for a given reccurence of an event. - * - * @param integer $year The year of the reucrance. - * @param integer $month The month of the reucrance. - * @param integer $mday The day of the month of the reucrance. - * - * @return boolean True if an exception exists for the given date. - */ - public function hasException($year, $month, $mday) - { - return in_array(sprintf('%04d%02d%02d', $year, $month, $mday), - $this->getExceptions()); - } - - /** - * Retrieves all the exceptions for this event. - * - * @return array Array containing the dates of all the exceptions in - * YYYYMMDD form. - */ - public function getExceptions() - { - return $this->exceptions; - } - - /** - * Adds a completion to a recurring event. - * - * @param integer $year The year of the execption. - * @param integer $month The month of the execption. - * @param integer $mday The day of the month of the completion. - */ - public function addCompletion($year, $month, $mday) - { - $this->completions[] = sprintf('%04d%02d%02d', $year, $month, $mday); - } - - /** - * Deletes a completion from a recurring event. - * - * @param integer $year The year of the execption. - * @param integer $month The month of the execption. - * @param integer $mday The day of the month of the completion. - */ - public function deleteCompletion($year, $month, $mday) - { - $key = array_search(sprintf('%04d%02d%02d', $year, $month, $mday), $this->completions); - if ($key !== false) { - unset($this->completions[$key]); - } - } - - /** - * Checks if a completion exists for a given reccurence of an event. - * - * @param integer $year The year of the reucrance. - * @param integer $month The month of the recurrance. - * @param integer $mday The day of the month of the recurrance. - * - * @return boolean True if a completion exists for the given date. - */ - public function hasCompletion($year, $month, $mday) - { - return in_array(sprintf('%04d%02d%02d', $year, $month, $mday), - $this->getCompletions()); - } - - /** - * Retrieves all the completions for this event. - * - * @return array Array containing the dates of all the completions in - * YYYYMMDD form. - */ - public function getCompletions() - { - return $this->completions; - } - - /** - * Parses a vCalendar 1.0 recurrence rule. - * - * @link http://www.imc.org/pdi/vcal-10.txt - * @link http://www.shuchow.com/vCalAddendum.html - * - * @param string $rrule A vCalendar 1.0 conform RRULE value. - */ - public function fromRRule10($rrule) - { - $this->reset(); - - if (!$rrule) { - return; - } - - if (!preg_match('/([A-Z]+)(\d+)?(.*)/', $rrule, $matches)) { - // No recurrence data - event does not recur. - $this->setRecurType(self::RECUR_NONE); - } - - // Always default the recurInterval to 1. - $this->setRecurInterval(!empty($matches[2]) ? $matches[2] : 1); - - $remainder = trim($matches[3]); - - switch ($matches[1]) { - case 'D': - $this->setRecurType(self::RECUR_DAILY); - break; - - case 'W': - $this->setRecurType(self::RECUR_WEEKLY); - if (!empty($remainder)) { - $mask = 0; - while (preg_match('/^ ?[A-Z]{2} ?/', $remainder, $matches)) { - $day = trim($matches[0]); - $remainder = substr($remainder, strlen($matches[0])); - $mask |= $maskdays[$day]; - } - $this->setRecurOnDay($mask); - } else { - // Recur on the day of the week of the original recurrence. - $maskdays = array( - Horde_Date::DATE_SUNDAY => Horde_Date::MASK_SUNDAY, - Horde_Date::DATE_MONDAY => Horde_Date::MASK_MONDAY, - Horde_Date::DATE_TUESDAY => Horde_Date::MASK_TUESDAY, - Horde_Date::DATE_WEDNESDAY => Horde_Date::MASK_WEDNESDAY, - Horde_Date::DATE_THURSDAY => Horde_Date::MASK_THURSDAY, - Horde_Date::DATE_FRIDAY => Horde_Date::MASK_FRIDAY, - Horde_Date::DATE_SATURDAY => Horde_Date::MASK_SATURDAY, - ); - $this->setRecurOnDay($maskdays[$this->start->dayOfWeek()]); - } - break; - - case 'MP': - $this->setRecurType(self::RECUR_MONTHLY_WEEKDAY); - break; - - case 'MD': - $this->setRecurType(self::RECUR_MONTHLY_DATE); - break; - - case 'YM': - $this->setRecurType(self::RECUR_YEARLY_DATE); - break; - - case 'YD': - $this->setRecurType(self::RECUR_YEARLY_DAY); - break; - } - - // We don't support modifiers at the moment, strip them. - while ($remainder && !preg_match('/^(#\d+|\d{8})($| |T\d{6})/', $remainder)) { - $remainder = substr($remainder, 1); - } - if (!empty($remainder)) { - if (strpos($remainder, '#') === 0) { - $this->setRecurCount(substr($remainder, 1)); - } else { - list($year, $month, $mday) = sscanf($remainder, '%04d%02d%02d'); - $this->setRecurEnd(new Horde_Date(array('year' => $year, - 'month' => $month, - 'mday' => $mday, - 'hour' => 23, - 'min' => 59, - 'sec' => 59))); - } - } - } - - /** - * Creates a vCalendar 1.0 recurrence rule. - * - * @link http://www.imc.org/pdi/vcal-10.txt - * @link http://www.shuchow.com/vCalAddendum.html - * - * @param Horde_Icalendar $calendar A Horde_Icalendar object instance. - * - * @return string A vCalendar 1.0 conform RRULE value. - */ - public function toRRule10($calendar) - { - switch ($this->recurType) { - case self::RECUR_NONE: - return ''; - - case self::RECUR_DAILY: - $rrule = 'D' . $this->recurInterval; - break; - - case self::RECUR_WEEKLY: - $rrule = 'W' . $this->recurInterval; - $vcaldays = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); - - for ($i = 0; $i <= 7; ++$i) { - if ($this->recurOnDay(pow(2, $i))) { - $rrule .= ' ' . $vcaldays[$i]; - } - } - break; - - case self::RECUR_MONTHLY_DATE: - $rrule = 'MD' . $this->recurInterval . ' ' . trim($this->start->mday); - break; - - case self::RECUR_MONTHLY_WEEKDAY: - $nth_weekday = (int)($this->start->mday / 7); - if (($this->start->mday % 7) > 0) { - $nth_weekday++; - } - - $vcaldays = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); - $rrule = 'MP' . $this->recurInterval . ' ' . $nth_weekday . '+ ' . $vcaldays[$this->start->dayOfWeek()]; - - break; - - case self::RECUR_YEARLY_DATE: - $rrule = 'YM' . $this->recurInterval . ' ' . trim($this->start->month); - break; - - case self::RECUR_YEARLY_DAY: - $rrule = 'YD' . $this->recurInterval . ' ' . $this->start->dayOfYear(); - break; - - default: - return ''; - } - - if ($this->hasRecurEnd()) { - $recurEnd = clone $this->recurEnd; - return $rrule . ' ' . $calendar->_exportDateTime($recurEnd); - } - - return $rrule . ' #' . (int)$this->getRecurCount(); - } - - /** - * Parses an iCalendar 2.0 recurrence rule. - * - * @link http://rfc.net/rfc2445.html#s4.3.10 - * @link http://rfc.net/rfc2445.html#s4.8.5 - * @link http://www.shuchow.com/vCalAddendum.html - * - * @param string $rrule An iCalendar 2.0 conform RRULE value. - */ - public function fromRRule20($rrule) - { - $this->reset(); - - // Parse the recurrence rule into keys and values. - $rdata = array(); - $parts = explode(';', $rrule); - foreach ($parts as $part) { - list($key, $value) = explode('=', $part, 2); - $rdata[strtoupper($key)] = $value; - } - - if (isset($rdata['FREQ'])) { - // Always default the recurInterval to 1. - $this->setRecurInterval(isset($rdata['INTERVAL']) ? $rdata['INTERVAL'] : 1); - - $maskdays = array( - 'SU' => Horde_Date::MASK_SUNDAY, - 'MO' => Horde_Date::MASK_MONDAY, - 'TU' => Horde_Date::MASK_TUESDAY, - 'WE' => Horde_Date::MASK_WEDNESDAY, - 'TH' => Horde_Date::MASK_THURSDAY, - 'FR' => Horde_Date::MASK_FRIDAY, - 'SA' => Horde_Date::MASK_SATURDAY, - ); - - switch (strtoupper($rdata['FREQ'])) { - case 'DAILY': - $this->setRecurType(self::RECUR_DAILY); - break; - - case 'WEEKLY': - $this->setRecurType(self::RECUR_WEEKLY); - if (isset($rdata['BYDAY'])) { - $days = explode(',', $rdata['BYDAY']); - $mask = 0; - foreach ($days as $day) { - $mask |= $maskdays[$day]; - } - $this->setRecurOnDay($mask); - } else { - // Recur on the day of the week of the original - // recurrence. - $maskdays = array( - Horde_Date::DATE_SUNDAY => Horde_Date::MASK_SUNDAY, - Horde_Date::DATE_MONDAY => Horde_Date::MASK_MONDAY, - Horde_Date::DATE_TUESDAY => Horde_Date::MASK_TUESDAY, - Horde_Date::DATE_WEDNESDAY => Horde_Date::MASK_WEDNESDAY, - Horde_Date::DATE_THURSDAY => Horde_Date::MASK_THURSDAY, - Horde_Date::DATE_FRIDAY => Horde_Date::MASK_FRIDAY, - Horde_Date::DATE_SATURDAY => Horde_Date::MASK_SATURDAY); - $this->setRecurOnDay($maskdays[$this->start->dayOfWeek()]); - } - break; - - case 'MONTHLY': - if (isset($rdata['BYDAY'])) { - $this->setRecurType(self::RECUR_MONTHLY_WEEKDAY); - if (preg_match('/(-?[1-4])([A-Z]+)/', $rdata['BYDAY'], $m)) { - $this->setRecurOnDay($maskdays[$m[2]]); - $this->setRecurNthWeekday($m[1]); - } - } else { - $this->setRecurType(self::RECUR_MONTHLY_DATE); - } - break; - - case 'YEARLY': - if (isset($rdata['BYYEARDAY'])) { - $this->setRecurType(self::RECUR_YEARLY_DAY); - } elseif (isset($rdata['BYDAY'])) { - $this->setRecurType(self::RECUR_YEARLY_WEEKDAY); - if (preg_match('/(-?[1-4])([A-Z]+)/', $rdata['BYDAY'], $m)) { - $this->setRecurOnDay($maskdays[$m[2]]); - $this->setRecurNthWeekday($m[1]); - } - if ($rdata['BYMONTH']) { - $months = explode(',', $rdata['BYMONTH']); - $this->setRecurByMonth($months); - } - } else { - $this->setRecurType(self::RECUR_YEARLY_DATE); - } - break; - } - - if (isset($rdata['UNTIL'])) { - list($year, $month, $mday) = sscanf($rdata['UNTIL'], - '%04d%02d%02d'); - $this->setRecurEnd(new Horde_Date(array('year' => $year, - 'month' => $month, - 'mday' => $mday, - 'hour' => 23, - 'min' => 59, - 'sec' => 59))); - } - if (isset($rdata['COUNT'])) { - $this->setRecurCount($rdata['COUNT']); - } - } else { - // No recurrence data - event does not recur. - $this->setRecurType(self::RECUR_NONE); - } - } - - /** - * Creates an iCalendar 2.0 recurrence rule. - * - * @link http://rfc.net/rfc2445.html#s4.3.10 - * @link http://rfc.net/rfc2445.html#s4.8.5 - * @link http://www.shuchow.com/vCalAddendum.html - * - * @param Horde_Icalendar $calendar A Horde_Icalendar object instance. - * - * @return string An iCalendar 2.0 conform RRULE value. - */ - public function toRRule20($calendar) - { - switch ($this->recurType) { - case self::RECUR_NONE: - return ''; - - case self::RECUR_DAILY: - $rrule = 'FREQ=DAILY;INTERVAL=' . $this->recurInterval; - break; - - case self::RECUR_WEEKLY: - $rrule = 'FREQ=WEEKLY;INTERVAL=' . $this->recurInterval . ';BYDAY='; - $vcaldays = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); - - for ($i = $flag = 0; $i <= 7; ++$i) { - if ($this->recurOnDay(pow(2, $i))) { - if ($flag) { - $rrule .= ','; - } - $rrule .= $vcaldays[$i]; - $flag = true; - } - } - break; - - case self::RECUR_MONTHLY_DATE: - $rrule = 'FREQ=MONTHLY;INTERVAL=' . $this->recurInterval; - break; - - case self::RECUR_MONTHLY_WEEKDAY: - if (isset($this->recurNthDay)) { - $nth_weekday = $this->recurNthDay; - $day_of_week = log($this->recurData, 2); - } else { - $day_of_week = $this->start->dayOfWeek(); - $nth_weekday = (int)($this->start->mday / 7); - if (($this->start->mday % 7) > 0) { - $nth_weekday++; - } - } - $vcaldays = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); - $rrule = 'FREQ=MONTHLY;INTERVAL=' . $this->recurInterval - . ';BYDAY=' . $nth_weekday . $vcaldays[$day_of_week]; - break; - - case self::RECUR_YEARLY_DATE: - $rrule = 'FREQ=YEARLY;INTERVAL=' . $this->recurInterval; - break; - - case self::RECUR_YEARLY_DAY: - $rrule = 'FREQ=YEARLY;INTERVAL=' . $this->recurInterval - . ';BYYEARDAY=' . $this->start->dayOfYear(); - break; - - case self::RECUR_YEARLY_WEEKDAY: - if (isset($this->recurNthDay)) { - $nth_weekday = $this->recurNthDay; - $day_of_week = log($this->recurData, 2); - } else { - $day_of_week = $this->start->dayOfWeek(); - $nth_weekday = (int)($this->start->mday / 7); - if (($this->start->mday % 7) > 0) { - $nth_weekday++; - } - } - $months = !empty($this->recurMonths) ? join(',', $this->recurMonths) : $this->start->month; - $vcaldays = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); - $rrule = 'FREQ=YEARLY;INTERVAL=' . $this->recurInterval - . ';BYDAY=' - . $nth_weekday - . $vcaldays[$day_of_week] - . ';BYMONTH=' . $this->start->month; - break; - } - - if ($this->hasRecurEnd()) { - $recurEnd = clone $this->recurEnd; - $rrule .= ';UNTIL=' . $calendar->_exportDateTime($recurEnd); - } - if ($count = $this->getRecurCount()) { - $rrule .= ';COUNT=' . $count; - } - return $rrule; - } - - /** - * Parses the recurrence data from a hash. - * - * @param array $hash The hash to convert. - * - * @return boolean True if the hash seemed valid, false otherwise. - */ - public function fromHash($hash) - { - $this->reset(); - - if (!isset($hash['interval']) || !isset($hash['cycle'])) { - $this->setRecurType(self::RECUR_NONE); - return false; - } - - $this->setRecurInterval((int)$hash['interval']); - - $month2number = array( - 'january' => 1, - 'february' => 2, - 'march' => 3, - 'april' => 4, - 'may' => 5, - 'june' => 6, - 'july' => 7, - 'august' => 8, - 'september' => 9, - 'october' => 10, - 'november' => 11, - 'december' => 12, - ); - - $parse_day = false; - $set_daymask = false; - $update_month = false; - $update_daynumber = false; - $update_weekday = false; - $nth_weekday = -1; - - switch ($hash['cycle']) { - case 'daily': - $this->setRecurType(self::RECUR_DAILY); - break; - - case 'weekly': - $this->setRecurType(self::RECUR_WEEKLY); - $parse_day = true; - $set_daymask = true; - break; - - case 'monthly': - if (!isset($hash['daynumber'])) { - $this->setRecurType(self::RECUR_NONE); - return false; - } - - switch ($hash['type']) { - case 'daynumber': - $this->setRecurType(self::RECUR_MONTHLY_DATE); - $update_daynumber = true; - break; - - case 'weekday': - $this->setRecurType(self::RECUR_MONTHLY_WEEKDAY); - $this->setRecurNthWeekday($hash['daynumber']); - $parse_day = true; - $set_daymask = true; - break; - } - break; - - case 'yearly': - if (!isset($hash['type'])) { - $this->setRecurType(self::RECUR_NONE); - return false; - } - - switch ($hash['type']) { - case 'monthday': - $this->setRecurType(self::RECUR_YEARLY_DATE); - $update_month = true; - $update_daynumber = true; - break; - - case 'yearday': - if (!isset($hash['month'])) { - $this->setRecurType(self::RECUR_NONE); - return false; - } - - $this->setRecurType(self::RECUR_YEARLY_DAY); - // Start counting days in January. - $hash['month'] = 'january'; - $update_month = true; - $update_daynumber = true; - break; - - case 'weekday': - if (!isset($hash['daynumber'])) { - $this->setRecurType(self::RECUR_NONE); - return false; - } - - $this->setRecurType(self::RECUR_YEARLY_WEEKDAY); - $this->setRecurNthWeekday($hash['daynumber']); - $parse_day = true; - $set_daymask = true; - - if ($hash['month'] && isset($month2number[$hash['month']])) { - $this->setRecurByMonth($month2number[$hash['month']]); - } - break; - } - } - - if (isset($hash['range-type']) && isset($hash['range'])) { - switch ($hash['range-type']) { - case 'number': - $this->setRecurCount((int)$hash['range']); - break; - - case 'date': - $recur_end = new Horde_Date($hash['range']); - $recur_end->hour = 23; - $recur_end->min = 59; - $recur_end->sec = 59; - $this->setRecurEnd($recur_end); - break; - } - } - - // Need to parse ? - $last_found_day = -1; - if ($parse_day) { - if (!isset($hash['day'])) { - $this->setRecurType(self::RECUR_NONE); - return false; - } - - $mask = 0; - $bits = array( - 'monday' => Horde_Date::MASK_MONDAY, - 'tuesday' => Horde_Date::MASK_TUESDAY, - 'wednesday' => Horde_Date::MASK_WEDNESDAY, - 'thursday' => Horde_Date::MASK_THURSDAY, - 'friday' => Horde_Date::MASK_FRIDAY, - 'saturday' => Horde_Date::MASK_SATURDAY, - 'sunday' => Horde_Date::MASK_SUNDAY, - ); - $days = array( - 'monday' => Horde_Date::DATE_MONDAY, - 'tuesday' => Horde_Date::DATE_TUESDAY, - 'wednesday' => Horde_Date::DATE_WEDNESDAY, - 'thursday' => Horde_Date::DATE_THURSDAY, - 'friday' => Horde_Date::DATE_FRIDAY, - 'saturday' => Horde_Date::DATE_SATURDAY, - 'sunday' => Horde_Date::DATE_SUNDAY, - ); - - foreach ($hash['day'] as $day) { - // Validity check. - if (empty($day) || !isset($bits[$day])) { - continue; - } - - $mask |= $bits[$day]; - $last_found_day = $days[$day]; - } - - if ($set_daymask) { - $this->setRecurOnDay($mask); - } - } - - if ($update_month || $update_daynumber || $update_weekday) { - if ($update_month) { - if (isset($month2number[$hash['month']])) { - $this->start->month = $month2number[$hash['month']]; - } - } - - if ($update_daynumber) { - if (!isset($hash['daynumber'])) { - $this->setRecurType(self::RECUR_NONE); - return false; - } - - $this->start->mday = $hash['daynumber']; - } - - if ($update_weekday) { - $this->setNthWeekday($nth_weekday); - } - } - - // Exceptions. - if (isset($hash['exceptions'])) { - $this->exceptions = $hash['exceptions']; - } - - if (isset($hash['completions'])) { - $this->completions = $hash['completions']; - } - - return true; - } - - /** - * Export this object into a hash. - * - * @return array The recurrence hash. - */ - public function toHash() - { - if ($this->getRecurType() == self::RECUR_NONE) { - return array(); - } - - $day2number = array( - 0 => 'sunday', - 1 => 'monday', - 2 => 'tuesday', - 3 => 'wednesday', - 4 => 'thursday', - 5 => 'friday', - 6 => 'saturday' - ); - $month2number = array( - 1 => 'january', - 2 => 'february', - 3 => 'march', - 4 => 'april', - 5 => 'may', - 6 => 'june', - 7 => 'july', - 8 => 'august', - 9 => 'september', - 10 => 'october', - 11 => 'november', - 12 => 'december' - ); - - $hash = array('interval' => $this->getRecurInterval()); - $start = $this->getRecurStart(); - - switch ($this->getRecurType()) { - case self::RECUR_DAILY: - $hash['cycle'] = 'daily'; - break; - - case self::RECUR_WEEKLY: - $hash['cycle'] = 'weekly'; - $bits = array( - 'monday' => Horde_Date::MASK_MONDAY, - 'tuesday' => Horde_Date::MASK_TUESDAY, - 'wednesday' => Horde_Date::MASK_WEDNESDAY, - 'thursday' => Horde_Date::MASK_THURSDAY, - 'friday' => Horde_Date::MASK_FRIDAY, - 'saturday' => Horde_Date::MASK_SATURDAY, - 'sunday' => Horde_Date::MASK_SUNDAY, - ); - $days = array(); - foreach ($bits as $name => $bit) { - if ($this->recurOnDay($bit)) { - $days[] = $name; - } - } - $hash['day'] = $days; - break; - - case self::RECUR_MONTHLY_DATE: - $hash['cycle'] = 'monthly'; - $hash['type'] = 'daynumber'; - $hash['daynumber'] = $start->mday; - break; - - case self::RECUR_MONTHLY_WEEKDAY: - $hash['cycle'] = 'monthly'; - $hash['type'] = 'weekday'; - $hash['daynumber'] = $start->weekOfMonth(); - $hash['day'] = array ($day2number[$start->dayOfWeek()]); - break; - - case self::RECUR_YEARLY_DATE: - $hash['cycle'] = 'yearly'; - $hash['type'] = 'monthday'; - $hash['daynumber'] = $start->mday; - $hash['month'] = $month2number[$start->month]; - break; - - case self::RECUR_YEARLY_DAY: - $hash['cycle'] = 'yearly'; - $hash['type'] = 'yearday'; - $hash['daynumber'] = $start->dayOfYear(); - break; - - case self::RECUR_YEARLY_WEEKDAY: - $hash['cycle'] = 'yearly'; - $hash['type'] = 'weekday'; - $hash['daynumber'] = $start->weekOfMonth(); - $hash['day'] = array ($day2number[$start->dayOfWeek()]); - $hash['month'] = $month2number[$start->month]; - } - - if ($this->hasRecurCount()) { - $hash['range-type'] = 'number'; - $hash['range'] = $this->getRecurCount(); - } elseif ($this->hasRecurEnd()) { - $date = $this->getRecurEnd(); - $hash['range-type'] = 'date'; - $hash['range'] = $date->datestamp(); - } else { - $hash['range-type'] = 'none'; - $hash['range'] = ''; - } - - // Recurrence exceptions - $hash['exceptions'] = $this->exceptions; - $hash['completions'] = $this->completions; - - return $hash; - } - - /** - * Returns a simple object suitable for json transport representing this - * object. - * - * Possible properties are: - * - t: type - * - i: interval - * - e: end date - * - c: count - * - d: data - * - co: completions - * - ex: exceptions - * - * @return object A simple object. - */ - public function toJson() - { - $json = new stdClass; - $json->t = $this->recurType; - $json->i = $this->recurInterval; - if ($this->hasRecurEnd()) { - $json->e = $this->recurEnd->toJson(); - } - if ($this->recurCount) { - $json->c = $this->recurCount; - } - if ($this->recurData) { - $json->d = $this->recurData; - } - if ($this->completions) { - $json->co = $this->completions; - } - if ($this->exceptions) { - $json->ex = $this->exceptions; - } - return $json; - } - -} diff --git a/lib/calendar_ui.php b/lib/calendar_ui.php index 5152c28..bf45bee 100644 --- a/lib/calendar_ui.php +++ b/lib/calendar_ui.php @@ -92,6 +92,7 @@ class calendar_ui $this->cal->register_handler('plugin.resource_calendar', array($this, 'resource_calendar')); $this->cal->register_handler('plugin.attendees_freebusy_table', array($this, 'attendees_freebusy_table')); $this->cal->register_handler('plugin.edit_attendees_notify', array($this, 'edit_attendees_notify')); + $this->cal->register_handler('plugin.edit_recurrence_sync', array($this, 'edit_recurrence_sync')); $this->cal->register_handler('plugin.edit_recurring_warning', array($this, 'recurring_event_warning')); $this->cal->register_handler('plugin.event_rsvp_buttons', array($this, 'event_rsvp_buttons')); $this->cal->register_handler('plugin.angenda_options', array($this, 'angenda_options')); @@ -473,7 +474,7 @@ class calendar_ui } /** - * + * Render HTML for attendee notification warning */ function edit_attendees_notify($attrib = array()) { @@ -481,6 +482,15 @@ class calendar_ui return html::div($attrib, html::label(null, $checkbox->show(1) . ' ' . $this->cal->gettext('sendnotifications'))); } + /** + * Render HTML for recurrence option to align start date with the recurrence rule + */ + function edit_recurrence_sync($attrib = array()) + { + $checkbox = new html_checkbox(array('name' => '_start_sync', 'value' => 1)); + return html::div($attrib, html::label(null, $checkbox->show(1) . ' ' . $this->cal->gettext('eventstartsync'))); + } + /** * Generate the form for recurrence settings */ diff --git a/lib/js/jquery.miniColors.min.js b/lib/js/jquery.miniColors.min.js deleted file mode 100644 index cd08974..0000000 --- a/lib/js/jquery.miniColors.min.js +++ /dev/null @@ -1,16 +0,0 @@ -// http://plugins.jquery.com/project/jQueryMiniColors -jQuery&&function(d){d.extend(d.fn,{miniColors:function(j,k){var x=function(a,b){var e=l(a.val());e||(e="FFFFFF");var c=p(e),e=d('');e.insertAfter(a);a.addClass("miniColors").attr("maxlength",7).attr("autocomplete","off");a.data("trigger",e);a.data("hsb",c);b.change&&a.data("change",b.change);b.readonly&&a.attr("readonly",true);b.disabled&&q(a);b.colorValues&&a.data("colorValues",b.colorValues);e.bind("click.miniColors",function(b){b.preventDefault(); -a.trigger("focus")});a.bind("focus.miniColors",function(){w(a)});a.bind("blur.miniColors",function(){var b=l(a.val());a.val(b?"#"+b:"")});a.bind("keydown.miniColors",function(b){b.keyCode===9&&i(a)});a.bind("keyup.miniColors",function(){var b=a.val().replace(/[^A-F0-9#]/ig,"");a.val(b);r(a)||a.data("trigger").css("backgroundColor","#FFF")});a.bind("paste.miniColors",function(){setTimeout(function(){a.trigger("keyup")},5)})},q=function(a){i(a);a.attr("disabled",true);a.data("trigger").css("opacity", -0.5)},w=function(a){if(a.attr("disabled"))return false;i();var b=d('
');b.append('
');b.append('
');b.css({top:a.is(":visible")?a.offset().top+a.outerHeight():a.data("trigger").offset().top+a.data("trigger").outerHeight(),left:a.is(":visible")?a.offset().left:a.data("trigger").offset().left, -display:"none"}).addClass(a.attr("class"));var e=a.data("colorValues");if(e&&e.length){var c,f='
',g;for(g in e)c=l(e[g]),f+='
';f+="
";b.append(f);c=Math.ceil(e.length/7)*24;b.css("width",b.width()+c+5+"px");b.find(".miniColors-presets").css("width",c+"px")}c=a.data("hsb");b.find(".miniColors-colors").css("backgroundColor","#"+n(m({h:c.h,s:100,b:100})));(f=a.data("colorPosition"))|| -(f=s(c));b.find(".miniColors-colorPicker").css("top",f.y+"px").css("left",f.x+"px");(f=a.data("huePosition"))||(f=t(c));b.find(".miniColors-huePicker").css("top",f.y+"px");a.data("selector",b);a.data("huePicker",b.find(".miniColors-huePicker"));a.data("colorPicker",b.find(".miniColors-colorPicker"));a.data("mousebutton",0);d("BODY").append(b);b.fadeIn(100);b.bind("selectstart",function(){return false});d(document).bind("mousedown.miniColors",function(b){a.data("mousebutton",1);d(b.target).parents().andSelf().hasClass("miniColors-colors")&& -(b.preventDefault(),a.data("moving","colors"),u(a,b));d(b.target).parents().andSelf().hasClass("miniColors-hues")&&(b.preventDefault(),a.data("moving","hues"),v(a,b));d(b.target).parents().andSelf().hasClass("miniColors-selector")?b.preventDefault():d(b.target).parents().andSelf().hasClass("miniColors")||i(a)});d(document).bind("mouseup.miniColors",function(){a.data("mousebutton",0);a.removeData("moving")});d(document).bind("mousemove.miniColors",function(b){a.data("mousebutton")===1&&(a.data("moving")=== -"colors"&&u(a,b),a.data("moving")==="hues"&&v(a,b))});e&&(b.find(".miniColors-colorPreset").click(function(){a.val(d(this).attr("rel"));r(a)}),b.find('.miniColors-presets div[rel="'+a.val().replace(/#/,"")+'"]').addClass("miniColors-colorPreset-active"))},i=function(a){a||(a=".miniColors");d(a).each(function(){var a=d(this).data("selector");d(this).removeData("selector");d(a).fadeOut(100,function(){d(this).remove()})});d(document).unbind("mousedown.miniColors");d(document).unbind("mousemove.miniColors")}, -u=function(a,b){var e=a.data("colorPicker");e.hide();var c={x:b.clientX-a.data("selector").find(".miniColors-colors").offset().left+d(document).scrollLeft()-5,y:b.clientY-a.data("selector").find(".miniColors-colors").offset().top+d(document).scrollTop()-5};if(c.x<=-5)c.x=-5;if(c.x>=144)c.x=144;if(c.y<=-5)c.y=-5;if(c.y>=144)c.y=144;a.data("colorPosition",c);e.css("left",c.x).css("top",c.y).show();e=Math.round((c.x+5)*0.67);e<0&&(e=0);e>100&&(e=100);c=100-Math.round((c.y+5)*0.67);c<0&&(c=0);c>100&& -(c=100);var f=a.data("hsb");f.s=e;f.b=c;o(a,f,true)},v=function(a,b){var e=a.data("huePicker");e.hide();var c={y:b.clientY-a.data("selector").find(".miniColors-colors").offset().top+d(document).scrollTop()-1};if(c.y<=-1)c.y=-1;if(c.y>=149)c.y=149;a.data("huePosition",c);e.css("top",c.y).show();e=Math.round((150-c.y-1)*2.4);e<0&&(e=0);e>360&&(e=360);c=a.data("hsb");c.h=e;o(a,c,true)},o=function(a,b,e){a.data("hsb",b);var c=n(m(b));e&&a.val("#"+c);a.data("trigger").css("backgroundColor","#"+c);a.data("selector")&& -a.data("selector").find(".miniColors-colors").css("backgroundColor","#"+n(m({h:b.h,s:100,b:100})));a.data("change")&&a.data("change").call(a,"#"+c,m(b));a.data("colorValues")&&(a.data("selector").find(".miniColors-colorPreset-active").removeClass("miniColors-colorPreset-active"),a.data("selector").find('.miniColors-presets div[rel="'+c+'"]').addClass("miniColors-colorPreset-active"))},r=function(a){var b=l(a.val());if(!b)return false;var b=p(b),e=a.data("hsb");if(b.h===e.h&&b.s===e.s&&b.b===e.b)return true; -e=s(b);d(a.data("colorPicker")).css("top",e.y+"px").css("left",e.x+"px");e=t(b);d(a.data("huePicker")).css("top",e.y+"px");o(a,b,false);return true},s=function(a){var b=Math.ceil(a.s/0.67);b<0&&(b=0);b>150&&(b=150);a=150-Math.ceil(a.b/0.67);a<0&&(a=0);a>150&&(a=150);return{x:b-5,y:a-5}},t=function(a){a=150-a.h/2.4;a<0&&(h=0);a>150&&(h=150);return{y:a-1}},l=function(a){a=a.replace(/[^A-Fa-f0-9]/,"");a.length==3&&(a=a[0]+a[0]+a[1]+a[1]+a[2]+a[2]);return a.length===6?a:null},m=function(a){var b,e,c; -b=Math.round(a.h);var d=Math.round(a.s*255/100),a=Math.round(a.b*255/100);if(d==0)b=e=c=a;else{var d=(255-d)*a/255,g=(a-d)*(b%60)/60;b==360&&(b=0);b<60?(b=a,c=d,e=d+g):b<120?(e=a,c=d,b=a-g):b<180?(e=a,b=d,c=d+g):b<240?(c=a,b=d,e=a-g):b<300?(c=a,e=d,b=d+g):b<360?(b=a,e=d,c=a-g):c=e=b=0}return{r:Math.round(b),g:Math.round(e),b:Math.round(c)}},n=function(a){var b=[a.r.toString(16),a.g.toString(16),a.b.toString(16)];d.each(b,function(a,c){c.length==1&&(b[a]="0"+c)});return b.join("")},p=function(a){var b= -a,b=parseInt(b.indexOf("#")>-1?b.substring(1):b,16),a=b>>16,d=(b&65280)>>8;b&=255;var c={h:0,s:0,b:0},f=Math.min(a,d,b),g=Math.max(a,d,b),f=g-f;c.b=g;c.s=g!=0?255*f/g:0;c.h=c.s!=0?a==g?(d-b)/f:d==g?2+(b-a)/f:4+(a-d)/f:-1;c.h*=60;c.h<0&&(c.h+=360);c.s*=100/255;c.b*=100/255;if(c.s===0)c.h=360;return c};switch(j){case "readonly":return d(this).each(function(){d(this).attr("readonly",k)}),d(this);case "disabled":return d(this).each(function(){if(k)q(d(this));else{var a=d(this);a.attr("disabled",false); -a.data("trigger").css("opacity",1)}}),d(this);case "value":return d(this).each(function(){d(this).val(k).trigger("keyup")}),d(this);case "destroy":return d(this).each(function(){var a=d(this);i();a=d(a);a.data("trigger").remove();a.removeAttr("autocomplete");a.removeData("trigger");a.removeData("selector");a.removeData("hsb");a.removeData("huePicker");a.removeData("colorPicker");a.removeData("mousebutton");a.removeData("moving");a.unbind("click.miniColors");a.unbind("focus.miniColors");a.unbind("blur.miniColors"); -a.unbind("keyup.miniColors");a.unbind("keydown.miniColors");a.unbind("paste.miniColors");d(document).unbind("mousedown.miniColors");d(document).unbind("mousemove.miniColors")}),d(this);default:return j||(j={}),d(this).each(function(){d(this)[0].tagName.toLowerCase()==="input"&&(d(this).data("trigger")||x(d(this),j,k))}),d(this)}}})}(jQuery); diff --git a/localization/el.inc b/localization/el.inc new file mode 100644 index 0000000..aa3c1e4 --- /dev/null +++ b/localization/el.inc @@ -0,0 +1,95 @@ + diff --git a/localization/en_US.inc b/localization/en_US.inc index 2e2952c..a640c65 100644 --- a/localization/en_US.inc +++ b/localization/en_US.inc @@ -112,6 +112,8 @@ $labels['nmonthsback'] = '$nr months back'; $labels['showurl'] = 'Show calendar URL'; $labels['showurldescription'] = 'Use the following address to access (read only) your calendar from other applications. You can copy and paste this into any calendar software that supports the iCal format.'; $labels['caldavurldescription'] = 'Copy this address to a CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; +$labels['showfburl'] = 'Show free-busy URL'; +$labels['fburldescription'] = 'Use the following address to access Free-Busy information from other applications. You can copy and paste this into any calendar software that supports free-busy information in iCal format. No authentication is required for this URL.'; $labels['findcalendars'] = 'Find calendars...'; $labels['searchterms'] = 'Search terms'; $labels['calsearchresults'] = 'Available Calendars'; @@ -123,6 +125,7 @@ $labels['invitationspending'] = 'Pending invitations'; $labels['invitationsdeclined'] = 'Declined invitations'; $labels['changepartstat'] = 'Change participant status'; $labels['rsvpcomment'] = 'Invitation text'; +$labels['eventstartsync'] = 'Move the event start date to the first occurrence'; // agenda view $labels['listrange'] = 'Range to display:'; @@ -165,8 +168,6 @@ $labels['availbusy'] = 'Busy'; $labels['availunknown'] = 'Unknown'; $labels['availtentative'] = 'Tentative'; $labels['availoutofoffice'] = 'Out of Office'; -$labels['delegatedto'] = 'Delegated to: '; -$labels['delegatedfrom'] = 'Delegated from: '; $labels['scheduletime'] = 'Find availability'; $labels['sendinvitations'] = 'Send invitations'; $labels['sendnotifications'] = 'Notify participants about modifications'; @@ -267,6 +268,7 @@ $labels['currentevent'] = 'Current'; $labels['futurevents'] = 'Future'; $labels['allevents'] = 'All'; $labels['saveasnew'] = 'Save as new'; +$labels['recurrenceerror'] = 'Unable to resolve recurrence rule for specified start date.'; // birthdays calendar $labels['birthdays'] = 'Birthdays'; diff --git a/localization/et_EE.inc b/localization/et_EE.inc deleted file mode 100644 index 84357aa..0000000 --- a/localization/et_EE.inc +++ /dev/null @@ -1,207 +0,0 @@ -CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; -$labels['searchterms'] = 'Search terms'; -$labels['calendarsubscribe'] = 'List permanently'; -$labels['listrange'] = 'Range to display:'; -$labels['listsections'] = 'Divide into:'; -$labels['smartsections'] = 'Smart sections'; -$labels['until'] = 'until'; -$labels['today'] = 'Today'; -$labels['tomorrow'] = 'Tomorrow'; -$labels['thisweek'] = 'This week'; -$labels['nextweek'] = 'Next week'; -$labels['thismonth'] = 'This month'; -$labels['nextmonth'] = 'Next month'; -$labels['weekofyear'] = 'Week'; -$labels['pastevents'] = 'Past'; -$labels['futureevents'] = 'Future'; -$labels['showalarms'] = 'Show reminders'; -$labels['defaultalarmtype'] = 'Default reminder setting'; -$labels['defaultalarmoffset'] = 'Default reminder time'; -$labels['attendee'] = 'Participant'; -$labels['role'] = 'Role'; -$labels['availability'] = 'Avail.'; -$labels['confirmstate'] = 'Status'; -$labels['addattendee'] = 'Add participant'; -$labels['roleorganizer'] = 'Organizer'; -$labels['rolerequired'] = 'Kohustuslik'; -$labels['roleoptional'] = 'Optional'; -$labels['rolechair'] = 'Chair'; -$labels['rolenonparticipant'] = 'Absent'; -$labels['cutypeindividual'] = 'Individual'; -$labels['cutypegroup'] = 'Group'; -$labels['cutyperesource'] = 'Resource'; -$labels['cutyperoom'] = 'Room'; -$labels['availfree'] = 'Free'; -$labels['availbusy'] = 'Busy'; -$labels['availunknown'] = 'Unknown'; -$labels['availtentative'] = 'Tentative'; -$labels['availoutofoffice'] = 'Absent'; -$labels['delegatedto'] = 'Delegated to: '; -$labels['delegatedfrom'] = 'Delegated from: '; -$labels['scheduletime'] = 'Find availability'; -$labels['sendinvitations'] = 'Send invitations'; -$labels['sendnotifications'] = 'Notify participants about modifications'; -$labels['sendcancellation'] = 'Notify participants about event cancellation'; -$labels['onlyworkinghours'] = 'Find availability within my working hours'; -$labels['reqallattendees'] = 'Required/all participants'; -$labels['prevslot'] = 'Previous Slot'; -$labels['nextslot'] = 'Next Slot'; -$labels['noslotfound'] = 'Unable to find a free time slot'; -$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; -$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; -$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; -$labels['eventupdatesubject'] = '"$title" has been updated'; -$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; -$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; -$labels['eventcancelsubject'] = '"$title" has been canceled'; -$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; -$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; -$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; -$labels['itipcomment'] = 'Invitation/notification comment'; -$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; -$labels['eventcancelled'] = 'The event has been cancelled'; -$labels['saveincalendar'] = 'save in'; -$labels['resource'] = 'Resource'; -$labels['resourcedetails'] = 'Details'; -$labels['tabsummary'] = 'Summary'; -$labels['tabrecurrence'] = 'Recurrence'; -$labels['tabattendees'] = 'Participants'; -$labels['tabattachments'] = 'Attachments'; -$labels['tabsharing'] = 'Sharing'; -$labels['deleteobjectconfirm'] = 'Do you really want to delete this event?'; -$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; -$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; -$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; -$labels['savingdata'] = 'Saving data...'; -$labels['errorsaving'] = 'Failed to save changes.'; -$labels['operationfailed'] = 'The requested operation failed.'; -$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; -$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; -$labels['searchnoresults'] = 'No events found in the selected calendars.'; -$labels['successremoval'] = 'The event has been deleted successfully.'; -$labels['successrestore'] = 'The event has been restored successfully.'; -$labels['errornotifying'] = 'Failed to send notifications to event participants'; -$labels['errorimportingevent'] = 'Failed to import the event'; -$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; -$labels['nowritecalendarfound'] = 'No calendar found to save the event'; -$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; -$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; -$labels['itipsendsuccess'] = 'Invitation sent to participants.'; -$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; -$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; -$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; -$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; -$labels['importsuccess'] = 'Successfully imported $nr events'; -$labels['importnone'] = 'No events found to be imported'; -$labels['importerror'] = 'An error occured while importing'; -$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; -$labels['changeeventconfirm'] = 'Change event'; -$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; -$labels['currentevent'] = 'Current'; -$labels['futurevents'] = 'Future'; -$labels['allevents'] = 'All'; -$labels['saveasnew'] = 'Save as new'; -$labels['birthdays'] = 'Birthdays'; -$labels['birthdayscalendar'] = 'Birthdays Calendar'; -$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; -$labels['birthdayscalendarsources'] = 'From these address books'; -$labels['birthdayeventtitle'] = '$name\'s Birthday'; -$labels['birthdayage'] = 'Age $age'; -$labels['operation'] = 'Toiming'; -?> diff --git a/localization/he.inc b/localization/he.inc deleted file mode 100644 index 036f184..0000000 --- a/localization/he.inc +++ /dev/null @@ -1,272 +0,0 @@ -CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; -$labels['findcalendars'] = 'Find calendars...'; -$labels['searchterms'] = 'Search terms'; -$labels['calsearchresults'] = 'Available Calendars'; -$labels['calendarsubscribe'] = 'List permanently'; -$labels['nocalendarsfound'] = 'No calendars found'; -$labels['nrcalendarsfound'] = '$nr calendars found'; -$labels['quickview'] = 'View only this calendar'; -$labels['invitationspending'] = 'Pending invitations'; -$labels['invitationsdeclined'] = 'Declined invitations'; -$labels['changepartstat'] = 'Change participant status'; -$labels['rsvpcomment'] = 'Invitation text'; -$labels['listrange'] = 'Range to display:'; -$labels['listsections'] = 'Divide into:'; -$labels['smartsections'] = 'Smart sections'; -$labels['until'] = 'until'; -$labels['today'] = 'Today'; -$labels['tomorrow'] = 'Tomorrow'; -$labels['thisweek'] = 'This week'; -$labels['nextweek'] = 'Next week'; -$labels['prevweek'] = 'Previous week'; -$labels['thismonth'] = 'This month'; -$labels['nextmonth'] = 'Next month'; -$labels['weekofyear'] = 'Week'; -$labels['pastevents'] = 'Past'; -$labels['futureevents'] = 'Future'; -$labels['showalarms'] = 'Show reminders'; -$labels['defaultalarmtype'] = 'Default reminder setting'; -$labels['defaultalarmoffset'] = 'Default reminder time'; -$labels['attendee'] = 'Participant'; -$labels['role'] = 'Role'; -$labels['availability'] = 'Avail.'; -$labels['confirmstate'] = 'Status'; -$labels['addattendee'] = 'Add participant'; -$labels['roleorganizer'] = 'Organizer'; -$labels['rolerequired'] = 'Required'; -$labels['roleoptional'] = 'Optional'; -$labels['rolechair'] = 'Chair'; -$labels['rolenonparticipant'] = 'Absent'; -$labels['cutypeindividual'] = 'Individual'; -$labels['cutypegroup'] = 'Group'; -$labels['cutyperesource'] = 'Resource'; -$labels['cutyperoom'] = 'Room'; -$labels['availfree'] = 'Free'; -$labels['availbusy'] = 'Busy'; -$labels['availunknown'] = 'Unknown'; -$labels['availtentative'] = 'Tentative'; -$labels['availoutofoffice'] = 'Out of Office'; -$labels['delegatedto'] = 'Delegated to: '; -$labels['delegatedfrom'] = 'Delegated from: '; -$labels['scheduletime'] = 'Find availability'; -$labels['sendinvitations'] = 'Send invitations'; -$labels['sendnotifications'] = 'Notify participants about modifications'; -$labels['sendcancellation'] = 'Notify participants about event cancellation'; -$labels['onlyworkinghours'] = 'Find availability within my working hours'; -$labels['reqallattendees'] = 'Required/all participants'; -$labels['prevslot'] = 'Previous Slot'; -$labels['nextslot'] = 'Next Slot'; -$labels['suggestedslot'] = 'Suggested Slot'; -$labels['noslotfound'] = 'Unable to find a free time slot'; -$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; -$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; -$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; -$labels['eventupdatesubject'] = '"$title" has been updated'; -$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; -$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; -$labels['eventcancelsubject'] = '"$title" has been canceled'; -$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; -$labels['itipobjectnotfound'] = 'The event referred by this message was not found in your calendar.'; -$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodycancel'] = "\$sender has rejected your participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegated'] = "\$sender has delegated the participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegatedto'] = "\$sender has delegated the participation in the following event to you:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; -$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; -$labels['itipcomment'] = 'Invitation/notification comment'; -$labels['itipcommenttitle'] = 'This comment will be attached to the invitation/notification message sent to participants'; -$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; -$labels['eventcancelled'] = 'The event has been cancelled'; -$labels['saveincalendar'] = 'save in'; -$labels['updatemycopy'] = 'Update in my calendar'; -$labels['savetocalendar'] = 'Save to calendar'; -$labels['openpreview'] = 'Check Calendar'; -$labels['noearlierevents'] = 'No earlier events'; -$labels['nolaterevents'] = 'No later events'; -$labels['resource'] = 'Resource'; -$labels['addresource'] = 'Book resource'; -$labels['findresources'] = 'Find resources'; -$labels['resourcedetails'] = 'Details'; -$labels['resourceavailability'] = 'Availability'; -$labels['resourceowner'] = 'Owner'; -$labels['resourceadded'] = 'The resource was added to your event'; -$labels['tabsummary'] = 'Summary'; -$labels['tabrecurrence'] = 'Recurrence'; -$labels['tabattendees'] = 'Participants'; -$labels['tabresources'] = 'Resources'; -$labels['tabattachments'] = 'Attachments'; -$labels['tabsharing'] = 'Sharing'; -$labels['deleteobjectconfirm'] = 'Do you really want to delete this event?'; -$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; -$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; -$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; -$labels['savingdata'] = 'Saving data...'; -$labels['errorsaving'] = 'Failed to save changes.'; -$labels['operationfailed'] = 'The requested operation failed.'; -$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; -$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; -$labels['searchnoresults'] = 'No events found in the selected calendars.'; -$labels['successremoval'] = 'The event has been deleted successfully.'; -$labels['successrestore'] = 'The event has been restored successfully.'; -$labels['errornotifying'] = 'Failed to send notifications to event participants'; -$labels['errorimportingevent'] = 'Failed to import the event'; -$labels['importwarningexists'] = 'A copy of this event already exists in your calendar.'; -$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; -$labels['nowritecalendarfound'] = 'No calendar found to save the event'; -$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; -$labels['updatedsuccessfully'] = 'The event was successfully updated in \'$calendar\''; -$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; -$labels['itipsendsuccess'] = 'Invitation sent to participants.'; -$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; -$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; -$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; -$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; -$labels['importsuccess'] = 'Successfully imported $nr events'; -$labels['importnone'] = 'No events found to be imported'; -$labels['importerror'] = 'An error occured while importing'; -$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; -$labels['changeeventconfirm'] = 'Change event'; -$labels['removeeventconfirm'] = 'Delete event'; -$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; -$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to delete the current event only, this and all future occurences or all occurences of this event?'; -$labels['currentevent'] = 'Current'; -$labels['futurevents'] = 'Future'; -$labels['allevents'] = 'All'; -$labels['saveasnew'] = 'Save as new'; -$labels['birthdays'] = 'Birthdays'; -$labels['birthdayscalendar'] = 'Birthdays Calendar'; -$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; -$labels['birthdayscalendarsources'] = 'From these address books'; -$labels['birthdayeventtitle'] = '$name\'s Birthday'; -$labels['birthdayage'] = 'Age $age'; -$labels['eventchangelog'] = 'Change History'; -$labels['eventdiff'] = 'Changes from revisions $rev'; -$labels['revision'] = 'Revision'; -$labels['user'] = 'User'; -$labels['operation'] = 'Action'; -$labels['actionappend'] = 'Saved'; -$labels['actionmove'] = 'Moved'; -$labels['actiondelete'] = 'Deleted'; -$labels['compare'] = 'Compare'; -$labels['showrevision'] = 'Show this version'; -$labels['restore'] = 'Restore this version'; -$labels['eventnotfound'] = 'Failed to load event data'; -$labels['eventchangelognotavailable'] = 'Change history is not available for this event'; -$labels['eventdiffnotavailable'] = 'No comparison possible for the selected revisions'; -$labels['eventrestoreconfirm'] = 'Do you really want to restore revision $rev of this event? This will replace the current event with the old version.'; -$labels['arialabelminical'] = 'Calendar date selection'; -$labels['arialabelcalendarview'] = 'Calendar view'; -$labels['arialabelsearchform'] = 'Event search form'; -$labels['arialabelquicksearchbox'] = 'Event search input'; -$labels['arialabelcalsearchform'] = 'Calendars search form'; -$labels['calendaractions'] = 'Calendar actions'; -$labels['arialabeleventattendees'] = 'Event participants list'; -$labels['arialabeleventresources'] = 'Event resources list'; -$labels['arialabelresourcesearchform'] = 'Resources search form'; -$labels['arialabelresourceselection'] = 'Available resources'; -?> diff --git a/localization/hr.inc b/localization/hr.inc deleted file mode 100644 index 6794804..0000000 --- a/localization/hr.inc +++ /dev/null @@ -1,272 +0,0 @@ -CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; -$labels['findcalendars'] = 'Find calendars...'; -$labels['searchterms'] = 'Search terms'; -$labels['calsearchresults'] = 'Available Calendars'; -$labels['calendarsubscribe'] = 'List permanently'; -$labels['nocalendarsfound'] = 'No calendars found'; -$labels['nrcalendarsfound'] = '$nr calendars found'; -$labels['quickview'] = 'View only this calendar'; -$labels['invitationspending'] = 'Pending invitations'; -$labels['invitationsdeclined'] = 'Declined invitations'; -$labels['changepartstat'] = 'Change participant status'; -$labels['rsvpcomment'] = 'Invitation text'; -$labels['listrange'] = 'Range to display:'; -$labels['listsections'] = 'Divide into:'; -$labels['smartsections'] = 'Smart sections'; -$labels['until'] = 'until'; -$labels['today'] = 'Today'; -$labels['tomorrow'] = 'Tomorrow'; -$labels['thisweek'] = 'This week'; -$labels['nextweek'] = 'Next week'; -$labels['prevweek'] = 'Previous week'; -$labels['thismonth'] = 'This month'; -$labels['nextmonth'] = 'Next month'; -$labels['weekofyear'] = 'Week'; -$labels['pastevents'] = 'Past'; -$labels['futureevents'] = 'Future'; -$labels['showalarms'] = 'Show reminders'; -$labels['defaultalarmtype'] = 'Default reminder setting'; -$labels['defaultalarmoffset'] = 'Default reminder time'; -$labels['attendee'] = 'Participant'; -$labels['role'] = 'Role'; -$labels['availability'] = 'Avail.'; -$labels['confirmstate'] = 'Status'; -$labels['addattendee'] = 'Add participant'; -$labels['roleorganizer'] = 'Organizer'; -$labels['rolerequired'] = 'Required'; -$labels['roleoptional'] = 'Optional'; -$labels['rolechair'] = 'Chair'; -$labels['rolenonparticipant'] = 'Absent'; -$labels['cutypeindividual'] = 'Individual'; -$labels['cutypegroup'] = 'Group'; -$labels['cutyperesource'] = 'Resource'; -$labels['cutyperoom'] = 'Room'; -$labels['availfree'] = 'Free'; -$labels['availbusy'] = 'Busy'; -$labels['availunknown'] = 'Unknown'; -$labels['availtentative'] = 'Tentative'; -$labels['availoutofoffice'] = 'Out of Office'; -$labels['delegatedto'] = 'Delegated to: '; -$labels['delegatedfrom'] = 'Delegated from: '; -$labels['scheduletime'] = 'Find availability'; -$labels['sendinvitations'] = 'Send invitations'; -$labels['sendnotifications'] = 'Notify participants about modifications'; -$labels['sendcancellation'] = 'Notify participants about event cancellation'; -$labels['onlyworkinghours'] = 'Find availability within my working hours'; -$labels['reqallattendees'] = 'Required/all participants'; -$labels['prevslot'] = 'Previous Slot'; -$labels['nextslot'] = 'Next Slot'; -$labels['suggestedslot'] = 'Suggested Slot'; -$labels['noslotfound'] = 'Unable to find a free time slot'; -$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; -$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; -$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; -$labels['eventupdatesubject'] = '"$title" has been updated'; -$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; -$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; -$labels['eventcancelsubject'] = '"$title" has been canceled'; -$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; -$labels['itipobjectnotfound'] = 'The event referred by this message was not found in your calendar.'; -$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodycancel'] = "\$sender has rejected your participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegated'] = "\$sender has delegated the participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegatedto'] = "\$sender has delegated the participation in the following event to you:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; -$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; -$labels['itipcomment'] = 'Invitation/notification comment'; -$labels['itipcommenttitle'] = 'This comment will be attached to the invitation/notification message sent to participants'; -$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; -$labels['eventcancelled'] = 'The event has been cancelled'; -$labels['saveincalendar'] = 'save in'; -$labels['updatemycopy'] = 'Update in my calendar'; -$labels['savetocalendar'] = 'Save to calendar'; -$labels['openpreview'] = 'Check Calendar'; -$labels['noearlierevents'] = 'No earlier events'; -$labels['nolaterevents'] = 'No later events'; -$labels['resource'] = 'Resource'; -$labels['addresource'] = 'Book resource'; -$labels['findresources'] = 'Find resources'; -$labels['resourcedetails'] = 'Details'; -$labels['resourceavailability'] = 'Availability'; -$labels['resourceowner'] = 'Owner'; -$labels['resourceadded'] = 'The resource was added to your event'; -$labels['tabsummary'] = 'Summary'; -$labels['tabrecurrence'] = 'Recurrence'; -$labels['tabattendees'] = 'Participants'; -$labels['tabresources'] = 'Resources'; -$labels['tabattachments'] = 'Attachments'; -$labels['tabsharing'] = 'Sharing'; -$labels['deleteobjectconfirm'] = 'Do you really want to delete this event?'; -$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; -$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; -$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; -$labels['savingdata'] = 'Saving data...'; -$labels['errorsaving'] = 'Failed to save changes.'; -$labels['operationfailed'] = 'The requested operation failed.'; -$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; -$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; -$labels['searchnoresults'] = 'No events found in the selected calendars.'; -$labels['successremoval'] = 'The event has been deleted successfully.'; -$labels['successrestore'] = 'The event has been restored successfully.'; -$labels['errornotifying'] = 'Failed to send notifications to event participants'; -$labels['errorimportingevent'] = 'Failed to import the event'; -$labels['importwarningexists'] = 'A copy of this event already exists in your calendar.'; -$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; -$labels['nowritecalendarfound'] = 'No calendar found to save the event'; -$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; -$labels['updatedsuccessfully'] = 'The event was successfully updated in \'$calendar\''; -$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; -$labels['itipsendsuccess'] = 'Invitation sent to participants.'; -$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; -$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; -$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; -$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; -$labels['importsuccess'] = 'Successfully imported $nr events'; -$labels['importnone'] = 'No events found to be imported'; -$labels['importerror'] = 'An error occured while importing'; -$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; -$labels['changeeventconfirm'] = 'Change event'; -$labels['removeeventconfirm'] = 'Delete event'; -$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; -$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to delete the current event only, this and all future occurences or all occurences of this event?'; -$labels['currentevent'] = 'Current'; -$labels['futurevents'] = 'Future'; -$labels['allevents'] = 'All'; -$labels['saveasnew'] = 'Save as new'; -$labels['birthdays'] = 'Birthdays'; -$labels['birthdayscalendar'] = 'Birthdays Calendar'; -$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; -$labels['birthdayscalendarsources'] = 'From these address books'; -$labels['birthdayeventtitle'] = '$name\'s Birthday'; -$labels['birthdayage'] = 'Age $age'; -$labels['eventchangelog'] = 'Change History'; -$labels['eventdiff'] = 'Changes from revisions $rev'; -$labels['revision'] = 'Revision'; -$labels['user'] = 'User'; -$labels['operation'] = 'Action'; -$labels['actionappend'] = 'Saved'; -$labels['actionmove'] = 'Moved'; -$labels['actiondelete'] = 'Deleted'; -$labels['compare'] = 'Compare'; -$labels['showrevision'] = 'Show this version'; -$labels['restore'] = 'Restore this version'; -$labels['eventnotfound'] = 'Failed to load event data'; -$labels['eventchangelognotavailable'] = 'Change history is not available for this event'; -$labels['eventdiffnotavailable'] = 'No comparison possible for the selected revisions'; -$labels['eventrestoreconfirm'] = 'Do you really want to restore revision $rev of this event? This will replace the current event with the old version.'; -$labels['arialabelminical'] = 'Calendar date selection'; -$labels['arialabelcalendarview'] = 'Calendar view'; -$labels['arialabelsearchform'] = 'Event search form'; -$labels['arialabelquicksearchbox'] = 'Event search input'; -$labels['arialabelcalsearchform'] = 'Calendars search form'; -$labels['calendaractions'] = 'Calendar actions'; -$labels['arialabeleventattendees'] = 'Event participants list'; -$labels['arialabeleventresources'] = 'Event resources list'; -$labels['arialabelresourcesearchform'] = 'Resources search form'; -$labels['arialabelresourceselection'] = 'Available resources'; -?> diff --git a/localization/ko_KR.inc b/localization/ko_KR.inc new file mode 100644 index 0000000..d53e38e --- /dev/null +++ b/localization/ko_KR.inc @@ -0,0 +1,203 @@ + diff --git a/localization/ku_IQ.inc b/localization/ku_IQ.inc deleted file mode 100644 index 96325b5..0000000 --- a/localization/ku_IQ.inc +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/localization/lv.inc b/localization/lv.inc new file mode 100644 index 0000000..104b531 --- /dev/null +++ b/localization/lv.inc @@ -0,0 +1,268 @@ +CalDAV uz klienta aplikāciju (piem. Evolution vai Mozilla Thunderbird) lai pilnībā sinhronizētu izvēlēto kalendāru ar jūsu datoru vai mobilo ierīci.'; +$labels['findcalendars'] = 'Meklēt kalendārus...'; +$labels['searchterms'] = 'Meklēšanas nosacījumi'; +$labels['calsearchresults'] = 'Pieejamie kalendāri'; +$labels['calendarsubscribe'] = 'Rādīt sarakstā vienmēr'; +$labels['nocalendarsfound'] = 'Neviens kalendārs nav atrasts'; +$labels['nrcalendarsfound'] = 'Atrasti $nr kalendāri'; +$labels['quickview'] = 'Skatīt tikai šo kalendāru'; +$labels['invitationspending'] = 'Neapstrādātie uzaicinājumi'; +$labels['invitationsdeclined'] = 'Noraidītie uzaicinājumi'; +$labels['changepartstat'] = 'Mainīt dalībnieka statusu'; +$labels['rsvpcomment'] = 'Uzaicinājuma teksts'; +$labels['listrange'] = 'Attēlot diapazonu:'; +$labels['listsections'] = 'Sadalīt:'; +$labels['smartsections'] = 'Viedās sekcijas'; +$labels['until'] = 'līdz'; +$labels['today'] = 'Šodien'; +$labels['tomorrow'] = 'Rīt'; +$labels['thisweek'] = 'Šonedēļ'; +$labels['nextweek'] = 'Jaunnedēļ'; +$labels['prevweek'] = 'Pagājušā nedēļā'; +$labels['thismonth'] = 'Šomēnes'; +$labels['nextmonth'] = 'Nākošmēnes'; +$labels['weekofyear'] = 'Nedēļa'; +$labels['pastevents'] = 'Pagātne'; +$labels['futureevents'] = 'Nākotne'; +$labels['showalarms'] = 'Rādīt atgādinājumus'; +$labels['defaultalarmtype'] = 'Noklusētais atgādinājumu uzstādījums'; +$labels['defaultalarmoffset'] = 'Noklusētais atgādinājuma laiks'; +$labels['attendee'] = 'Dalībnieks'; +$labels['role'] = 'Loma'; +$labels['availability'] = 'Pieej.'; +$labels['confirmstate'] = 'Statuss'; +$labels['addattendee'] = 'Pievienot dalībnieku'; +$labels['roleorganizer'] = 'Organizētājs'; +$labels['rolerequired'] = 'Obligāti'; +$labels['roleoptional'] = 'Pēc izvēles'; +$labels['rolechair'] = 'Vadītājs'; +$labels['rolenonparticipant'] = 'Nepiedalās'; +$labels['cutypeindividual'] = 'Persona'; +$labels['cutypegroup'] = 'Grupa'; +$labels['cutyperesource'] = 'Resurss'; +$labels['cutyperoom'] = 'Telpa'; +$labels['availfree'] = 'Brīvs'; +$labels['availbusy'] = 'Aizņemts'; +$labels['availunknown'] = 'Nezināms'; +$labels['availtentative'] = 'Varbūt'; +$labels['availoutofoffice'] = 'Ārpus biroja'; +$labels['delegatedto'] = 'Deleģēt:'; +$labels['delegatedfrom'] = 'Deleģēts no:'; +$labels['scheduletime'] = 'Atrast brīvu laiku'; +$labels['sendinvitations'] = 'Nosūtīt uzaicinājumus'; +$labels['sendnotifications'] = 'Apziņot dalībniekus par izmaiņām'; +$labels['sendcancellation'] = 'Apziņot dalībniekus par pasākuma atcelšanu'; +$labels['onlyworkinghours'] = 'Atrast brīvu laiku manā darba laikā'; +$labels['reqallattendees'] = 'Obligātie/visi dalībnieki'; +$labels['prevslot'] = 'Iepriekšējā iedaļa'; +$labels['nextslot'] = 'Nākamā iedaļa'; +$labels['suggestedslot'] = 'Ieteicamā iedaļa'; +$labels['noslotfound'] = 'Nav brīvas laika iedaļas'; +$labels['invitationsubject'] = 'Jūs esat uzaicināts uz "$title"'; +$labels['invitationmailbody'] = "*\$title*\n\nKad: \$date\n\nUzaicinātie: \$attendees\n\nLūdzu skatiet pievienoto iCalendar failu ar notikuma informācij, kuru jūs varat importēt savā kalendāra aplikācijā."; +$labels['invitationattendlinks'] = "Gadījumā ja jūsu e-pasta praogramma neatbalsta iTip pieprasījumus, tad jūs varat izmantot šo saiti, lai pieņemtu vai noraidītu šo uzaicinājumu:\n\$url"; +$labels['eventupdatesubject'] = '"$title" ir mainīts'; +$labels['eventupdatesubjectempty'] = 'Pasākums, kas attiecas uz jums ir mainīts'; +$labels['eventupdatemailbody'] = "*\$title*\n\nKad: \$date\n\nUzaicinātie: \$attendees\n\nPielikumā pievienots iCalendar fails ar atjaunotu notikuma informāciju, kuru jūs varat importēt savā kalendāra aplikācijā."; +$labels['eventcancelsubject'] = '"$title" ir atcelts'; +$labels['eventcancelmailbody'] = "*\$title*\n\nKad: \$date\n\nUzaicinātie: \$attendees\n\nPasākumu ir atcēlis tā organizators \$organizer.\n\nLūdzu skatiet pievienoto iCalendar failu ar atjaunotu notikuma informāciju."; +$labels['itipobjectnotfound'] = 'Notikums uz ko attiecas šis ziņojums nav atrodams jūsu kalendāra.'; +$labels['itipmailbodyaccepted'] = "\$sender ir pieņēmis uzaicinājumu uz:\n\n*\$title*\n\nKad: \$date\n\nUzaicinātie: \$attendees"; +$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; +$labels['itipmailbodydeclined'] = "\$sender ir noraidījis uzaicinājumu dalībai:\n\n*\$title*\n\nKad: \$date\n\nUzaicinātie: \$attendees"; +$labels['itipmailbodycancel'] = "\$sender ir noraidījis jūsu dalību sekojošā pasākumā:\n\n*\$title*\n\nKad: \$date"; +$labels['itipmailbodydelegated'] = "\$sender ir deleģējis dalību sekojošā pasākumā:\n\n*\$title*\n\nKad: \$date"; +$labels['itipmailbodydelegatedto'] = "\$sender ir deleģējis jums dalību sekojošā pasākumā:\n\n*\$title*\n\nKad: \$date"; +$labels['itipdeclineevent'] = 'Vai vēlaties noraidīt šo uzaicinājumu?'; +$labels['declinedeleteconfirm'] = 'Vai jūs vēlaties arī dzēst šo noraidīto notikumu no jūsu kalendāra?'; +$labels['itipcomment'] = 'Uzaicinājumam/paziņojuma komentārs'; +$labels['itipcommenttitle'] = 'Šis komentārs tiks pievienots uzaicinājumam/paziņojuma ziņojumam dalībniekiem'; +$labels['notanattendee'] = 'Jūs neesat šī notikuma dalībnieku sarakstā'; +$labels['eventcancelled'] = 'Notikums atcelts'; +$labels['saveincalendar'] = 'saglabāt'; +$labels['updatemycopy'] = 'Atjaunot manā kalendārā'; +$labels['savetocalendar'] = 'Saglabāt kalendārā'; +$labels['openpreview'] = 'Pārbaudīt kalendāru'; +$labels['noearlierevents'] = 'Nav notikumu pirms'; +$labels['nolaterevents'] = 'Nav notikumu pēc'; +$labels['resource'] = 'Resurss'; +$labels['addresource'] = 'Pieteikt resursus'; +$labels['findresources'] = 'Meklēt resursus'; +$labels['resourcedetails'] = 'Detaļas'; +$labels['resourceavailability'] = 'Pieejamība'; +$labels['resourceowner'] = 'Īpašnieks'; +$labels['resourceadded'] = 'Resursi pievienoti jūsu notikumam'; +$labels['tabsummary'] = 'Kopsavilkums'; +$labels['tabrecurrence'] = 'Atkārtojums'; +$labels['tabattendees'] = 'Dalībnieki'; +$labels['tabresources'] = 'Resursi'; +$labels['tabattachments'] = 'Pielikumi'; +$labels['tabsharing'] = 'Dalīšanās'; +$labels['deleteobjectconfirm'] = 'Vai tiešām jūs vēlaties dzēst šo notikumu?'; +$labels['deleteventconfirm'] = 'Vai tiešām jūs vēlaties dzēst šo notikumu?'; +$labels['deletecalendarconfirm'] = 'Vai tiešām jūs vēlaties dzēst šo kalendāru ar visiem notikumiem?'; +$labels['deletecalendarconfirmrecursive'] = 'Vai tiešām jūs vēlaties dzēst šo kalendāru ar visiem notikumiem un pakārtotajiem kalendāriem?'; +$labels['savingdata'] = 'Saglabājam...'; +$labels['errorsaving'] = 'Kļūda saglabājot izmaiņas.'; +$labels['operationfailed'] = 'Kļūda pieprasītās darbības laikā.'; +$labels['invalideventdates'] = 'Ievadīti nederīgi datumi! Lūdzu pārbaudiet ievadīto.'; +$labels['invalidcalendarproperties'] = 'Nederīgas kalendāra īpašības! Lūdzu norādiet derīgu nosaukumu.'; +$labels['searchnoresults'] = 'Nav atrasts neviens notikums izvēlētajos kalendāros'; +$labels['successremoval'] = 'Notikums veiksmīgi dzēsts'; +$labels['successrestore'] = 'Notikums veiksmīgi atjaunots'; +$labels['errornotifying'] = 'Kļūda izsūtot paziņojumus dalībniekiem'; +$labels['errorimportingevent'] = 'Kļūda importējot notikumu'; +$labels['importwarningexists'] = 'Šī notikuma kopija jau eksistē jūsu kalendārā'; +$labels['newerversionexists'] = 'Jaunāka notikuma versija jau eksistē jūsu kalendārā! Darbība atcelta.'; +$labels['nowritecalendarfound'] = 'Nav atrasts kalendārs, kur pievienot notikumu'; +$labels['importedsuccessfully'] = 'Šis notikums veiksmīgi pievienots kalendāram \'$calendar\''; +$labels['updatedsuccessfully'] = 'Šis notikums veiksmīgi atjaunots kalendārā \'$calendar\''; +$labels['attendeupdateesuccess'] = 'Dalībnieku statusi veiksmīgi atjaunoti'; +$labels['itipsendsuccess'] = 'Uzaicinājumi dalībniekiem izsūtīti'; +$labels['itipresponseerror'] = 'Kļūda nosūtot atbildi uz šo uzaicinājumu'; +$labels['itipinvalidrequest'] = 'Šis uzaicinājums vairs nav spēkā'; +$labels['sentresponseto'] = 'Atbilde uz uzaicinājumu veiksmīgi nosūtīta $mailto'; +$labels['localchangeswarning'] = 'Jūsu veiktās izmaiņas attēlosies tikai jūsu kalendārā un netiks nosūtītas pasākuma organizatoram.'; +$labels['importsuccess'] = 'Veiksmīgi importēti $nr notikumi'; +$labels['importnone'] = 'Nav atrasti notikumi ko importēt'; +$labels['importerror'] = 'Kļūda importa laikā'; +$labels['aclnorights'] = 'Jums nav šī kalendāra administratora tiesību'; +$labels['changeeventconfirm'] = 'Mainīt notikumu'; +$labels['removeeventconfirm'] = 'Dzēst notikumu'; +$labels['changerecurringeventwarning'] = 'Šis ir periodisks notikums. Vai vēlaties labot tikai šo notikumu, šo un visus šos nākotnes notikumus, visus šos notikumus, vai arī saglabāt šo kā jaunu notikumu?'; +$labels['removerecurringeventwarning'] = 'Šis ir periodisks notikums. Vai vēlaties dzēst tikai šo notikumu, šo un visus šos nākotnes notikumus vai arī visus šos notikumus?'; +$labels['removerecurringallonly'] = 'Šis ir periodisks notikums. Kā dalībnieks jūs varat tikai dzēst šo notikumu pilnībā.'; +$labels['currentevent'] = 'Pašreizējais'; +$labels['futurevents'] = 'Nākotne'; +$labels['allevents'] = 'Visi'; +$labels['saveasnew'] = 'Saglabāt kā jaunu'; +$labels['birthdays'] = 'Dzimšanas dienas'; +$labels['birthdayscalendar'] = 'Dzimšanas dienu kalendārs'; +$labels['displaybirthdayscalendar'] = 'Rādīt dzimšanas dienu kalendāru'; +$labels['birthdayscalendarsources'] = 'No šīm adrešu grāmatām'; +$labels['birthdayeventtitle'] = '$name dzimšanas diena'; +$labels['birthdayage'] = 'Vecums $age'; +$labels['objectchangelog'] = 'Mainīt vēsturi'; +$labels['objectdiff'] = 'Izmaiņas no $rev1 uz $rev2'; +$labels['objectnotfound'] = 'Kļūda ielādējot notikuma datus'; +$labels['objectchangelognotavailable'] = 'Šī notikuma vēsturi mainīt nevar'; +$labels['objectdiffnotavailable'] = 'Izvēlētās versijas nav salīdzināmas'; +$labels['revisionrestoreconfirm'] = 'Vai tiešām vēlaties atjaunot šī notikuma $rev. versiju? Šī darbība aizstās pašreizējo notikumu ar veco versiju.'; +$labels['objectrestoresuccess'] = 'Versija $rev veiksmīgi atjaunota'; +$labels['objectrestoreerror'] = 'Kļūda atjaunojot veco versiju'; +$labels['arialabelminical'] = 'Kalendāra datuma izvēle'; +$labels['arialabelcalendarview'] = 'Kalendāra skats'; +$labels['arialabelsearchform'] = 'Notikumu meklēšanas forma'; +$labels['arialabelquicksearchbox'] = 'Notikumu meklēšanas ievadlauks'; +$labels['arialabelcalsearchform'] = 'Kalendāru meklēšanas forma'; +$labels['calendaractions'] = 'Darbības ar kalendāru'; +$labels['arialabeleventattendees'] = 'Dalībnieku saraksts'; +$labels['arialabeleventresources'] = 'Resursu saraksts'; +$labels['arialabelresourcesearchform'] = 'Resursu meklēšanas forma'; +$labels['arialabelresourceselection'] = 'Pieejamie resursi'; +?> diff --git a/localization/pl.inc b/localization/pl.inc deleted file mode 100644 index 82c4deb..0000000 --- a/localization/pl.inc +++ /dev/null @@ -1,103 +0,0 @@ - diff --git a/localization/ro.inc b/localization/ro.inc deleted file mode 100644 index 96325b5..0000000 --- a/localization/ro.inc +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/localization/sv.inc b/localization/sv.inc deleted file mode 100644 index 96325b5..0000000 --- a/localization/sv.inc +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/localization/tr_TR.inc b/localization/tr_TR.inc deleted file mode 100644 index 96325b5..0000000 --- a/localization/tr_TR.inc +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/localization/vi.inc b/localization/vi.inc deleted file mode 100644 index 036f184..0000000 --- a/localization/vi.inc +++ /dev/null @@ -1,272 +0,0 @@ -CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; -$labels['findcalendars'] = 'Find calendars...'; -$labels['searchterms'] = 'Search terms'; -$labels['calsearchresults'] = 'Available Calendars'; -$labels['calendarsubscribe'] = 'List permanently'; -$labels['nocalendarsfound'] = 'No calendars found'; -$labels['nrcalendarsfound'] = '$nr calendars found'; -$labels['quickview'] = 'View only this calendar'; -$labels['invitationspending'] = 'Pending invitations'; -$labels['invitationsdeclined'] = 'Declined invitations'; -$labels['changepartstat'] = 'Change participant status'; -$labels['rsvpcomment'] = 'Invitation text'; -$labels['listrange'] = 'Range to display:'; -$labels['listsections'] = 'Divide into:'; -$labels['smartsections'] = 'Smart sections'; -$labels['until'] = 'until'; -$labels['today'] = 'Today'; -$labels['tomorrow'] = 'Tomorrow'; -$labels['thisweek'] = 'This week'; -$labels['nextweek'] = 'Next week'; -$labels['prevweek'] = 'Previous week'; -$labels['thismonth'] = 'This month'; -$labels['nextmonth'] = 'Next month'; -$labels['weekofyear'] = 'Week'; -$labels['pastevents'] = 'Past'; -$labels['futureevents'] = 'Future'; -$labels['showalarms'] = 'Show reminders'; -$labels['defaultalarmtype'] = 'Default reminder setting'; -$labels['defaultalarmoffset'] = 'Default reminder time'; -$labels['attendee'] = 'Participant'; -$labels['role'] = 'Role'; -$labels['availability'] = 'Avail.'; -$labels['confirmstate'] = 'Status'; -$labels['addattendee'] = 'Add participant'; -$labels['roleorganizer'] = 'Organizer'; -$labels['rolerequired'] = 'Required'; -$labels['roleoptional'] = 'Optional'; -$labels['rolechair'] = 'Chair'; -$labels['rolenonparticipant'] = 'Absent'; -$labels['cutypeindividual'] = 'Individual'; -$labels['cutypegroup'] = 'Group'; -$labels['cutyperesource'] = 'Resource'; -$labels['cutyperoom'] = 'Room'; -$labels['availfree'] = 'Free'; -$labels['availbusy'] = 'Busy'; -$labels['availunknown'] = 'Unknown'; -$labels['availtentative'] = 'Tentative'; -$labels['availoutofoffice'] = 'Out of Office'; -$labels['delegatedto'] = 'Delegated to: '; -$labels['delegatedfrom'] = 'Delegated from: '; -$labels['scheduletime'] = 'Find availability'; -$labels['sendinvitations'] = 'Send invitations'; -$labels['sendnotifications'] = 'Notify participants about modifications'; -$labels['sendcancellation'] = 'Notify participants about event cancellation'; -$labels['onlyworkinghours'] = 'Find availability within my working hours'; -$labels['reqallattendees'] = 'Required/all participants'; -$labels['prevslot'] = 'Previous Slot'; -$labels['nextslot'] = 'Next Slot'; -$labels['suggestedslot'] = 'Suggested Slot'; -$labels['noslotfound'] = 'Unable to find a free time slot'; -$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; -$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; -$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; -$labels['eventupdatesubject'] = '"$title" has been updated'; -$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; -$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; -$labels['eventcancelsubject'] = '"$title" has been canceled'; -$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; -$labels['itipobjectnotfound'] = 'The event referred by this message was not found in your calendar.'; -$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodycancel'] = "\$sender has rejected your participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegated'] = "\$sender has delegated the participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegatedto'] = "\$sender has delegated the participation in the following event to you:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; -$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; -$labels['itipcomment'] = 'Invitation/notification comment'; -$labels['itipcommenttitle'] = 'This comment will be attached to the invitation/notification message sent to participants'; -$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; -$labels['eventcancelled'] = 'The event has been cancelled'; -$labels['saveincalendar'] = 'save in'; -$labels['updatemycopy'] = 'Update in my calendar'; -$labels['savetocalendar'] = 'Save to calendar'; -$labels['openpreview'] = 'Check Calendar'; -$labels['noearlierevents'] = 'No earlier events'; -$labels['nolaterevents'] = 'No later events'; -$labels['resource'] = 'Resource'; -$labels['addresource'] = 'Book resource'; -$labels['findresources'] = 'Find resources'; -$labels['resourcedetails'] = 'Details'; -$labels['resourceavailability'] = 'Availability'; -$labels['resourceowner'] = 'Owner'; -$labels['resourceadded'] = 'The resource was added to your event'; -$labels['tabsummary'] = 'Summary'; -$labels['tabrecurrence'] = 'Recurrence'; -$labels['tabattendees'] = 'Participants'; -$labels['tabresources'] = 'Resources'; -$labels['tabattachments'] = 'Attachments'; -$labels['tabsharing'] = 'Sharing'; -$labels['deleteobjectconfirm'] = 'Do you really want to delete this event?'; -$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; -$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; -$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; -$labels['savingdata'] = 'Saving data...'; -$labels['errorsaving'] = 'Failed to save changes.'; -$labels['operationfailed'] = 'The requested operation failed.'; -$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; -$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; -$labels['searchnoresults'] = 'No events found in the selected calendars.'; -$labels['successremoval'] = 'The event has been deleted successfully.'; -$labels['successrestore'] = 'The event has been restored successfully.'; -$labels['errornotifying'] = 'Failed to send notifications to event participants'; -$labels['errorimportingevent'] = 'Failed to import the event'; -$labels['importwarningexists'] = 'A copy of this event already exists in your calendar.'; -$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; -$labels['nowritecalendarfound'] = 'No calendar found to save the event'; -$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; -$labels['updatedsuccessfully'] = 'The event was successfully updated in \'$calendar\''; -$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; -$labels['itipsendsuccess'] = 'Invitation sent to participants.'; -$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; -$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; -$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; -$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; -$labels['importsuccess'] = 'Successfully imported $nr events'; -$labels['importnone'] = 'No events found to be imported'; -$labels['importerror'] = 'An error occured while importing'; -$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; -$labels['changeeventconfirm'] = 'Change event'; -$labels['removeeventconfirm'] = 'Delete event'; -$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; -$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to delete the current event only, this and all future occurences or all occurences of this event?'; -$labels['currentevent'] = 'Current'; -$labels['futurevents'] = 'Future'; -$labels['allevents'] = 'All'; -$labels['saveasnew'] = 'Save as new'; -$labels['birthdays'] = 'Birthdays'; -$labels['birthdayscalendar'] = 'Birthdays Calendar'; -$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; -$labels['birthdayscalendarsources'] = 'From these address books'; -$labels['birthdayeventtitle'] = '$name\'s Birthday'; -$labels['birthdayage'] = 'Age $age'; -$labels['eventchangelog'] = 'Change History'; -$labels['eventdiff'] = 'Changes from revisions $rev'; -$labels['revision'] = 'Revision'; -$labels['user'] = 'User'; -$labels['operation'] = 'Action'; -$labels['actionappend'] = 'Saved'; -$labels['actionmove'] = 'Moved'; -$labels['actiondelete'] = 'Deleted'; -$labels['compare'] = 'Compare'; -$labels['showrevision'] = 'Show this version'; -$labels['restore'] = 'Restore this version'; -$labels['eventnotfound'] = 'Failed to load event data'; -$labels['eventchangelognotavailable'] = 'Change history is not available for this event'; -$labels['eventdiffnotavailable'] = 'No comparison possible for the selected revisions'; -$labels['eventrestoreconfirm'] = 'Do you really want to restore revision $rev of this event? This will replace the current event with the old version.'; -$labels['arialabelminical'] = 'Calendar date selection'; -$labels['arialabelcalendarview'] = 'Calendar view'; -$labels['arialabelsearchform'] = 'Event search form'; -$labels['arialabelquicksearchbox'] = 'Event search input'; -$labels['arialabelcalsearchform'] = 'Calendars search form'; -$labels['calendaractions'] = 'Calendar actions'; -$labels['arialabeleventattendees'] = 'Event participants list'; -$labels['arialabeleventresources'] = 'Event resources list'; -$labels['arialabelresourcesearchform'] = 'Resources search form'; -$labels['arialabelresourceselection'] = 'Available resources'; -?> diff --git a/localization/vi_VN.inc b/localization/vi_VN.inc deleted file mode 100644 index 036f184..0000000 --- a/localization/vi_VN.inc +++ /dev/null @@ -1,272 +0,0 @@ -CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; -$labels['findcalendars'] = 'Find calendars...'; -$labels['searchterms'] = 'Search terms'; -$labels['calsearchresults'] = 'Available Calendars'; -$labels['calendarsubscribe'] = 'List permanently'; -$labels['nocalendarsfound'] = 'No calendars found'; -$labels['nrcalendarsfound'] = '$nr calendars found'; -$labels['quickview'] = 'View only this calendar'; -$labels['invitationspending'] = 'Pending invitations'; -$labels['invitationsdeclined'] = 'Declined invitations'; -$labels['changepartstat'] = 'Change participant status'; -$labels['rsvpcomment'] = 'Invitation text'; -$labels['listrange'] = 'Range to display:'; -$labels['listsections'] = 'Divide into:'; -$labels['smartsections'] = 'Smart sections'; -$labels['until'] = 'until'; -$labels['today'] = 'Today'; -$labels['tomorrow'] = 'Tomorrow'; -$labels['thisweek'] = 'This week'; -$labels['nextweek'] = 'Next week'; -$labels['prevweek'] = 'Previous week'; -$labels['thismonth'] = 'This month'; -$labels['nextmonth'] = 'Next month'; -$labels['weekofyear'] = 'Week'; -$labels['pastevents'] = 'Past'; -$labels['futureevents'] = 'Future'; -$labels['showalarms'] = 'Show reminders'; -$labels['defaultalarmtype'] = 'Default reminder setting'; -$labels['defaultalarmoffset'] = 'Default reminder time'; -$labels['attendee'] = 'Participant'; -$labels['role'] = 'Role'; -$labels['availability'] = 'Avail.'; -$labels['confirmstate'] = 'Status'; -$labels['addattendee'] = 'Add participant'; -$labels['roleorganizer'] = 'Organizer'; -$labels['rolerequired'] = 'Required'; -$labels['roleoptional'] = 'Optional'; -$labels['rolechair'] = 'Chair'; -$labels['rolenonparticipant'] = 'Absent'; -$labels['cutypeindividual'] = 'Individual'; -$labels['cutypegroup'] = 'Group'; -$labels['cutyperesource'] = 'Resource'; -$labels['cutyperoom'] = 'Room'; -$labels['availfree'] = 'Free'; -$labels['availbusy'] = 'Busy'; -$labels['availunknown'] = 'Unknown'; -$labels['availtentative'] = 'Tentative'; -$labels['availoutofoffice'] = 'Out of Office'; -$labels['delegatedto'] = 'Delegated to: '; -$labels['delegatedfrom'] = 'Delegated from: '; -$labels['scheduletime'] = 'Find availability'; -$labels['sendinvitations'] = 'Send invitations'; -$labels['sendnotifications'] = 'Notify participants about modifications'; -$labels['sendcancellation'] = 'Notify participants about event cancellation'; -$labels['onlyworkinghours'] = 'Find availability within my working hours'; -$labels['reqallattendees'] = 'Required/all participants'; -$labels['prevslot'] = 'Previous Slot'; -$labels['nextslot'] = 'Next Slot'; -$labels['suggestedslot'] = 'Suggested Slot'; -$labels['noslotfound'] = 'Unable to find a free time slot'; -$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; -$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; -$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; -$labels['eventupdatesubject'] = '"$title" has been updated'; -$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; -$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; -$labels['eventcancelsubject'] = '"$title" has been canceled'; -$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; -$labels['itipobjectnotfound'] = 'The event referred by this message was not found in your calendar.'; -$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodycancel'] = "\$sender has rejected your participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegated'] = "\$sender has delegated the participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegatedto'] = "\$sender has delegated the participation in the following event to you:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; -$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; -$labels['itipcomment'] = 'Invitation/notification comment'; -$labels['itipcommenttitle'] = 'This comment will be attached to the invitation/notification message sent to participants'; -$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; -$labels['eventcancelled'] = 'The event has been cancelled'; -$labels['saveincalendar'] = 'save in'; -$labels['updatemycopy'] = 'Update in my calendar'; -$labels['savetocalendar'] = 'Save to calendar'; -$labels['openpreview'] = 'Check Calendar'; -$labels['noearlierevents'] = 'No earlier events'; -$labels['nolaterevents'] = 'No later events'; -$labels['resource'] = 'Resource'; -$labels['addresource'] = 'Book resource'; -$labels['findresources'] = 'Find resources'; -$labels['resourcedetails'] = 'Details'; -$labels['resourceavailability'] = 'Availability'; -$labels['resourceowner'] = 'Owner'; -$labels['resourceadded'] = 'The resource was added to your event'; -$labels['tabsummary'] = 'Summary'; -$labels['tabrecurrence'] = 'Recurrence'; -$labels['tabattendees'] = 'Participants'; -$labels['tabresources'] = 'Resources'; -$labels['tabattachments'] = 'Attachments'; -$labels['tabsharing'] = 'Sharing'; -$labels['deleteobjectconfirm'] = 'Do you really want to delete this event?'; -$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; -$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; -$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; -$labels['savingdata'] = 'Saving data...'; -$labels['errorsaving'] = 'Failed to save changes.'; -$labels['operationfailed'] = 'The requested operation failed.'; -$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; -$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; -$labels['searchnoresults'] = 'No events found in the selected calendars.'; -$labels['successremoval'] = 'The event has been deleted successfully.'; -$labels['successrestore'] = 'The event has been restored successfully.'; -$labels['errornotifying'] = 'Failed to send notifications to event participants'; -$labels['errorimportingevent'] = 'Failed to import the event'; -$labels['importwarningexists'] = 'A copy of this event already exists in your calendar.'; -$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; -$labels['nowritecalendarfound'] = 'No calendar found to save the event'; -$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; -$labels['updatedsuccessfully'] = 'The event was successfully updated in \'$calendar\''; -$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; -$labels['itipsendsuccess'] = 'Invitation sent to participants.'; -$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; -$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; -$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; -$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; -$labels['importsuccess'] = 'Successfully imported $nr events'; -$labels['importnone'] = 'No events found to be imported'; -$labels['importerror'] = 'An error occured while importing'; -$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; -$labels['changeeventconfirm'] = 'Change event'; -$labels['removeeventconfirm'] = 'Delete event'; -$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; -$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to delete the current event only, this and all future occurences or all occurences of this event?'; -$labels['currentevent'] = 'Current'; -$labels['futurevents'] = 'Future'; -$labels['allevents'] = 'All'; -$labels['saveasnew'] = 'Save as new'; -$labels['birthdays'] = 'Birthdays'; -$labels['birthdayscalendar'] = 'Birthdays Calendar'; -$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; -$labels['birthdayscalendarsources'] = 'From these address books'; -$labels['birthdayeventtitle'] = '$name\'s Birthday'; -$labels['birthdayage'] = 'Age $age'; -$labels['eventchangelog'] = 'Change History'; -$labels['eventdiff'] = 'Changes from revisions $rev'; -$labels['revision'] = 'Revision'; -$labels['user'] = 'User'; -$labels['operation'] = 'Action'; -$labels['actionappend'] = 'Saved'; -$labels['actionmove'] = 'Moved'; -$labels['actiondelete'] = 'Deleted'; -$labels['compare'] = 'Compare'; -$labels['showrevision'] = 'Show this version'; -$labels['restore'] = 'Restore this version'; -$labels['eventnotfound'] = 'Failed to load event data'; -$labels['eventchangelognotavailable'] = 'Change history is not available for this event'; -$labels['eventdiffnotavailable'] = 'No comparison possible for the selected revisions'; -$labels['eventrestoreconfirm'] = 'Do you really want to restore revision $rev of this event? This will replace the current event with the old version.'; -$labels['arialabelminical'] = 'Calendar date selection'; -$labels['arialabelcalendarview'] = 'Calendar view'; -$labels['arialabelsearchform'] = 'Event search form'; -$labels['arialabelquicksearchbox'] = 'Event search input'; -$labels['arialabelcalsearchform'] = 'Calendars search form'; -$labels['calendaractions'] = 'Calendar actions'; -$labels['arialabeleventattendees'] = 'Event participants list'; -$labels['arialabeleventresources'] = 'Event resources list'; -$labels['arialabelresourcesearchform'] = 'Resources search form'; -$labels['arialabelresourceselection'] = 'Available resources'; -?> diff --git a/localization/zh_TW.inc b/localization/zh_TW.inc deleted file mode 100644 index 036f184..0000000 --- a/localization/zh_TW.inc +++ /dev/null @@ -1,272 +0,0 @@ -CalDAV client application (e.g. Evolution or Mozilla Thunderbird) to fully synchronize this specific calendar with your computer or mobile device.'; -$labels['findcalendars'] = 'Find calendars...'; -$labels['searchterms'] = 'Search terms'; -$labels['calsearchresults'] = 'Available Calendars'; -$labels['calendarsubscribe'] = 'List permanently'; -$labels['nocalendarsfound'] = 'No calendars found'; -$labels['nrcalendarsfound'] = '$nr calendars found'; -$labels['quickview'] = 'View only this calendar'; -$labels['invitationspending'] = 'Pending invitations'; -$labels['invitationsdeclined'] = 'Declined invitations'; -$labels['changepartstat'] = 'Change participant status'; -$labels['rsvpcomment'] = 'Invitation text'; -$labels['listrange'] = 'Range to display:'; -$labels['listsections'] = 'Divide into:'; -$labels['smartsections'] = 'Smart sections'; -$labels['until'] = 'until'; -$labels['today'] = 'Today'; -$labels['tomorrow'] = 'Tomorrow'; -$labels['thisweek'] = 'This week'; -$labels['nextweek'] = 'Next week'; -$labels['prevweek'] = 'Previous week'; -$labels['thismonth'] = 'This month'; -$labels['nextmonth'] = 'Next month'; -$labels['weekofyear'] = 'Week'; -$labels['pastevents'] = 'Past'; -$labels['futureevents'] = 'Future'; -$labels['showalarms'] = 'Show reminders'; -$labels['defaultalarmtype'] = 'Default reminder setting'; -$labels['defaultalarmoffset'] = 'Default reminder time'; -$labels['attendee'] = 'Participant'; -$labels['role'] = 'Role'; -$labels['availability'] = 'Avail.'; -$labels['confirmstate'] = 'Status'; -$labels['addattendee'] = 'Add participant'; -$labels['roleorganizer'] = 'Organizer'; -$labels['rolerequired'] = 'Required'; -$labels['roleoptional'] = 'Optional'; -$labels['rolechair'] = 'Chair'; -$labels['rolenonparticipant'] = 'Absent'; -$labels['cutypeindividual'] = 'Individual'; -$labels['cutypegroup'] = 'Group'; -$labels['cutyperesource'] = 'Resource'; -$labels['cutyperoom'] = 'Room'; -$labels['availfree'] = 'Free'; -$labels['availbusy'] = 'Busy'; -$labels['availunknown'] = 'Unknown'; -$labels['availtentative'] = 'Tentative'; -$labels['availoutofoffice'] = 'Out of Office'; -$labels['delegatedto'] = 'Delegated to: '; -$labels['delegatedfrom'] = 'Delegated from: '; -$labels['scheduletime'] = 'Find availability'; -$labels['sendinvitations'] = 'Send invitations'; -$labels['sendnotifications'] = 'Notify participants about modifications'; -$labels['sendcancellation'] = 'Notify participants about event cancellation'; -$labels['onlyworkinghours'] = 'Find availability within my working hours'; -$labels['reqallattendees'] = 'Required/all participants'; -$labels['prevslot'] = 'Previous Slot'; -$labels['nextslot'] = 'Next Slot'; -$labels['suggestedslot'] = 'Suggested Slot'; -$labels['noslotfound'] = 'Unable to find a free time slot'; -$labels['invitationsubject'] = 'You\'ve been invited to "$title"'; -$labels['invitationmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with all the event details which you can import to your calendar application."; -$labels['invitationattendlinks'] = "In case your email client doesn't support iTip requests you can use the following link to either accept or decline this invitation:\n\$url"; -$labels['eventupdatesubject'] = '"$title" has been updated'; -$labels['eventupdatesubjectempty'] = 'An event that concerns you has been updated'; -$labels['eventupdatemailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nPlease find attached an iCalendar file with the updated event details which you can import to your calendar application."; -$labels['eventcancelsubject'] = '"$title" has been canceled'; -$labels['eventcancelmailbody'] = "*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees\n\nThe event has been cancelled by \$organizer.\n\nPlease find attached an iCalendar file with the updated event details."; -$labels['itipobjectnotfound'] = 'The event referred by this message was not found in your calendar.'; -$labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; -$labels['itipmailbodycancel'] = "\$sender has rejected your participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegated'] = "\$sender has delegated the participation in the following event:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipmailbodydelegatedto'] = "\$sender has delegated the participation in the following event to you:\n\n*\$title*\n\nWhen: \$date"; -$labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; -$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; -$labels['itipcomment'] = 'Invitation/notification comment'; -$labels['itipcommenttitle'] = 'This comment will be attached to the invitation/notification message sent to participants'; -$labels['notanattendee'] = 'You\'re not listed as an attendee of this event'; -$labels['eventcancelled'] = 'The event has been cancelled'; -$labels['saveincalendar'] = 'save in'; -$labels['updatemycopy'] = 'Update in my calendar'; -$labels['savetocalendar'] = 'Save to calendar'; -$labels['openpreview'] = 'Check Calendar'; -$labels['noearlierevents'] = 'No earlier events'; -$labels['nolaterevents'] = 'No later events'; -$labels['resource'] = 'Resource'; -$labels['addresource'] = 'Book resource'; -$labels['findresources'] = 'Find resources'; -$labels['resourcedetails'] = 'Details'; -$labels['resourceavailability'] = 'Availability'; -$labels['resourceowner'] = 'Owner'; -$labels['resourceadded'] = 'The resource was added to your event'; -$labels['tabsummary'] = 'Summary'; -$labels['tabrecurrence'] = 'Recurrence'; -$labels['tabattendees'] = 'Participants'; -$labels['tabresources'] = 'Resources'; -$labels['tabattachments'] = 'Attachments'; -$labels['tabsharing'] = 'Sharing'; -$labels['deleteobjectconfirm'] = 'Do you really want to delete this event?'; -$labels['deleteventconfirm'] = 'Do you really want to delete this event?'; -$labels['deletecalendarconfirm'] = 'Do you really want to delete this calendar with all its events?'; -$labels['deletecalendarconfirmrecursive'] = 'Do you really want to delete this calendar with all its events and sub-calendars?'; -$labels['savingdata'] = 'Saving data...'; -$labels['errorsaving'] = 'Failed to save changes.'; -$labels['operationfailed'] = 'The requested operation failed.'; -$labels['invalideventdates'] = 'Invalid dates entered! Please check your input.'; -$labels['invalidcalendarproperties'] = 'Invalid calendar properties! Please set a valid name.'; -$labels['searchnoresults'] = 'No events found in the selected calendars.'; -$labels['successremoval'] = 'The event has been deleted successfully.'; -$labels['successrestore'] = 'The event has been restored successfully.'; -$labels['errornotifying'] = 'Failed to send notifications to event participants'; -$labels['errorimportingevent'] = 'Failed to import the event'; -$labels['importwarningexists'] = 'A copy of this event already exists in your calendar.'; -$labels['newerversionexists'] = 'A newer version of this event already exists! Aborted.'; -$labels['nowritecalendarfound'] = 'No calendar found to save the event'; -$labels['importedsuccessfully'] = 'The event was successfully added to \'$calendar\''; -$labels['updatedsuccessfully'] = 'The event was successfully updated in \'$calendar\''; -$labels['attendeupdateesuccess'] = 'Successfully updated the participant\'s status'; -$labels['itipsendsuccess'] = 'Invitation sent to participants.'; -$labels['itipresponseerror'] = 'Failed to send the response to this event invitation'; -$labels['itipinvalidrequest'] = 'This invitation is no longer valid'; -$labels['sentresponseto'] = 'Successfully sent invitation response to $mailto'; -$labels['localchangeswarning'] = 'You are about to make changes that will only be reflected on your calendar and not be sent to the organizer of the event.'; -$labels['importsuccess'] = 'Successfully imported $nr events'; -$labels['importnone'] = 'No events found to be imported'; -$labels['importerror'] = 'An error occured while importing'; -$labels['aclnorights'] = 'You do not have administrator rights on this calendar.'; -$labels['changeeventconfirm'] = 'Change event'; -$labels['removeeventconfirm'] = 'Delete event'; -$labels['changerecurringeventwarning'] = 'This is a recurring event. Would you like to edit the current event only, this and all future occurences, all occurences or save it as a new event?'; -$labels['removerecurringeventwarning'] = 'This is a recurring event. Would you like to delete the current event only, this and all future occurences or all occurences of this event?'; -$labels['currentevent'] = 'Current'; -$labels['futurevents'] = 'Future'; -$labels['allevents'] = 'All'; -$labels['saveasnew'] = 'Save as new'; -$labels['birthdays'] = 'Birthdays'; -$labels['birthdayscalendar'] = 'Birthdays Calendar'; -$labels['displaybirthdayscalendar'] = 'Display birthdays calendar'; -$labels['birthdayscalendarsources'] = 'From these address books'; -$labels['birthdayeventtitle'] = '$name\'s Birthday'; -$labels['birthdayage'] = 'Age $age'; -$labels['eventchangelog'] = 'Change History'; -$labels['eventdiff'] = 'Changes from revisions $rev'; -$labels['revision'] = 'Revision'; -$labels['user'] = 'User'; -$labels['operation'] = 'Action'; -$labels['actionappend'] = 'Saved'; -$labels['actionmove'] = 'Moved'; -$labels['actiondelete'] = 'Deleted'; -$labels['compare'] = 'Compare'; -$labels['showrevision'] = 'Show this version'; -$labels['restore'] = 'Restore this version'; -$labels['eventnotfound'] = 'Failed to load event data'; -$labels['eventchangelognotavailable'] = 'Change history is not available for this event'; -$labels['eventdiffnotavailable'] = 'No comparison possible for the selected revisions'; -$labels['eventrestoreconfirm'] = 'Do you really want to restore revision $rev of this event? This will replace the current event with the old version.'; -$labels['arialabelminical'] = 'Calendar date selection'; -$labels['arialabelcalendarview'] = 'Calendar view'; -$labels['arialabelsearchform'] = 'Event search form'; -$labels['arialabelquicksearchbox'] = 'Event search input'; -$labels['arialabelcalsearchform'] = 'Calendars search form'; -$labels['calendaractions'] = 'Calendar actions'; -$labels['arialabeleventattendees'] = 'Event participants list'; -$labels['arialabeleventresources'] = 'Event resources list'; -$labels['arialabelresourcesearchform'] = 'Resources search form'; -$labels['arialabelresourceselection'] = 'Available resources'; -?> diff --git a/skins/classic/calendar.css b/skins/classic/calendar.css index 73be0ab..67de374 100644 --- a/skins/classic/calendar.css +++ b/skins/classic/calendar.css @@ -1495,6 +1495,12 @@ span.spacer { font-weight: bold; } +.fc-needs-action, +.fc-declined, +.cal-event-status-cancelled { + opacity: 0.6; +} + .cal-event-status-cancelled .fc-event-title { text-decoration: line-through; } diff --git a/skins/classic/images/badge_confidential.gif b/skins/classic/images/badge_confidential.gif deleted file mode 100644 index ce6b2a0..0000000 Binary files a/skins/classic/images/badge_confidential.gif and /dev/null differ diff --git a/skins/classic/images/badge_confidential.png b/skins/classic/images/badge_confidential.png deleted file mode 100644 index e12e788..0000000 Binary files a/skins/classic/images/badge_confidential.png and /dev/null differ diff --git a/skins/classic/images/badge_private.gif b/skins/classic/images/badge_private.gif deleted file mode 100644 index 900ed73..0000000 Binary files a/skins/classic/images/badge_private.gif and /dev/null differ diff --git a/skins/classic/images/badge_private.png b/skins/classic/images/badge_private.png deleted file mode 100644 index acf3207..0000000 Binary files a/skins/classic/images/badge_private.png and /dev/null differ diff --git a/skins/classic/images/minicolors-all.png b/skins/classic/images/minicolors-all.png deleted file mode 100644 index 001ed88..0000000 Binary files a/skins/classic/images/minicolors-all.png and /dev/null differ diff --git a/skins/classic/images/minicolors-handles.gif b/skins/classic/images/minicolors-handles.gif deleted file mode 100644 index 9aa9f75..0000000 Binary files a/skins/classic/images/minicolors-handles.gif and /dev/null differ diff --git a/skins/classic/jquery.miniColors.css b/skins/classic/jquery.miniColors.css deleted file mode 100644 index d9c4710..0000000 --- a/skins/classic/jquery.miniColors.css +++ /dev/null @@ -1,106 +0,0 @@ -.miniColors-trigger { - height: 22px; - width: 22px; - background: url('images/minicolors-all.png') -170px 0 no-repeat; - vertical-align: middle; - margin: 0 .25em; - display: inline-block; - outline: none; -} - -.miniColors-selector { - position: absolute; - width: 175px; - height: 150px; - background: #FFF; - border: solid 1px #BBB; - -moz-box-shadow: 0 0 6px rgba(0, 0, 0, .25); - -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, .25); - box-shadow: 0 0 6px rgba(0, 0, 0, .25); - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - padding: 5px; - z-index: 999999; -} - -.miniColors-selector.black { - background: #000; - border-color: #000; -} - -.miniColors-colors { - position: absolute; - top: 5px; - left: 5px; - width: 150px; - height: 150px; - background: url('images/minicolors-all.png') top left no-repeat; - cursor: crosshair; -} - -.miniColors-hues { - position: absolute; - top: 5px; - left: 160px; - width: 20px; - height: 150px; - background: url('images/minicolors-all.png') -150px 0 no-repeat; - cursor: crosshair; -} - -.miniColors-colorPicker { - position: absolute; - width: 11px; - height: 11px; - background: url('images/minicolors-all.png') -170px -28px no-repeat; -} - -.miniColors-huePicker { - position: absolute; - left: -3px; - width: 26px; - height: 3px; - background: url('images/minicolors-all.png') -170px -24px no-repeat; - overflow: hidden; -} - -.miniColors-presets { - position: absolute; - left: 185px; - top: 5px; - width: 60px; -} - -.miniColors-colorPreset { - float: left; - width: 18px; - height: 15px; - margin: 2px; - border: 1px solid #333; - cursor: pointer; -} - -.miniColors-colorPreset-active { - border: 2px dotted #666; - margin: 1px; -} - -/* Hacks for IE6/7 */ - -* html .miniColors-colors { - background-image: none; - filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='plugins/calendar/skins/classic/images/minicolors-all.png', sizingMethod='crop'); -} - -* html .miniColors-colorPicker { - background: url('images/minicolors-handles.gif') 0 -28px no-repeat; -} - -* html .miniColors-huePicker { - background: url('images/minicolors-handles.gif') 0 -24px no-repeat; -} - -* html .miniColors-trigger { - background: url('images/minicolors-handles.gif') 0 0 no-repeat; -} diff --git a/skins/larry/calendar.css b/skins/larry/calendar.css index 74da6c3..e3497ba 100644 --- a/skins/larry/calendar.css +++ b/skins/larry/calendar.css @@ -433,6 +433,7 @@ pre { background-color: #c7e3ef; } +#fburl, #calfeedurl, #caldavurl { width: 98%; @@ -794,8 +795,7 @@ a.miniColors-trigger { } .calendarmain .eventdialog div.event-line { - margin-top: 0.1em; - margin-bottom: 0.3em; + margin-bottom: 0.4em; white-space: nowrap; overflow-x: hidden; text-overflow: ellipsis; @@ -1945,6 +1945,12 @@ a.dropdown-link:after { font-weight: bold; } +.fc-needs-action, +.fc-declined, +.cal-event-status-cancelled { + opacity: 0.6; +} + .cal-event-status-cancelled .fc-event-title { text-decoration: line-through; } @@ -2238,6 +2244,7 @@ div.calendar-invitebox .rsvp-status.delegated { background-position: 2px -180px; } +#event-partstat .changersvp.unknown, #event-partstat .changersvp.needs-action, div.calendar-invitebox .rsvp-status.needs-action { background-position: 2px 0; diff --git a/skins/larry/images/attendee-status.gif b/skins/larry/images/attendee-status.gif deleted file mode 100644 index 5c08aae..0000000 Binary files a/skins/larry/images/attendee-status.gif and /dev/null differ diff --git a/skins/larry/images/badge_cancelled.png b/skins/larry/images/badge_cancelled.png deleted file mode 100644 index 2eb4878..0000000 Binary files a/skins/larry/images/badge_cancelled.png and /dev/null differ diff --git a/skins/larry/images/badge_confidential.png b/skins/larry/images/badge_confidential.png deleted file mode 100644 index 04a2052..0000000 Binary files a/skins/larry/images/badge_confidential.png and /dev/null differ diff --git a/skins/larry/images/badge_private.png b/skins/larry/images/badge_private.png deleted file mode 100644 index 52e4dbe..0000000 Binary files a/skins/larry/images/badge_private.png and /dev/null differ diff --git a/skins/larry/images/minicolors-all.png b/skins/larry/images/minicolors-all.png deleted file mode 100644 index 001ed88..0000000 Binary files a/skins/larry/images/minicolors-all.png and /dev/null differ diff --git a/skins/larry/images/minicolors-handles.gif b/skins/larry/images/minicolors-handles.gif deleted file mode 100644 index 9aa9f75..0000000 Binary files a/skins/larry/images/minicolors-handles.gif and /dev/null differ diff --git a/skins/larry/jquery.miniColors.css b/skins/larry/jquery.miniColors.css deleted file mode 100644 index d9c4710..0000000 --- a/skins/larry/jquery.miniColors.css +++ /dev/null @@ -1,106 +0,0 @@ -.miniColors-trigger { - height: 22px; - width: 22px; - background: url('images/minicolors-all.png') -170px 0 no-repeat; - vertical-align: middle; - margin: 0 .25em; - display: inline-block; - outline: none; -} - -.miniColors-selector { - position: absolute; - width: 175px; - height: 150px; - background: #FFF; - border: solid 1px #BBB; - -moz-box-shadow: 0 0 6px rgba(0, 0, 0, .25); - -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, .25); - box-shadow: 0 0 6px rgba(0, 0, 0, .25); - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - padding: 5px; - z-index: 999999; -} - -.miniColors-selector.black { - background: #000; - border-color: #000; -} - -.miniColors-colors { - position: absolute; - top: 5px; - left: 5px; - width: 150px; - height: 150px; - background: url('images/minicolors-all.png') top left no-repeat; - cursor: crosshair; -} - -.miniColors-hues { - position: absolute; - top: 5px; - left: 160px; - width: 20px; - height: 150px; - background: url('images/minicolors-all.png') -150px 0 no-repeat; - cursor: crosshair; -} - -.miniColors-colorPicker { - position: absolute; - width: 11px; - height: 11px; - background: url('images/minicolors-all.png') -170px -28px no-repeat; -} - -.miniColors-huePicker { - position: absolute; - left: -3px; - width: 26px; - height: 3px; - background: url('images/minicolors-all.png') -170px -24px no-repeat; - overflow: hidden; -} - -.miniColors-presets { - position: absolute; - left: 185px; - top: 5px; - width: 60px; -} - -.miniColors-colorPreset { - float: left; - width: 18px; - height: 15px; - margin: 2px; - border: 1px solid #333; - cursor: pointer; -} - -.miniColors-colorPreset-active { - border: 2px dotted #666; - margin: 1px; -} - -/* Hacks for IE6/7 */ - -* html .miniColors-colors { - background-image: none; - filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='plugins/calendar/skins/classic/images/minicolors-all.png', sizingMethod='crop'); -} - -* html .miniColors-colorPicker { - background: url('images/minicolors-handles.gif') 0 -28px no-repeat; -} - -* html .miniColors-huePicker { - background: url('images/minicolors-handles.gif') 0 -24px no-repeat; -} - -* html .miniColors-trigger { - background: url('images/minicolors-handles.gif') 0 0 no-repeat; -} diff --git a/skins/larry/templates/calendar.html b/skins/larry/templates/calendar.html index e7f89c2..07a4750 100644 --- a/skins/larry/templates/calendar.html +++ b/skins/larry/templates/calendar.html @@ -74,6 +74,9 @@
  • + +
  • +
  • @@ -361,6 +364,11 @@ +
    +

    + +
    +