All-in-One Event Calendar - Version 1.0.6

Version Description

Download this release

Release Info

Developer theseed
Plugin Icon 128x128 All-in-One Event Calendar
Version 1.0.6
Comparing to
See all releases

Code changes from version 1.0.5 to 1.0.6

all-in-one-event-calendar.php CHANGED
@@ -2,8 +2,8 @@
2
  /**
3
  * Plugin Name: All-in-One Event Calendar Plugin
4
  * Plugin URI: http://theseedstudio.com/software/all-in-one-event-calendar-wordpress/
5
- * Description: An events calendar system with month and agenda calendar views, color-coded categories, recurring events, and import/export of iCalendar (.ics) feeds.
6
- * Version: 1.0.5
7
  * Author: The Seed Studio
8
  * Author URI: http://theseedstudio.com/
9
  */
@@ -56,6 +56,11 @@ define( 'AI1EC_JS_PATH', AI1EC_PATH . '/js' );
56
  // ============
57
  define( 'AI1EC_LIB_PATH', AI1EC_PATH . '/lib' );
58
 
 
 
 
 
 
59
  // ============
60
  // = App Path =
61
  // ============
2
  /**
3
  * Plugin Name: All-in-One Event Calendar Plugin
4
  * Plugin URI: http://theseedstudio.com/software/all-in-one-event-calendar-wordpress/
5
+ * Description: An event calendar system with month and agenda views, upcoming events widget, color-coded categories, recurrence, and import/export of .ics feeds.
6
+ * Version: 1.0.6
7
  * Author: The Seed Studio
8
  * Author URI: http://theseedstudio.com/
9
  */
56
  // ============
57
  define( 'AI1EC_LIB_PATH', AI1EC_PATH . '/lib' );
58
 
59
+ // =================
60
+ // = Language Path =
61
+ // =================
62
+ define( 'AI1EC_LANGUAGE_PATH', AI1EC_PLUGIN_NAME . '/language' );
63
+
64
  // ============
65
  // = App Path =
66
  // ============
app/controller/class-ai1ec-app-controller.php CHANGED
@@ -62,7 +62,7 @@ class Ai1ec_App_Controller {
62
  $ai1ec_settings;
63
 
64
  // register_activation_hook
65
- register_activation_hook( AI1EC_PLUGIN_NAME . '/' . AI1EC_PLUGIN_NAME . '.php', array( &$this, 'rewrite_flush' ) );
66
 
67
  // Configure MySQL to operate in GMT time
68
  $wpdb->query( "SET time_zone = '+0:00'" );
@@ -82,6 +82,8 @@ class Ai1ec_App_Controller {
82
  add_action( 'init', array( &$this, 'parse_standalone_request' ) );
83
  // General initialization
84
  add_action( 'init', array( &$ai1ec_events_controller, 'init' ) );
 
 
85
  // Register The Event Calendar importer
86
  add_action( 'admin_init', array( &$ai1ec_importer_controller, 'register_importer' ) );
87
  // add content for our custom columns
@@ -117,7 +119,7 @@ class Ai1ec_App_Controller {
117
  // filter the post lists by custom filters
118
  add_filter( 'parse_query', array( &$ai1ec_app_helper, 'taxonomy_filter_post_type_request' ) );
119
  // Filter event post content, in single- and multi-post views
120
- add_filter( 'the_content', array( &$ai1ec_events_controller, 'event_content' ) );
121
  // Override excerpt filters for proper event display in excerpt form
122
  add_filter( 'get_the_excerpt', array( &$ai1ec_events_controller, 'event_excerpt' ), 11 );
123
  add_filter( 'the_excerpt', array( &$ai1ec_events_controller, 'event_excerpt_noautop' ), 11 );
@@ -151,6 +153,33 @@ class Ai1ec_App_Controller {
151
  // Update iCalendar feed
152
  add_action( 'wp_ajax_ai1ec_update_ics', array( &$ai1ec_settings_controller, 'update_ics_feed' ) );
153
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
 
155
  /**
156
  * rewrite_flush function
@@ -339,8 +368,9 @@ class Ai1ec_App_Controller {
339
  $this->page_content = ob_get_contents();
340
  ob_end_clean();
341
 
342
- // Replace page content
343
- add_filter( 'the_content', array( &$this, 'append_content' ) );
 
344
  }
345
  }
346
 
62
  $ai1ec_settings;
63
 
64
  // register_activation_hook
65
+ register_activation_hook( AI1EC_PLUGIN_NAME . '/' . AI1EC_PLUGIN_NAME . '.php', array( &$this, 'activation_hook' ) );
66
 
67
  // Configure MySQL to operate in GMT time
68
  $wpdb->query( "SET time_zone = '+0:00'" );
82
  add_action( 'init', array( &$this, 'parse_standalone_request' ) );
83
  // General initialization
84
  add_action( 'init', array( &$ai1ec_events_controller, 'init' ) );
85
+ // Load plugin text domain
86
+ add_action( 'init', array( &$this, 'load_textdomain' ) );
87
  // Register The Event Calendar importer
88
  add_action( 'admin_init', array( &$ai1ec_importer_controller, 'register_importer' ) );
89
  // add content for our custom columns
119
  // filter the post lists by custom filters
120
  add_filter( 'parse_query', array( &$ai1ec_app_helper, 'taxonomy_filter_post_type_request' ) );
121
  // Filter event post content, in single- and multi-post views
122
+ add_filter( 'the_content', array( &$ai1ec_events_controller, 'event_content' ), PHP_INT_MAX - 1 );
123
  // Override excerpt filters for proper event display in excerpt form
124
  add_filter( 'get_the_excerpt', array( &$ai1ec_events_controller, 'event_excerpt' ), 11 );
125
  add_filter( 'the_excerpt', array( &$ai1ec_events_controller, 'event_excerpt_noautop' ), 11 );
153
  // Update iCalendar feed
154
  add_action( 'wp_ajax_ai1ec_update_ics', array( &$ai1ec_settings_controller, 'update_ics_feed' ) );
155
  }
156
+
157
+ /**
158
+ * activation_hook function
159
+ *
160
+ * This function is called when activating the plugin
161
+ *
162
+ * @return void
163
+ **/
164
+ function activation_hook() {
165
+
166
+ // load plugin text domain
167
+ $this->load_textdomain();
168
+
169
+ // flush rewrite rules
170
+ $this->rewrite_flush();
171
+ }
172
+
173
+ /**
174
+ * load_textdomain function
175
+ *
176
+ * Loads plugin text domain
177
+ *
178
+ * @return void
179
+ **/
180
+ function load_textdomain() {
181
+ $err = load_plugin_textdomain( AI1EC_PLUGIN_NAME, false, AI1EC_LANGUAGE_PATH );
182
+ }
183
 
184
  /**
185
  * rewrite_flush function
368
  $this->page_content = ob_get_contents();
369
  ob_end_clean();
370
 
371
+ // Replace page content - make sure it happens at (almost) the very end of
372
+ // page content filters (some themes are overly ambitious here)
373
+ add_filter( 'the_content', array( &$this, 'append_content' ), PHP_INT_MAX - 1 );
374
  }
375
  }
376
 
app/controller/class-ai1ec-calendar-controller.php CHANGED
@@ -169,7 +169,7 @@ class Ai1ec_Calendar_Controller {
169
  // Validate preselected category/tag IDs
170
  $cat_ids = join( ',', array_filter( split( ',', $this->request['ai1ec_cat_ids'] ), 'is_numeric' ) );
171
  $tag_ids = join( ',', array_filter( split( ',', $this->request['ai1ec_tag_ids'] ), 'is_numeric' ) );
172
-
173
  $categories = get_terms( 'events_categories', array( 'orderby' => 'name' ) );
174
  foreach( $categories as &$cat ) {
175
  $cat->color = $ai1ec_events_helper->get_category_color_square( $cat->term_id );
@@ -217,19 +217,15 @@ class Ai1ec_Calendar_Controller {
217
 
218
  // Get components of localized time
219
  $bits = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( time() ) );
220
- // Use first day of the month as reference timestamp
221
- $timestamp = gmmktime( 0, 0, 0, $bits['mon'], 1, $bits['year'] );
222
- // Incorporate month offset into date, so we are looking at right month
223
- $timestamp = strtotime(
224
- $month_offset > 0 ? "+$month_offset months" : "$month_offset months",
225
- $timestamp );
226
 
227
  $days_events = $ai1ec_calendar_helper->get_events_for_month( $timestamp, $categories, $tags );
228
  $cell_array = $ai1ec_calendar_helper->get_month_cell_array( $timestamp, $days_events );
229
  $pagination_links = $ai1ec_calendar_helper->get_month_pagination_links( $month_offset );
230
 
231
  $view_args = array(
232
- 'title' => strftime( '%B %Y', $timestamp ),
233
  'weekdays' => $ai1ec_calendar_helper->get_weekdays(),
234
  'cell_array' => $cell_array,
235
  'pagination_links' => $pagination_links,
169
  // Validate preselected category/tag IDs
170
  $cat_ids = join( ',', array_filter( split( ',', $this->request['ai1ec_cat_ids'] ), 'is_numeric' ) );
171
  $tag_ids = join( ',', array_filter( split( ',', $this->request['ai1ec_tag_ids'] ), 'is_numeric' ) );
172
+
173
  $categories = get_terms( 'events_categories', array( 'orderby' => 'name' ) );
174
  foreach( $categories as &$cat ) {
175
  $cat->color = $ai1ec_events_helper->get_category_color_square( $cat->term_id );
217
 
218
  // Get components of localized time
219
  $bits = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( time() ) );
220
+ // Use first day of the month as reference timestamp, and apply month offset
221
+ $timestamp = gmmktime( 0, 0, 0, $bits['mon'] + $month_offset, 1, $bits['year'] );
 
 
 
 
222
 
223
  $days_events = $ai1ec_calendar_helper->get_events_for_month( $timestamp, $categories, $tags );
224
  $cell_array = $ai1ec_calendar_helper->get_month_cell_array( $timestamp, $days_events );
225
  $pagination_links = $ai1ec_calendar_helper->get_month_pagination_links( $month_offset );
226
 
227
  $view_args = array(
228
+ 'title' => gmstrftime( '%B %Y', $timestamp ),
229
  'weekdays' => $ai1ec_calendar_helper->get_weekdays(),
230
  'cell_array' => $cell_array,
231
  'pagination_links' => $pagination_links,
app/controller/class-ai1ec-events-controller.php CHANGED
@@ -96,7 +96,7 @@ class Ai1ec_Events_Controller {
96
  **/
97
  function init()
98
  {
99
- global $ai1ec_events_helper;
100
 
101
  // Initialize dashboard view
102
  if( is_admin() ) {
@@ -126,7 +126,12 @@ class Ai1ec_Events_Controller {
126
  // Supply custom value to JavaScript from PHP
127
  wp_localize_script( 'ai1ec-add_new_event', 'ai1ec_add_new_event', array(
128
  // Current time, used for date/time pickers
129
- 'now' => $ai1ec_events_helper->gmt_to_local( time() ),
 
 
 
 
 
130
  ) );
131
 
132
  // =======
@@ -221,7 +226,7 @@ class Ai1ec_Events_Controller {
221
  'repeat' => $ai1ec_events_helper->create_repeat_dropdown( $repeat ),
222
  'count' => $ai1ec_events_helper->create_count_input( $count ),
223
  'end' => $ai1ec_events_helper->create_end_dropdown( $end ),
224
- 'until' => $ai1ec_events_helper->gmt_to_local( $until ),
225
  'repeating_event' => $repeating_event,
226
  'timezone' => $timezone,
227
  'ending' => $end
@@ -296,7 +301,7 @@ class Ai1ec_Events_Controller {
296
 
297
  // verify this came from the our screen and with proper authorization,
298
  // because save_post can be triggered at other times
299
- if ( !wp_verify_nonce( $_POST[AI1EC_POST_TYPE], 'ai1ec' ) ) {
300
  return;
301
  }
302
  }
@@ -328,7 +333,7 @@ class Ai1ec_Events_Controller {
328
  // = Repeating event, build rrule =
329
  // ================================
330
  $end = (int) $_POST['ai1ec_end'];
331
- switch( $end ) :
332
  // Never
333
  case 0:
334
  $end = '';
@@ -340,75 +345,75 @@ class Ai1ec_Events_Controller {
340
  // On date
341
  case 2:
342
  $until = $_POST['ai1ec_until_time'];
343
- $until = $ai1ec_events_helper->local_to_gmt( $until );
344
- $until += 24 * 60 * 60; // Add 1 day (intuitively, the last day is included)
345
- $until = gmdate( 'Ymd\THis\Z', $until ); // Convert to Zulu time
346
  $end = ';UNTIL=' . $until;
347
  break;
348
- endswitch;
349
 
350
  switch( $_POST['ai1ec_repeat'] ) {
351
  // Daily
352
  case 'DAILY':
353
- $rrule = 'FREQ=DAILY' . $end;
354
  break;
355
  // Mondays
356
  case 'MO':
357
- $rrule = 'FREQ=DAILY;BYDAY=MO' . $end;
358
  break;
359
  // Tuesdays
360
  case 'TU':
361
- $rrule = 'FREQ=DAILY;BYDAY=TU' . $end;
362
  break;
363
  // Wednesdays
364
  case 'WE':
365
- $rrule = 'FREQ=DAILY;BYDAY=WE' . $end;
366
  break;
367
  // Thursdays
368
  case 'TH':
369
- $rrule = 'FREQ=DAILY;BYDAY=TH' . $end;
370
  break;
371
  // Fridays
372
  case 'FR':
373
- $rrule = 'FREQ=DAILY;BYDAY=FR' . $end;
374
  break;
375
  // Tuesdays and Thursdays
376
  case 'TU+TH':
377
- $rrule = 'FREQ=DAILY;BYDAY=TU,TH' . $end;
378
  break;
379
  // Mondays Wednesdays Fridays
380
  case 'MO+WE+FR':
381
- $rrule = 'FREQ=DAILY;BYDAY=MO,WE,FR' . $end;
382
  break;
383
  // Weekends
384
  case 'WEEKDAYS':
385
- $rrule = 'FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR' . $end;
386
  break;
387
  // Saturdays
388
  case 'SA':
389
- $rrule = 'FREQ=DAILY;BYDAY=SA' . $end;
390
  break;
391
  // Sundays
392
  case 'SU':
393
- $rrule = 'FREQ=DAILY;BYDAY=SU' . $end;
394
  break;
395
  // Weekends
396
  case 'WEEKENDS':
397
- $rrule = 'FREQ=DAILY;BYDAY=SA+SU' . $end;
398
  break;
399
  // Weekly
400
  case 'WEEKLY':
401
- $rrule = 'FREQ=WEEKLY' . $end;
402
  break;
403
  // Monthly
404
  case 'MONTHLY':
405
- $rrule = 'FREQ=MONTHLY' . $end;
406
  break;
407
  // Yearly
408
  case 'YEARLY':
409
- $rrule = 'FREQ=YEARLY' . $end;
410
  break;
411
  }
 
 
412
  }
413
 
414
  $is_new = false;
96
  **/
97
  function init()
98
  {
99
+ global $ai1ec_events_helper, $ai1ec_settings;
100
 
101
  // Initialize dashboard view
102
  if( is_admin() ) {
126
  // Supply custom value to JavaScript from PHP
127
  wp_localize_script( 'ai1ec-add_new_event', 'ai1ec_add_new_event', array(
128
  // Current time, used for date/time pickers
129
+ 'now' => $ai1ec_events_helper->gmt_to_local( time() ),
130
+ // US input format for date pickers
131
+ 'us_format' => $ai1ec_settings->input_us_format,
132
+ // ICS feed error messages
133
+ 'duplicate_feed_message' => esc_html__( 'This feed is already being imported.', AI1EC_PLUGIN_NAME ),
134
+ 'invalid_url_message' => esc_html__( 'Please enter a valid iCalendar URL.', AI1EC_PLUGIN_NAME ),
135
  ) );
136
 
137
  // =======
226
  'repeat' => $ai1ec_events_helper->create_repeat_dropdown( $repeat ),
227
  'count' => $ai1ec_events_helper->create_count_input( $count ),
228
  'end' => $ai1ec_events_helper->create_end_dropdown( $end ),
229
+ 'until' => $until,
230
  'repeating_event' => $repeating_event,
231
  'timezone' => $timezone,
232
  'ending' => $end
301
 
302
  // verify this came from the our screen and with proper authorization,
303
  // because save_post can be triggered at other times
304
+ if ( ! wp_verify_nonce( $_POST[AI1EC_POST_TYPE], 'ai1ec' ) ) {
305
  return;
306
  }
307
  }
333
  // = Repeating event, build rrule =
334
  // ================================
335
  $end = (int) $_POST['ai1ec_end'];
336
+ switch( $end ) {
337
  // Never
338
  case 0:
339
  $end = '';
345
  // On date
346
  case 2:
347
  $until = $_POST['ai1ec_until_time'];
348
+ $until = gmdate( 'Ymd', $until );
 
 
349
  $end = ';UNTIL=' . $until;
350
  break;
351
+ }
352
 
353
  switch( $_POST['ai1ec_repeat'] ) {
354
  // Daily
355
  case 'DAILY':
356
+ $rrule = 'FREQ=DAILY';
357
  break;
358
  // Mondays
359
  case 'MO':
360
+ $rrule = 'FREQ=DAILY;BYDAY=MO';
361
  break;
362
  // Tuesdays
363
  case 'TU':
364
+ $rrule = 'FREQ=DAILY;BYDAY=TU';
365
  break;
366
  // Wednesdays
367
  case 'WE':
368
+ $rrule = 'FREQ=DAILY;BYDAY=WE';
369
  break;
370
  // Thursdays
371
  case 'TH':
372
+ $rrule = 'FREQ=DAILY;BYDAY=TH';
373
  break;
374
  // Fridays
375
  case 'FR':
376
+ $rrule = 'FREQ=DAILY;BYDAY=FR';
377
  break;
378
  // Tuesdays and Thursdays
379
  case 'TU+TH':
380
+ $rrule = 'FREQ=DAILY;BYDAY=TU,TH';
381
  break;
382
  // Mondays Wednesdays Fridays
383
  case 'MO+WE+FR':
384
+ $rrule = 'FREQ=DAILY;BYDAY=MO,WE,FR';
385
  break;
386
  // Weekends
387
  case 'WEEKDAYS':
388
+ $rrule = 'FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR';
389
  break;
390
  // Saturdays
391
  case 'SA':
392
+ $rrule = 'FREQ=DAILY;BYDAY=SA';
393
  break;
394
  // Sundays
395
  case 'SU':
396
+ $rrule = 'FREQ=DAILY;BYDAY=SU';
397
  break;
398
  // Weekends
399
  case 'WEEKENDS':
400
+ $rrule = 'FREQ=DAILY;BYDAY=SA+SU';
401
  break;
402
  // Weekly
403
  case 'WEEKLY':
404
+ $rrule = 'FREQ=WEEKLY';
405
  break;
406
  // Monthly
407
  case 'MONTHLY':
408
+ $rrule = 'FREQ=MONTHLY';
409
  break;
410
  // Yearly
411
  case 'YEARLY':
412
+ $rrule = 'FREQ=YEARLY';
413
  break;
414
  }
415
+
416
+ $rrule .= $end;
417
  }
418
 
419
  $is_new = false;
app/controller/class-ai1ec-exporter-controller.php CHANGED
@@ -57,8 +57,9 @@ class Ai1ec_Exporter_Controller {
57
  $ai1ec_cat_ids = isset( $_REQUEST['ai1ec_cat_ids'] ) && ! empty( $_REQUEST['ai1ec_cat_ids'] ) ? $_REQUEST['ai1ec_cat_ids'] : false;
58
  $ai1ec_tag_ids = isset( $_REQUEST['ai1ec_tag_ids'] ) && ! empty( $_REQUEST['ai1ec_tag_ids'] ) ? $_REQUEST['ai1ec_tag_ids'] : false;
59
  $ai1ec_post_ids = isset( $_REQUEST['ai1ec_post_ids'] ) && ! empty( $_REQUEST['ai1ec_post_ids'] ) ? $_REQUEST['ai1ec_post_ids'] : false;
60
- $start = false;
61
- $end = gmmktime() - 24 * 60 * 60; // Include any events ending today
 
62
  $events = $ai1ec_events_helper->get_matching_events( $start, $end, $ai1ec_tag_ids, $ai1ec_cat_ids, $ai1ec_post_ids );
63
  $c = new vcalendar();
64
  $c->setProperty( 'calscale', 'GREGORIAN' );
57
  $ai1ec_cat_ids = isset( $_REQUEST['ai1ec_cat_ids'] ) && ! empty( $_REQUEST['ai1ec_cat_ids'] ) ? $_REQUEST['ai1ec_cat_ids'] : false;
58
  $ai1ec_tag_ids = isset( $_REQUEST['ai1ec_tag_ids'] ) && ! empty( $_REQUEST['ai1ec_tag_ids'] ) ? $_REQUEST['ai1ec_tag_ids'] : false;
59
  $ai1ec_post_ids = isset( $_REQUEST['ai1ec_post_ids'] ) && ! empty( $_REQUEST['ai1ec_post_ids'] ) ? $_REQUEST['ai1ec_post_ids'] : false;
60
+ // when exporting events by post_id, do not look up the event's start/end date/time
61
+ $start = $ai1ec_post_ids !== false ? false : gmmktime() - 24 * 60 * 60; // Include any events ending today
62
+ $end = false;
63
  $events = $ai1ec_events_helper->get_matching_events( $start, $end, $ai1ec_tag_ids, $ai1ec_cat_ids, $ai1ec_post_ids );
64
  $c = new vcalendar();
65
  $c->setProperty( 'calscale', 'GREGORIAN' );
app/controller/class-ai1ec-importer-controller.php CHANGED
@@ -55,7 +55,8 @@ class Ai1ec_Importer_Controller {
55
  {
56
  global $wpdb,
57
  $ai1ec_importer_helper,
58
- $ai1ec_events_helper;
 
59
 
60
  // ====================
61
  // = Select all feeds =
@@ -68,6 +69,9 @@ class Ai1ec_Importer_Controller {
68
  // = go over each iCalendar feed =
69
  // ===============================
70
  foreach( $feeds as $feed ) {
 
 
 
71
  $ai1ec_importer_helper->parse_ics_feed( $feed );
72
  }
73
  }
55
  {
56
  global $wpdb,
57
  $ai1ec_importer_helper,
58
+ $ai1ec_events_helper,
59
+ $ai1ec_settings_controller;
60
 
61
  // ====================
62
  // = Select all feeds =
69
  // = go over each iCalendar feed =
70
  // ===============================
71
  foreach( $feeds as $feed ) {
72
+ // flush the feed
73
+ $ai1ec_settings_controller->flush_ics_feed( false, $feed->feed_url );
74
+ // import the feed
75
  $ai1ec_importer_helper->parse_ics_feed( $feed );
76
  }
77
  }
app/controller/class-ai1ec-settings-controller.php CHANGED
@@ -140,15 +140,21 @@ class Ai1ec_Settings_Controller {
140
  *
141
  * Deletes all event posts that are from that selected feed
142
  *
 
 
 
143
  * @return void
144
  **/
145
- function flush_ics_feed()
146
  {
147
  global $wpdb,
148
  $ai1ec_view_helper;
149
  $ics_id = (int) $_REQUEST['ics_id'];
150
  $table_name = $wpdb->prefix . 'ai1ec_event_feeds';
151
- $feed_url = $wpdb->get_var( $wpdb->prepare( "SELECT feed_url FROM $table_name WHERE feed_id = %d", $ics_id ) );
 
 
 
152
  if( $feed_url )
153
  {
154
  $table_name = $wpdb->prefix . 'ai1ec_events';
@@ -174,8 +180,9 @@ class Ai1ec_Settings_Controller {
174
  'message' => 'Invalid feed'
175
  );
176
  }
177
-
178
- $ai1ec_view_helper->json_response( $output );
 
179
  }
180
 
181
  /**
@@ -197,7 +204,11 @@ class Ai1ec_Settings_Controller {
197
 
198
  if( $feed )
199
  {
 
 
 
200
  $count = $ai1ec_importer_helper->parse_ics_feed( $feed );
 
201
  $output = array(
202
  'error' => false,
203
  'message' => sprintf( __( 'Imported %d events', AI1EC_PLUGIN_NAME ), $count ),
@@ -212,7 +223,7 @@ class Ai1ec_Settings_Controller {
212
  'message' => 'Invalid feed'
213
  );
214
  }
215
-
216
  $ai1ec_view_helper->json_response( $output );
217
  }
218
 
@@ -235,7 +246,7 @@ class Ai1ec_Settings_Controller {
235
  'error' => false,
236
  'message' => 'Request successful.'
237
  );
238
-
239
  $ai1ec_view_helper->json_response( $output );
240
  }
241
 
140
  *
141
  * Deletes all event posts that are from that selected feed
142
  *
143
+ * @param bool $ajax When set to true, the data is outputted using json_response
144
+ * @param bool|string $feed_url Feed URL
145
+ *
146
  * @return void
147
  **/
148
+ function flush_ics_feed( $ajax = true, $feed_url = false )
149
  {
150
  global $wpdb,
151
  $ai1ec_view_helper;
152
  $ics_id = (int) $_REQUEST['ics_id'];
153
  $table_name = $wpdb->prefix . 'ai1ec_event_feeds';
154
+
155
+ if( $feed_url === false )
156
+ $feed_url = $wpdb->get_var( $wpdb->prepare( "SELECT feed_url FROM $table_name WHERE feed_id = %d", $ics_id ) );
157
+
158
  if( $feed_url )
159
  {
160
  $table_name = $wpdb->prefix . 'ai1ec_events';
180
  'message' => 'Invalid feed'
181
  );
182
  }
183
+
184
+ if( $ajax )
185
+ $ai1ec_view_helper->json_response( $output );
186
  }
187
 
188
  /**
204
 
205
  if( $feed )
206
  {
207
+ // flush the feed
208
+ $this->flush_ics_feed( false, $feed->feed_url );
209
+ // reimport the feed
210
  $count = $ai1ec_importer_helper->parse_ics_feed( $feed );
211
+
212
  $output = array(
213
  'error' => false,
214
  'message' => sprintf( __( 'Imported %d events', AI1EC_PLUGIN_NAME ), $count ),
223
  'message' => 'Invalid feed'
224
  );
225
  }
226
+
227
  $ai1ec_view_helper->json_response( $output );
228
  }
229
 
246
  'error' => false,
247
  'message' => 'Request successful.'
248
  );
249
+
250
  $ai1ec_view_helper->json_response( $output );
251
  }
252
 
app/helper/class-ai1ec-app-helper.php CHANGED
@@ -100,6 +100,7 @@ class Ai1ec_App_Helper {
100
  * @return void
101
  **/
102
  function create_post_type() {
 
103
 
104
  // if the event contributor role is not created, create it
105
  if( !get_role( 'ai1ec_event_assistant' ) ) {
@@ -193,7 +194,8 @@ class Ai1ec_App_Helper {
193
  'has_archive' => true,
194
  'hierarchical' => false,
195
  'menu_position' => 5,
196
- 'supports' => $supports
 
197
  );
198
 
199
  // ========================================
100
  * @return void
101
  **/
102
  function create_post_type() {
103
+ global $ai1ec_settings;
104
 
105
  // if the event contributor role is not created, create it
106
  if( !get_role( 'ai1ec_event_assistant' ) ) {
194
  'has_archive' => true,
195
  'hierarchical' => false,
196
  'menu_position' => 5,
197
+ 'supports' => $supports,
198
+ 'exclude_from_search' => $ai1ec_settings->exclude_from_search
199
  );
200
 
201
  // ========================================
app/helper/class-ai1ec-calendar-helper.php CHANGED
@@ -163,7 +163,7 @@ class Ai1ec_Calendar_Helper {
163
  * @return array list of matching event objects
164
  **/
165
  function get_events_between( $start_time, $end_time, $post_status = 'publish' ) {
166
- global $wpdb, $ai1ec_events_helper;
167
 
168
  // Convert timestamps to MySQL format in GMT time
169
  $start_time = $ai1ec_events_helper->local_to_gmt( $start_time );
@@ -174,7 +174,43 @@ class Ai1ec_Calendar_Helper {
174
  $start_time,
175
  $end_time,
176
  );
177
- if( $post_status != null ) $args[] = $post_status;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
 
179
  $query = $wpdb->prepare(
180
  "SELECT p.*, e.post_id, i.id AS instance_id, " .
@@ -192,9 +228,10 @@ class Ai1ec_Calendar_Helper {
192
  "WHERE post_type = '" . AI1EC_POST_TYPE . "' " .
193
  "AND i.start >= FROM_UNIXTIME( %d ) " .
194
  "AND i.start < FROM_UNIXTIME( %d ) " .
195
- ( $post_status == null ? '' : "AND post_status = %s " ) .
196
  "ORDER BY allday DESC, i.start ASC, post_title ASC",
197
  $args );
 
198
  $events = $wpdb->get_results( $query, ARRAY_A );
199
  foreach( $events as &$event ) {
200
  $event = new Ai1ec_Event( $event );
163
  * @return array list of matching event objects
164
  **/
165
  function get_events_between( $start_time, $end_time, $post_status = 'publish' ) {
166
+ global $wpdb, $ai1ec_events_helper, $current_user;
167
 
168
  // Convert timestamps to MySQL format in GMT time
169
  $start_time = $ai1ec_events_helper->local_to_gmt( $start_time );
174
  $start_time,
175
  $end_time,
176
  );
177
+
178
+ if( current_user_can( 'administrator' ) || current_user_can( 'editor' ) ) {
179
+ $post_status = "AND ( post_status = %s OR post_status = %s ) ";
180
+ $args[] = 'publish';
181
+ $args[] = 'private';
182
+ }
183
+ else if( is_user_logged_in() ) {
184
+ // get user info
185
+ get_currentuserinfo();
186
+
187
+ /**
188
+ * include post_status = published
189
+ * or
190
+ * post_status = private and author = logged in user
191
+ */
192
+ $post_status = "AND " .
193
+ "( " .
194
+ "post_status = %s " .
195
+
196
+ "OR " .
197
+
198
+ "( " .
199
+ "post_status = %s " .
200
+
201
+ "AND " .
202
+
203
+ "post_author = %d " .
204
+ ") " .
205
+ ") ";
206
+
207
+ $args[] = 'publish';
208
+ $args[] = 'private';
209
+ $args[] = $current_user->ID;
210
+ } else {
211
+ $post_status = "AND post_status = %s ";
212
+ $args[] = 'publish';
213
+ }
214
 
215
  $query = $wpdb->prepare(
216
  "SELECT p.*, e.post_id, i.id AS instance_id, " .
228
  "WHERE post_type = '" . AI1EC_POST_TYPE . "' " .
229
  "AND i.start >= FROM_UNIXTIME( %d ) " .
230
  "AND i.start < FROM_UNIXTIME( %d ) " .
231
+ $post_status .
232
  "ORDER BY allday DESC, i.start ASC, post_title ASC",
233
  $args );
234
+
235
  $events = $wpdb->get_results( $query, ARRAY_A );
236
  foreach( $events as &$event ) {
237
  $event = new Ai1ec_Event( $event );
app/helper/class-ai1ec-events-helper.php CHANGED
@@ -135,12 +135,10 @@ class Ai1ec_Events_Helper {
135
  global $wpdb;
136
 
137
  // Convert event's timestamps to local for correct calculations of
138
- // recurrence.
139
- // $gm_diff: Needed with SG_iCal_Freq, which doesn't use gm___ version of
140
- // PHP date functions and calculates wrong recurrences sometimes
141
- $gm_diff = mktime( 0 ) - gmmktime( 0 );
142
- $event->start = $this->gmt_to_local( $event->start ) + $gm_diff;
143
- $event->end = $this->gmt_to_local( $event->end ) + $gm_diff;
144
 
145
  $evs = array();
146
  $e = array(
@@ -188,7 +186,7 @@ class Ai1ec_Events_Helper {
188
  $this->get_matching_event_id(
189
  $event->ical_uid,
190
  $event->ical_feed_url,
191
- $start = $this->local_to_gmt( $e['start'] ) - $gm_diff,
192
  false, // Only search events that don't define recurrence (i.e. only search for RECURRENCE-ID events)
193
  $event->post_id
194
  )
@@ -197,15 +195,19 @@ class Ai1ec_Events_Helper {
197
  // If no other instance was found
198
  if( is_null( $matching_event_id ) )
199
  {
200
- $start_day = date( 'j', $e['start'] );
201
- $end_day = date( 'j', $e['end'] );
202
-
203
- // If event spans days, create instance for each spanning day
204
- if( $start_day != $end_day || $e['end'] - $e['start'] > 60 * 60 * 24 )
205
- $this->create_cache_table_entries( $e, $gm_diff );
 
 
 
206
  // Else cache single instance of event
207
- else
208
- $this->insert_event_in_cache_table( $e, $gm_diff );
 
209
  }
210
  }
211
  }
@@ -216,16 +218,15 @@ class Ai1ec_Events_Helper {
216
  * Inserts a new record in the cache table
217
  *
218
  * @param array $event Event array
219
- * @param int $gm_diff Different between local time and gmt time
220
  *
221
  * @return void
222
  **/
223
- function insert_event_in_cache_table( $event, $gm_diff ) {
224
  global $wpdb;
225
 
226
  // Return the start/end times to GMT zone
227
- $event['start'] = $this->local_to_gmt( $event['start'] ) - $gm_diff;
228
- $event['end'] = $this->local_to_gmt( $event['end'] ) - $gm_diff;
229
 
230
  $wpdb->query(
231
  $wpdb->prepare(
@@ -243,12 +244,13 @@ class Ai1ec_Events_Helper {
243
  * Create a new entry for each day that the event spans.
244
  *
245
  * @param array $e Event array
246
- * @param int $gm_diff Different between local time and GMT time
247
  *
248
  * @return void
249
  **/
250
- function create_cache_table_entries( $e, $gm_diff )
251
  {
 
 
252
  // Decompose start dates into components
253
  $start_bits = getdate( $e['start'] );
254
 
@@ -267,7 +269,7 @@ class Ai1ec_Events_Helper {
267
  $start_bits['year'] // year
268
  );
269
  // Cache first day
270
- $this->insert_event_in_cache_table( array( 'post_id' => $e['post_id'], 'start' => $event_start, 'end' => $event_end ), $gm_diff );
271
 
272
  // ====================================================
273
  // = Calculate the time for event's intermediate days =
@@ -278,7 +280,7 @@ class Ai1ec_Events_Helper {
278
  $event_end += 60 * 60 * 24;
279
  // Cache intermediate days
280
  while( $event_end < $e['end'] ) {
281
- $this->insert_event_in_cache_table( array( 'post_id' => $e['post_id'], 'start' => $event_start, 'end' => $event_end ), $gm_diff );
282
  $event_start = $event_end; // Start time is previous end time
283
  $event_end += 24 * 60 * 60; // Increment end time by 1 day
284
  }
@@ -292,7 +294,7 @@ class Ai1ec_Events_Helper {
292
  $event_end = $e['end'];
293
  if( $event_end > $event_start )
294
  // Cache last day
295
- $this->insert_event_in_cache_table( array( 'post_id' => $e['post_id'], 'start' => $event_start, 'end' => $event_end ), $gm_diff );
296
  }
297
 
298
  /**
@@ -403,12 +405,12 @@ class Ai1ec_Events_Helper {
403
  $until = $rec->getUntil();
404
  if( $until ) {
405
  $until = strtotime( $rec->getUntil() );
406
- $until -= 24 * 60 * 60; // Subtract 1 day (intuitively, last date is included)
407
- $end = 2; // set end value
408
- } else if( $count )
409
- $end = 1; // set end value
410
  else
411
- $end = 0; // set end value
412
  }
413
  }
414
  return array(
@@ -469,79 +471,149 @@ class Ai1ec_Events_Helper {
469
  * @return array Matching events
470
  **/
471
  function get_matching_events( $start = false, $end = false, $tags = false, $categories = false, $posts = false ) {
472
- $args = array(
473
- 'post_type' => AI1EC_POST_TYPE,
474
- 'posts_per_page' => -1
475
- );
476
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
477
  if( $categories !== false ) {
478
- // add categories
 
479
  if( strstr( $categories, ',' ) !== false ) {
480
- $categories = explode( ',', $categories );
481
- // prevent sql injection
482
- foreach( $categories as $key => $val ) {
483
- $categories[$key] = (int) $val;
484
- }
 
 
 
 
485
  }
486
- $args["tax_query"][] = array(
487
- 'taxonomy' => 'events_categories',
488
- 'terms' => $categories,
489
- 'field' => 'id'
490
- );
491
  }
492
 
 
 
 
493
  if( $tags !== false ) {
494
- // add tags
 
495
  if( strstr( $tags, ',' ) !== false ) {
496
- $tags = explode( ',', $tags );
497
  // prevent sql injection
498
- foreach( $tags as $key => $val ) {
499
- $tags[$key] = (int) $val;
500
- }
 
 
 
 
 
 
 
 
 
 
 
501
  }
502
- $args["tax_query"][] = array(
503
- 'taxonomy' => 'events_tags',
504
- 'terms' => $tags,
505
- 'field' => 'id'
506
- );
507
  }
508
 
 
 
 
509
  if( $posts !== false ) {
510
- // add posts
511
  if( strstr( $posts, ',' ) !== false ) {
512
- $posts = explode( ',', $posts );
513
- // prevent sql injection
514
- foreach( $posts as $key => $val ) {
515
- $posts[$key] = (int) $val;
516
- }
 
 
517
  }
518
- if( is_array( $posts ) )
519
- $args["post__in"] = $posts;
520
- else
521
- $args["p"] = $posts;
522
  }
523
 
524
- $loop = new WP_Query( $args );
525
- $events = array();
526
- foreach( $loop->posts as $post ) {
527
- try{
528
- $ev = new Ai1ec_Event( $post->ID );
529
- } catch( Ai1ec_Event_Not_Found $n ) {
530
- // The event is not found, continue to the next event
531
- continue;
532
- }
533
- // if there are recurrence rules, include the event, else...
534
- if( empty( $ev->recurrence_rules ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
535
  // if start time is set, and event start time is before the range
536
  // it, continue to the next event
537
- if( $start !== false && $ev->start < $start )
538
- continue;
 
 
539
  // if end time is set, and event end time is after
540
  // it, continue to the next event
541
- if( $end !== false && $ev->end < $end )
542
- continue;
 
 
543
  }
544
- $events[] = $ev;
545
  }
546
 
547
  return $events;
@@ -570,11 +642,13 @@ class Ai1ec_Events_Helper {
570
  * this is also converted to the local timezone.
571
  *
572
  * @param int $timestamp
 
573
  *
574
  * @return string
575
  **/
576
- function get_short_time( $timestamp ) {
577
- $timestamp = $this->gmt_to_local( $timestamp );
 
578
  $ampm = gmstrftime( '%p', $timestamp );
579
  $ampm = $ampm[0];
580
  $ampm = strtolower( $ampm );
@@ -588,11 +662,13 @@ class Ai1ec_Events_Helper {
588
  * this is also converted to the local timezone.
589
  *
590
  * @param int $timestamp
 
591
  *
592
  * @return string
593
  **/
594
- function get_short_date( $timestamp ) {
595
- $timestamp = $this->gmt_to_local( $timestamp );
 
596
  return gmstrftime( '%b %e', $timestamp );
597
  }
598
 
@@ -606,8 +682,9 @@ class Ai1ec_Events_Helper {
606
  *
607
  * @return string
608
  **/
609
- function get_medium_time( $timestamp ) {
610
- $timestamp = $this->gmt_to_local( $timestamp );
 
611
  $ampm = gmstrftime( '%p', $timestamp );
612
  $ampm = strtolower( $ampm );
613
  return gmstrftime( '%l:%M', $timestamp ) . $ampm;
@@ -620,11 +697,13 @@ class Ai1ec_Events_Helper {
620
  * this is also converted to the local timezone.
621
  *
622
  * @param int $timestamp
 
623
  *
624
  * @return string
625
  **/
626
- function get_long_time( $timestamp ) {
627
- $timestamp = $this->gmt_to_local( $timestamp );
 
628
  $ampm = gmstrftime( '%p', $timestamp );
629
  $ampm = strtolower( $ampm );
630
  return gmstrftime( '%a, %B %e @ %l:%M', $timestamp ) . $ampm;
@@ -634,14 +713,16 @@ class Ai1ec_Events_Helper {
634
  * get_long_date function
635
  *
636
  * Format a long-length date for use in other views (e.g., single event);
637
- * this is also converted to the local timezone.
638
  *
639
  * @param int $timestamp
 
640
  *
641
  * @return string
642
  **/
643
- function get_long_date( $timestamp ) {
644
- $timestamp = $this->gmt_to_local( $timestamp );
 
645
  return gmstrftime( '%a, %B %e', $timestamp );
646
  }
647
 
@@ -759,7 +840,7 @@ class Ai1ec_Events_Helper {
759
  * comma-separated string
760
  *
761
  * @return array Filtered post IDs as an array of ints
762
- **/
763
  function filter_by_terms( $post_ids, $term_ids )
764
  {
765
  global $wpdb;
@@ -795,11 +876,12 @@ class Ai1ec_Events_Helper {
795
  /**
796
  * get_category_color function
797
  *
 
798
  *
799
- *
800
- * @return void
801
- **/
802
- function get_category_color( $term_id = 0 ) {
803
  global $wpdb;
804
 
805
  $term_id = (int) $term_id;
@@ -811,9 +893,11 @@ class Ai1ec_Events_Helper {
811
  /**
812
  * get_category_color_square function
813
  *
 
 
814
  *
815
- *
816
- * @return void
817
  **/
818
  function get_category_color_square( $term_id ) {
819
  $color = $this->get_category_color( $term_id );
@@ -829,6 +913,8 @@ class Ai1ec_Events_Helper {
829
  *
830
  * Returns the style attribute assigning the category color style to an event.
831
  *
 
 
832
  * @return string
833
  **/
834
  function get_event_category_color_style( $term_id, $allday = false ) {
@@ -846,8 +932,9 @@ class Ai1ec_Events_Helper {
846
  /**
847
  * get_event_category_colors function
848
  *
849
- * Returns category color boxes
850
  *
 
851
  * @return string
852
  **/
853
  function get_event_category_colors( $cats ) {
@@ -865,8 +952,9 @@ class Ai1ec_Events_Helper {
865
  /**
866
  * create_end_dropdown function
867
  *
 
868
  *
869
- *
870
  * @return void
871
  **/
872
  function create_end_dropdown( $selected = null ) {
135
  global $wpdb;
136
 
137
  // Convert event's timestamps to local for correct calculations of
138
+ // recurrence. Need to also remove PHP timezone offset for each date for
139
+ // SG_iCal to calculate correct recurring instances.
140
+ $event->start = $this->gmt_to_local( $event->start ) - date( 'Z', $event->start );
141
+ $event->end = $this->gmt_to_local( $event->end ) - date( 'Z', $event->end );
 
 
142
 
143
  $evs = array();
144
  $e = array(
186
  $this->get_matching_event_id(
187
  $event->ical_uid,
188
  $event->ical_feed_url,
189
+ $start = $this->local_to_gmt( $e['start'] ) - date( 'Z', $e['start'] ),
190
  false, // Only search events that don't define recurrence (i.e. only search for RECURRENCE-ID events)
191
  $event->post_id
192
  )
195
  // If no other instance was found
196
  if( is_null( $matching_event_id ) )
197
  {
198
+ $start = getdate( $e['start'] );
199
+ $end = getdate( $e['end'] );
200
+
201
+ // If event spans a day and end time is not midnight, or spans more than
202
+ // a day, then create instance for each spanning day
203
+ if( ( $start['mday'] != $end['mday'] &&
204
+ ( $end['hours'] || $end['minutes'] || $end['seconds'] ) )
205
+ || $e['end'] - $e['start'] > 60 * 60 * 24 ) {
206
+ $this->create_cache_table_entries( $e );
207
  // Else cache single instance of event
208
+ } else {
209
+ $this->insert_event_in_cache_table( $e );
210
+ }
211
  }
212
  }
213
  }
218
  * Inserts a new record in the cache table
219
  *
220
  * @param array $event Event array
 
221
  *
222
  * @return void
223
  **/
224
+ function insert_event_in_cache_table( $event ) {
225
  global $wpdb;
226
 
227
  // Return the start/end times to GMT zone
228
+ $event['start'] = $this->local_to_gmt( $event['start'] ) + date( 'Z', $event['start'] );
229
+ $event['end'] = $this->local_to_gmt( $event['end'] ) + date( 'Z', $event['end'] );
230
 
231
  $wpdb->query(
232
  $wpdb->prepare(
244
  * Create a new entry for each day that the event spans.
245
  *
246
  * @param array $e Event array
 
247
  *
248
  * @return void
249
  **/
250
+ function create_cache_table_entries( $e )
251
  {
252
+ global $ai1ec_events_helper;
253
+
254
  // Decompose start dates into components
255
  $start_bits = getdate( $e['start'] );
256
 
269
  $start_bits['year'] // year
270
  );
271
  // Cache first day
272
+ $this->insert_event_in_cache_table( array( 'post_id' => $e['post_id'], 'start' => $event_start, 'end' => $event_end ) );
273
 
274
  // ====================================================
275
  // = Calculate the time for event's intermediate days =
280
  $event_end += 60 * 60 * 24;
281
  // Cache intermediate days
282
  while( $event_end < $e['end'] ) {
283
+ $this->insert_event_in_cache_table( array( 'post_id' => $e['post_id'], 'start' => $event_start, 'end' => $event_end ) );
284
  $event_start = $event_end; // Start time is previous end time
285
  $event_end += 24 * 60 * 60; // Increment end time by 1 day
286
  }
294
  $event_end = $e['end'];
295
  if( $event_end > $event_start )
296
  // Cache last day
297
+ $this->insert_event_in_cache_table( array( 'post_id' => $e['post_id'], 'start' => $event_start, 'end' => $event_end ) );
298
  }
299
 
300
  /**
405
  $until = $rec->getUntil();
406
  if( $until ) {
407
  $until = strtotime( $rec->getUntil() );
408
+ $until += date( 'Z', $until ); // Add timezone offset
409
+ $end = 2;
410
+ } elseif( $count )
411
+ $end = 1;
412
  else
413
+ $end = 0;
414
  }
415
  }
416
  return array(
471
  * @return array Matching events
472
  **/
473
  function get_matching_events( $start = false, $end = false, $tags = false, $categories = false, $posts = false ) {
474
+ global $wpdb;
 
 
 
475
 
476
+ // holds event_categories sql
477
+ $c_sql = '';
478
+ $c_where_sql = '';
479
+ // holds event_tags sql
480
+ $t_sql = '';
481
+ $t_where_sql ='';
482
+ // holds posts sql
483
+ $p_where_sql = '';
484
+ // holds start sql
485
+ $start_where_sql = '';
486
+ // holds end sql
487
+ $end_where_sql = '';
488
+ // hold escape values
489
+ $args = array();
490
+
491
+ // =============================
492
+ // = Generating start date sql =
493
+ // =============================
494
+ if( $start !== false ) {
495
+ $start_where_sql = "AND e.start >= FROM_UNIXTIME( %d )";
496
+ $args[] = $start;
497
+ }
498
+
499
+ // ===========================
500
+ // = Generating end date sql =
501
+ // ===========================
502
+ if( $end !== false ) {
503
+ $end_where_sql = "AND e.end <= FROM_UNIXTIME( %d )";
504
+ $args[] = $end;
505
+ }
506
+
507
+ // ===================================
508
+ // = Generating event_categories sql =
509
+ // ===================================
510
  if( $categories !== false ) {
511
+
512
+ // sanitize categories var
513
  if( strstr( $categories, ',' ) !== false ) {
514
+ $tmp = array();
515
+ // prevent sql injection
516
+ foreach( explode( ',', $categories ) as $cat )
517
+ $tmp[] = (int) $cat;
518
+
519
+ $categories = $tmp;
520
+ } else {
521
+ // prevent sql injection
522
+ $categories = (int) $categories;
523
  }
524
+
525
+ $c_sql = "INNER JOIN $wpdb->term_relationships AS tr ON post_id = tr.object_id ";
526
+ $c_where_sql = "AND tr.term_taxonomy_id IN ( $categories ) ";
 
 
527
  }
528
 
529
+ // =============================
530
+ // = Generating event_tags sql =
531
+ // =============================
532
  if( $tags !== false ) {
533
+
534
+ // sanitize tags var
535
  if( strstr( $tags, ',' ) !== false ) {
536
+ $tmp = array();
537
  // prevent sql injection
538
+ foreach( explode( ',', $tags ) as $tag )
539
+ $tmp[] = (int) $tag;
540
+
541
+ $tags = $tmp;
542
+ } else {
543
+ $tags = (int) $tags;
544
+ }
545
+
546
+ // if category sql is included then don't inner join term_relationships table
547
+ if( ! empty( $c_sql ) ) {
548
+ $t_where_sql = "AND tr.term_taxonomy_id IN ( $tags ) ";
549
+ } else {
550
+ $t_sql = "INNER JOIN $wpdb->term_relationships AS tr ON e.post_id = tr.object_id ";
551
+ $t_where_sql = "AND tr.term_taxonomy_id IN ( $tags ) ";
552
  }
 
 
 
 
 
553
  }
554
 
555
+ // ========================
556
+ // = Generating posts sql =
557
+ // ========================
558
  if( $posts !== false ) {
559
+ // sanitize posts var
560
  if( strstr( $posts, ',' ) !== false ) {
561
+ $tmp = array();
562
+
563
+ // prevent sql injection
564
+ foreach( explode( ',', $posts ) as $post )
565
+ $tmp[] = $post;
566
+
567
+ $posts = $tmp;
568
  }
569
+
570
+ $p_where_sql = "AND ID IN ( $posts ) ";
 
 
571
  }
572
 
573
+
574
+ $query = $wpdb->prepare(
575
+ "SELECT *, e.post_id, UNIX_TIMESTAMP( e.start ) as start, UNIX_TIMESTAMP( e.end ) as end, e.allday, e.recurrence_rules, e.exception_rules,
576
+ e.recurrence_dates, e.exception_dates, e.venue, e.country, e.address, e.city, e.province, e.postal_code,
577
+ e.show_map, e.contact_name, e.contact_phone, e.contact_email, e.cost, e.ical_feed_url, e.ical_source_url,
578
+ e.ical_organizer, e.ical_contact, e.ical_uid " .
579
+ "FROM $wpdb->posts " .
580
+ "INNER JOIN {$wpdb->prefix}ai1ec_events AS e ON e.post_id = ID " .
581
+ $c_sql .
582
+ $t_sql .
583
+ "WHERE post_type = '" . AI1EC_POST_TYPE . "' " .
584
+ $c_where_sql .
585
+ $t_where_sql .
586
+ $p_where_sql .
587
+ $start_where_sql .
588
+ $end_where_sql,
589
+ $args );
590
+
591
+ $events = $wpdb->get_results( $query, ARRAY_A );
592
+
593
+ foreach( $events as &$event ) {
594
+ try{
595
+ $event = new Ai1ec_Event( $event );
596
+ } catch( Ai1ec_Event_Not_Found $n ) {
597
+ unset( $event );
598
+ // The event is not found, continue to the next event
599
+ continue;
600
+ }
601
+
602
+ // if there are recurrence rules, include the event, else...
603
+ if( empty( $event->recurrence_rules ) ) {
604
  // if start time is set, and event start time is before the range
605
  // it, continue to the next event
606
+ if( $start !== false && $event->start < $start ) {
607
+ unset( $event );
608
+ continue;
609
+ }
610
  // if end time is set, and event end time is after
611
  // it, continue to the next event
612
+ if( $end !== false && $ev->end < $end ) {
613
+ unset( $event );
614
+ continue;
615
+ }
616
  }
 
617
  }
618
 
619
  return $events;
642
  * this is also converted to the local timezone.
643
  *
644
  * @param int $timestamp
645
+ * @param bool $convert_from_gmt Whether to convert from GMT time to local
646
  *
647
  * @return string
648
  **/
649
+ function get_short_time( $timestamp, $convert_from_gmt = true ) {
650
+ if( $convert_from_gmt )
651
+ $timestamp = $this->gmt_to_local( $timestamp );
652
  $ampm = gmstrftime( '%p', $timestamp );
653
  $ampm = $ampm[0];
654
  $ampm = strtolower( $ampm );
662
  * this is also converted to the local timezone.
663
  *
664
  * @param int $timestamp
665
+ * @param bool $convert_from_gmt Whether to convert from GMT time to local
666
  *
667
  * @return string
668
  **/
669
+ function get_short_date( $timestamp, $convert_from_gmt = true ) {
670
+ if( $convert_from_gmt )
671
+ $timestamp = $this->gmt_to_local( $timestamp );
672
  return gmstrftime( '%b %e', $timestamp );
673
  }
674
 
682
  *
683
  * @return string
684
  **/
685
+ function get_medium_time( $timestamp, $convert_from_gmt = true ) {
686
+ if( $convert_from_gmt )
687
+ $timestamp = $this->gmt_to_local( $timestamp );
688
  $ampm = gmstrftime( '%p', $timestamp );
689
  $ampm = strtolower( $ampm );
690
  return gmstrftime( '%l:%M', $timestamp ) . $ampm;
697
  * this is also converted to the local timezone.
698
  *
699
  * @param int $timestamp
700
+ * @param bool $convert_from_gmt Whether to convert from GMT time to local
701
  *
702
  * @return string
703
  **/
704
+ function get_long_time( $timestamp, $convert_from_gmt = true ) {
705
+ if( $convert_from_gmt )
706
+ $timestamp = $this->gmt_to_local( $timestamp );
707
  $ampm = gmstrftime( '%p', $timestamp );
708
  $ampm = strtolower( $ampm );
709
  return gmstrftime( '%a, %B %e @ %l:%M', $timestamp ) . $ampm;
713
  * get_long_date function
714
  *
715
  * Format a long-length date for use in other views (e.g., single event);
716
+ * this is also converted to the local timezone if desired.
717
  *
718
  * @param int $timestamp
719
+ * @param bool $convert_from_gmt Whether to convert from GMT time to local
720
  *
721
  * @return string
722
  **/
723
+ function get_long_date( $timestamp, $convert_from_gmt = true ) {
724
+ if( $convert_from_gmt )
725
+ $timestamp = $this->gmt_to_local( $timestamp );
726
  return gmstrftime( '%a, %B %e', $timestamp );
727
  }
728
 
840
  * comma-separated string
841
  *
842
  * @return array Filtered post IDs as an array of ints
843
+ */
844
  function filter_by_terms( $post_ids, $term_ids )
845
  {
846
  global $wpdb;
876
  /**
877
  * get_category_color function
878
  *
879
+ * Returns the color of the Event Category having the given term ID.
880
  *
881
+ * @param int $term_id The ID of the Event Category
882
+ * @return string
883
+ */
884
+ function get_category_color( $term_id ) {
885
  global $wpdb;
886
 
887
  $term_id = (int) $term_id;
893
  /**
894
  * get_category_color_square function
895
  *
896
+ * Returns the HTML markup for the category color square of the given Event
897
+ * Category term ID.
898
  *
899
+ * @param int $term_id The Event Category's term ID
900
+ * @return string
901
  **/
902
  function get_category_color_square( $term_id ) {
903
  $color = $this->get_category_color( $term_id );
913
  *
914
  * Returns the style attribute assigning the category color style to an event.
915
  *
916
+ * @param int $term_id The Event Category's term ID
917
+ * @param bool $allday Whether the event is all-day
918
  * @return string
919
  **/
920
  function get_event_category_color_style( $term_id, $allday = false ) {
932
  /**
933
  * get_event_category_colors function
934
  *
935
+ * Returns category color squares for the list of Event Category objects.
936
  *
937
+ * @param array $cats The Event Category objects as returned by get_terms()
938
  * @return string
939
  **/
940
  function get_event_category_colors( $cats ) {
952
  /**
953
  * create_end_dropdown function
954
  *
955
+ * Outputs the dropdown list for the recurrence end option.
956
  *
957
+ * @param int $selected The index of the selected option, if any
958
  * @return void
959
  **/
960
  function create_end_dropdown( $selected = null ) {
app/helper/class-ai1ec-importer-helper.php CHANGED
@@ -51,19 +51,25 @@ class Ai1ec_Importer_Helper {
51
  * Passed array: Array( 'year', 'month', 'day', ['hour', 'min', 'sec', ['tz']] )
52
  * Return int: UNIX timestamp in GMT
53
  *
54
- * @param array $t Time array
55
  * @param string $def_timezone Default time zone in case not defined in $t
56
  *
57
  * @return int UNIX timestamp
58
  **/
59
  function time_array_to_timestamp( $t, $def_timezone ) {
60
- $ret = $t['year'] . '-' . $t['month'] . '-' . $t['day'];
61
- if( isset( $t['hour'] ) )
62
- $ret .= ' ' . $t['hour'] . ':' . $t['min'] . ':' . $t['sec'];
63
- $timezone = $t['tz'];
 
 
 
 
 
64
  if( ! $timezone ) $timezone = $def_timezone;
65
  if( $timezone )
66
  $ret .= ' ' . $timezone;
 
67
  return strtotime( $ret );
68
  }
69
 
@@ -89,7 +95,7 @@ class Ai1ec_Importer_Helper {
89
  // create new instance
90
  $v = new vcalendar( array(
91
  'unique_id' => $feed->feed_url,
92
- 'url' => str_replace( 'webcal', 'http', $feed->feed_url ),
93
  ) );
94
 
95
  // actual parse of the feed
@@ -111,11 +117,11 @@ class Ai1ec_Importer_Helper {
111
  // go over each event
112
  while( $e = $v->getComponent( 'vevent' ) )
113
  {
114
- $start = $e->getProperty( 'dtstart' );
115
- $end = $e->getProperty( 'dtend' );
116
 
117
  // Event is all-day if no time components are defined
118
- $allday = ! isset( $start['hour'] );
119
 
120
  // convert times to GMT UNIX timestamps
121
  $start = $this->time_array_to_timestamp( $start, $timezone );
51
  * Passed array: Array( 'year', 'month', 'day', ['hour', 'min', 'sec', ['tz']] )
52
  * Return int: UNIX timestamp in GMT
53
  *
54
+ * @param array $t iCalcreator's time property array (*full* format expected)
55
  * @param string $def_timezone Default time zone in case not defined in $t
56
  *
57
  * @return int UNIX timestamp
58
  **/
59
  function time_array_to_timestamp( $t, $def_timezone ) {
60
+ $ret = $t['value']['year'] .
61
+ '-' . $t['value']['month'] .
62
+ '-' . $t['value']['day'];
63
+ if( isset( $t['value']['hour'] ) )
64
+ $ret .= ' ' . $t['value']['hour'] .
65
+ ':' . $t['value']['min'] .
66
+ ':' . $t['value']['sec'];
67
+ $timezone = $t['params']['TZID'];
68
+
69
  if( ! $timezone ) $timezone = $def_timezone;
70
  if( $timezone )
71
  $ret .= ' ' . $timezone;
72
+
73
  return strtotime( $ret );
74
  }
75
 
95
  // create new instance
96
  $v = new vcalendar( array(
97
  'unique_id' => $feed->feed_url,
98
+ 'url' => $feed->feed_url,
99
  ) );
100
 
101
  // actual parse of the feed
117
  // go over each event
118
  while( $e = $v->getComponent( 'vevent' ) )
119
  {
120
+ $start = $e->getProperty( 'dtstart', 1, true );
121
+ $end = $e->getProperty( 'dtend', 1, true );
122
 
123
  // Event is all-day if no time components are defined
124
+ $allday = ! isset( $start['value']['hour'] );
125
 
126
  // convert times to GMT UNIX timestamps
127
  $start = $this->time_array_to_timestamp( $start, $timezone );
app/helper/class-ai1ec-settings-helper.php CHANGED
@@ -243,7 +243,7 @@ class Ai1ec_Settings_Helper {
243
  /**
244
  * general_settings_meta_box function
245
  *
246
- *
247
  *
248
  * @return void
249
  **/
@@ -265,10 +265,12 @@ class Ai1ec_Settings_Helper {
265
  id="include_events_in_rss" value="1"'
266
  . ( $ai1ec_settings->include_events_in_rss ? ' checked="checked"' : '' )
267
  . '/>';
 
268
  $show_publish_button = $ai1ec_settings->show_publish_button ? 'checked=checked' : '';
269
  $turn_off_subscription_buttons = $ai1ec_settings->turn_off_subscription_buttons ? 'checked=checked' : '';
270
  $show_create_event_button = $ai1ec_settings->show_create_event_button ? 'checked=checked' : '';
271
  $inject_categories = $ai1ec_settings->inject_categories ? 'checked=checked' : '';
 
272
  $default_calendar_view = $ai1ec_settings_helper->get_view_dropdown( $ai1ec_settings->default_calendar_view );
273
 
274
  $args = array(
@@ -277,10 +279,12 @@ class Ai1ec_Settings_Helper {
277
  'calendar_css_selector' => $calendar_css_selector,
278
  'week_start_day' => $week_start_day,
279
  'agenda_events_per_page' => $agenda_events_per_page,
 
280
  'show_publish_button' => $show_publish_button,
281
  'turn_off_subscription_buttons' => $turn_off_subscription_buttons,
282
  'show_create_event_button' => $show_create_event_button,
283
  'inject_categories' => $inject_categories,
 
284
  );
285
  $ai1ec_view_helper->display( 'box_general_settings.php', $args );
286
  }
243
  /**
244
  * general_settings_meta_box function
245
  *
246
+ * Displays the General Settings meta box.
247
  *
248
  * @return void
249
  **/
265
  id="include_events_in_rss" value="1"'
266
  . ( $ai1ec_settings->include_events_in_rss ? ' checked="checked"' : '' )
267
  . '/>';
268
+ $exclude_from_search = $ai1ec_settings->exclude_from_search ? 'checked=checked' : '';
269
  $show_publish_button = $ai1ec_settings->show_publish_button ? 'checked=checked' : '';
270
  $turn_off_subscription_buttons = $ai1ec_settings->turn_off_subscription_buttons ? 'checked=checked' : '';
271
  $show_create_event_button = $ai1ec_settings->show_create_event_button ? 'checked=checked' : '';
272
  $inject_categories = $ai1ec_settings->inject_categories ? 'checked=checked' : '';
273
+ $input_us_format = $ai1ec_settings->input_us_format ? 'checked=checked' : '';
274
  $default_calendar_view = $ai1ec_settings_helper->get_view_dropdown( $ai1ec_settings->default_calendar_view );
275
 
276
  $args = array(
279
  'calendar_css_selector' => $calendar_css_selector,
280
  'week_start_day' => $week_start_day,
281
  'agenda_events_per_page' => $agenda_events_per_page,
282
+ 'exclude_from_search' => $exclude_from_search,
283
  'show_publish_button' => $show_publish_button,
284
  'turn_off_subscription_buttons' => $turn_off_subscription_buttons,
285
  'show_create_event_button' => $show_create_event_button,
286
  'inject_categories' => $inject_categories,
287
+ 'input_us_format' => $input_us_format,
288
  );
289
  $ai1ec_view_helper->display( 'box_general_settings.php', $args );
290
  }
app/model/class-ai1ec-event.php CHANGED
@@ -592,11 +592,14 @@ class Ai1ec_Event {
592
  if( $rules['until'] ) {
593
  $rules['until'] = sprintf(
594
  __( 'until <strong>%s</strong>', AI1EC_PLUGIN_NAME ),
595
- esc_html( $ai1ec_events_helper->get_long_date( $rules['until'] ) ) );
596
  } else {
597
  unset( $rules['until'] );
598
  }
599
 
 
 
 
600
  $end = join( __( ' or ', AI1EC_PLUGIN_NAME ), $rules );
601
 
602
  if( $end )
592
  if( $rules['until'] ) {
593
  $rules['until'] = sprintf(
594
  __( 'until <strong>%s</strong>', AI1EC_PLUGIN_NAME ),
595
+ esc_html( $ai1ec_events_helper->get_long_date( $rules['until'], false ) ) );
596
  } else {
597
  unset( $rules['until'] );
598
  }
599
 
600
+ // The "end" specifier shouldn't be output
601
+ unset( $rules['end'] );
602
+
603
  $end = join( __( ' or ', AI1EC_PLUGIN_NAME ), $rules );
604
 
605
  if( $end )
app/model/class-ai1ec-settings.php CHANGED
@@ -94,6 +94,14 @@ class Ai1ec_Settings {
94
  **/
95
  var $cron_freq;
96
 
 
 
 
 
 
 
 
 
97
  /**
98
  * show_publish_button class variable
99
  *
@@ -134,6 +142,15 @@ class Ai1ec_Settings {
134
  **/
135
  var $inject_categories;
136
 
 
 
 
 
 
 
 
 
 
137
  /**
138
  * settings_page class variable
139
  *
@@ -212,9 +229,11 @@ class Ai1ec_Settings {
212
  'facebook_credentials' => null,
213
  'user_role_can_create_event' => null,
214
  'show_publish_button' => false,
 
215
  'show_create_event_button' => false,
216
  'turn_off_subscription_buttons' => false,
217
  'inject_categories' => false,
 
218
  'cron_freq' => 'daily'
219
  );
220
 
@@ -245,9 +264,11 @@ class Ai1ec_Settings {
245
  $this->agenda_events_per_page = 1;
246
  $this->cron_freq = $params['cron_freq'];
247
  $this->show_publish_button = $params['show_publish_button'];
 
248
  $this->show_create_event_button = $params['show_create_event_button'];
249
  $this->turn_off_subscription_buttons = $params['turn_off_subscription_buttons'];
250
  $this->inject_categories = $params['inject_categories'];
 
251
  $this->include_events_in_rss = $params['include_events_in_rss'];
252
  $this->allow_events_posting_facebook = $params['allow_events_posting_facebook'];
253
  $this->facebook_credentials = $params['facebook_credentials'];
94
  **/
95
  var $cron_freq;
96
 
97
+ /**
98
+ * exclude_from_search class variable
99
+ *
100
+ * Whether to exclude events from search results
101
+ * @var bool
102
+ **/
103
+ var $exclude_from_search;
104
+
105
  /**
106
  * show_publish_button class variable
107
  *
142
  **/
143
  var $inject_categories;
144
 
145
+ /**
146
+ * input_us_format class variable
147
+ *
148
+ * Input dates in US format.
149
+ *
150
+ * @var bool
151
+ **/
152
+ var $input_us_format;
153
+
154
  /**
155
  * settings_page class variable
156
  *
229
  'facebook_credentials' => null,
230
  'user_role_can_create_event' => null,
231
  'show_publish_button' => false,
232
+ 'exclude_from_search' => false,
233
  'show_create_event_button' => false,
234
  'turn_off_subscription_buttons' => false,
235
  'inject_categories' => false,
236
+ 'input_us_format' => false,
237
  'cron_freq' => 'daily'
238
  );
239
 
264
  $this->agenda_events_per_page = 1;
265
  $this->cron_freq = $params['cron_freq'];
266
  $this->show_publish_button = $params['show_publish_button'];
267
+ $this->exclude_from_search = $params['exclude_from_search'];
268
  $this->show_create_event_button = $params['show_create_event_button'];
269
  $this->turn_off_subscription_buttons = $params['turn_off_subscription_buttons'];
270
  $this->inject_categories = $params['inject_categories'];
271
+ $this->input_us_format = $params['input_us_format'];
272
  $this->include_events_in_rss = $params['include_events_in_rss'];
273
  $this->allow_events_posting_facebook = $params['allow_events_posting_facebook'];
274
  $this->facebook_credentials = $params['facebook_credentials'];
app/view/box_general_settings.php CHANGED
@@ -1,3 +1,5 @@
 
 
1
  <label class="textinput" for="calendar_page_id"><?php _e( 'Calendar page:', AI1EC_PLUGIN_NAME ) ?></label>
2
  <div class="alignleft"><?php echo $calendar_page ?></div>
3
  <br class="clear" />
@@ -18,9 +20,9 @@
18
  <input name="agenda_events_per_page" id="agenda_events_per_page" type="text" size="1" value="<?php echo esc_attr( $agenda_events_per_page ) ?>" />&nbsp;<?php _e( 'events', AI1EC_PLUGIN_NAME ) ?>
19
  <br class="clear" />
20
 
21
- <label for="show_publish_button">
22
- <input class="checkbox" name="show_publish_button" id="show_publish_button" type="checkbox" value="1" <?php echo $show_publish_button ?> />
23
- <?php _e( 'Display <strong>Publish</strong> at bottom of Edit Event form', AI1EC_PLUGIN_NAME ) ?>
24
  </label>
25
  <br class="clear" />
26
 
@@ -41,3 +43,17 @@
41
  <?php _e( 'Include <strong>event categories</strong> in post category lists', AI1EC_PLUGIN_NAME ) ?>
42
  </label>
43
  <br class="clear" />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h2>Viewing Events</h2>
2
+
3
  <label class="textinput" for="calendar_page_id"><?php _e( 'Calendar page:', AI1EC_PLUGIN_NAME ) ?></label>
4
  <div class="alignleft"><?php echo $calendar_page ?></div>
5
  <br class="clear" />
20
  <input name="agenda_events_per_page" id="agenda_events_per_page" type="text" size="1" value="<?php echo esc_attr( $agenda_events_per_page ) ?>" />&nbsp;<?php _e( 'events', AI1EC_PLUGIN_NAME ) ?>
21
  <br class="clear" />
22
 
23
+ <label for="exclude_from_search">
24
+ <input class="checkbox" name="exclude_from_search" id="exclude_from_search" type="checkbox" value="1" <?php echo $exclude_from_search ?> />
25
+ <?php _e( '<strong>Exclude</strong> events from search results', AI1EC_PLUGIN_NAME ) ?>
26
  </label>
27
  <br class="clear" />
28
 
43
  <?php _e( 'Include <strong>event categories</strong> in post category lists', AI1EC_PLUGIN_NAME ) ?>
44
  </label>
45
  <br class="clear" />
46
+
47
+ <h2>Adding/Editing Events</h2>
48
+
49
+ <label for="input_us_format">
50
+ <input class="checkbox" name="input_us_format" id="input_us_format" type="checkbox" value="1" <?php echo $input_us_format ?> />
51
+ <?php _e( 'Input dates in <strong>US format</strong>', AI1EC_PLUGIN_NAME ) ?>
52
+ </label>
53
+ <br class="clear" />
54
+
55
+ <label for="show_publish_button">
56
+ <input class="checkbox" name="show_publish_button" id="show_publish_button" type="checkbox" value="1" <?php echo $show_publish_button ?> />
57
+ <?php _e( 'Display <strong>Publish</strong> at bottom of Edit Event form', AI1EC_PLUGIN_NAME ) ?>
58
+ </label>
59
+ <br class="clear" />
app/view/box_the_seed_studio.php CHANGED
@@ -4,7 +4,7 @@
4
  </div>
5
  <p><?php _e( 'The Seed Studio provides web development and support services for clients and web developers.', AI1EC_PLUGIN_NAME ) ?></p>
6
  <div class="ai1ec-follow-fan">
7
- <div class="facebook-like-top">
8
  <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>
9
  <fb:like href="http://www.facebook.com/pages/The-Seed-Agency/66657743707" layout="button_count" show_faces="true" width="110" font="lucida grande"></fb:like>
10
  </div>
4
  </div>
5
  <p><?php _e( 'The Seed Studio provides web development and support services for clients and web developers.', AI1EC_PLUGIN_NAME ) ?></p>
6
  <div class="ai1ec-follow-fan">
7
+ <div class="ai1ec-facebook-like-top">
8
  <script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>
9
  <fb:like href="http://www.facebook.com/pages/The-Seed-Agency/66657743707" layout="button_count" show_faces="true" width="110" font="lucida grande"></fb:like>
10
  </div>
app/view/event-excerpt.php CHANGED
@@ -1,7 +1,4 @@
1
  <div class="ai1ec-excerpt">
2
- <a class="ai1ec-button ai1ec-event-link" href="<?php the_permalink() ?>">
3
- <?php _e( 'View Event »', AI1EC_PLUGIN_NAME ) ?>
4
- </a>
5
  <div class="ai1ec-time"><label class="ai1ec-label"><?php _e( 'When:', AI1EC_PLUGIN_NAME ) ?></label> <?php echo $event->timespan_html ?></div>
6
  <?php if( $location ): ?>
7
  <div class="ai1ec-location"><label class="ai1ec-label"><?php _e( 'Where:', AI1EC_PLUGIN_NAME ) ?></label> <?php echo $location ?></div>
1
  <div class="ai1ec-excerpt">
 
 
 
2
  <div class="ai1ec-time"><label class="ai1ec-label"><?php _e( 'When:', AI1EC_PLUGIN_NAME ) ?></label> <?php echo $event->timespan_html ?></div>
3
  <?php if( $location ): ?>
4
  <div class="ai1ec-location"><label class="ai1ec-label"><?php _e( 'Where:', AI1EC_PLUGIN_NAME ) ?></label> <?php echo $location ?></div>
app/view/feed_row.php CHANGED
@@ -4,10 +4,12 @@
4
  </h4>
5
  <div class="ai1ec-feed-url"><input type="text" class="ai1ec-feed-url" readonly="readonly" value="<?php echo esc_attr( $feed_url ) ?>" /></div>
6
  <input type="hidden" name="feed_id" class="ai1ec_feed_id" value="<?php echo $feed_id;?>" />
7
- <div class="ai1ec-feed-category">
8
- <?php _e( 'Event category:', AI1EC_PLUGIN_NAME ); ?>
9
- <strong><?php echo $event_category; ?></strong>
10
- </div>
 
 
11
  <?php if( $tags ): ?>
12
  <div class="ai1ec-feed-tags">
13
  <?php _e( 'Tag with', AI1EC_PLUGIN_NAME ); ?>:
4
  </h4>
5
  <div class="ai1ec-feed-url"><input type="text" class="ai1ec-feed-url" readonly="readonly" value="<?php echo esc_attr( $feed_url ) ?>" /></div>
6
  <input type="hidden" name="feed_id" class="ai1ec_feed_id" value="<?php echo $feed_id;?>" />
7
+ <?php if( $event_category ): ?>
8
+ <div class="ai1ec-feed-category">
9
+ <?php _e( 'Event category:', AI1EC_PLUGIN_NAME ); ?>
10
+ <strong><?php echo $event_category; ?></strong>
11
+ </div>
12
+ <?php endif ?>
13
  <?php if( $tags ): ?>
14
  <div class="ai1ec-feed-tags">
15
  <?php _e( 'Tag with', AI1EC_PLUGIN_NAME ); ?>:
css/calendar.css CHANGED
@@ -1,7 +1,7 @@
1
  .ai1ec-container {
2
  font-size: 13pt !important;
3
  clear: both;
4
- }
5
  /* Some plugins mangle styling of standard HTML tags, fix them here */
6
  .ai1ec-container small {
7
  margin: 0 !important;
@@ -26,7 +26,7 @@
26
  margin-bottom: 0.2em;
27
  }
28
  table.ai1ec-calendar-toolbar {
29
- width: 100%;
30
  border: 0 !important;
31
  margin: 0 !important;
32
  }
@@ -177,9 +177,9 @@ table.ai1ec-month-view {
177
  border: 1px solid #ddd !important;
178
  margin: 0 !important;
179
  background: #fff;
180
- table-layout: fixed;
181
  clear: both;
182
- width: 100%;
183
  }
184
  .ai1ec-month-view td {
185
  border: 1px solid #ddd !important;
@@ -375,24 +375,22 @@ table.ai1ec-month-view {
375
  margin: 0 !important;
376
  padding: 0 !important;
377
  border-top: 1px solid #f2f2f2;
378
- border-bottom: 1px solid #fff;
379
- background: #f8f8f8;
380
- background: -o-linear-gradient( #f2f2f2 1em, #fff );
381
- background: -ms-linear-gradient( #f2f2f2 1em, #fff );
382
- background: -moz-linear-gradient( #f2f2f2 1em, #fff );
383
- background: -webkit-gradient( linear, 0 1em, 0 100%, from(#f2f2f2), to(#fff) );
384
- background: -webkit-linear-gradient( #f2f2f2 1em, #fff );
385
  }
386
  .ai1ec-agenda-view .ai1ec-date.ai1ec-today {
387
- border-top: 1px solid #eec;
388
- border-bottom: 1px solid #fff;
389
- background: #ffd;
390
- background: -o-linear-gradient( #f8f8ce 1em, #fff );
391
- background: -ms-linear-gradient( #f8f8ce 1em, #fff );
392
- background: -moz-linear-gradient( #f8f8ce 1em, #fff );
393
- background: -webkit-gradient( linear, 0 1em, 0 100%, from(#f8f8ce), to(#fff) );
394
- background: -webkit-linear-gradient( #f8f8ce 1em, #fff );
395
- background: -o-linear-gradient( #f8f8ce 1em, #fff );
396
  }
397
  .ai1ec-agenda-view h3.ai1ec-date-title {
398
  width: 4em;
@@ -455,7 +453,7 @@ table.ai1ec-month-view {
455
  text-decoration: none;
456
  padding: 0.1em 0.3em !important;
457
  margin: 0.5em 0 !important;
458
- background: #fff;
459
  border: 1px solid #ddd;
460
  border-radius: 0.5em;
461
  -o-border-radius: 0.5em;
1
  .ai1ec-container {
2
  font-size: 13pt !important;
3
  clear: both;
4
+ }
5
  /* Some plugins mangle styling of standard HTML tags, fix them here */
6
  .ai1ec-container small {
7
  margin: 0 !important;
26
  margin-bottom: 0.2em;
27
  }
28
  table.ai1ec-calendar-toolbar {
29
+ width: 100% !important;
30
  border: 0 !important;
31
  margin: 0 !important;
32
  }
177
  border: 1px solid #ddd !important;
178
  margin: 0 !important;
179
  background: #fff;
180
+ table-layout: fixed !important;
181
  clear: both;
182
+ width: 100% !important;
183
  }
184
  .ai1ec-month-view td {
185
  border: 1px solid #ddd !important;
375
  margin: 0 !important;
376
  padding: 0 !important;
377
  border-top: 1px solid #f2f2f2;
378
+ background: #f2f2f2 !important;
379
+ background: -o-linear-gradient( #f2f2f2 1em, rgba(255,255,255,0) ) !important;
380
+ background: -ms-linear-gradient( #f2f2f2 1em, rgba(255,255,255,0) ) !important;
381
+ background: -moz-linear-gradient( #f2f2f2 1em, rgba(255,255,255,0) ) !important;
382
+ background: -webkit-gradient( linear, 0 1em, 0 100%, from(#f2f2f2), to(rgba(255,255,255,0)) ) !important;
383
+ background: -webkit-linear-gradient( #f2f2f2 1em, rgba(255,255,255,0) ) !important;
 
384
  }
385
  .ai1ec-agenda-view .ai1ec-date.ai1ec-today {
386
+ border-top: 1px solid #ffd;
387
+ background: #ffd !important;
388
+ background: -o-linear-gradient( #f8f8ce 1em, rgba(255,255,255,0) ) !important;
389
+ background: -ms-linear-gradient( #f8f8ce 1em, rgba(255,255,255,0) ) !important;
390
+ background: -moz-linear-gradient( #f8f8ce 1em, rgba(255,255,255,0) ) !important;
391
+ background: -webkit-gradient( linear, 0 1em, 0 100%, from(#f8f8ce), to(rgba(255,255,255,0)) ) !important;
392
+ background: -webkit-linear-gradient( #f8f8ce 1em, rgba(255,255,255,0) ) !important;
393
+ background: -o-linear-gradient( #f8f8ce 1em, rgba(255,255,255,0) ) !important;
 
394
  }
395
  .ai1ec-agenda-view h3.ai1ec-date-title {
396
  width: 4em;
453
  text-decoration: none;
454
  padding: 0.1em 0.3em !important;
455
  margin: 0.5em 0 !important;
456
+ background: #fff !important;
457
  border: 1px solid #ddd;
458
  border-radius: 0.5em;
459
  -o-border-radius: 0.5em;
css/general.css CHANGED
@@ -170,15 +170,18 @@ label.ai1ec-label {
170
  /* Subscribe buttons */
171
  .ai1ec-subscribe-google img {
172
  float: left;
173
- width: 30px;
174
- height: 32px;
175
- margin: -10px 0.5em -8px 0;
176
  padding: 0 !important;
177
  border: none !important;
178
  background: none !important;
179
  }
180
 
181
  /* Widget views */
 
 
 
182
  .ai1ec-agenda-widget-view {
183
  font-size: 0.8em !important;
184
  overflow: hidden;
170
  /* Subscribe buttons */
171
  .ai1ec-subscribe-google img {
172
  float: left;
173
+ width: 30px !important;
174
+ height: 32px !important;
175
+ margin: -10px 0.5em -8px 0 !important;
176
  padding: 0 !important;
177
  border: none !important;
178
  background: none !important;
179
  }
180
 
181
  /* Widget views */
182
+ .ai1ec-agenda-widget-view div {
183
+ margin: 0;
184
+ }
185
  .ai1ec-agenda-widget-view {
186
  font-size: 0.8em !important;
187
  overflow: hidden;
css/settings.css CHANGED
@@ -89,27 +89,31 @@
89
  text-transform: lowercase;
90
  }
91
 
92
- #general-settings {
93
  line-height: 1.7em;
94
  }
95
- #general-settings div.inside label {
96
  float: left;
97
  clear: left;
98
  margin: 0.25em 0;
99
  }
100
- #general-settings .checkbox {
101
  float: left;
102
  margin: 0.5em 0.5em 0 0;
103
  }
104
- #general-settings div.description {
105
  clear: left;
106
  font-size: 0.95em;
107
  line-height: 1.5em;
108
  margin-bottom: 1em;
109
  }
110
- label.textinput {
111
  width: 230px;
112
  }
 
 
 
 
113
 
114
  .ai1ec-follow-fan {
115
  padding:10px 0 10px 0;
@@ -117,7 +121,7 @@ label.textinput {
117
  border-top: 1px solid #ccc;
118
  border-bottom: 1px solid #ccc;
119
  }
120
- .facebook-like-top {
121
  float: left;
122
  }
123
 
89
  text-transform: lowercase;
90
  }
91
 
92
+ .ai1ec_event_page_all-in-one-event-calendar-settings #general-settings {
93
  line-height: 1.7em;
94
  }
95
+ .ai1ec_event_page_all-in-one-event-calendar-settings #general-settings div.inside label {
96
  float: left;
97
  clear: left;
98
  margin: 0.25em 0;
99
  }
100
+ .ai1ec_event_page_all-in-one-event-calendar-settings #general-settings .checkbox {
101
  float: left;
102
  margin: 0.5em 0.5em 0 0;
103
  }
104
+ .ai1ec_event_page_all-in-one-event-calendar-settings #general-settings div.description {
105
  clear: left;
106
  font-size: 0.95em;
107
  line-height: 1.5em;
108
  margin-bottom: 1em;
109
  }
110
+ .ai1ec_event_page_all-in-one-event-calendar-settings #general-settings label.textinput {
111
  width: 230px;
112
  }
113
+ .ai1ec_event_page_all-in-one-event-calendar-settings #general-settings h2 {
114
+ margin-bottom: 0;
115
+ margin-top: 10px;
116
+ }
117
 
118
  .ai1ec-follow-fan {
119
  padding:10px 0 10px 0;
121
  border-top: 1px solid #ccc;
122
  border-bottom: 1px solid #ccc;
123
  }
124
+ .ai1ec-facebook-like-top {
125
  float: left;
126
  }
127
 
js/add_new_event.js CHANGED
@@ -29,6 +29,7 @@ jQuery( function( $ ){
29
  end_date_input: '#ai1ec_end-date-input',
30
  end_time_input: '#ai1ec_end-time-input',
31
  end_time: '#ai1ec_end-time',
 
32
  now: now
33
  }
34
  $.timespan( data );
@@ -37,6 +38,7 @@ jQuery( function( $ ){
37
  data = {
38
  start_date_input: '#ai1ec_until-date-input',
39
  start_time: '#ai1ec_until-time',
 
40
  now: now
41
  }
42
  $.inputdate( data );
@@ -282,18 +284,42 @@ jQuery( function( $ ){
282
  $( '#ai1ec_add_new_ics' ).click( function() {
283
  var $button = $( this );
284
  var $url = $( '#ai1ec_feed_url' );
285
- if( ! isUrl( $url.val() ) ) {
286
- // color the feed url input field in red
287
- $url.css( 'border-color', '#FF0000' ).focus();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
288
  } else {
289
  // disable the add button for now
290
  $button.attr( 'disabled', true );
291
- // restore feed url color if it has been changed
292
- $url.css( 'border-color', '#DFDFDF' );
293
  // create the data to send
294
  var data = {
295
  action: 'ai1ec_add_ics',
296
- feed_url: $url.val(),
297
  feed_category: $( '#ai1ec_feed_category option:selected' ).val(),
298
  feed_tags: $( '#ai1ec_feed_tags' ).val()
299
  };
29
  end_date_input: '#ai1ec_end-date-input',
30
  end_time_input: '#ai1ec_end-time-input',
31
  end_time: '#ai1ec_end-time',
32
+ us_format: ai1ec_add_new_event.us_format,
33
  now: now
34
  }
35
  $.timespan( data );
38
  data = {
39
  start_date_input: '#ai1ec_until-date-input',
40
  start_time: '#ai1ec_until-time',
41
+ us_format: ai1ec_add_new_event.us_format,
42
  now: now
43
  }
44
  $.inputdate( data );
284
  $( '#ai1ec_add_new_ics' ).click( function() {
285
  var $button = $( this );
286
  var $url = $( '#ai1ec_feed_url' );
287
+ var url = $url.val().replace( 'webcal://', 'http://' );
288
+ var invalid = false;
289
+ var error_message;
290
+
291
+ // restore feed url border colors if it has been changed
292
+ $('.ai1ec-feed-url, #ai1ec_feed_url').css( 'border-color', '#DFDFDF' );
293
+ $('#ai1ec-feed-error').remove();
294
+
295
+ // Check for duplicates
296
+ $('.ai1ec-feed-url').each( function() {
297
+ if( this.value == url ) {
298
+ // This feed's already been added
299
+ $(this).css( 'border-color', '#FF0000' );
300
+ invalid = true;
301
+ error_message = ai1ec_add_new_event.duplicate_feed_message;
302
+ }
303
+ } );
304
+ // Check for valid URL
305
+ if( ! isUrl( url ) ) {
306
+ invalid = true;
307
+ error_message = ai1ec_add_new_event.invalid_url_message;
308
+ }
309
+
310
+ if( invalid ) {
311
+ // color the feed url input field in red and output error message
312
+ $url
313
+ .css( 'border-color', '#FF0000' )
314
+ .focus()
315
+ .before( '<div class="error" id="ai1ec-feed-error"><p>' + error_message + '</p></div>' );
316
  } else {
317
  // disable the add button for now
318
  $button.attr( 'disabled', true );
 
 
319
  // create the data to send
320
  var data = {
321
  action: 'ai1ec_add_ics',
322
+ feed_url: url,
323
  feed_category: $( '#ai1ec_feed_category option:selected' ).val(),
324
  feed_tags: $( '#ai1ec_feed_tags' ).val()
325
  };
js/jquery.inputdate.js CHANGED
@@ -26,7 +26,7 @@
26
  /**
27
  * Value initialization
28
  */
29
- function reset( start_date_input, start_time, twentyfour_hour, now )
30
  {
31
  // Restore original values of fields when the page was loaded
32
  start_time.val( start_time.data( 'timespan.initial_value' ) );
@@ -42,7 +42,7 @@
42
  } else {
43
  start = new Date( now );
44
  }
45
- start_date_input.val( formatDate( start, false ) );
46
 
47
  // Trigger function (defined above) to internally store values of each
48
  // input field (used in calculations later).
@@ -57,6 +57,7 @@
57
  start_date_input: 'date-input',
58
  start_time: 'time',
59
  twentyfour_hour: false,
 
60
  now: new Date()
61
  };
62
 
@@ -76,7 +77,7 @@
76
  // Shortcut jQuery objects
77
  var start_date_input = $(o.start_date_input);
78
  var start_time = $(o.start_time);
79
-
80
  var date_inputs = start_date_input;
81
  var all_inputs = start_date_input;
82
 
@@ -87,14 +88,15 @@
87
  // Save original (presumably valid) value of every input field upon focus.
88
  all_inputs.bind( 'focus.timespan', store_value );
89
  date_inputs.calendricalDate( {
90
- today: new Date( o.now.getFullYear(), o.now.getMonth(), o.now.getDate() )
 
91
  } );
92
 
93
  // Validate and update saved value of DATE fields upon blur.
94
  date_inputs
95
  .bind( 'blur.timespan', function() {
96
  // Validate contents of this field.
97
- var date = parseDate( this.value, false );
98
  if( isNaN( date ) ) {
99
  // This field is invalid.
100
  reset_invalid( $(this) );
@@ -103,7 +105,7 @@
103
  $(this).data( 'timespan.stored', this.value );
104
  // Re-format contents of field correctly (in case parsable but not
105
  // perfect).
106
- $(this).val( formatDate( date, false ) );
107
  }
108
  });
109
 
@@ -111,10 +113,10 @@
111
  // appropriate amount.
112
  start_date_input.bind( 'focus.timespan', function() {
113
  // Calculate the time difference between start & end and save it.
114
- var start_date_val = parseDate( start_date_input.val(), false ).getTime() / 1000;
115
  } )
116
  .bind( 'blur.timespan', function() {
117
- var start_date_val = parseDate( start_date_input.data( 'timespan.stored' ), false );
118
  // Shift end date/time as appropriate.
119
  } );
120
 
@@ -124,7 +126,7 @@
124
  // Update hidden field value with chosen date/time.
125
 
126
  // Convert Date object into UNIX timestamp for form submission
127
- var unix_start_time = parseDate( start_date_input.val(), false ).getTime() / 1000;
128
  // If parsed incorrectly, entire calculation is invalid.
129
  if( isNaN( unix_start_time ) ) {
130
  unix_start_time = '';
@@ -141,6 +143,7 @@
141
  reset( start_date_input,
142
  start_time,
143
  o.twentyfour_hour,
 
144
  o.now )
145
 
146
  return this;
@@ -156,6 +159,7 @@
156
  reset( $(o.start_date_input),
157
  $(o.start_time),
158
  o.twentyfour_hour,
 
159
  o.now );
160
 
161
  return this;
26
  /**
27
  * Value initialization
28
  */
29
+ function reset( start_date_input, start_time, twentyfour_hour, us_format, now )
30
  {
31
  // Restore original values of fields when the page was loaded
32
  start_time.val( start_time.data( 'timespan.initial_value' ) );
42
  } else {
43
  start = new Date( now );
44
  }
45
+ start_date_input.val( formatDate( start, us_format ) );
46
 
47
  // Trigger function (defined above) to internally store values of each
48
  // input field (used in calculations later).
57
  start_date_input: 'date-input',
58
  start_time: 'time',
59
  twentyfour_hour: false,
60
+ us_format: false,
61
  now: new Date()
62
  };
63
 
77
  // Shortcut jQuery objects
78
  var start_date_input = $(o.start_date_input);
79
  var start_time = $(o.start_time);
80
+
81
  var date_inputs = start_date_input;
82
  var all_inputs = start_date_input;
83
 
88
  // Save original (presumably valid) value of every input field upon focus.
89
  all_inputs.bind( 'focus.timespan', store_value );
90
  date_inputs.calendricalDate( {
91
+ today: new Date( o.now.getFullYear(), o.now.getMonth(), o.now.getDate() ),
92
+ usa: o.us_format
93
  } );
94
 
95
  // Validate and update saved value of DATE fields upon blur.
96
  date_inputs
97
  .bind( 'blur.timespan', function() {
98
  // Validate contents of this field.
99
+ var date = parseDate( this.value, o.us_format );
100
  if( isNaN( date ) ) {
101
  // This field is invalid.
102
  reset_invalid( $(this) );
105
  $(this).data( 'timespan.stored', this.value );
106
  // Re-format contents of field correctly (in case parsable but not
107
  // perfect).
108
+ $(this).val( formatDate( date, o.us_format ) );
109
  }
110
  });
111
 
113
  // appropriate amount.
114
  start_date_input.bind( 'focus.timespan', function() {
115
  // Calculate the time difference between start & end and save it.
116
+ var start_date_val = parseDate( start_date_input.val(), o.us_format ).getTime() / 1000;
117
  } )
118
  .bind( 'blur.timespan', function() {
119
+ var start_date_val = parseDate( start_date_input.data( 'timespan.stored' ), o.us_format );
120
  // Shift end date/time as appropriate.
121
  } );
122
 
126
  // Update hidden field value with chosen date/time.
127
 
128
  // Convert Date object into UNIX timestamp for form submission
129
+ var unix_start_time = parseDate( start_date_input.val(), o.us_format ).getTime() / 1000;
130
  // If parsed incorrectly, entire calculation is invalid.
131
  if( isNaN( unix_start_time ) ) {
132
  unix_start_time = '';
143
  reset( start_date_input,
144
  start_time,
145
  o.twentyfour_hour,
146
+ o.us_format,
147
  o.now )
148
 
149
  return this;
159
  reset( $(o.start_date_input),
160
  $(o.start_time),
161
  o.twentyfour_hour,
162
+ o.us_format,
163
  o.now );
164
 
165
  return this;
js/jquery.timespan.js CHANGED
@@ -27,7 +27,8 @@
27
  * Value initialization
28
  */
29
  function reset( start_date_input, start_time_input, start_time,
30
- end_date_input, end_time_input, end_time, allday, twentyfour_hour, now )
 
31
  {
32
  // Restore original values of fields when the page was loaded
33
  start_time.val( start_time.data( 'timespan.initial_value' ) );
@@ -49,7 +50,7 @@
49
  start_time_input.val(
50
  formatTime( start.getUTCHours(), start.getUTCMinutes() - start.getUTCMinutes() % 15, twentyfour_hour ) );
51
  }
52
- start_date_input.val( formatDate( start, false ) );
53
 
54
  var end = parseInt( end_time.val() );
55
  // If end_time field has a valid integer, use it, else use start time plus
@@ -67,7 +68,7 @@
67
  // provided we were given an iCalendar-spec all-day timespan.
68
  if( allday.get(0).checked )
69
  end.setUTCDate( end.getUTCDate() - 1 );
70
- end_date_input.val( formatDate( end, false ) );
71
 
72
  // Trigger function (defined above) to internally store values of each
73
  // input field (used in calculations later).
@@ -94,6 +95,7 @@
94
  end_time_input: '#end-time-input',
95
  end_time: '#end-time',
96
  twentyfour_hour: false,
 
97
  now: new Date(),
98
  };
99
 
@@ -137,10 +139,10 @@
137
  .bind( 'change.timespan', function() {
138
  if( this.checked ) {
139
  time_inputs.fadeOut();
140
- date_inputs.calendricalDateRange( { today: today } );
141
  } else {
142
  time_inputs.fadeIn();
143
- all_inputs.calendricalDateTimeRange( { today: today } );
144
  }
145
  } )
146
  .get().checked = false;
@@ -149,7 +151,7 @@
149
  date_inputs
150
  .bind( 'blur.timespan', function() {
151
  // Validate contents of this field.
152
- var date = parseDate( this.value, false );
153
  if( isNaN( date ) ) {
154
  // This field is invalid.
155
  reset_invalid( $(this) );
@@ -158,7 +160,7 @@
158
  $(this).data( 'timespan.stored', this.value );
159
  // Re-format contents of field correctly (in case parsable but not
160
  // perfect).
161
- $(this).val( formatDate( date, false ) );
162
  }
163
  });
164
 
@@ -184,23 +186,23 @@
184
  start_date_input.add( o.start_time_input )
185
  .bind( 'focus.timespan', function() {
186
  // Calculate the time difference between start & end and save it.
187
- var start_date_val = parseDate( start_date_input.val(), false ).getTime() / 1000;
188
  var start_time_val = parseTime( start_time_input.val() );
189
  start_date_val += start_time_val.hour * 3600 + start_time_val.minute * 60;
190
- var end_date_val = parseDate( end_date_input.val(), false ).getTime() / 1000;
191
  var end_time_val = parseTime( end_time_input.val() );
192
  end_date_val += end_time_val.hour * 3600 + end_time_val.minute * 60;
193
  start_date_input.data( 'time_diff', end_date_val - start_date_val );
194
  } )
195
  .bind( 'blur.timespan', function() {
196
- var start_date_val = parseDate( start_date_input.data( 'timespan.stored' ), false );
197
  var start_time_val = parseTime( start_time_input.data( 'timespan.stored' ) );
198
  // Shift end date/time as appropriate.
199
  var end_time_val = start_date_val.getTime() / 1000
200
  + start_time_val.hour * 3600 + start_time_val.minute * 60
201
  + start_date_input.data( 'time_diff' );
202
  end_time_val = new Date( end_time_val * 1000 );
203
- end_date_input.val( formatDate( end_time_val, false ) );
204
  end_time_input.val( formatTime( end_time_val.getUTCHours(), end_time_val.getUTCMinutes(), false ) );
205
  } );
206
 
@@ -212,7 +214,7 @@
212
  // 1. Start date/time
213
 
214
  // Convert Date object into UNIX timestamp for form submission
215
- var unix_start_time = parseDate( start_date_input.val(), false ).getTime() / 1000;
216
  // If parsed correctly, proceed to add the time.
217
  if( ! isNaN( unix_start_time ) ) {
218
  // Add time quantity to date, unless "All day" is checked.
@@ -237,7 +239,7 @@
237
  // 2. End date/time
238
 
239
  // Convert Date object into UNIX timestamp for form submission
240
- var unix_end_time = parseDate( end_date_input.val(), false ).getTime() / 1000;
241
  // If parsed correctly, proceed to add the time.
242
  if( ! isNaN( unix_end_time ) ) {
243
  // If "All day" is checked, store an end date that is one day
@@ -278,6 +280,7 @@
278
  end_time,
279
  allday,
280
  o.twentyfour_hour,
 
281
  o.now )
282
 
283
  return this;
@@ -298,6 +301,7 @@
298
  $(o.end_time),
299
  $(o.allday),
300
  o.twentyfour_hour,
 
301
  o.now );
302
 
303
  return this;
27
  * Value initialization
28
  */
29
  function reset( start_date_input, start_time_input, start_time,
30
+ end_date_input, end_time_input, end_time, allday, twentyfour_hour,
31
+ us_format, now )
32
  {
33
  // Restore original values of fields when the page was loaded
34
  start_time.val( start_time.data( 'timespan.initial_value' ) );
50
  start_time_input.val(
51
  formatTime( start.getUTCHours(), start.getUTCMinutes() - start.getUTCMinutes() % 15, twentyfour_hour ) );
52
  }
53
+ start_date_input.val( formatDate( start, us_format ) );
54
 
55
  var end = parseInt( end_time.val() );
56
  // If end_time field has a valid integer, use it, else use start time plus
68
  // provided we were given an iCalendar-spec all-day timespan.
69
  if( allday.get(0).checked )
70
  end.setUTCDate( end.getUTCDate() - 1 );
71
+ end_date_input.val( formatDate( end, us_format ) );
72
 
73
  // Trigger function (defined above) to internally store values of each
74
  // input field (used in calculations later).
95
  end_time_input: '#end-time-input',
96
  end_time: '#end-time',
97
  twentyfour_hour: false,
98
+ us_format: false,
99
  now: new Date(),
100
  };
101
 
139
  .bind( 'change.timespan', function() {
140
  if( this.checked ) {
141
  time_inputs.fadeOut();
142
+ date_inputs.calendricalDateRange( { today: today, usa: o.us_format } );
143
  } else {
144
  time_inputs.fadeIn();
145
+ all_inputs.calendricalDateTimeRange( { today: today, usa: o.us_format } );
146
  }
147
  } )
148
  .get().checked = false;
151
  date_inputs
152
  .bind( 'blur.timespan', function() {
153
  // Validate contents of this field.
154
+ var date = parseDate( this.value, o.us_format );
155
  if( isNaN( date ) ) {
156
  // This field is invalid.
157
  reset_invalid( $(this) );
160
  $(this).data( 'timespan.stored', this.value );
161
  // Re-format contents of field correctly (in case parsable but not
162
  // perfect).
163
+ $(this).val( formatDate( date, o.us_format ) );
164
  }
165
  });
166
 
186
  start_date_input.add( o.start_time_input )
187
  .bind( 'focus.timespan', function() {
188
  // Calculate the time difference between start & end and save it.
189
+ var start_date_val = parseDate( start_date_input.val(), o.us_format ).getTime() / 1000;
190
  var start_time_val = parseTime( start_time_input.val() );
191
  start_date_val += start_time_val.hour * 3600 + start_time_val.minute * 60;
192
+ var end_date_val = parseDate( end_date_input.val(), o.us_format ).getTime() / 1000;
193
  var end_time_val = parseTime( end_time_input.val() );
194
  end_date_val += end_time_val.hour * 3600 + end_time_val.minute * 60;
195
  start_date_input.data( 'time_diff', end_date_val - start_date_val );
196
  } )
197
  .bind( 'blur.timespan', function() {
198
+ var start_date_val = parseDate( start_date_input.data( 'timespan.stored' ), o.us_format );
199
  var start_time_val = parseTime( start_time_input.data( 'timespan.stored' ) );
200
  // Shift end date/time as appropriate.
201
  var end_time_val = start_date_val.getTime() / 1000
202
  + start_time_val.hour * 3600 + start_time_val.minute * 60
203
  + start_date_input.data( 'time_diff' );
204
  end_time_val = new Date( end_time_val * 1000 );
205
+ end_date_input.val( formatDate( end_time_val, o.us_format ) );
206
  end_time_input.val( formatTime( end_time_val.getUTCHours(), end_time_val.getUTCMinutes(), false ) );
207
  } );
208
 
214
  // 1. Start date/time
215
 
216
  // Convert Date object into UNIX timestamp for form submission
217
+ var unix_start_time = parseDate( start_date_input.val(), o.us_format ).getTime() / 1000;
218
  // If parsed correctly, proceed to add the time.
219
  if( ! isNaN( unix_start_time ) ) {
220
  // Add time quantity to date, unless "All day" is checked.
239
  // 2. End date/time
240
 
241
  // Convert Date object into UNIX timestamp for form submission
242
+ var unix_end_time = parseDate( end_date_input.val(), o.us_format ).getTime() / 1000;
243
  // If parsed correctly, proceed to add the time.
244
  if( ! isNaN( unix_end_time ) ) {
245
  // If "All day" is checked, store an end date that is one day
280
  end_time,
281
  allday,
282
  o.twentyfour_hour,
283
+ o.us_format,
284
  o.now )
285
 
286
  return this;
301
  $(o.end_time),
302
  $(o.allday),
303
  o.twentyfour_hour,
304
+ o.us_format,
305
  o.now );
306
 
307
  return this;
language/all-in-one-event-calendar.mo ADDED
Binary file
language/all-in-one-event-calendar.po ADDED
@@ -0,0 +1,829 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2010 All-in-One Event Calendar Plugin
2
+ # This file is distributed under the same license as the All-in-One Event Calendar Plugin package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: All-in-One Event Calendar Plugin 1.0.6\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/tag/all-in-one-event-calendar\n"
7
+ "POT-Creation-Date: 2011-09-15 08:49:29+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2011-09-15 01:53-0800\n"
12
+ "Last-Translator: Paul Hoepfner-Homme <paul@the-seed.ca>\n"
13
+ "Language-Team: The Seed Studio <dev@theseedstudio.com>\n"
14
+ "X-Poedit-Language: English\n"
15
+ "X-Poedit-Country: CANADA\n"
16
+
17
+ #: app/controller/class-ai1ec-importer-controller.php:91
18
+ msgid "The Events Calendar → All-in-One Event Calendar"
19
+ msgstr ""
20
+
21
+ #: app/controller/class-ai1ec-importer-controller.php:92
22
+ msgid "Imports events created using The Events Calendar plugin into the All-in-One Event Calendar"
23
+ msgstr ""
24
+
25
+ #: app/controller/class-ai1ec-settings-controller.php:82
26
+ msgid "Settings Updated."
27
+ msgstr ""
28
+
29
+ #: app/controller/class-ai1ec-settings-controller.php:172
30
+ msgid "Flushed %d events"
31
+ msgstr ""
32
+
33
+ #: app/controller/class-ai1ec-settings-controller.php:214
34
+ msgid "Imported %d events"
35
+ msgstr ""
36
+
37
+ #: app/controller/class-ai1ec-settings-controller.php:215
38
+ #: app/view/feed_row.php:22
39
+ msgid "Flush 1 event"
40
+ msgid_plural "Flush %s events"
41
+ msgstr[0] ""
42
+ msgstr[1] ""
43
+
44
+ #: app/controller/class-ai1ec-settings-controller.php:266
45
+ msgctxt "meta box"
46
+ msgid "General Settings"
47
+ msgstr ""
48
+
49
+ #: app/controller/class-ai1ec-settings-controller.php:273
50
+ msgctxt "meta box"
51
+ msgid "The Seed Studio Support"
52
+ msgstr ""
53
+
54
+ #: app/controller/class-ai1ec-settings-controller.php:280
55
+ msgctxt "meta box"
56
+ msgid "ICS Import Settings"
57
+ msgstr ""
58
+
59
+ #: app/controller/class-ai1ec-settings-controller.php:344
60
+ msgid "<a href=\"%s\">Settings</a>"
61
+ msgstr ""
62
+
63
+ #: app/controller/class-ai1ec-settings-controller.php:358
64
+ msgid "<a href=\"%s\" target=\"_blank\">Donate</a>"
65
+ msgstr ""
66
+
67
+ #: app/controller/class-ai1ec-settings-controller.php:359
68
+ msgid "<a href=\"%s\" target=\"_blank\">Get Support</a>"
69
+ msgstr ""
70
+
71
+ #: app/controller/class-ai1ec-calendar-controller.php:280
72
+ #: app/helper/class-ai1ec-settings-helper.php:151
73
+ #: app/view/calendar.php:18
74
+ msgid "Agenda"
75
+ msgstr ""
76
+
77
+ #: app/controller/class-ai1ec-events-controller.php:133
78
+ msgid "This feed is already being imported."
79
+ msgstr ""
80
+
81
+ #: app/controller/class-ai1ec-events-controller.php:134
82
+ msgid "Please enter a valid iCalendar URL."
83
+ msgstr ""
84
+
85
+ #: app/controller/class-ai1ec-events-controller.php:274
86
+ msgid "Publish"
87
+ msgstr ""
88
+
89
+ #: app/controller/class-ai1ec-events-controller.php:274
90
+ #: app/view/feed_row.php:20
91
+ msgid "Update"
92
+ msgstr ""
93
+
94
+ #: app/controller/class-ai1ec-events-controller.php:276
95
+ msgid "Submit for Review"
96
+ msgstr ""
97
+
98
+ #: app/controller/class-ai1ec-events-controller.php:465
99
+ msgid "Event updated. <a href=\"%s\">View event</a>"
100
+ msgstr ""
101
+
102
+ #: app/controller/class-ai1ec-events-controller.php:466
103
+ msgid "Custom field updated."
104
+ msgstr ""
105
+
106
+ #: app/controller/class-ai1ec-events-controller.php:467
107
+ msgid "Custom field deleted."
108
+ msgstr ""
109
+
110
+ #: app/controller/class-ai1ec-events-controller.php:468
111
+ msgid "Event updated."
112
+ msgstr ""
113
+
114
+ #. translators: %s: date and time of the revision
115
+ #: app/controller/class-ai1ec-events-controller.php:470
116
+ msgid "Event restored to revision from %s"
117
+ msgstr ""
118
+
119
+ #: app/controller/class-ai1ec-events-controller.php:471
120
+ msgid "Event published. <a href=\"%s\">View event</a>"
121
+ msgstr ""
122
+
123
+ #: app/controller/class-ai1ec-events-controller.php:472
124
+ msgid "Event saved."
125
+ msgstr ""
126
+
127
+ #: app/controller/class-ai1ec-events-controller.php:473
128
+ msgid "Event submitted. <a target=\"_blank\" href=\"%s\">Preview event</a>"
129
+ msgstr ""
130
+
131
+ #: app/controller/class-ai1ec-events-controller.php:474
132
+ msgid "Event scheduled for: <strong>%1$s</strong>. <a target=\"_blank\" href=\"%2$s\">Preview event</a>"
133
+ msgstr ""
134
+
135
+ #. translators: Publish box date format, see http:php.net/date
136
+ #: app/controller/class-ai1ec-events-controller.php:476
137
+ msgid "M j, Y @ G:i"
138
+ msgstr ""
139
+
140
+ #: app/controller/class-ai1ec-events-controller.php:477
141
+ msgid "Event draft updated. <a target=\"_blank\" href=\"%s\">Preview event</a>"
142
+ msgstr ""
143
+
144
+ #: app/controller/class-ai1ec-app-controller.php:331
145
+ #: app/controller/class-ai1ec-app-controller.php:332
146
+ msgid "Settings"
147
+ msgstr ""
148
+
149
+ #: app/helper/class-ai1ec-events-helper.php:438
150
+ msgid "times"
151
+ msgstr ""
152
+
153
+ #: app/helper/class-ai1ec-app-helper.php:149
154
+ msgid "Add New"
155
+ msgstr ""
156
+
157
+ #: app/helper/class-ai1ec-app-helper.php:150
158
+ msgid "Add New Event"
159
+ msgstr ""
160
+
161
+ #: app/helper/class-ai1ec-app-helper.php:151
162
+ msgid "Edit Event"
163
+ msgstr ""
164
+
165
+ #: app/helper/class-ai1ec-app-helper.php:152
166
+ msgid "New Event"
167
+ msgstr ""
168
+
169
+ #: app/helper/class-ai1ec-app-helper.php:153
170
+ msgid "View Event"
171
+ msgstr ""
172
+
173
+ #: app/helper/class-ai1ec-app-helper.php:154
174
+ msgid "Search Events"
175
+ msgstr ""
176
+
177
+ #: app/helper/class-ai1ec-app-helper.php:155
178
+ msgid "No Events found"
179
+ msgstr ""
180
+
181
+ #: app/helper/class-ai1ec-app-helper.php:156
182
+ msgid "No Events found in Trash"
183
+ msgstr ""
184
+
185
+ #: app/helper/class-ai1ec-app-helper.php:157
186
+ msgid "Parent Event"
187
+ msgstr ""
188
+
189
+ #: app/helper/class-ai1ec-app-helper.php:158
190
+ msgid "Events"
191
+ msgstr ""
192
+
193
+ #: app/helper/class-ai1ec-app-helper.php:313
194
+ msgid "All Events <span class=\"update-plugins count-%d\" title=\"%d Pending Events\"><span class=\"update-count\">%d</span></span>"
195
+ msgstr ""
196
+
197
+ #: app/helper/class-ai1ec-app-helper.php:319
198
+ msgid "All Events"
199
+ msgstr ""
200
+
201
+ #: app/helper/class-ai1ec-app-helper.php:395
202
+ msgid "Event Details"
203
+ msgstr ""
204
+
205
+ #: app/helper/class-ai1ec-app-helper.php:412
206
+ msgid "Post Date"
207
+ msgstr ""
208
+
209
+ #: app/helper/class-ai1ec-app-helper.php:413
210
+ msgid "Event date/time"
211
+ msgstr ""
212
+
213
+ #: app/helper/class-ai1ec-app-helper.php:629
214
+ msgid "To set up the plugin, please select an option in the <strong>Calendar page</strong> dropdown list, then click <strong>Update Settings</strong>."
215
+ msgstr ""
216
+
217
+ #: app/helper/class-ai1ec-app-helper.php:633
218
+ msgid "The plugin is installed, but has not been configured. <a href=\"%s\">Click here to set it up now »</a>"
219
+ msgstr ""
220
+
221
+ #: app/helper/class-ai1ec-app-helper.php:639
222
+ msgid "The plugin is installed, but has not been configured. Please log in as a WordPress Administrator to set it up."
223
+ msgstr ""
224
+
225
+ #: app/helper/class-ai1ec-calendar-helper.php:564
226
+ msgid "« Previous Events"
227
+ msgstr ""
228
+
229
+ #: app/helper/class-ai1ec-calendar-helper.php:571
230
+ msgid "Next Events »"
231
+ msgstr ""
232
+
233
+ #: app/helper/class-ai1ec-settings-helper.php:85
234
+ msgid "- Auto-Create New Page -"
235
+ msgstr ""
236
+
237
+ #: app/helper/class-ai1ec-settings-helper.php:106
238
+ msgid "View \"%s\" »"
239
+ msgstr ""
240
+
241
+ #: app/helper/class-ai1ec-settings-helper.php:148
242
+ #: app/view/calendar.php:10
243
+ #: app/view/calendar.php:11
244
+ #: app/view/calendar.php:17
245
+ msgid "Month"
246
+ msgstr ""
247
+
248
+ #: app/helper/class-ai1ec-settings-helper.php:168
249
+ msgid "Hourly"
250
+ msgstr ""
251
+
252
+ #: app/helper/class-ai1ec-settings-helper.php:171
253
+ msgid "Twice Daily"
254
+ msgstr ""
255
+
256
+ #: app/helper/class-ai1ec-settings-helper.php:174
257
+ msgid "Daily"
258
+ msgstr ""
259
+
260
+ #: app/helper/class-ai1ec-settings-helper.php:258
261
+ msgid "Calendar"
262
+ msgstr ""
263
+
264
+ #: app/view/settings.php:5
265
+ msgid "All-in-one Event Calendar"
266
+ msgstr ""
267
+
268
+ #: app/view/settings.php:17
269
+ msgid "Update Settings"
270
+ msgstr ""
271
+
272
+ #: app/view/box_event_cost.php:1
273
+ msgid "Event cost"
274
+ msgstr ""
275
+
276
+ #: app/view/box_event_cost.php:7
277
+ msgid "Cost"
278
+ msgstr ""
279
+
280
+ #: app/view/event-excerpt.php:2
281
+ #: app/view/event-single.php:5
282
+ #: app/view/event-multi.php:4
283
+ msgid "When:"
284
+ msgstr ""
285
+
286
+ #: app/view/event-excerpt.php:4
287
+ #: app/view/event-single.php:20
288
+ #: app/view/event-multi.php:20
289
+ msgid "Where:"
290
+ msgstr ""
291
+
292
+ #: app/view/feed_row.php:3
293
+ #: app/view/box_ics_import_settings.php:8
294
+ msgid "iCalendar/.ics Feed URL:"
295
+ msgstr ""
296
+
297
+ #: app/view/feed_row.php:9
298
+ msgid "Event category:"
299
+ msgstr ""
300
+
301
+ #: app/view/feed_row.php:15
302
+ #: app/view/box_ics_import_settings.php:18
303
+ msgid "Tag with"
304
+ msgstr ""
305
+
306
+ #: app/view/feed_row.php:19
307
+ msgid "× Delete"
308
+ msgstr ""
309
+
310
+ #: app/view/event-map.php:6
311
+ msgid "View Full-Size Map »"
312
+ msgstr ""
313
+
314
+ #: app/view/box_event_location.php:1
315
+ msgid "Event location details"
316
+ msgstr ""
317
+
318
+ #: app/view/box_event_location.php:7
319
+ msgid "Venue name:"
320
+ msgstr ""
321
+
322
+ #: app/view/box_event_location.php:17
323
+ msgid "Address:"
324
+ msgstr ""
325
+
326
+ #: app/view/box_event_location.php:27
327
+ msgid "Show Google Map:"
328
+ msgstr ""
329
+
330
+ #: app/view/class-ai1ec-agenda-widget.php:18
331
+ #: app/view/class-ai1ec-agenda-widget.php:39
332
+ msgid "Upcoming Events"
333
+ msgstr ""
334
+
335
+ #: app/view/class-ai1ec-agenda-widget.php:20
336
+ msgid "All-in-One Event Calendar: Lists upcoming events in Agenda view"
337
+ msgstr ""
338
+
339
+ #: app/view/month.php:4
340
+ #: app/view/agenda.php:12
341
+ msgid "Today"
342
+ msgstr ""
343
+
344
+ #: app/view/month.php:50
345
+ msgid "Summary:"
346
+ msgstr ""
347
+
348
+ #: app/view/month.php:53
349
+ msgid "click anywhere for details"
350
+ msgstr ""
351
+
352
+ #: app/view/month.php:61
353
+ #: app/view/agenda.php:57
354
+ #: app/view/agenda.php:107
355
+ msgid "(all-day)"
356
+ msgstr ""
357
+
358
+ #: app/view/import.php:6
359
+ msgid "Successfully imported events:"
360
+ msgstr ""
361
+
362
+ #: app/view/event-single.php:8
363
+ msgid "Back to Calendar »"
364
+ msgstr ""
365
+
366
+ #: app/view/event-single.php:15
367
+ #: app/view/event-multi.php:14
368
+ msgid "Repeats:"
369
+ msgstr ""
370
+
371
+ #: app/view/event-single.php:27
372
+ msgid "Add this event to your favourite calendar program (iCal, Outlook, etc.)"
373
+ msgstr ""
374
+
375
+ #: app/view/event-single.php:28
376
+ msgid "✔ Add to Calendar"
377
+ msgstr ""
378
+
379
+ #: app/view/event-single.php:31
380
+ msgid "Add this event to your Google Calendar"
381
+ msgstr ""
382
+
383
+ #: app/view/event-single.php:33
384
+ msgid "Add to Google Calendar"
385
+ msgstr ""
386
+
387
+ #: app/view/event-single.php:40
388
+ #: app/view/event-multi.php:33
389
+ msgid "Cost:"
390
+ msgstr ""
391
+
392
+ #: app/view/event-single.php:46
393
+ #: app/view/event-multi.php:39
394
+ msgid "Contact:"
395
+ msgstr ""
396
+
397
+ #: app/view/event-single.php:52
398
+ #: app/view/event-multi.php:45
399
+ #: app/view/agenda.php:79
400
+ msgid "Categories:"
401
+ msgstr ""
402
+
403
+ #: app/view/event-single.php:59
404
+ #: app/view/event-multi.php:51
405
+ #: app/view/agenda.php:85
406
+ msgid "Tags:"
407
+ msgstr ""
408
+
409
+ #: app/view/box_eventbrite.php:1
410
+ msgid "Eventbrite Ticketing"
411
+ msgstr ""
412
+
413
+ #: app/view/box_eventbrite.php:7
414
+ msgid "Register this event with Eventbrite.com?"
415
+ msgstr ""
416
+
417
+ #: app/view/box_eventbrite.php:12
418
+ msgid "Yes"
419
+ msgstr ""
420
+
421
+ #: app/view/box_eventbrite.php:14
422
+ msgid "No"
423
+ msgstr ""
424
+
425
+ #: app/view/box_eventbrite.php:22
426
+ msgid "Set up your first ticket"
427
+ msgstr ""
428
+
429
+ #: app/view/box_eventbrite.php:24
430
+ msgid "To create multiple tickets per event, submit this form, then follow the link to Eventbrite."
431
+ msgstr ""
432
+
433
+ #: app/view/box_eventbrite.php:32
434
+ msgid "Name"
435
+ msgstr ""
436
+
437
+ #: app/view/box_eventbrite.php:42
438
+ msgid "Description"
439
+ msgstr ""
440
+
441
+ #: app/view/box_eventbrite.php:53
442
+ msgid "Type"
443
+ msgstr ""
444
+
445
+ #: app/view/box_eventbrite.php:58
446
+ msgid "Set Price"
447
+ msgstr ""
448
+
449
+ #: app/view/box_eventbrite.php:60
450
+ msgid "Donation Based"
451
+ msgstr ""
452
+
453
+ #: app/view/box_eventbrite.php:68
454
+ msgid "The price for this event's first ticket will be taken from the Cost field above."
455
+ msgstr ""
456
+
457
+ #: app/view/box_eventbrite.php:75
458
+ msgid "Quantity"
459
+ msgstr ""
460
+
461
+ #: app/view/box_eventbrite.php:85
462
+ msgid "Include Fee in Price"
463
+ msgstr ""
464
+
465
+ #: app/view/box_eventbrite.php:90
466
+ msgid "Add Service Fee on top of price"
467
+ msgstr ""
468
+
469
+ #: app/view/box_eventbrite.php:92
470
+ msgid "Include Service fee in price"
471
+ msgstr ""
472
+
473
+ #: app/view/box_eventbrite.php:98
474
+ msgid "Payment Options"
475
+ msgstr ""
476
+
477
+ #: app/view/box_eventbrite.php:103
478
+ msgid "Paypal"
479
+ msgstr ""
480
+
481
+ #: app/view/box_eventbrite.php:105
482
+ msgid "Google Checkout"
483
+ msgstr ""
484
+
485
+ #: app/view/box_eventbrite.php:107
486
+ msgid "Check"
487
+ msgstr ""
488
+
489
+ #: app/view/box_eventbrite.php:109
490
+ msgid "Cash"
491
+ msgstr ""
492
+
493
+ #: app/view/box_eventbrite.php:111
494
+ msgid "Send an Invoice"
495
+ msgstr ""
496
+
497
+ #. #-#-#-#-# plugin.pot (All-in-One Event Calendar Plugin 1.0.6) #-#-#-#-#
498
+ #. Author of the plugin/theme
499
+ #: app/view/box_the_seed_studio.php:3
500
+ msgid "The Seed Studio"
501
+ msgstr ""
502
+
503
+ #: app/view/box_the_seed_studio.php:5
504
+ msgid "The Seed Studio provides web development and support services for clients and web developers."
505
+ msgstr ""
506
+
507
+ #: app/view/box_the_seed_studio.php:11
508
+ msgid "Follow @the_seed_studio"
509
+ msgstr ""
510
+
511
+ #: app/view/box_the_seed_studio.php:16
512
+ msgid "Get Support<span> from one of our experienced pros</span>"
513
+ msgstr ""
514
+
515
+ #: app/view/box_the_seed_studio.php:18
516
+ msgid "Support"
517
+ msgstr ""
518
+
519
+ #: app/view/box_the_seed_studio.php:20
520
+ msgid "View plugin documentation"
521
+ msgstr ""
522
+
523
+ #: app/view/box_the_seed_studio.php:23
524
+ msgid "You can also hire The Seed for support on a contract or per-hour basis for this plugin, for your website or for any of your Internet marketing needs (we can really help!)."
525
+ msgstr ""
526
+
527
+ #: app/view/box_the_seed_studio.php:26
528
+ msgid "Plugin users: The Seed gives support priority to clients. For free support from other WordPress users, visit the plugin's forum."
529
+ msgstr ""
530
+
531
+ #: app/view/box_the_seed_studio.php:29
532
+ msgid "Vote and Share"
533
+ msgstr ""
534
+
535
+ #: app/view/box_the_seed_studio.php:32
536
+ msgid "This plugin is offered free to the Wordpress Community under the GPL3 license. All we ask is that you:"
537
+ msgstr ""
538
+
539
+ #: app/view/box_the_seed_studio.php:34
540
+ msgid "<a href=\"http://wordpress.org/extend/plugins/all-in-one-event-calendar/\" target=\"_blank\">Give it a five-star rating on wordpress.org</a> (if you think it deserves it!)"
541
+ msgstr ""
542
+
543
+ #: app/view/box_the_seed_studio.php:35
544
+ msgid "Link to the plugin page on our website"
545
+ msgstr ""
546
+
547
+ #: app/view/box_the_seed_studio.php:36
548
+ msgid "Become a Fan on Facebook"
549
+ msgstr ""
550
+
551
+ #: app/view/box_the_seed_studio.php:37
552
+ msgid "Follow us on Twitter"
553
+ msgstr ""
554
+
555
+ #: app/view/box_the_seed_studio.php:41
556
+ msgid "Donate"
557
+ msgstr ""
558
+
559
+ #: app/view/box_the_seed_studio.php:43
560
+ msgid "If you would like to help support development of this plugin, then by all means..."
561
+ msgstr ""
562
+
563
+ #: app/view/event-multi.php:7
564
+ msgid "View in Calendar »"
565
+ msgstr ""
566
+
567
+ #: app/view/event-multi.php:24
568
+ msgid "View Map »"
569
+ msgstr ""
570
+
571
+ #: app/view/box_general_settings.php:3
572
+ msgid "Calendar page:"
573
+ msgstr ""
574
+
575
+ #: app/view/box_general_settings.php:7
576
+ msgid "Default calendar view:"
577
+ msgstr ""
578
+
579
+ #: app/view/box_general_settings.php:11
580
+ msgid "Contain calendar in this DOM element:"
581
+ msgstr ""
582
+
583
+ #: app/view/box_general_settings.php:13
584
+ msgid "Optional. Provide a <a href=\"http://api.jquery.com/category/selectors/\" target=\"_blank\">jQuery selector</a> that evaluates to a single DOM element. Replaces any existing markup found within target. If left empty, calendar is shown in normal page content container."
585
+ msgstr ""
586
+
587
+ #: app/view/box_general_settings.php:15
588
+ msgid "Week starts on"
589
+ msgstr ""
590
+
591
+ #: app/view/box_general_settings.php:19
592
+ msgid "Agenda pages show at most"
593
+ msgstr ""
594
+
595
+ #: app/view/box_general_settings.php:20
596
+ msgid "events"
597
+ msgstr ""
598
+
599
+ #: app/view/box_general_settings.php:25
600
+ msgid "<strong>Exclude</strong> events from search results"
601
+ msgstr ""
602
+
603
+ #: app/view/box_general_settings.php:31
604
+ msgid "Show <strong>Post Your Event</strong> button above the calendar to privileged users"
605
+ msgstr ""
606
+
607
+ #: app/view/box_general_settings.php:37
608
+ msgid "Hide <strong>Subscribe</strong>/<strong>Add to Calendar</strong> buttons in calendar and single event views"
609
+ msgstr ""
610
+
611
+ #: app/view/box_general_settings.php:43
612
+ msgid "Include <strong>event categories</strong> in post category lists"
613
+ msgstr ""
614
+
615
+ #: app/view/box_general_settings.php:51
616
+ msgid "Input dates in <strong>US format</strong>"
617
+ msgstr ""
618
+
619
+ #: app/view/box_general_settings.php:57
620
+ msgid "Display <strong>Publish</strong> at bottom of Edit Event form"
621
+ msgstr ""
622
+
623
+ #: app/view/agenda-widget.php:11
624
+ msgid "There are no upcoming events."
625
+ msgstr ""
626
+
627
+ #: app/view/agenda-widget.php:59
628
+ msgid "View Calendar »"
629
+ msgstr ""
630
+
631
+ #: app/view/agenda-widget.php:67
632
+ #: app/view/calendar.php:101
633
+ msgid "Subscribe to this calendar using your favourite calendar program (iCal, Outlook, etc.)"
634
+ msgstr ""
635
+
636
+ #: app/view/agenda-widget.php:68
637
+ #: app/view/calendar.php:102
638
+ msgid "✔ Subscribe"
639
+ msgstr ""
640
+
641
+ #: app/view/agenda-widget.php:72
642
+ #: app/view/calendar.php:107
643
+ msgid "Subscribe to this calendar in your Google Calendar"
644
+ msgstr ""
645
+
646
+ #: app/view/agenda-widget.php:74
647
+ msgid "Add to Google"
648
+ msgstr ""
649
+
650
+ #: app/view/box_event_contact.php:1
651
+ msgid "Organizer contact info"
652
+ msgstr ""
653
+
654
+ #: app/view/box_event_contact.php:7
655
+ msgid "Contact name:"
656
+ msgstr ""
657
+
658
+ #: app/view/box_event_contact.php:17
659
+ msgid "Phone:"
660
+ msgstr ""
661
+
662
+ #: app/view/box_event_contact.php:27
663
+ msgid "E-mail:"
664
+ msgstr ""
665
+
666
+ #: app/view/admin_notices.php:2
667
+ msgid "All-in-One Event Calendar Notice:"
668
+ msgstr ""
669
+
670
+ #: app/view/calendar.php:27
671
+ msgid "+ Post Your Event"
672
+ msgstr ""
673
+
674
+ #: app/view/calendar.php:36
675
+ msgid "Clear Filters"
676
+ msgstr ""
677
+
678
+ #: app/view/calendar.php:36
679
+ msgid "✘"
680
+ msgstr ""
681
+
682
+ #: app/view/calendar.php:37
683
+ msgid "Filter:"
684
+ msgstr ""
685
+
686
+ #: app/view/calendar.php:42
687
+ msgid "Categories ▾"
688
+ msgstr ""
689
+
690
+ #: app/view/calendar.php:64
691
+ msgid "Tags ▾"
692
+ msgstr ""
693
+
694
+ #: app/view/calendar.php:103
695
+ msgid "to this filtered calendar"
696
+ msgstr ""
697
+
698
+ #: app/view/calendar.php:109
699
+ msgid "Subscribe in Google Calendar"
700
+ msgstr ""
701
+
702
+ #: app/view/agenda.php:5
703
+ msgid "+ Expand All"
704
+ msgstr ""
705
+
706
+ #: app/view/agenda.php:8
707
+ msgid "− Collapse All"
708
+ msgstr ""
709
+
710
+ #: app/view/agenda.php:28
711
+ msgid "There are no upcoming events to display at this time."
712
+ msgstr ""
713
+
714
+ #: app/view/agenda.php:75
715
+ msgid "Read more »"
716
+ msgstr ""
717
+
718
+ #: app/view/event-single-footer.php:8
719
+ msgid "View original post »"
720
+ msgstr ""
721
+
722
+ #: app/view/agenda-widget-form.php:2
723
+ msgid "Title:"
724
+ msgstr ""
725
+
726
+ #: app/view/agenda-widget-form.php:6
727
+ msgid "Number of events to show:"
728
+ msgstr ""
729
+
730
+ #: app/view/agenda-widget-form.php:11
731
+ msgid "Show <strong>View Calendar</strong> button"
732
+ msgstr ""
733
+
734
+ #: app/view/agenda-widget-form.php:14
735
+ msgid "Show <strong>Subscribe</strong> buttons"
736
+ msgstr ""
737
+
738
+ #: app/view/agenda-widget-form.php:17
739
+ msgid "Hide this widget on calendar page"
740
+ msgstr ""
741
+
742
+ #: app/view/box_time_and_date.php:2
743
+ msgid "Event date and time"
744
+ msgstr ""
745
+
746
+ #: app/view/box_time_and_date.php:8
747
+ msgid "All-day event"
748
+ msgstr ""
749
+
750
+ #: app/view/box_time_and_date.php:18
751
+ msgid "Start date / time"
752
+ msgstr ""
753
+
754
+ #: app/view/box_time_and_date.php:31
755
+ msgid "End date / time"
756
+ msgstr ""
757
+
758
+ #: app/view/box_time_and_date.php:44
759
+ msgid "Repeat"
760
+ msgstr ""
761
+
762
+ #: app/view/box_time_and_date.php:54
763
+ msgid "End"
764
+ msgstr ""
765
+
766
+ #: app/view/box_time_and_date.php:64
767
+ msgid "Ending after"
768
+ msgstr ""
769
+
770
+ #: app/view/box_time_and_date.php:74
771
+ msgid "On date"
772
+ msgstr ""
773
+
774
+ #: app/view/box_ics_import_settings.php:2
775
+ msgid "Auto-refresh"
776
+ msgstr ""
777
+
778
+ #: app/view/box_ics_import_settings.php:12
779
+ msgid "Event category"
780
+ msgstr ""
781
+
782
+ #: app/view/box_ics_import_settings.php:22
783
+ msgid "+ Add new subscription"
784
+ msgstr ""
785
+
786
+ #: app/view/event_categories-color_picker.php:5
787
+ #: app/view/event_categories-color_picker.php:19
788
+ msgid "Category Color"
789
+ msgstr ""
790
+
791
+ #: app/view/event_categories-color_picker.php:13
792
+ #: app/view/event_categories-color_picker.php:25
793
+ msgid "Events in this category will be identified by this color"
794
+ msgstr ""
795
+
796
+ #: app/model/class-ai1ec-event.php:444
797
+ msgid " (all-day)"
798
+ msgstr ""
799
+
800
+ #: app/model/class-ai1ec-event.php:583
801
+ msgid "ending after <strong>%d</strong> time"
802
+ msgid_plural "ending after <strong>%d</strong> times"
803
+ msgstr[0] ""
804
+ msgstr[1] ""
805
+
806
+ #: app/model/class-ai1ec-event.php:594
807
+ msgid "until <strong>%s</strong>"
808
+ msgstr ""
809
+
810
+ #: app/model/class-ai1ec-event.php:603
811
+ msgid " or "
812
+ msgstr ""
813
+
814
+ #. Plugin Name of the plugin/theme
815
+ msgid "All-in-One Event Calendar Plugin"
816
+ msgstr ""
817
+
818
+ #. Plugin URI of the plugin/theme
819
+ msgid "http://theseedstudio.com/software/all-in-one-event-calendar-wordpress/"
820
+ msgstr ""
821
+
822
+ #. Description of the plugin/theme
823
+ msgid "An event calendar system with month and agenda views, upcoming events widget, color-coded categories, recurrence, and import/export of .ics feeds."
824
+ msgstr ""
825
+
826
+ #. Author URI of the plugin/theme
827
+ msgid "http://theseedstudio.com/"
828
+ msgstr ""
829
+
language/all-in-one-event-calendar.pot ADDED
@@ -0,0 +1,850 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2010 All-in-One Event Calendar Plugin
2
+ # This file is distributed under the same license as the All-in-One Event Calendar Plugin package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: All-in-One Event Calendar Plugin 1.0.6\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/tag/all-in-one-event-calendar\n"
7
+ "POT-Creation-Date: 2011-09-15 08:49:29+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2010-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+
15
+ #: app/controller/class-ai1ec-importer-controller.php:91
16
+ msgid "The Events Calendar → All-in-One Event Calendar"
17
+ msgstr ""
18
+
19
+ #: app/controller/class-ai1ec-importer-controller.php:92
20
+ msgid ""
21
+ "Imports events created using The Events Calendar plugin into the All-in-One "
22
+ "Event Calendar"
23
+ msgstr ""
24
+
25
+ #: app/controller/class-ai1ec-settings-controller.php:82
26
+ msgid "Settings Updated."
27
+ msgstr ""
28
+
29
+ #: app/controller/class-ai1ec-settings-controller.php:172
30
+ msgid "Flushed %d events"
31
+ msgstr ""
32
+
33
+ #: app/controller/class-ai1ec-settings-controller.php:214
34
+ msgid "Imported %d events"
35
+ msgstr ""
36
+
37
+ #: app/controller/class-ai1ec-settings-controller.php:215
38
+ #: app/view/feed_row.php:22
39
+ msgid "Flush 1 event"
40
+ msgid_plural "Flush %s events"
41
+ msgstr[0] ""
42
+ msgstr[1] ""
43
+
44
+ #: app/controller/class-ai1ec-settings-controller.php:266
45
+ msgctxt "meta box"
46
+ msgid "General Settings"
47
+ msgstr ""
48
+
49
+ #: app/controller/class-ai1ec-settings-controller.php:273
50
+ msgctxt "meta box"
51
+ msgid "The Seed Studio Support"
52
+ msgstr ""
53
+
54
+ #: app/controller/class-ai1ec-settings-controller.php:280
55
+ msgctxt "meta box"
56
+ msgid "ICS Import Settings"
57
+ msgstr ""
58
+
59
+ #: app/controller/class-ai1ec-settings-controller.php:344
60
+ msgid "<a href=\"%s\">Settings</a>"
61
+ msgstr ""
62
+
63
+ #: app/controller/class-ai1ec-settings-controller.php:358
64
+ msgid "<a href=\"%s\" target=\"_blank\">Donate</a>"
65
+ msgstr ""
66
+
67
+ #: app/controller/class-ai1ec-settings-controller.php:359
68
+ msgid "<a href=\"%s\" target=\"_blank\">Get Support</a>"
69
+ msgstr ""
70
+
71
+ #: app/controller/class-ai1ec-calendar-controller.php:280
72
+ #: app/helper/class-ai1ec-settings-helper.php:151 app/view/calendar.php:18
73
+ msgid "Agenda"
74
+ msgstr ""
75
+
76
+ #: app/controller/class-ai1ec-events-controller.php:133
77
+ msgid "This feed is already being imported."
78
+ msgstr ""
79
+
80
+ #: app/controller/class-ai1ec-events-controller.php:134
81
+ msgid "Please enter a valid iCalendar URL."
82
+ msgstr ""
83
+
84
+ #: app/controller/class-ai1ec-events-controller.php:274
85
+ msgid "Publish"
86
+ msgstr ""
87
+
88
+ #: app/controller/class-ai1ec-events-controller.php:274
89
+ #: app/view/feed_row.php:20
90
+ msgid "Update"
91
+ msgstr ""
92
+
93
+ #: app/controller/class-ai1ec-events-controller.php:276
94
+ msgid "Submit for Review"
95
+ msgstr ""
96
+
97
+ #: app/controller/class-ai1ec-events-controller.php:465
98
+ msgid "Event updated. <a href=\"%s\">View event</a>"
99
+ msgstr ""
100
+
101
+ #: app/controller/class-ai1ec-events-controller.php:466
102
+ msgid "Custom field updated."
103
+ msgstr ""
104
+
105
+ #: app/controller/class-ai1ec-events-controller.php:467
106
+ msgid "Custom field deleted."
107
+ msgstr ""
108
+
109
+ #: app/controller/class-ai1ec-events-controller.php:468
110
+ msgid "Event updated."
111
+ msgstr ""
112
+
113
+ #. translators: %s: date and time of the revision
114
+ #: app/controller/class-ai1ec-events-controller.php:470
115
+ msgid "Event restored to revision from %s"
116
+ msgstr ""
117
+
118
+ #: app/controller/class-ai1ec-events-controller.php:471
119
+ msgid "Event published. <a href=\"%s\">View event</a>"
120
+ msgstr ""
121
+
122
+ #: app/controller/class-ai1ec-events-controller.php:472
123
+ msgid "Event saved."
124
+ msgstr ""
125
+
126
+ #: app/controller/class-ai1ec-events-controller.php:473
127
+ msgid "Event submitted. <a target=\"_blank\" href=\"%s\">Preview event</a>"
128
+ msgstr ""
129
+
130
+ #: app/controller/class-ai1ec-events-controller.php:474
131
+ msgid ""
132
+ "Event scheduled for: <strong>%1$s</strong>. <a target=\"_blank\" href=\"%2$s"
133
+ "\">Preview event</a>"
134
+ msgstr ""
135
+
136
+ #. translators: Publish box date format, see http:php.net/date
137
+ #: app/controller/class-ai1ec-events-controller.php:476
138
+ msgid "M j, Y @ G:i"
139
+ msgstr ""
140
+
141
+ #: app/controller/class-ai1ec-events-controller.php:477
142
+ msgid "Event draft updated. <a target=\"_blank\" href=\"%s\">Preview event</a>"
143
+ msgstr ""
144
+
145
+ #: app/controller/class-ai1ec-app-controller.php:331
146
+ #: app/controller/class-ai1ec-app-controller.php:332
147
+ msgid "Settings"
148
+ msgstr ""
149
+
150
+ #: app/helper/class-ai1ec-events-helper.php:438
151
+ msgid "times"
152
+ msgstr ""
153
+
154
+ #: app/helper/class-ai1ec-app-helper.php:149
155
+ msgid "Add New"
156
+ msgstr ""
157
+
158
+ #: app/helper/class-ai1ec-app-helper.php:150
159
+ msgid "Add New Event"
160
+ msgstr ""
161
+
162
+ #: app/helper/class-ai1ec-app-helper.php:151
163
+ msgid "Edit Event"
164
+ msgstr ""
165
+
166
+ #: app/helper/class-ai1ec-app-helper.php:152
167
+ msgid "New Event"
168
+ msgstr ""
169
+
170
+ #: app/helper/class-ai1ec-app-helper.php:153
171
+ msgid "View Event"
172
+ msgstr ""
173
+
174
+ #: app/helper/class-ai1ec-app-helper.php:154
175
+ msgid "Search Events"
176
+ msgstr ""
177
+
178
+ #: app/helper/class-ai1ec-app-helper.php:155
179
+ msgid "No Events found"
180
+ msgstr ""
181
+
182
+ #: app/helper/class-ai1ec-app-helper.php:156
183
+ msgid "No Events found in Trash"
184
+ msgstr ""
185
+
186
+ #: app/helper/class-ai1ec-app-helper.php:157
187
+ msgid "Parent Event"
188
+ msgstr ""
189
+
190
+ #: app/helper/class-ai1ec-app-helper.php:158
191
+ msgid "Events"
192
+ msgstr ""
193
+
194
+ #: app/helper/class-ai1ec-app-helper.php:313
195
+ msgid ""
196
+ "All Events <span class=\"update-plugins count-%d\" title=\"%d Pending Events"
197
+ "\"><span class=\"update-count\">%d</span></span>"
198
+ msgstr ""
199
+
200
+ #: app/helper/class-ai1ec-app-helper.php:319
201
+ msgid "All Events"
202
+ msgstr ""
203
+
204
+ #: app/helper/class-ai1ec-app-helper.php:395
205
+ msgid "Event Details"
206
+ msgstr ""
207
+
208
+ #: app/helper/class-ai1ec-app-helper.php:412
209
+ msgid "Post Date"
210
+ msgstr ""
211
+
212
+ #: app/helper/class-ai1ec-app-helper.php:413
213
+ msgid "Event date/time"
214
+ msgstr ""
215
+
216
+ #: app/helper/class-ai1ec-app-helper.php:629
217
+ msgid ""
218
+ "To set up the plugin, please select an option in the <strong>Calendar page</"
219
+ "strong> dropdown list, then click <strong>Update Settings</strong>."
220
+ msgstr ""
221
+
222
+ #: app/helper/class-ai1ec-app-helper.php:633
223
+ msgid ""
224
+ "The plugin is installed, but has not been configured. <a href=\"%s\">Click "
225
+ "here to set it up now »</a>"
226
+ msgstr ""
227
+
228
+ #: app/helper/class-ai1ec-app-helper.php:639
229
+ msgid ""
230
+ "The plugin is installed, but has not been configured. Please log in as a "
231
+ "WordPress Administrator to set it up."
232
+ msgstr ""
233
+
234
+ #: app/helper/class-ai1ec-calendar-helper.php:564
235
+ msgid "« Previous Events"
236
+ msgstr ""
237
+
238
+ #: app/helper/class-ai1ec-calendar-helper.php:571
239
+ msgid "Next Events »"
240
+ msgstr ""
241
+
242
+ #: app/helper/class-ai1ec-settings-helper.php:85
243
+ msgid "- Auto-Create New Page -"
244
+ msgstr ""
245
+
246
+ #: app/helper/class-ai1ec-settings-helper.php:106
247
+ msgid "View \"%s\" »"
248
+ msgstr ""
249
+
250
+ #: app/helper/class-ai1ec-settings-helper.php:148 app/view/calendar.php:10
251
+ #: app/view/calendar.php:11 app/view/calendar.php:17
252
+ msgid "Month"
253
+ msgstr ""
254
+
255
+ #: app/helper/class-ai1ec-settings-helper.php:168
256
+ msgid "Hourly"
257
+ msgstr ""
258
+
259
+ #: app/helper/class-ai1ec-settings-helper.php:171
260
+ msgid "Twice Daily"
261
+ msgstr ""
262
+
263
+ #: app/helper/class-ai1ec-settings-helper.php:174
264
+ msgid "Daily"
265
+ msgstr ""
266
+
267
+ #: app/helper/class-ai1ec-settings-helper.php:258
268
+ msgid "Calendar"
269
+ msgstr ""
270
+
271
+ #: app/view/settings.php:5
272
+ msgid "All-in-one Event Calendar"
273
+ msgstr ""
274
+
275
+ #: app/view/settings.php:17
276
+ msgid "Update Settings"
277
+ msgstr ""
278
+
279
+ #: app/view/box_event_cost.php:1
280
+ msgid "Event cost"
281
+ msgstr ""
282
+
283
+ #: app/view/box_event_cost.php:7
284
+ msgid "Cost"
285
+ msgstr ""
286
+
287
+ #: app/view/event-excerpt.php:2 app/view/event-single.php:5
288
+ #: app/view/event-multi.php:4
289
+ msgid "When:"
290
+ msgstr ""
291
+
292
+ #: app/view/event-excerpt.php:4 app/view/event-single.php:20
293
+ #: app/view/event-multi.php:20
294
+ msgid "Where:"
295
+ msgstr ""
296
+
297
+ #: app/view/feed_row.php:3 app/view/box_ics_import_settings.php:8
298
+ msgid "iCalendar/.ics Feed URL:"
299
+ msgstr ""
300
+
301
+ #: app/view/feed_row.php:9
302
+ msgid "Event category:"
303
+ msgstr ""
304
+
305
+ #: app/view/feed_row.php:15 app/view/box_ics_import_settings.php:18
306
+ msgid "Tag with"
307
+ msgstr ""
308
+
309
+ #: app/view/feed_row.php:19
310
+ msgid "× Delete"
311
+ msgstr ""
312
+
313
+ #: app/view/event-map.php:6
314
+ msgid "View Full-Size Map »"
315
+ msgstr ""
316
+
317
+ #: app/view/box_event_location.php:1
318
+ msgid "Event location details"
319
+ msgstr ""
320
+
321
+ #: app/view/box_event_location.php:7
322
+ msgid "Venue name:"
323
+ msgstr ""
324
+
325
+ #: app/view/box_event_location.php:17
326
+ msgid "Address:"
327
+ msgstr ""
328
+
329
+ #: app/view/box_event_location.php:27
330
+ msgid "Show Google Map:"
331
+ msgstr ""
332
+
333
+ #: app/view/class-ai1ec-agenda-widget.php:18
334
+ #: app/view/class-ai1ec-agenda-widget.php:39
335
+ msgid "Upcoming Events"
336
+ msgstr ""
337
+
338
+ #: app/view/class-ai1ec-agenda-widget.php:20
339
+ msgid "All-in-One Event Calendar: Lists upcoming events in Agenda view"
340
+ msgstr ""
341
+
342
+ #: app/view/month.php:4 app/view/agenda.php:12
343
+ msgid "Today"
344
+ msgstr ""
345
+
346
+ #: app/view/month.php:50
347
+ msgid "Summary:"
348
+ msgstr ""
349
+
350
+ #: app/view/month.php:53
351
+ msgid "click anywhere for details"
352
+ msgstr ""
353
+
354
+ #: app/view/month.php:61 app/view/agenda.php:57 app/view/agenda.php:107
355
+ msgid "(all-day)"
356
+ msgstr ""
357
+
358
+ #: app/view/import.php:6
359
+ msgid "Successfully imported events:"
360
+ msgstr ""
361
+
362
+ #: app/view/event-single.php:8
363
+ msgid "Back to Calendar »"
364
+ msgstr ""
365
+
366
+ #: app/view/event-single.php:15 app/view/event-multi.php:14
367
+ msgid "Repeats:"
368
+ msgstr ""
369
+
370
+ #: app/view/event-single.php:27
371
+ msgid "Add this event to your favourite calendar program (iCal, Outlook, etc.)"
372
+ msgstr ""
373
+
374
+ #: app/view/event-single.php:28
375
+ msgid "✔ Add to Calendar"
376
+ msgstr ""
377
+
378
+ #: app/view/event-single.php:31
379
+ msgid "Add this event to your Google Calendar"
380
+ msgstr ""
381
+
382
+ #: app/view/event-single.php:33
383
+ msgid "Add to Google Calendar"
384
+ msgstr ""
385
+
386
+ #: app/view/event-single.php:40 app/view/event-multi.php:33
387
+ msgid "Cost:"
388
+ msgstr ""
389
+
390
+ #: app/view/event-single.php:46 app/view/event-multi.php:39
391
+ msgid "Contact:"
392
+ msgstr ""
393
+
394
+ #: app/view/event-single.php:52 app/view/event-multi.php:45
395
+ #: app/view/agenda.php:79
396
+ msgid "Categories:"
397
+ msgstr ""
398
+
399
+ #: app/view/event-single.php:59 app/view/event-multi.php:51
400
+ #: app/view/agenda.php:85
401
+ msgid "Tags:"
402
+ msgstr ""
403
+
404
+ #: app/view/box_eventbrite.php:1
405
+ msgid "Eventbrite Ticketing"
406
+ msgstr ""
407
+
408
+ #: app/view/box_eventbrite.php:7
409
+ msgid "Register this event with Eventbrite.com?"
410
+ msgstr ""
411
+
412
+ #: app/view/box_eventbrite.php:12
413
+ msgid "Yes"
414
+ msgstr ""
415
+
416
+ #: app/view/box_eventbrite.php:14
417
+ msgid "No"
418
+ msgstr ""
419
+
420
+ #: app/view/box_eventbrite.php:22
421
+ msgid "Set up your first ticket"
422
+ msgstr ""
423
+
424
+ #: app/view/box_eventbrite.php:24
425
+ msgid ""
426
+ "To create multiple tickets per event, submit this form, then follow the link "
427
+ "to Eventbrite."
428
+ msgstr ""
429
+
430
+ #: app/view/box_eventbrite.php:32
431
+ msgid "Name"
432
+ msgstr ""
433
+
434
+ #: app/view/box_eventbrite.php:42
435
+ msgid "Description"
436
+ msgstr ""
437
+
438
+ #: app/view/box_eventbrite.php:53
439
+ msgid "Type"
440
+ msgstr ""
441
+
442
+ #: app/view/box_eventbrite.php:58
443
+ msgid "Set Price"
444
+ msgstr ""
445
+
446
+ #: app/view/box_eventbrite.php:60
447
+ msgid "Donation Based"
448
+ msgstr ""
449
+
450
+ #: app/view/box_eventbrite.php:68
451
+ msgid ""
452
+ "The price for this event's first ticket will be taken from the Cost field "
453
+ "above."
454
+ msgstr ""
455
+
456
+ #: app/view/box_eventbrite.php:75
457
+ msgid "Quantity"
458
+ msgstr ""
459
+
460
+ #: app/view/box_eventbrite.php:85
461
+ msgid "Include Fee in Price"
462
+ msgstr ""
463
+
464
+ #: app/view/box_eventbrite.php:90
465
+ msgid "Add Service Fee on top of price"
466
+ msgstr ""
467
+
468
+ #: app/view/box_eventbrite.php:92
469
+ msgid "Include Service fee in price"
470
+ msgstr ""
471
+
472
+ #: app/view/box_eventbrite.php:98
473
+ msgid "Payment Options"
474
+ msgstr ""
475
+
476
+ #: app/view/box_eventbrite.php:103
477
+ msgid "Paypal"
478
+ msgstr ""
479
+
480
+ #: app/view/box_eventbrite.php:105
481
+ msgid "Google Checkout"
482
+ msgstr ""
483
+
484
+ #: app/view/box_eventbrite.php:107
485
+ msgid "Check"
486
+ msgstr ""
487
+
488
+ #: app/view/box_eventbrite.php:109
489
+ msgid "Cash"
490
+ msgstr ""
491
+
492
+ #: app/view/box_eventbrite.php:111
493
+ msgid "Send an Invoice"
494
+ msgstr ""
495
+
496
+ #. #-#-#-#-# plugin.pot (All-in-One Event Calendar Plugin 1.0.6) #-#-#-#-#
497
+ #. Author of the plugin/theme
498
+ #: app/view/box_the_seed_studio.php:3
499
+ msgid "The Seed Studio"
500
+ msgstr ""
501
+
502
+ #: app/view/box_the_seed_studio.php:5
503
+ msgid ""
504
+ "The Seed Studio provides web development and support services for clients "
505
+ "and web developers."
506
+ msgstr ""
507
+
508
+ #: app/view/box_the_seed_studio.php:11
509
+ msgid "Follow @the_seed_studio"
510
+ msgstr ""
511
+
512
+ #: app/view/box_the_seed_studio.php:16
513
+ msgid "Get Support<span> from one of our experienced pros</span>"
514
+ msgstr ""
515
+
516
+ #: app/view/box_the_seed_studio.php:18
517
+ msgid "Support"
518
+ msgstr ""
519
+
520
+ #: app/view/box_the_seed_studio.php:20
521
+ msgid "View plugin documentation"
522
+ msgstr ""
523
+
524
+ #: app/view/box_the_seed_studio.php:23
525
+ msgid ""
526
+ "You can also hire The Seed for support on a contract or per-hour basis for "
527
+ "this plugin, for your website or for any of your Internet marketing needs "
528
+ "(we can really help!)."
529
+ msgstr ""
530
+
531
+ #: app/view/box_the_seed_studio.php:26
532
+ msgid ""
533
+ "Plugin users: The Seed gives support priority to clients. For free support "
534
+ "from other WordPress users, visit the plugin's forum."
535
+ msgstr ""
536
+
537
+ #: app/view/box_the_seed_studio.php:29
538
+ msgid "Vote and Share"
539
+ msgstr ""
540
+
541
+ #: app/view/box_the_seed_studio.php:32
542
+ msgid ""
543
+ "This plugin is offered free to the Wordpress Community under the GPL3 "
544
+ "license. All we ask is that you:"
545
+ msgstr ""
546
+
547
+ #: app/view/box_the_seed_studio.php:34
548
+ msgid ""
549
+ "<a href=\"http://wordpress.org/extend/plugins/all-in-one-event-calendar/\" "
550
+ "target=\"_blank\">Give it a five-star rating on wordpress.org</a> (if you "
551
+ "think it deserves it!)"
552
+ msgstr ""
553
+
554
+ #: app/view/box_the_seed_studio.php:35
555
+ msgid "Link to the plugin page on our website"
556
+ msgstr ""
557
+
558
+ #: app/view/box_the_seed_studio.php:36
559
+ msgid "Become a Fan on Facebook"
560
+ msgstr ""
561
+
562
+ #: app/view/box_the_seed_studio.php:37
563
+ msgid "Follow us on Twitter"
564
+ msgstr ""
565
+
566
+ #: app/view/box_the_seed_studio.php:41
567
+ msgid "Donate"
568
+ msgstr ""
569
+
570
+ #: app/view/box_the_seed_studio.php:43
571
+ msgid ""
572
+ "If you would like to help support development of this plugin, then by all "
573
+ "means..."
574
+ msgstr ""
575
+
576
+ #: app/view/event-multi.php:7
577
+ msgid "View in Calendar »"
578
+ msgstr ""
579
+
580
+ #: app/view/event-multi.php:24
581
+ msgid "View Map »"
582
+ msgstr ""
583
+
584
+ #: app/view/box_general_settings.php:3
585
+ msgid "Calendar page:"
586
+ msgstr ""
587
+
588
+ #: app/view/box_general_settings.php:7
589
+ msgid "Default calendar view:"
590
+ msgstr ""
591
+
592
+ #: app/view/box_general_settings.php:11
593
+ msgid "Contain calendar in this DOM element:"
594
+ msgstr ""
595
+
596
+ #: app/view/box_general_settings.php:13
597
+ msgid ""
598
+ "Optional. Provide a <a href=\"http://api.jquery.com/category/selectors/\" "
599
+ "target=\"_blank\">jQuery selector</a> that evaluates to a single DOM "
600
+ "element. Replaces any existing markup found within target. If left empty, "
601
+ "calendar is shown in normal page content container."
602
+ msgstr ""
603
+
604
+ #: app/view/box_general_settings.php:15
605
+ msgid "Week starts on"
606
+ msgstr ""
607
+
608
+ #: app/view/box_general_settings.php:19
609
+ msgid "Agenda pages show at most"
610
+ msgstr ""
611
+
612
+ #: app/view/box_general_settings.php:20
613
+ msgid "events"
614
+ msgstr ""
615
+
616
+ #: app/view/box_general_settings.php:25
617
+ msgid "<strong>Exclude</strong> events from search results"
618
+ msgstr ""
619
+
620
+ #: app/view/box_general_settings.php:31
621
+ msgid ""
622
+ "Show <strong>Post Your Event</strong> button above the calendar to "
623
+ "privileged users"
624
+ msgstr ""
625
+
626
+ #: app/view/box_general_settings.php:37
627
+ msgid ""
628
+ "Hide <strong>Subscribe</strong>/<strong>Add to Calendar</strong> buttons in "
629
+ "calendar and single event views"
630
+ msgstr ""
631
+
632
+ #: app/view/box_general_settings.php:43
633
+ msgid "Include <strong>event categories</strong> in post category lists"
634
+ msgstr ""
635
+
636
+ #: app/view/box_general_settings.php:51
637
+ msgid "Input dates in <strong>US format</strong>"
638
+ msgstr ""
639
+
640
+ #: app/view/box_general_settings.php:57
641
+ msgid "Display <strong>Publish</strong> at bottom of Edit Event form"
642
+ msgstr ""
643
+
644
+ #: app/view/agenda-widget.php:11
645
+ msgid "There are no upcoming events."
646
+ msgstr ""
647
+
648
+ #: app/view/agenda-widget.php:59
649
+ msgid "View Calendar »"
650
+ msgstr ""
651
+
652
+ #: app/view/agenda-widget.php:67 app/view/calendar.php:101
653
+ msgid ""
654
+ "Subscribe to this calendar using your favourite calendar program (iCal, "
655
+ "Outlook, etc.)"
656
+ msgstr ""
657
+
658
+ #: app/view/agenda-widget.php:68 app/view/calendar.php:102
659
+ msgid "✔ Subscribe"
660
+ msgstr ""
661
+
662
+ #: app/view/agenda-widget.php:72 app/view/calendar.php:107
663
+ msgid "Subscribe to this calendar in your Google Calendar"
664
+ msgstr ""
665
+
666
+ #: app/view/agenda-widget.php:74
667
+ msgid "Add to Google"
668
+ msgstr ""
669
+
670
+ #: app/view/box_event_contact.php:1
671
+ msgid "Organizer contact info"
672
+ msgstr ""
673
+
674
+ #: app/view/box_event_contact.php:7
675
+ msgid "Contact name:"
676
+ msgstr ""
677
+
678
+ #: app/view/box_event_contact.php:17
679
+ msgid "Phone:"
680
+ msgstr ""
681
+
682
+ #: app/view/box_event_contact.php:27
683
+ msgid "E-mail:"
684
+ msgstr ""
685
+
686
+ #: app/view/admin_notices.php:2
687
+ msgid "All-in-One Event Calendar Notice:"
688
+ msgstr ""
689
+
690
+ #: app/view/calendar.php:27
691
+ msgid "+ Post Your Event"
692
+ msgstr ""
693
+
694
+ #: app/view/calendar.php:36
695
+ msgid "Clear Filters"
696
+ msgstr ""
697
+
698
+ #: app/view/calendar.php:36
699
+ msgid "✘"
700
+ msgstr ""
701
+
702
+ #: app/view/calendar.php:37
703
+ msgid "Filter:"
704
+ msgstr ""
705
+
706
+ #: app/view/calendar.php:42
707
+ msgid "Categories ▾"
708
+ msgstr ""
709
+
710
+ #: app/view/calendar.php:64
711
+ msgid "Tags ▾"
712
+ msgstr ""
713
+
714
+ #: app/view/calendar.php:103
715
+ msgid "to this filtered calendar"
716
+ msgstr ""
717
+
718
+ #: app/view/calendar.php:109
719
+ msgid "Subscribe in Google Calendar"
720
+ msgstr ""
721
+
722
+ #: app/view/agenda.php:5
723
+ msgid "+ Expand All"
724
+ msgstr ""
725
+
726
+ #: app/view/agenda.php:8
727
+ msgid "− Collapse All"
728
+ msgstr ""
729
+
730
+ #: app/view/agenda.php:28
731
+ msgid "There are no upcoming events to display at this time."
732
+ msgstr ""
733
+
734
+ #: app/view/agenda.php:75
735
+ msgid "Read more »"
736
+ msgstr ""
737
+
738
+ #: app/view/event-single-footer.php:8
739
+ msgid "View original post »"
740
+ msgstr ""
741
+
742
+ #: app/view/agenda-widget-form.php:2
743
+ msgid "Title:"
744
+ msgstr ""
745
+
746
+ #: app/view/agenda-widget-form.php:6
747
+ msgid "Number of events to show:"
748
+ msgstr ""
749
+
750
+ #: app/view/agenda-widget-form.php:11
751
+ msgid "Show <strong>View Calendar</strong> button"
752
+ msgstr ""
753
+
754
+ #: app/view/agenda-widget-form.php:14
755
+ msgid "Show <strong>Subscribe</strong> buttons"
756
+ msgstr ""
757
+
758
+ #: app/view/agenda-widget-form.php:17
759
+ msgid "Hide this widget on calendar page"
760
+ msgstr ""
761
+
762
+ #: app/view/box_time_and_date.php:2
763
+ msgid "Event date and time"
764
+ msgstr ""
765
+
766
+ #: app/view/box_time_and_date.php:8
767
+ msgid "All-day event"
768
+ msgstr ""
769
+
770
+ #: app/view/box_time_and_date.php:18
771
+ msgid "Start date / time"
772
+ msgstr ""
773
+
774
+ #: app/view/box_time_and_date.php:31
775
+ msgid "End date / time"
776
+ msgstr ""
777
+
778
+ #: app/view/box_time_and_date.php:44
779
+ msgid "Repeat"
780
+ msgstr ""
781
+
782
+ #: app/view/box_time_and_date.php:54
783
+ msgid "End"
784
+ msgstr ""
785
+
786
+ #: app/view/box_time_and_date.php:64
787
+ msgid "Ending after"
788
+ msgstr ""
789
+
790
+ #: app/view/box_time_and_date.php:74
791
+ msgid "On date"
792
+ msgstr ""
793
+
794
+ #: app/view/box_ics_import_settings.php:2
795
+ msgid "Auto-refresh"
796
+ msgstr ""
797
+
798
+ #: app/view/box_ics_import_settings.php:12
799
+ msgid "Event category"
800
+ msgstr ""
801
+
802
+ #: app/view/box_ics_import_settings.php:22
803
+ msgid "+ Add new subscription"
804
+ msgstr ""
805
+
806
+ #: app/view/event_categories-color_picker.php:5
807
+ #: app/view/event_categories-color_picker.php:19
808
+ msgid "Category Color"
809
+ msgstr ""
810
+
811
+ #: app/view/event_categories-color_picker.php:13
812
+ #: app/view/event_categories-color_picker.php:25
813
+ msgid "Events in this category will be identified by this color"
814
+ msgstr ""
815
+
816
+ #: app/model/class-ai1ec-event.php:444
817
+ msgid " (all-day)"
818
+ msgstr ""
819
+
820
+ #: app/model/class-ai1ec-event.php:583
821
+ msgid "ending after <strong>%d</strong> time"
822
+ msgid_plural "ending after <strong>%d</strong> times"
823
+ msgstr[0] ""
824
+ msgstr[1] ""
825
+
826
+ #: app/model/class-ai1ec-event.php:594
827
+ msgid "until <strong>%s</strong>"
828
+ msgstr ""
829
+
830
+ #: app/model/class-ai1ec-event.php:603
831
+ msgid " or "
832
+ msgstr ""
833
+
834
+ #. Plugin Name of the plugin/theme
835
+ msgid "All-in-One Event Calendar Plugin"
836
+ msgstr ""
837
+
838
+ #. Plugin URI of the plugin/theme
839
+ msgid "http://theseedstudio.com/software/all-in-one-event-calendar-wordpress/"
840
+ msgstr ""
841
+
842
+ #. Description of the plugin/theme
843
+ msgid ""
844
+ "An event calendar system with month and agenda views, upcoming events "
845
+ "widget, color-coded categories, recurrence, and import/export of .ics feeds."
846
+ msgstr ""
847
+
848
+ #. Author URI of the plugin/theme
849
+ msgid "http://theseedstudio.com/"
850
+ msgstr ""
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === All-in-One Event Calendar ===
2
  Contributors: theseed, hubrik, vtowel, yani.iliev
3
  Donate link: http://theseedstudio.com/software/all-in-one-event-calendar-wordpress/
4
- Tags: calendar, event, events, ics, ics calendar, ical-feed, ics feed, wordpress ics importer, wordpress ical importer, upcoming events, todo, notes, journal, freebusy, availability, web calendar, web events, webcal, google calendar, ical, iCalendar, all-in-one, ai1ec, google calendar sync, ical sync, events sync, holiday calendar, calendar 2011, events 2011
5
  Requires at least: 3.1.3
6
  Tested up to: 3.2.1
7
- Stable tag: 1.0.5
8
 
9
  An event calendar system with month and agenda views, upcoming events widget, color-coded categories, recurrence, and import/export of .ics feeds.
10
 
@@ -52,6 +52,17 @@ The All-in-One Event Calendar Plugin also has a few features that will prove use
52
 
53
  == Changelog ==
54
 
 
 
 
 
 
 
 
 
 
 
 
55
  = Version 1.0.5 =
56
  * Added agenda-like Upcoming Events widget
57
  * Added tooltips to category color squares
1
  === All-in-One Event Calendar ===
2
  Contributors: theseed, hubrik, vtowel, yani.iliev
3
  Donate link: http://theseedstudio.com/software/all-in-one-event-calendar-wordpress/
4
+ Tags: calendar, event, events, ics, ics calendar, ical-feed, ics feed, wordpress ics importer, wordpress ical importer, upcoming events, todo, notes, journal, freebusy, availability, web calendar, web events, webcal, google calendar, ical, iCalendar, all-in-one, ai1ec, google calendar sync, ical sync, events sync, holiday calendar, calendar 2011, events 2011, widget, events widget, upcoming events widget, calendar widget, agenda widget
5
  Requires at least: 3.1.3
6
  Tested up to: 3.2.1
7
+ Stable tag: 1.0.6
8
 
9
  An event calendar system with month and agenda views, upcoming events widget, color-coded categories, recurrence, and import/export of .ics feeds.
10
 
52
 
53
  == Changelog ==
54
 
55
+ = Version 1.0.6 =
56
+ * Fixed issue with importing of iCalendar feeds that define time zone per-property (e.g., Yahoo! Calendar feeds)
57
+ * Fixed numerous theme-related layout/formatting issues
58
+ * Fixed issue with all-day events after daylight savings time showing in duplicate
59
+ * Fixed issue where private events would not show at all in the front-end
60
+ * Fixed duplicate import issue with certain feeds that do not uniquely identify events (e.g., ESPN)
61
+ * Added option to General Settings for inputting dates in US format
62
+ * Added option to General Settings for excluding events from search results
63
+ * Added error messages for iCalendar feed validation
64
+ * Improved support for multiple locales
65
+
66
  = Version 1.0.5 =
67
  * Added agenda-like Upcoming Events widget
68
  * Added tooltips to category color squares