The Events Calendar - Version 4.0.2

Version Description

Download this release

Release Info

Developer borkweb
Plugin Icon The Events Calendar
Version 4.0.2
Comparing to
See all releases

Code changes from version 4.0.1 to 4.0.2

common/src/Tribe/Admin/Notice/Archive_Slug_Conflict.php CHANGED
@@ -51,20 +51,18 @@ class Tribe__Admin__Notice__Archive_Slug_Conflict {
51
  * Echoes the admin notice to the page
52
  */
53
  public function notice() {
54
-
55
  // What's happening?
56
  $page_title = apply_filters( 'the_title', $this->page->post_title );
57
  $line_1 = __( sprintf( 'The page "%1$s" uses the "/%2$s" slug: the Events Calendar plugin will show its calendar in place of the page.', $page_title, $this->archive_slug ), 'tribe-common' );
58
 
59
  // What the user can do
60
  $page_edit_link = get_edit_post_link( $this->page->ID );
61
- // $can_edit_page_link = sprintf( __( '<a href="%s">Edit the page slug</a>', 'tribe-common' ), $page_edit_link );
62
  $can_edit_page_link = sprintf( __( '<a href="%s">Edit the page slug</a>', 'tribe-common' ), $page_edit_link );
63
  $page_edit_link_string = current_user_can( 'edit_pages' ) ? $can_edit_page_link : __( 'Ask the site administrator to edit the page slug', 'tribe-common' );
64
 
65
  $settings_cap = apply_filters( 'tribe_settings_req_cap', 'manage_options' );
66
  $admin_slug = apply_filters( 'tribe_settings_admin_slug', 'tribe-common' );
67
- $setting_page_link = apply_filters( 'tribe_settings_url', admin_url( 'edit.php?page=' . $admin_slug . '#tribe-field-singleEventSlug' ) );
68
  $can_edit_settings_link = sprintf( __( '<a href="%s">edit Events settings</a>.', 'tribe-common' ), $setting_page_link );
69
  $events_settings_link_string = current_user_can( $settings_cap ) ? $can_edit_settings_link : __( ' ask the site administrator set a different Events URL slug.', 'tribe-common' );
70
 
51
  * Echoes the admin notice to the page
52
  */
53
  public function notice() {
 
54
  // What's happening?
55
  $page_title = apply_filters( 'the_title', $this->page->post_title );
56
  $line_1 = __( sprintf( 'The page "%1$s" uses the "/%2$s" slug: the Events Calendar plugin will show its calendar in place of the page.', $page_title, $this->archive_slug ), 'tribe-common' );
57
 
58
  // What the user can do
59
  $page_edit_link = get_edit_post_link( $this->page->ID );
 
60
  $can_edit_page_link = sprintf( __( '<a href="%s">Edit the page slug</a>', 'tribe-common' ), $page_edit_link );
61
  $page_edit_link_string = current_user_can( 'edit_pages' ) ? $can_edit_page_link : __( 'Ask the site administrator to edit the page slug', 'tribe-common' );
62
 
63
  $settings_cap = apply_filters( 'tribe_settings_req_cap', 'manage_options' );
64
  $admin_slug = apply_filters( 'tribe_settings_admin_slug', 'tribe-common' );
65
+ $setting_page_link = apply_filters( 'tribe_settings_url', admin_url( 'edit.php?page=' . $admin_slug . '#tribe-field-eventsSlug' ) );
66
  $can_edit_settings_link = sprintf( __( '<a href="%s">edit Events settings</a>.', 'tribe-common' ), $setting_page_link );
67
  $events_settings_link_string = current_user_can( $settings_cap ) ? $can_edit_settings_link : __( ' ask the site administrator set a different Events URL slug.', 'tribe-common' );
68
 
common/src/Tribe/Main.php CHANGED
@@ -17,7 +17,7 @@ class Tribe__Main {
17
  const OPTIONNAME = 'tribe_events_calendar_options';
18
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
19
 
20
- const VERSION = '4.0.1';
21
  const FEED_URL = 'https://theeventscalendar.com/feed/';
22
 
23
  protected $plugin_context;
17
  const OPTIONNAME = 'tribe_events_calendar_options';
18
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
19
 
20
+ const VERSION = '4.0.2';
21
  const FEED_URL = 'https://theeventscalendar.com/feed/';
22
 
23
  protected $plugin_context;
common/tribe-common.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Description: An event settings framework for managing shared options
4
- Version: 3.12.3
5
  Author: Modern Tribe, Inc.
6
  Author URI: http://m.tri.be/1x
7
  Text Domain: tribe-common
1
  <?php
2
  /*
3
  Description: An event settings framework for managing shared options
4
+ Version: 4.0.2
5
  Author: Modern Tribe, Inc.
6
  Author URI: http://m.tri.be/1x
7
  Text Domain: tribe-common
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: events, calendar, event, venue, organizer, dates, date, google maps, confe
5
  Donate link: http://m.tri.be/29
6
  Requires at least: 3.9
7
  Tested up to: 4.4
8
- Stable tag: 4.0.1
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -309,6 +309,23 @@ At no point during the 3.0 lifecycle will the major version change. But you can
309
 
310
  == Changelog ==
311
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  = [4.0.1] 2015-12-10 =
313
 
314
  * Tweak - Add a warning message for major updates
5
  Donate link: http://m.tri.be/29
6
  Requires at least: 3.9
7
  Tested up to: 4.4
8
+ Stable tag: 4.0.2
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
309
 
310
  == Changelog ==
311
 
312
+ = [4.0.2] 2015-12-16 =
313
+
314
+ * Tweak - Adding better support for non-numeric cost values on events (Props to Mirja for highlighting this!)
315
+ * Tweak - Avoid notice level errors when advanced events list widget settings are saved (Thank you Johan for reporting the issue!)
316
+ * Tweak - Improve messaging in the same-slug warning message (Thanks to Simon for bringing this to our attention!)
317
+ * Tweak - Hook to Event Tickets to inject event dates into ticket emails
318
+ * Tweak - Adding better support for default venues (Props to Karly for noting this!)
319
+ * Tweak - Improve handling of internationalized slugs (Cheers to Oliver for the help!)
320
+ * Fix - Ensure the past events list displays the correct events when accessed via ajax (Thank you Jesse for highlighting this!)
321
+ * Fix - Support ordering by venue/organizer within event queries (Thank you Doug for bringing this to our attention!)
322
+ * Fix - Fixed issue where events with the same date/time would sometimes be excluded from single-event navigation (Cheers to JeremyEnglert for the tip!)
323
+ * Fix - Resolved issue where events set with the explicit cost of 0 were not showing as "Free" (Thank you terrizsolo for reporting this!)
324
+ * Fix - Fixed bug where the datepicker in Twenty Sixteen was really ugly
325
+ * Fix - Fixed bug where using Quick Edit on events caused the table columns in the event list to become jumbled on save (Props to A K for the report!)
326
+ * Fix - Resolved bug where category links sometimes included event category 1 (Thank you Anthony for the original report of this problem!)
327
+ * Fix - Fixed a settings page URL (Props to Kristy for the heads up!)
328
+
329
  = [4.0.1] 2015-12-10 =
330
 
331
  * Tweak - Add a warning message for major updates
src/Tribe/Admin_List.php CHANGED
@@ -19,25 +19,31 @@ if ( ! class_exists( 'Tribe__Events__Admin_List' ) ) {
19
  *
20
  */
21
  public static function init() {
22
- if ( is_admin() && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
23
- // Logic for sorting events by event category or tags
24
- add_filter( 'posts_clauses', array( __CLASS__, 'sort_by_tax' ), 10, 2 );
 
25
 
26
- // Logic for sorting events by start or end date
27
- add_filter( 'posts_clauses', array( __CLASS__, 'sort_by_event_date' ), 11, 2 );
28
 
29
- add_filter( 'posts_fields', array( __CLASS__, 'events_search_fields' ), 10, 2 );
30
 
31
- // Pagination
32
- add_filter( 'post_limits', array( __CLASS__, 'events_search_limits' ), 10, 2 );
33
 
34
- add_filter( 'manage_' . Tribe__Events__Main::POSTTYPE . '_posts_columns', array( __CLASS__, 'column_headers' ) );
35
- add_filter( 'tribe_apm_headers_' . Tribe__Events__Main::POSTTYPE, array( __CLASS__, 'column_headers_check' ) );
36
 
37
- add_filter( 'views_edit-tribe_events', array( __CLASS__, 'update_event_counts' ) );
 
38
 
39
- // Registers custom event columns category/start date/end date
 
 
 
 
40
  add_action( 'manage_posts_custom_column', array( __CLASS__, 'custom_columns' ), 10, 2 );
 
41
 
42
  // Registers event start/end date as sortable columns
43
  add_action( 'manage_edit-' . Tribe__Events__Main::POSTTYPE . '_sortable_columns', array( __CLASS__, 'register_sortable_columns' ), 10, 2 );
19
  *
20
  */
21
  public static function init() {
22
+ if ( is_admin() ) {
23
+ if ( ! Tribe__Main::instance()->doing_ajax() ) {
24
+ // Logic for sorting events by event category or tags
25
+ add_filter( 'posts_clauses', array( __CLASS__, 'sort_by_tax' ), 10, 2 );
26
 
27
+ // Logic for sorting events by start or end date
28
+ add_filter( 'posts_clauses', array( __CLASS__, 'sort_by_event_date' ), 11, 2 );
29
 
30
+ add_filter( 'posts_fields', array( __CLASS__, 'events_search_fields' ), 10, 2 );
31
 
32
+ // Pagination
33
+ add_filter( 'post_limits', array( __CLASS__, 'events_search_limits' ), 10, 2 );
34
 
35
+ add_filter( 'tribe_apm_headers_' . Tribe__Events__Main::POSTTYPE, array( __CLASS__, 'column_headers_check' ) );
 
36
 
37
+ add_filter( 'views_edit-tribe_events', array( __CLASS__, 'update_event_counts' ) );
38
+ }
39
 
40
+ /**
41
+ * The following actions will need to be fired on AJAX calls, the logic above is required.
42
+ *
43
+ * Registers custom event columns category/start date/end date
44
+ */
45
  add_action( 'manage_posts_custom_column', array( __CLASS__, 'custom_columns' ), 10, 2 );
46
+ add_filter( 'manage_' . Tribe__Events__Main::POSTTYPE . '_posts_columns', array( __CLASS__, 'column_headers' ) );
47
 
48
  // Registers event start/end date as sortable columns
49
  add_action( 'manage_edit-' . Tribe__Events__Main::POSTTYPE . '_sortable_columns', array( __CLASS__, 'register_sortable_columns' ), 10, 2 );
src/Tribe/Cost_Utils.php CHANGED
@@ -193,6 +193,15 @@ class Tribe__Events__Cost_Utils {
193
 
194
  $costs = $this->parse_cost_range( $costs );
195
 
 
 
 
 
 
 
 
 
 
196
  if ( empty( $costs ) ) {
197
  return 0;
198
  }
@@ -207,8 +216,8 @@ class Tribe__Events__Cost_Utils {
207
  break;
208
  }
209
 
210
- // use a regular expression instead of is_numeric
211
- if ( ! preg_match( $this->get_cost_regex(), $cost ) ) {
212
  return 0;
213
  }
214
 
@@ -273,11 +282,11 @@ class Tribe__Events__Cost_Utils {
273
  return array();
274
  }
275
 
276
- // remove any empty prices
277
- $costs = array_filter( (array) $costs );
278
 
279
- // If it's empty returns 0
280
- if ( empty( $costs ) ) {
281
  return array();
282
  }
283
 
@@ -289,6 +298,9 @@ class Tribe__Events__Cost_Utils {
289
  // Get the required parts
290
  if ( preg_match_all( '/' . $price_regex . '/', $cost, $matches ) ) {
291
  $cost = reset( $matches );
 
 
 
292
  }
293
 
294
  // Get the max number of decimals for the range
@@ -307,8 +319,15 @@ class Tribe__Events__Cost_Utils {
307
  $costs = call_user_func_array( 'array_merge', $costs );
308
 
309
  foreach ( $costs as $cost ) {
310
- // Creates a Well Balanced Index that will perform good on a Key Sorting method
311
- $index = str_replace( '.', '', number_format( str_replace( $this->get_separators(), '.', $cost ), $max ) );
 
 
 
 
 
 
 
312
 
313
  // Keep the Costs in a organizeable array by keys with the "numeric" value
314
  $ocost[ $index ] = $cost;
193
 
194
  $costs = $this->parse_cost_range( $costs );
195
 
196
+ // if there's only one item, we're looking at a single event. If the cost is non-numeric, let's
197
+ // return the non-numeric cost so that value is preserved
198
+ if ( 1 === count( $costs ) && ! is_numeric( current( $costs ) ) ) {
199
+ return current( $costs );
200
+ }
201
+
202
+ // make sure we are only trying to get numeric min/max values
203
+ $costs = array_filter( $costs, 'is_numeric' );
204
+
205
  if ( empty( $costs ) ) {
206
  return 0;
207
  }
216
  break;
217
  }
218
 
219
+ // If there isn't anything on the cost just return 0
220
+ if ( empty( $cost ) ) {
221
  return 0;
222
  }
223
 
282
  return array();
283
  }
284
 
285
+ // make sure costs is an array
286
+ $costs = (array) $costs;
287
 
288
+ // If there aren't any costs, return a blank array
289
+ if ( 0 === count( $costs ) ) {
290
  return array();
291
  }
292
 
298
  // Get the required parts
299
  if ( preg_match_all( '/' . $price_regex . '/', $cost, $matches ) ) {
300
  $cost = reset( $matches );
301
+ } else {
302
+ $cost = array( $cost );
303
+ continue;
304
  }
305
 
306
  // Get the max number of decimals for the range
319
  $costs = call_user_func_array( 'array_merge', $costs );
320
 
321
  foreach ( $costs as $cost ) {
322
+ $numeric_cost = str_replace( $this->get_separators(), '.', $cost );
323
+
324
+ if ( is_numeric( $numeric_cost ) ) {
325
+ // Creates a Well Balanced Index that will perform good on a Key Sorting method
326
+ $index = str_replace( array( '.', ',' ), '', number_format( $numeric_cost, $max ) );
327
+ } else {
328
+ // Makes sure that we have "index-safe" string
329
+ $index = sanitize_title( $numeric_cost );
330
+ }
331
 
332
  // Keep the Costs in a organizeable array by keys with the "numeric" value
333
  $ocost[ $index ] = $cost;
src/Tribe/Event_Tickets/Main.php CHANGED
@@ -18,15 +18,27 @@ class Tribe__Events__Event_Tickets__Main {
18
 
19
  /**
20
  * Contains an instance of the Attendees Report integration class
 
21
  * @since 4.0.1
 
22
  * @var Tribe__Events__Event_Tickets__Attendees_Report
23
  */
24
  private $attendees_report;
25
 
 
 
 
 
 
 
 
 
 
26
  /**
27
  * Method to return the private instance of the class
28
  *
29
  * @since 4.0.1
 
30
  * @return Tribe__Events__Event_Tickets__Main
31
  */
32
  public static function instance() {
@@ -42,10 +54,16 @@ class Tribe__Events__Event_Tickets__Main {
42
  */
43
  public function __construct() {
44
  $this->attendees_report();
 
45
  }
46
 
47
  /**
48
  * Attendees Report integration class object accessor method
 
 
 
 
 
49
  */
50
  public function attendees_report( $object = null ) {
51
  if ( $object ) {
@@ -56,4 +74,22 @@ class Tribe__Events__Event_Tickets__Main {
56
 
57
  return $this->attendees_report;
58
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  }
18
 
19
  /**
20
  * Contains an instance of the Attendees Report integration class
21
+ *
22
  * @since 4.0.1
23
+ *
24
  * @var Tribe__Events__Event_Tickets__Attendees_Report
25
  */
26
  private $attendees_report;
27
 
28
+ /**
29
+ * Contains an instance of the Ticket Email integration class
30
+ *
31
+ * @since 4.0.2
32
+ *
33
+ * @var Tribe__Events__Event_Tickets__Ticket_Email
34
+ */
35
+ private $ticket_email;
36
+
37
  /**
38
  * Method to return the private instance of the class
39
  *
40
  * @since 4.0.1
41
+ *
42
  * @return Tribe__Events__Event_Tickets__Main
43
  */
44
  public static function instance() {
54
  */
55
  public function __construct() {
56
  $this->attendees_report();
57
+ $this->ticket_email();
58
  }
59
 
60
  /**
61
  * Attendees Report integration class object accessor method
62
+ *
63
+ * @since 4.0.1
64
+ *
65
+ * @param object $object Override Attendees Report object
66
+ * @return Tribe__Events__Event_Tickets__Attendees_Report
67
  */
68
  public function attendees_report( $object = null ) {
69
  if ( $object ) {
74
 
75
  return $this->attendees_report;
76
  }
77
+
78
+ /**
79
+ * Ticket email integration class object accessor method
80
+ *
81
+ * @since 4.0.2
82
+ *
83
+ * @param object $object Override Ticket Email object
84
+ * @return Tribe__Events__Event_Tickets__Ticket_Email
85
+ */
86
+ public function ticket_email( $object = null ) {
87
+ if ( $object ) {
88
+ $this->ticket_email = $object;
89
+ } elseif ( ! $this->ticket_email ) {
90
+ $this->ticket_email = new Tribe__Events__Event_Tickets__Ticket_Email;
91
+ }
92
+
93
+ return $this->ticket_email;
94
+ }
95
  }
src/Tribe/Event_Tickets/Ticket_Email.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The Events Calendar integration with Event Tickets ticket email
4
+ *
5
+ * @package The Events Calendar
6
+ * @subpackage Event Tickets
7
+ * @since 4.0.2
8
+ */
9
+ class Tribe__Events__Event_Tickets__Ticket_Email {
10
+ /**
11
+ * Constructor
12
+ */
13
+ public function __construct() {
14
+ $this->add_hooks();
15
+ }
16
+
17
+ /**
18
+ * Adds hooks for injecting/overriding aspects of the ticket emails from Event Tickets
19
+ *
20
+ * @since 4.0.2
21
+ */
22
+ public function add_hooks() {
23
+ add_filter( 'event_tickets_email_include_start_date', array( $this, 'maybe_include_start_date' ), 10, 2 );
24
+ }
25
+
26
+ /**
27
+ * Includes the start date in the ticket email if the post type is appropriate
28
+ *
29
+ * @since 4.0.2
30
+ * @param boolean $include_start_date Whether or not to include the start date
31
+ * @param int $event_id Event ID
32
+ * @return boolean
33
+ */
34
+ public function maybe_include_start_date( $include_start_date, $event_id ) {
35
+ // if the post type isn't the TEC post type, don't change the boolean
36
+ if ( Tribe__Events__Main::POSTTYPE !== get_post_type( $event_id ) ) {
37
+ return $include_start_date;
38
+ }
39
+
40
+ return true;
41
+ }
42
+ }
src/Tribe/List_Widget.php CHANGED
@@ -150,6 +150,7 @@ class Tribe__Events__List_Widget extends WP_Widget {
150
  */
151
  public function update( $new_instance, $old_instance ) {
152
  $instance = $old_instance;
 
153
 
154
  /* Strip tags (if needed) and update the widget settings. */
155
  $instance['title'] = strip_tags( $new_instance['title'] );
@@ -167,14 +168,24 @@ class Tribe__Events__List_Widget extends WP_Widget {
167
  * @return string The output for the admin widget form.
168
  */
169
  public function form( $instance ) {
170
- /* Set up default widget settings. */
171
- $defaults = array(
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  'title' => esc_html__( 'Upcoming Events', 'the-events-calendar' ),
173
  'limit' => '5',
174
  'no_upcoming_events' => false,
175
- );
176
- $instance = wp_parse_args( (array) $instance, $defaults );
177
- $tribe_ecp = Tribe__Events__Main::instance();
178
- include( $tribe_ecp->pluginPath . 'src/admin-views/widget-admin-list.php' );
179
  }
180
  }
150
  */
151
  public function update( $new_instance, $old_instance ) {
152
  $instance = $old_instance;
153
+ $new_instance = $this->default_instance_args( $new_instance );
154
 
155
  /* Strip tags (if needed) and update the widget settings. */
156
  $instance['title'] = strip_tags( $new_instance['title'] );
168
  * @return string The output for the admin widget form.
169
  */
170
  public function form( $instance ) {
171
+ $instance = $this->default_instance_args( $instance );
172
+ $tribe_ecp = Tribe__Events__Main::instance();
173
+ include( $tribe_ecp->pluginPath . 'src/admin-views/widget-admin-list.php' );
174
+ }
175
+
176
+ /**
177
+ * Accepts and returns the widget's instance array - ensuring any missing
178
+ * elements are generated and set to their default value.
179
+ *
180
+ * @param array $instance
181
+ *
182
+ * @return array
183
+ */
184
+ protected function default_instance_args( array $instance ) {
185
+ return wp_parse_args( $instance, array(
186
  'title' => esc_html__( 'Upcoming Events', 'the-events-calendar' ),
187
  'limit' => '5',
188
  'no_upcoming_events' => false,
189
+ ) );
 
 
 
190
  }
191
  }
src/Tribe/Main.php CHANGED
@@ -32,7 +32,7 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
32
  const VENUE_POST_TYPE = 'tribe_venue';
33
  const ORGANIZER_POST_TYPE = 'tribe_organizer';
34
 
35
- const VERSION = '4.0.1';
36
  const MIN_ADDON_VERSION = '4.0';
37
  const WP_PLUGIN_URL = 'http://wordpress.org/extend/plugins/the-events-calendar/';
38
 
@@ -487,7 +487,12 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
487
  add_action( 'plugins_loaded', array( 'Tribe__Cache', 'setup' ) );
488
  add_action( 'plugins_loaded', array( 'Tribe__Support', 'getInstance' ) );
489
  add_action( 'plugins_loaded', array( $this, 'set_meta_factory_global' ) );
490
- add_action( 'current_screen', array( $this, 'init_admin_list_screen' ) );
 
 
 
 
 
491
 
492
  // Load organizer and venue editors
493
  add_action( 'admin_menu', array( $this, 'addVenueAndOrganizerEditor' ) );
@@ -764,6 +769,8 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
764
  * Run on applied action init
765
  */
766
  public function init() {
 
 
767
  $this->pluginName = $this->plugin_name = esc_html__( 'The Events Calendar', 'the-events-calendar' );
768
  $this->rewriteSlug = $this->getRewriteSlug();
769
  $this->rewriteSlugSingular = $this->getRewriteSlugSingular();
@@ -785,10 +792,10 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
785
  $this->singular_event_label = $this->get_event_label_singular();
786
  $this->plural_event_label = $this->get_event_label_plural();
787
 
788
- $this->postTypeArgs['rewrite']['slug'] = sanitize_title( $this->rewriteSlugSingular );
789
- $this->postVenueTypeArgs['rewrite']['slug'] = sanitize_title( $this->singular_venue_label );
790
  $this->postVenueTypeArgs['show_in_nav_menus'] = class_exists( 'Tribe__Events__Pro__Main' ) ? true : false;
791
- $this->postOrganizerTypeArgs['rewrite']['slug'] = sanitize_title( $this->singular_organizer_label );
792
  $this->postOrganizerTypeArgs['show_in_nav_menus'] = class_exists( 'Tribe__Events__Pro__Main' ) ? true : false;
793
  $this->postVenueTypeArgs['public'] = class_exists( 'Tribe__Events__Pro__Main' ) ? true : false;
794
  $this->postOrganizerTypeArgs['public'] = class_exists( 'Tribe__Events__Pro__Main' ) ? true : false;
@@ -1636,11 +1643,11 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
1636
  public function displayEventVenueDropdown( $post_id ) {
1637
  $venue_id = get_post_meta( $post_id, '_EventVenueID', true );
1638
 
1639
- if (
1640
- ( ! $post_id || get_post_status( $post_id ) === 'auto-draft' ) &&
1641
- ! $venue_id &&
1642
- tribe_is_community_edit_event_page()
1643
- ) {
1644
  $venue_id = $this->defaults()->venue_id();
1645
  }
1646
 
@@ -2322,12 +2329,15 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
2322
  * @param WP_Screen $screen WP Admin screen object for the current page
2323
  */
2324
  public function init_admin_list_screen( $screen ) {
2325
- if ( 'edit' !== $screen->base ) {
2326
- return;
2327
- }
 
 
2328
 
2329
- if ( self::POSTTYPE !== $screen->post_type ) {
2330
- return;
 
2331
  }
2332
 
2333
  Tribe__Events__Admin_List::init();
@@ -2651,12 +2661,10 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
2651
  if ( ! is_wp_error( $term_link ) ) {
2652
  $event_url = trailingslashit( $term_link );
2653
  }
2654
- } else {
2655
- if ( $term ) {
2656
- $term_link = get_term_link( (int) $term, self::TAXONOMY );
2657
- if ( ! is_wp_error( $term_link ) ) {
2658
- $event_url = trailingslashit( $term_link );
2659
- }
2660
  }
2661
  }
2662
 
@@ -3909,17 +3917,113 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
3909
  }
3910
 
3911
  /**
3912
- * Get a "previous/next post" link for events. Ordered by start date instead of ID.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3913
  *
3914
  * @param WP_Post $post The post/event.
3915
  * @param string $mode Either 'next' or 'previous'.
3916
- * @param mixed $anchor
3917
  *
3918
- * @return string The link (with <a> tags).
3919
  */
3920
- public function get_event_link( $post, $mode = 'next', $anchor = false ) {
3921
  global $wpdb;
3922
- $link = '';
3923
 
3924
  if ( 'previous' === $mode ) {
3925
  $order = 'DESC';
@@ -3956,15 +4060,44 @@ if ( ! class_exists( 'Tribe__Events__Main' ) ) {
3956
  *
3957
  * @var array $args
3958
  * @var WP_Post $post
3959
- * @var boolean $anchor
3960
  */
3961
- $args = (array) apply_filters( "tribe_events_get_{$mode}_event_link", $args, $post, $anchor );
 
3962
  $results = tribe_get_events( $args );
 
 
 
3963
 
3964
  // If we successfully located the next/prev event, we should have precisely one element in $results
3965
  if ( 1 === count( $results ) ) {
3966
  $event = current( $results );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3967
 
 
 
3968
  if ( ! $anchor ) {
3969
  $anchor = apply_filters( 'the_title', $event->post_title );
3970
  } elseif ( strpos( $anchor, '%title%' ) !== false ) {
32
  const VENUE_POST_TYPE = 'tribe_venue';
33
  const ORGANIZER_POST_TYPE = 'tribe_organizer';
34
 
35
+ const VERSION = '4.0.2';
36
  const MIN_ADDON_VERSION = '4.0';
37
  const WP_PLUGIN_URL = 'http://wordpress.org/extend/plugins/the-events-calendar/';
38
 
487
  add_action( 'plugins_loaded', array( 'Tribe__Cache', 'setup' ) );
488
  add_action( 'plugins_loaded', array( 'Tribe__Support', 'getInstance' ) );
489
  add_action( 'plugins_loaded', array( $this, 'set_meta_factory_global' ) );
490
+
491
+ if ( ! Tribe__Main::instance()->doing_ajax() ) {
492
+ add_action( 'current_screen', array( $this, 'init_admin_list_screen' ) );
493
+ } else {
494
+ add_action( 'admin_init', array( $this, 'init_admin_list_screen' ) );
495
+ }
496
 
497
  // Load organizer and venue editors
498
  add_action( 'admin_menu', array( $this, 'addVenueAndOrganizerEditor' ) );
769
  * Run on applied action init
770
  */
771
  public function init() {
772
+ $rewrite = Tribe__Events__Rewrite::instance();
773
+
774
  $this->pluginName = $this->plugin_name = esc_html__( 'The Events Calendar', 'the-events-calendar' );
775
  $this->rewriteSlug = $this->getRewriteSlug();
776
  $this->rewriteSlugSingular = $this->getRewriteSlugSingular();
792
  $this->singular_event_label = $this->get_event_label_singular();
793
  $this->plural_event_label = $this->get_event_label_plural();
794
 
795
+ $this->postTypeArgs['rewrite']['slug'] = $rewrite->prepare_slug( $this->rewriteSlugSingular, self::POSTTYPE );
796
+ $this->postVenueTypeArgs['rewrite']['slug'] = $rewrite->prepare_slug( $this->singular_venue_label, self::VENUE_POST_TYPE );
797
  $this->postVenueTypeArgs['show_in_nav_menus'] = class_exists( 'Tribe__Events__Pro__Main' ) ? true : false;
798
+ $this->postOrganizerTypeArgs['rewrite']['slug'] = $rewrite->prepare_slug( $this->singular_organizer_label, self::ORGANIZER_POST_TYPE );
799
  $this->postOrganizerTypeArgs['show_in_nav_menus'] = class_exists( 'Tribe__Events__Pro__Main' ) ? true : false;
800
  $this->postVenueTypeArgs['public'] = class_exists( 'Tribe__Events__Pro__Main' ) ? true : false;
801
  $this->postOrganizerTypeArgs['public'] = class_exists( 'Tribe__Events__Pro__Main' ) ? true : false;
1643
  public function displayEventVenueDropdown( $post_id ) {
1644
  $venue_id = get_post_meta( $post_id, '_EventVenueID', true );
1645
 
1646
+ // Strange but true: the following func lives in core so is safe to call without a func_exists check
1647
+ $new_community_post = tribe_is_community_edit_event_page() && ! $post_id;
1648
+ $new_admin_post = 'auto-draft' === get_post_status( $post_id );
1649
+
1650
+ if ( ! $venue_id && ( $new_admin_post || $new_community_post ) ) {
1651
  $venue_id = $this->defaults()->venue_id();
1652
  }
1653
 
2329
  * @param WP_Screen $screen WP Admin screen object for the current page
2330
  */
2331
  public function init_admin_list_screen( $screen ) {
2332
+ // If we are dealing with a AJAX call just drop these checks
2333
+ if ( ! Tribe__Main::instance()->doing_ajax() ) {
2334
+ if ( 'edit' !== $screen->base ) {
2335
+ return;
2336
+ }
2337
 
2338
+ if ( self::POSTTYPE !== $screen->post_type ) {
2339
+ return;
2340
+ }
2341
  }
2342
 
2343
  Tribe__Events__Admin_List::init();
2661
  if ( ! is_wp_error( $term_link ) ) {
2662
  $event_url = trailingslashit( $term_link );
2663
  }
2664
+ } elseif ( $term && is_numeric( $term ) ) {
2665
+ $term_link = get_term_link( (int) $term, self::TAXONOMY );
2666
+ if ( ! is_wp_error( $term_link ) ) {
2667
+ $event_url = trailingslashit( $term_link );
 
 
2668
  }
2669
  }
2670
 
3917
  }
3918
 
3919
  /**
3920
+ * Modify the WHERE clause of query when fetching next/prev posts so events with identical times are not excluded
3921
+ *
3922
+ * This method ensures that when viewing single events that occur at a given time, other events
3923
+ * that occur at the exact same time are are not excluded from the prev/next links
3924
+ *
3925
+ * @since 4.0.2
3926
+ *
3927
+ * @param string $where_sql WHERE SQL statement
3928
+ * @param WP_Query $query WP_Query object
3929
+ *
3930
+ * return string
3931
+ */
3932
+ public function get_closest_event_where( $where_sql ) {
3933
+ // if we are in this method, we KNOW there is a section of the SQL that looks like this:
3934
+ // ( table.meta_key = '_EventStartDate' AND CAST( table.meta_value AS DATETIME ) [<|>] '2015-01-01 00:00:00' )
3935
+ // What we want to do is to extract all the portions of the WHERE BEFORE that section, all the
3936
+ // portions AFTER that section, and then rebuild that section to be flexible enough to include
3937
+ // events that have the SAME datetime as the event we're comparing against. Sadly, this requires
3938
+ // some regex-fu.
3939
+ //
3940
+ // The end-game is to change the known SQL line (from above) into the following:
3941
+ //
3942
+ // (
3943
+ // ( table.meta_key = '_EventStartDate' AND CAST( table.meta_value AS DATETIME ) [<|>] '2015-01-01 00:00:00' )
3944
+ // OR (
3945
+ // ( table.meta_key = '_EventStartDate' AND CAST( table.meta_value AS DATETIME ) = '2015-01-01 00:00:00' )
3946
+ // AND
3947
+ // table.post_id [<|>] POST_ID
3948
+ // )
3949
+ // )
3950
+ //
3951
+
3952
+ // Here's the regex portion that matches the part that we know. From that line, we want to
3953
+ // have a few capture groups.
3954
+ // 1) We need the whole thing
3955
+ // 2) We need the meta table alias
3956
+ // 3) We need the < or > sign
3957
+
3958
+ // Here's the regex for getting the meta table alias
3959
+ $meta_table_regex = '([^\.]+)\.meta_key\s*=\s*';
3960
+
3961
+ // Here's the regex for the middle section of the know line
3962
+ $middle_regex = '[\'"]_EventStartDate[\'"]\s+AND\s+CAST[^\)]+AS DATETIME\s*\)\s*';
3963
+
3964
+ // Here's the regex for the < and > sign
3965
+ $gt_lt_regex = '(\<|\>)';
3966
+
3967
+ // Let's put that line together, making sure we are including the wrapping parens and the
3968
+ // characters that make up the rest of the line - spacing in front, non paren characters at
3969
+ // the end
3970
+ $known_sql_regex = "\(\s*{$meta_table_regex}{$middle_regex}{$gt_lt_regex}[^\)]+\)";
3971
+
3972
+ // The known SQL line will undoubtedly be included amongst other WHERE statements. We need
3973
+ // to generically grab the SQL before and after the known line so we can rebuild our nice new
3974
+ // where statement. Here's the regex that brings it all together.
3975
+ // Note: We are using the 'm' modifier so that the regex looks over multiple lines as well
3976
+ // as the 's' modifier so that '.' includes linebreaks
3977
+ $full_regex = "/(.*)($known_sql_regex)(.*)/ms";
3978
+
3979
+ // here's a regex to grab the post ID from a portion of the WHERE statement
3980
+ $post_id_regex = '/NOT IN\s*\(([0-9]+)\)/';
3981
+
3982
+ if ( preg_match( $full_regex, $where_sql, $matches ) ) {
3983
+ // place capture groups into vars that are easier to read
3984
+ $before = $matches[1];
3985
+ $known = $matches[2];
3986
+ $alias = $matches[3];
3987
+ $gt_lt = $matches[4];
3988
+ $after = $matches[5];
3989
+
3990
+ // copy the known line but replace the < or > symbol with an =
3991
+ $equal = preg_replace( '/(\<|\>)/', '=', $known );
3992
+
3993
+ // extract the post ID from the extra "before" or "after" WHERE
3994
+ if (
3995
+ preg_match( $post_id_regex, $before, $post_id )
3996
+ || preg_match( $post_id_regex, $after, $post_id )
3997
+ ) {
3998
+ $post_id = absint( $post_id[1] );
3999
+ } else {
4000
+ // if we can't find the post ID, then let's bail
4001
+ return $where_sql;
4002
+ }
4003
+
4004
+ // rebuild the WHERE clause
4005
+ $where_sql = "{$before} (
4006
+ {$known}
4007
+ OR (
4008
+ {$equal}
4009
+ AND {$alias}.post_id {$gt_lt} {$post_id}
4010
+ )
4011
+ ) {$after} ";
4012
+ }
4013
+
4014
+ return $where_sql;
4015
+ }
4016
+
4017
+ /**
4018
+ * Get the prev/next post for a given event. Ordered by start date instead of ID.
4019
  *
4020
  * @param WP_Post $post The post/event.
4021
  * @param string $mode Either 'next' or 'previous'.
 
4022
  *
4023
+ * @return null|WP_Post
4024
  */
4025
+ public function get_closest_event( $post, $mode = 'next' ) {
4026
  global $wpdb;
 
4027
 
4028
  if ( 'previous' === $mode ) {
4029
  $order = 'DESC';
4060
  *
4061
  * @var array $args
4062
  * @var WP_Post $post
 
4063
  */
4064
+ $args = (array) apply_filters( "tribe_events_get_{$mode}_event_link", $args, $post );
4065
+ add_filter( 'posts_where', array( $this, 'get_closest_event_where' ) );
4066
  $results = tribe_get_events( $args );
4067
+ remove_filter( 'posts_where', array( $this, 'get_closest_event_where' ) );
4068
+
4069
+ $event = null;
4070
 
4071
  // If we successfully located the next/prev event, we should have precisely one element in $results
4072
  if ( 1 === count( $results ) ) {
4073
  $event = current( $results );
4074
+ }
4075
+
4076
+ /**
4077
+ * Affords an opportunity to modify the event used to generate the event link (typically for
4078
+ * the next or previous event in relation to $post).
4079
+ *
4080
+ * @var WP_Post $post
4081
+ * @var string $mode (typically "previous" or "next")
4082
+ */
4083
+ return apply_filters( 'tribe_events_get_closest_event', $event, $post, $mode );
4084
+ }
4085
+
4086
+ /**
4087
+ * Get a "previous/next post" link for events. Ordered by start date instead of ID.
4088
+ *
4089
+ * @param WP_Post $post The post/event.
4090
+ * @param string $mode Either 'next' or 'previous'.
4091
+ * @param mixed $anchor
4092
+ *
4093
+ * @return string The link (with <a> tags).
4094
+ */
4095
+ public function get_event_link( $post, $mode = 'next', $anchor = false ) {
4096
+ $link = null;
4097
+ $event = $this->get_closest_event( $post, $mode );
4098
 
4099
+ // If we successfully located the next/prev event, we should have precisely one element in $results
4100
+ if ( $event ) {
4101
  if ( ! $anchor ) {
4102
  $anchor = apply_filters( 'the_title', $event->post_title );
4103
  } elseif ( strpos( $anchor, '%title%' ) !== false ) {
src/Tribe/Query.php CHANGED
@@ -115,10 +115,13 @@ if ( ! class_exists( 'Tribe__Events__Query' ) ) {
115
  ? true // this is an event query of some type
116
  : false; // move along, this is not the query you are looking for
117
 
118
- // is the query pulling posts from the past
119
- if ( $query->is_main_query() && ! empty( $_REQUEST['tribe_event_display'] ) && $_REQUEST['tribe_event_display'] == 'past' ) {
 
 
 
120
  $query->tribe_is_past = true;
121
- } elseif ( tribe_is_ajax_view_request() && $query->get( 'eventDisplay' ) == 'past' ) {
122
  $query->tribe_is_past = true;
123
  } elseif ( $query->get( 'tribe_is_past' ) ) {
124
  $query->tribe_is_past = true;
@@ -164,7 +167,7 @@ if ( ! class_exists( 'Tribe__Events__Query' ) ) {
164
  do_action( 'log', 'multi_posttype', 'default', $query->tribe_is_multi_posttype );
165
  add_filter( 'posts_fields', array( __CLASS__, 'multi_type_posts_fields' ), 10, 2 );
166
  add_filter( 'posts_join', array( __CLASS__, 'posts_join' ), 10, 2 );
167
- add_filter( 'posts_join', array( __CLASS__, 'posts_join_orderby' ), 10, 2 );
168
  add_filter( 'posts_distinct', array( __CLASS__, 'posts_distinct' ) );
169
  add_filter( 'posts_orderby', array( __CLASS__, 'posts_orderby' ), 10, 2 );
170
  do_action( 'tribe_events_pre_get_posts', $query );
@@ -177,7 +180,7 @@ if ( ! class_exists( 'Tribe__Events__Query' ) ) {
177
  if ( ! ( $query->is_main_query() && 'month' === $query->get( 'eventDisplay' ) ) ) {
178
  add_filter( 'posts_fields', array( __CLASS__, 'posts_fields' ), 10, 2 );
179
  add_filter( 'posts_join', array( __CLASS__, 'posts_join' ), 10, 2 );
180
- add_filter( 'posts_join', array( __CLASS__, 'posts_join_orderby' ), 10, 2 );
181
  add_filter( 'posts_where', array( __CLASS__, 'posts_where' ), 10, 2 );
182
  add_filter( 'posts_distinct', array( __CLASS__, 'posts_distinct' ) );
183
  } else {
@@ -498,30 +501,6 @@ if ( ! class_exists( 'Tribe__Events__Query' ) ) {
498
  return $join_sql;
499
  }
500
 
501
- /**
502
- * Custom SQL join for orderby
503
- *
504
- * @param string $join_sql
505
- * @param wp_query $query
506
- *
507
- * @return string
508
- */
509
- public static function posts_join_orderby( $join_sql, $query ) {
510
- global $wpdb;
511
- switch ( $query->get( 'orderby' ) ) {
512
- case 'venue':
513
- $join_sql .= " LEFT JOIN {$wpdb->postmeta} tribe_order_by_venue_meta ON {$wpdb->posts}.ID = tribe_order_by_venue_meta.post_id AND tribe_order_by_venue_meta.meta_key='_EventVenueID' LEFT JOIN {$wpdb->posts} tribe_order_by_venue ON tribe_order_by_venue_meta.meta_value = tribe_order_by_venue.ID ";
514
- break;
515
- case 'organizer':
516
- $join_sql .= " LEFT JOIN {$wpdb->postmeta} tribe_order_by_organizer_meta ON {$wpdb->posts}.ID = tribe_order_by_organizer_meta.post_id AND tribe_order_by_organizer_meta.meta_key='_EventOrganizerID' LEFT JOIN {$wpdb->posts} tribe_order_by_organizer ON tribe_order_by_organizer_meta.meta_value = tribe_order_by_organizer.ID ";
517
- break;
518
- default:
519
- break;
520
- }
521
-
522
- return apply_filters( 'tribe_events_query_posts_join_orderby', $join_sql );
523
- }
524
-
525
  /**
526
  * Custom SQL conditional for event duration meta field
527
  *
@@ -669,26 +648,23 @@ if ( ! class_exists( 'Tribe__Events__Query' ) ) {
669
  */
670
  public static function posts_orderby( $order_sql, $query ) {
671
  global $wpdb;
672
- $postmeta_table = self::postmeta_table( $query );
673
 
674
  if ( $query->tribe_is_event || $query->tribe_is_event_category ) {
675
- $order = ( isset( $query->order ) && ! empty( $query->order ) ) ? $query->order : $query->get( 'order' );
676
- $orderby = ( isset( $query->orderby ) && ! empty( $query->orderby ) ) ? $query->orderby : $query->get( 'orderby' );
677
 
678
- // $order_sql = "DATE(MIN({$postmeta_table}.meta_value)) {$order}, TIME({$postmeta_table}.meta_value) {$order}";
679
  if ( self::can_inject_date_field( $query ) ) {
 
680
  $order_sql = "EventStartDate {$order}";
 
 
 
 
681
  }
682
 
683
  do_action( 'log', 'orderby', 'default', $orderby );
684
 
685
  switch ( $orderby ) {
686
- case 'venue':
687
- $order_sql = "tribe_order_by_venue.post_title {$order}, " . $order_sql;
688
- break;
689
- case 'organizer':
690
- $order_sql = "tribe_order_by_organizer.post_title {$order}, " . $order_sql;
691
- break;
692
  case 'title':
693
  $order_sql = "{$wpdb->posts}.post_title {$order}, " . $order_sql;
694
  break;
@@ -718,6 +694,100 @@ if ( ! class_exists( 'Tribe__Events__Query' ) ) {
718
  return $order_sql;
719
  }
720
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
721
  /**
722
  * Custom SQL to retrieve post_id list of events marked to be hidden from upcoming lists.
723
  *
@@ -935,14 +1005,14 @@ if ( ! class_exists( 'Tribe__Events__Query' ) ) {
935
  * @return string
936
  **/
937
  private static function postmeta_table( $query ) {
938
-
939
  global $wpdb;
 
940
 
941
  if ( ! $query->tribe_is_multi_posttype ) {
942
- return $wpdb->postmeta;
943
  }
944
 
945
-
946
  $qv = $query->query_vars;
947
 
948
  // check if are any meta queries
@@ -962,7 +1032,6 @@ if ( ! class_exists( 'Tribe__Events__Query' ) ) {
962
  }
963
 
964
  return $postmeta_table;
965
-
966
  }
967
 
968
  /**
115
  ? true // this is an event query of some type
116
  : false; // move along, this is not the query you are looking for
117
 
118
+ // is the query pulling posts from the past?
119
+ $past_requested = ! empty( $_REQUEST['tribe_event_display'] ) && 'past' === $_REQUEST['tribe_event_display'];
120
+ $display_past = 'past' === $query->get( 'eventDisplay' );
121
+
122
+ if ( $query->is_main_query() && $past_requested ) {
123
  $query->tribe_is_past = true;
124
+ } elseif ( tribe_is_ajax_view_request() && ( $display_past || $past_requested ) ) {
125
  $query->tribe_is_past = true;
126
  } elseif ( $query->get( 'tribe_is_past' ) ) {
127
  $query->tribe_is_past = true;
167
  do_action( 'log', 'multi_posttype', 'default', $query->tribe_is_multi_posttype );
168
  add_filter( 'posts_fields', array( __CLASS__, 'multi_type_posts_fields' ), 10, 2 );
169
  add_filter( 'posts_join', array( __CLASS__, 'posts_join' ), 10, 2 );
170
+ add_filter( 'posts_join', array( __CLASS__, 'posts_join_venue_organizer' ), 10, 2 );
171
  add_filter( 'posts_distinct', array( __CLASS__, 'posts_distinct' ) );
172
  add_filter( 'posts_orderby', array( __CLASS__, 'posts_orderby' ), 10, 2 );
173
  do_action( 'tribe_events_pre_get_posts', $query );
180
  if ( ! ( $query->is_main_query() && 'month' === $query->get( 'eventDisplay' ) ) ) {
181
  add_filter( 'posts_fields', array( __CLASS__, 'posts_fields' ), 10, 2 );
182
  add_filter( 'posts_join', array( __CLASS__, 'posts_join' ), 10, 2 );
183
+ add_filter( 'posts_join', array( __CLASS__, 'posts_join_venue_organizer' ), 10, 2 );
184
  add_filter( 'posts_where', array( __CLASS__, 'posts_where' ), 10, 2 );
185
  add_filter( 'posts_distinct', array( __CLASS__, 'posts_distinct' ) );
186
  } else {
501
  return $join_sql;
502
  }
503
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
504
  /**
505
  * Custom SQL conditional for event duration meta field
506
  *
648
  */
649
  public static function posts_orderby( $order_sql, $query ) {
650
  global $wpdb;
 
651
 
652
  if ( $query->tribe_is_event || $query->tribe_is_event_category ) {
653
+ $order = ( isset( $query->query_vars['order'] ) && ! empty( $query->query_vars['order'] ) ) ? $query->query_vars['order'] : $query->get( 'order' );
654
+ $orderby = ( isset( $query->query_vars['orderby'] ) && ! empty( $query->query_vars['orderby'] ) ) ? $query->query_vars['orderby'] : $query->get( 'orderby' );
655
 
 
656
  if ( self::can_inject_date_field( $query ) ) {
657
+ $old_orderby = $order_sql;
658
  $order_sql = "EventStartDate {$order}";
659
+
660
+ if ( $old_orderby ) {
661
+ $order_sql .= ", {$old_orderby}";
662
+ }
663
  }
664
 
665
  do_action( 'log', 'orderby', 'default', $orderby );
666
 
667
  switch ( $orderby ) {
 
 
 
 
 
 
668
  case 'title':
669
  $order_sql = "{$wpdb->posts}.post_title {$order}, " . $order_sql;
670
  break;
694
  return $order_sql;
695
  }
696
 
697
+ /**
698
+ * Adds a custom SQL join when ordering by venue or organizer is desired.
699
+ *
700
+ * @param string $join_sql
701
+ * @param wp_query $query
702
+ *
703
+ * @return string
704
+ */
705
+ public static function posts_join_venue_organizer( $join_sql, $query ) {
706
+ global $wpdb;
707
+
708
+ switch ( $query->get( 'orderby' ) ) {
709
+ case 'venue':
710
+ $join_sql .= " LEFT JOIN {$wpdb->postmeta} tribe_order_by_venue_meta ON {$wpdb->posts}.ID = tribe_order_by_venue_meta.post_id AND tribe_order_by_venue_meta.meta_key='_EventVenueID' LEFT JOIN {$wpdb->posts} tribe_order_by_venue ON tribe_order_by_venue_meta.meta_value = tribe_order_by_venue.ID ";
711
+ break;
712
+ case 'organizer':
713
+ $join_sql .= " LEFT JOIN {$wpdb->postmeta} tribe_order_by_organizer_meta ON {$wpdb->posts}.ID = tribe_order_by_organizer_meta.post_id AND tribe_order_by_organizer_meta.meta_key='_EventOrganizerID' LEFT JOIN {$wpdb->posts} tribe_order_by_organizer ON tribe_order_by_organizer_meta.meta_value = tribe_order_by_organizer.ID ";
714
+ break;
715
+ default:
716
+ return $join_sql;
717
+ break;
718
+ }
719
+
720
+ /**
721
+ * Ensures we add the matching corresponding code to the order clause.
722
+ *
723
+ * We use posts_clauses (as opposed to posts_orderby) in this case to avoid
724
+ * it being overwritten by Tribe__Events__Admin_List methods.
725
+ *
726
+ * @see Tribe__Events__Admin_List
727
+ */
728
+ add_filter( 'posts_clauses', array( __CLASS__, 'posts_orderby_venue_organizer' ), 100, 2 );
729
+
730
+ if ( has_filter( 'tribe_events_query_posts_join_orderby' ) ) {
731
+ /**
732
+ * Historically this filter has only been useful to modify the joins setup
733
+ * in relation to organizers and venues. In future it may have a more general
734
+ * application or may be removed.
735
+ *
736
+ * @deprecated since 4.0.2
737
+ *
738
+ * @var string $join_sql
739
+ */
740
+ $join_sql = apply_filters( 'tribe_events_query_posts_join_orderby', $join_sql );
741
+
742
+ _doing_it_wrong(
743
+ 'tribe_events_query_posts_join_orderby (filter)',
744
+ 'To modify joins in relation to venues and organizers specifically you are encouraged to use the tribe_events_query_posts_join_venue_organizer hook.',
745
+ '4.0.2'
746
+ );
747
+ }
748
+
749
+ /**
750
+ * Provides an opportunity to modify the join condition added to the query when
751
+ * ordering by venue or organizer.
752
+ *
753
+ * @var string $join_sql
754
+ */
755
+ return apply_filters( 'tribe_events_query_posts_join_venue_organizer', $join_sql );
756
+ }
757
+
758
+ /**
759
+ * Appends the necessary conditions to the order clause to sort by either venue or
760
+ * organizer.
761
+ *
762
+ * @param array $clauses
763
+ * @param WP_Query $query
764
+ * @return string
765
+ */
766
+ public static function posts_orderby_venue_organizer( array $clauses, $query ) {
767
+ // This filter has to be added for every individual query that requires it
768
+ remove_filter( 'posts_clauses', array( __CLASS__, 'posts_orderby_venue_organizer' ), 100 );
769
+
770
+ $order = ( isset( $query->order ) && ! empty( $query->order ) ) ? $query->order : $query->get( 'order' );
771
+ $orderby = ( isset( $query->orderby ) && ! empty( $query->orderby ) ) ? $query->orderby : $query->get( 'orderby' );
772
+
773
+ switch ( $orderby ) {
774
+ case 'venue':
775
+ $clauses['orderby'] = "tribe_order_by_venue.post_title {$order}, " . $clauses['orderby'];
776
+ break;
777
+ case 'organizer':
778
+ $clauses['orderby'] = "tribe_order_by_organizer.post_title {$order}, " . $clauses['orderby'];
779
+ break;
780
+ default:
781
+ return $clauses;
782
+ break;
783
+ }
784
+
785
+ // Trim trailing characters
786
+ $clauses['orderby'] = trim( $clauses['orderby'], ", \t\n\r\0\x0B" );
787
+
788
+ return $clauses;
789
+ }
790
+
791
  /**
792
  * Custom SQL to retrieve post_id list of events marked to be hidden from upcoming lists.
793
  *
1005
  * @return string
1006
  **/
1007
  private static function postmeta_table( $query ) {
1008
+ /** @var \wpdb $wpdb */
1009
  global $wpdb;
1010
+ $postmeta_table = $wpdb->postmeta;
1011
 
1012
  if ( ! $query->tribe_is_multi_posttype ) {
1013
+ return $postmeta_table;
1014
  }
1015
 
 
1016
  $qv = $query->query_vars;
1017
 
1018
  // check if are any meta queries
1032
  }
1033
 
1034
  return $postmeta_table;
 
1035
  }
1036
 
1037
  /**
src/Tribe/Rewrite.php CHANGED
@@ -14,6 +14,11 @@ if ( ! class_exists( 'Tribe__Events__Rewrite' ) ) {
14
  * Permalinks magic Happens over here!
15
  */
16
  class Tribe__Events__Rewrite {
 
 
 
 
 
17
 
18
  /**
19
  * Static singleton variable
@@ -407,6 +412,86 @@ if ( ! class_exists( 'Tribe__Events__Rewrite' ) ) {
407
  return $this->add( $regex, $args );
408
  }
409
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
  } // end Tribe__Events__Rewrite class
411
 
412
  } // end if !class_exists Tribe__Events__Rewrite
14
  * Permalinks magic Happens over here!
15
  */
16
  class Tribe__Events__Rewrite {
17
+ /**
18
+ * If we wish to setup a rewrite rule that uses percent symbols, we'll need
19
+ * to make use of this placeholder.
20
+ */
21
+ const PERCENT_PLACEHOLDER = '~~TRIBE~PC~~';
22
 
23
  /**
24
  * Static singleton variable
412
  return $this->add( $regex, $args );
413
  }
414
 
415
+ /**
416
+ * Returns a sanitized version of $slug that can be used in rewrite rules.
417
+ *
418
+ * This is ideal for those times where we wish to support internationalized
419
+ * URLs (ie, where "venue" in "venue/some-slug" may be rendered in non-ascii
420
+ * characters).
421
+ *
422
+ * In the case of registering new post types, $permastruct_name should
423
+ * generally match the CPT name itself.
424
+ *
425
+ * @param string $slug
426
+ * @param string $permastruct_name
427
+ * @return string
428
+ */
429
+ public function prepare_slug( $slug, $permastruct_name ) {
430
+ $needs_handling = false;
431
+ $sanitized_slug = sanitize_title( $slug );
432
+
433
+ // Was UTF8 encoding required for the slug? %a0 type entities are a tell-tale of this
434
+ if ( preg_match( '/(%[0-9a-f]{2})+/', $sanitized_slug ) ) {
435
+ /**
436
+ * Controls whether special UTF8 URL handling is setup for the set of
437
+ * rules described by $permastruct_name.
438
+ *
439
+ * This only fires if Tribe__Events__Rewrite::prepare_slug() believes
440
+ * handling is required.
441
+ *
442
+ * @var string $permastruct_name
443
+ * @var string $possible_slug_name
444
+ */
445
+ $needs_handling = apply_filters( 'tribe_events_rewrite_utf8_handling',
446
+ true,
447
+ $permastruct_name,
448
+ $possible_slug_name
449
+ );
450
+ }
451
+
452
+ if ( $needs_handling ) {
453
+ // User agents encode things the same way but in uppercase
454
+ $sanitized_slug = strtoupper( $sanitized_slug );
455
+
456
+ // UTF8 encoding results in lots of "%" chars in our string which play havoc
457
+ // with WP_Rewrite::generate_rewrite_rules(), so we swap them out temporarily
458
+ $sanitized_slug = str_replace( '%', self::PERCENT_PLACEHOLDER, $sanitized_slug );
459
+
460
+ // Restore the % chars later on
461
+ add_filter( $permastruct_name . '_rewrite_rules', array( $this, 'remove_percent_placeholders' ) );
462
+ }
463
+
464
+ /**
465
+ * Provides an opportunity to modify the sanitized slug which will be used
466
+ * in rewrite rules relating to $permastruct_name.
467
+ *
468
+ * @var string $prepared_slug
469
+ * @var string $permastruct_name
470
+ * @var string $original_slug
471
+ */
472
+ return apply_filters( 'tribe_events_rewrite_prepared_slug',
473
+ preg_quote( $sanitized_slug ),
474
+ $permastruct_name,
475
+ $slug
476
+ );
477
+ }
478
+
479
+ /**
480
+ * Converts any percentage placeholders in the array keys back to % symbols.
481
+ *
482
+ * @param array $rules
483
+ * @return array
484
+ */
485
+ public function remove_percent_placeholders( array $rules ) {
486
+ $new_rules = array();
487
+
488
+ foreach ( $rules as $key => $value ) {
489
+ $key = str_replace( self::PERCENT_PLACEHOLDER, '%', $key );
490
+ $new_rules[$key] = $value;
491
+ }
492
+
493
+ return $new_rules;
494
+ }
495
  } // end Tribe__Events__Rewrite class
496
 
497
  } // end if !class_exists Tribe__Events__Rewrite
src/Tribe/Template/List.php CHANGED
@@ -73,6 +73,7 @@ if ( ! class_exists( 'Tribe__Events__Template__List' ) ) {
73
  if ( isset( $_POST['tribe_event_display'] ) ) {
74
  if ( $_POST['tribe_event_display'] == 'past' ) {
75
  $args['eventDisplay'] = 'past';
 
76
  } elseif ( 'all' == $_POST['tribe_event_display'] ) {
77
  $args['eventDisplay'] = 'all';
78
  }
73
  if ( isset( $_POST['tribe_event_display'] ) ) {
74
  if ( $_POST['tribe_event_display'] == 'past' ) {
75
  $args['eventDisplay'] = 'past';
76
+ $args['order'] = 'DESC';
77
  } elseif ( 'all' == $_POST['tribe_event_display'] ) {
78
  $args['eventDisplay'] = 'all';
79
  }
src/admin-views/venue-meta-box.php CHANGED
@@ -49,14 +49,13 @@ if ( ! defined( 'ABSPATH' ) ) {
49
  <td>
50
  <?php
51
  $countries = Tribe__View_Helpers::constructCountries( $event->ID );
52
- $defaultCountry = tribe_get_default_value( 'country' );
53
  if ( isset( $_VenueCountry ) && $_VenueCountry ) {
54
  $current = $_VenueCountry;
55
- } elseif ( isset( $defaultCountry[1] ) ) {
56
- $current = $defaultCountry[1];
57
  } else {
58
  $current = null;
59
  }
 
60
  if ( is_array( $current ) && isset( $current[1] ) ) {
61
  $current = $current[1];
62
  }
49
  <td>
50
  <?php
51
  $countries = Tribe__View_Helpers::constructCountries( $event->ID );
52
+
53
  if ( isset( $_VenueCountry ) && $_VenueCountry ) {
54
  $current = $_VenueCountry;
 
 
55
  } else {
56
  $current = null;
57
  }
58
+
59
  if ( is_array( $current ) && isset( $current[1] ) ) {
60
  $current = $current[1];
61
  }
src/functions/template-tags/general.php CHANGED
@@ -350,47 +350,47 @@ if ( class_exists( 'Tribe__Events__Main' ) ) {
350
  $args = wp_parse_args( $args, $defaults );
351
  $categories = tribe_get_event_taxonomy( $post_id, $args );
352
 
353
- // check for the occurances of links in the returned string
354
  if ( null === $args[ 'label' ] ) {
355
  $label = sprintf(
356
- /* translators: %s is the singular translation of "Event" */
357
- _nx( '%s Category', '%s Categories', substr_count( $categories, '<a href' ), 'category list label', 'the-events-calendar' ),
358
- $events_label_singular
359
- );
360
- }
361
- else {
362
- $label = $args[ 'label' ];
363
- }
364
 
365
- $html = ! empty( $categories ) ? sprintf(
366
- '%s%s:%s %s%s%s',
367
- $args['label_before'],
368
- $label,
369
- $args['label_after'],
370
- $args['wrap_before'],
371
- $categories,
372
- $args['wrap_after']
373
- ) : '';
374
- if ( $args['echo'] ) {
375
- echo apply_filters( 'tribe_get_event_categories', $html, $post_id, $args, $categories );
376
- } else {
377
- return apply_filters( 'tribe_get_event_categories', $html, $post_id, $args, $categories );
 
378
  }
379
- }
380
 
381
- /**
382
- * Event Tags (Display)
383
- *
384
- * Display the event tags
385
- *
386
- * @category Events
387
- * @param null|string $label
388
- * @param string $separator
389
- * @param bool $echo
390
- *
391
- * @return array
392
- * @uses the_terms()
393
- */
394
  function tribe_meta_event_tags( $label = null, $separator = ', ', $echo = true ) {
395
  if ( ! $label ) {
396
  $label = esc_html__( 'Tags:', 'the-events-calendar' );
350
  $args = wp_parse_args( $args, $defaults );
351
  $categories = tribe_get_event_taxonomy( $post_id, $args );
352
 
353
+ // check for the occurrences of links in the returned string
354
  if ( null === $args[ 'label' ] ) {
355
  $label = sprintf(
356
+ /* translators: %s is the singular translation of "Event" */
357
+ _nx( '%s Category', '%s Categories', substr_count( $categories, '<a href' ), 'category list label', 'the-events-calendar' ),
358
+ $events_label_singular
359
+ );
360
+ }
361
+ else {
362
+ $label = $args[ 'label' ];
363
+ }
364
 
365
+ $html = ! empty( $categories ) ? sprintf(
366
+ '%s%s:%s %s%s%s',
367
+ $args['label_before'],
368
+ $label,
369
+ $args['label_after'],
370
+ $args['wrap_before'],
371
+ $categories,
372
+ $args['wrap_after']
373
+ ) : '';
374
+ if ( $args['echo'] ) {
375
+ echo apply_filters( 'tribe_get_event_categories', $html, $post_id, $args, $categories );
376
+ } else {
377
+ return apply_filters( 'tribe_get_event_categories', $html, $post_id, $args, $categories );
378
+ }
379
  }
 
380
 
381
+ /**
382
+ * Event Tags (Display)
383
+ *
384
+ * Display the event tags
385
+ *
386
+ * @category Events
387
+ * @param null|string $label
388
+ * @param string $separator
389
+ * @param bool $echo
390
+ *
391
+ * @return array
392
+ * @uses the_terms()
393
+ */
394
  function tribe_meta_event_tags( $label = null, $separator = ', ', $echo = true ) {
395
  if ( ! $label ) {
396
  $label = esc_html__( 'Tags:', 'the-events-calendar' );
src/resources/css/tribe-events-full.css CHANGED
@@ -1847,6 +1847,11 @@ body.tribe-theme-twentysixteen.events-archive .entry-header {
1847
  width: auto;
1848
  }
1849
 
 
 
 
 
 
1850
  /* = Events Retina
1851
  =============================================*/
1852
  @media
1847
  width: auto;
1848
  }
1849
 
1850
+ body.tribe-theme-twentysixteen .datepicker table {
1851
+ border: 0;
1852
+ width: auto;
1853
+ }
1854
+
1855
  /* = Events Retina
1856
  =============================================*/
1857
  @media
src/resources/css/tribe-events-full.min.css CHANGED
@@ -1 +1 @@
1
- #tribe-events-pg-template{margin:0 auto;max-width:1000px}.tribe-events-after-html{clear:both}#tribe-events .tribe-events-content p,.tribe-events-after-html p,.tribe-events-before-html p{line-height:1.7;margin:0 0 10px}#tribe-events-pg-template .tribe-events-content h1,#tribe-events-pg-template .tribe-events-content h2,#tribe-events-pg-template .tribe-events-content h3,#tribe-events-pg-template .tribe-events-content h4,#tribe-events-pg-template .tribe-events-content h5,#tribe-events-pg-template .tribe-events-content h6,.tribe-events-after-html h1,.tribe-events-after-html h2,.tribe-events-after-html h3,.tribe-events-after-html h4,.tribe-events-after-html h5,.tribe-events-after-html h6,.tribe-events-before-html h1,.tribe-events-before-html h2,.tribe-events-before-html h3,.tribe-events-before-html h4,.tribe-events-before-html h5,.tribe-events-before-html h6{margin:24px 0}#tribe-events-pg-template .tribe-events-content h1,.tribe-events-after-html h1,.tribe-events-before-html h1{font-size:21px;line-height:1.5}#tribe-events-pg-template .tribe-events-content h2,.tribe-events-after-html h2,.tribe-events-before-html h2{font-size:18px;line-height:1.6}#tribe-events-pg-template .tribe-events-content h3,.tribe-events-after-html h3,.tribe-events-before-html h3{font-size:16px;line-height:1.8}#tribe-events-pg-template .tribe-events-content h4,.tribe-events-after-html h4,.tribe-events-before-html h4{font-size:14px;line-height:1.8}#tribe-events-pg-template .tribe-events-content h5,.tribe-events-after-html h5,.tribe-events-before-html h5{font-size:13px;line-height:1.8}#tribe-events-pg-template .tribe-events-content h6,.tribe-events-after-html h6,.tribe-events-before-html h6{font-size:12px;line-height:1.8}#tribe-events-pg-template .tribe-events-content ul,.tribe-events-after-html ul,.tribe-events-before-html ul{list-style:disc}#tribe-events-pg-template .tribe-events-content ol,.tribe-events-after-html ol,.tribe-events-before-html ol{list-style:decimal}#tribe-events-pg-template .tribe-events-content ol li,#tribe-events-pg-template .tribe-events-content ul li,.tribe-events-after-html ol li,.tribe-events-after-html ul li,.tribe-events-before-html ol li,.tribe-events-before-html ul li{line-height:1.7;margin:0 0 20px}.tribe-events-back{margin:0 0 20px}#tribe-events-content a,.tribe-events-adv-list-widget .tribe-events-widget-link a,.tribe-events-adv-list-widget .tribe-events-widget-link a:hover,.tribe-events-back a,.tribe-events-back a:hover,.tribe-events-event-meta a,.tribe-events-list-widget .tribe-events-widget-link a,.tribe-events-list-widget .tribe-events-widget-link a:hover,ul.tribe-events-sub-nav a,ul.tribe-events-sub-nav a:hover{text-decoration:none}#tribe-events .tribe-events-button,.tribe-events-button{background-color:#666;background-image:none;border:0;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;color:#fff;cursor:pointer;display:inline-block;font-size:11px;font-weight:700;letter-spacing:1px;line-height:normal;padding:6px 9px;text-align:center;text-decoration:none;text-transform:uppercase;vertical-align:middle;zoom:1}.tribe-events-button.tribe-active{background-color:#666;color:#fff}#tribe-events .tribe-events-button:hover,.tribe-events-button.tribe-active:hover,.tribe-events-button.tribe-inactive,.tribe-events-button:hover{background-color:#ddd;color:#444;text-decoration:none}a.tribe-events-gcal,a.tribe-events-ical{clear:both;color:#fff;float:right;font-size:10px;font-weight:400;line-height:18px;margin-top:21px;padding:0 6px;text-decoration:none}.tribe-events-gcal{margin-right:9px}.single-tribe_events a.tribe-events-gcal,.single-tribe_events a.tribe-events-ical{float:none}.tribe-events-event-meta .tribe-events-gmap,.tribe-events-event-meta-desc .tribe-events-gmap{white-space:nowrap}.event .entry-title{color:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:inherit}.updated-info{height:0;text-indent:-9999px}.tribe-events-event-image{margin:0 0 20px;text-align:center}.tribe-events-event-image img{height:auto;max-width:100%}.tribe-events-schedule h2{font-style:normal;font-weight:700}.tribe-events-event-schedule-details{display:inline}.tribe-events-divider{font-weight:700;padding:0 10px}.events-archive .entry-content,.events-archive .entry-header{width:98%}.events-archive footer.entry-meta,.events-archive header.entry-header,.events-archive span.edit-link,.single-tribe_events footer.entry-meta,.single-tribe_events header.entry-header,.single-tribe_organizer footer.entry-meta,.single-tribe_organizer header.entry-header,.single-tribe_venue footer.entry-meta,.single-tribe_venue header.entry-header{display:none}.tribe-events-notices{background:#d9edf7;border:1px solid #bce8f1;-webkit-border-radius:4px;border-radius:4px;color:#3a87ad;margin:10px 0 18px;padding:8px 35px 8px 14px;text-shadow:0 1px 0 #fff}div.tribe-events-notices>ul,div.tribe-events-notices>ul>li{list-style:none;margin:0;padding:0}#tribe-events-content p.tribe-events-promo{color:#999;font-size:12px}#tribe-events-content p.tribe-events-promo a{color:#666}.clearfix:after,.clearfix:before,.tribe-clearfix:after,.tribe-clearfix:before{content:'';display:table}.clearfix:after,.tribe-clearfix:after{clear:both}.clearfix,.tribe-clearfix{zoom:1}.tribe-clear{clear:both}.tribe-events-visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.tribe-hide-text{overflow:hidden;text-indent:100%;white-space:nowrap}.tribe-events-error{display:none}.tribe-events-multi-event-day{color:#0f81bb}#tribe-events-content .tribe-events-abbr{border-bottom:0;cursor:default}.tribe-events-spinner{height:32px;margin-left:-16px;width:32px}.tribe-events-spinner-medium{height:24px;width:24px}.tribe-events-spinner-small{height:16px;margin-left:-8px;width:16px}h2.tribe-events-page-title{clear:none;font-size:24px;font-weight:400;margin-bottom:.5em;position:relative;text-align:center;z-index:0}.tribe-events-filter-view .tribe-events-list h2.tribe-events-page-title{float:none;width:100%}h2.tribe-events-page-title a{color:#000}h2.tribe-events-page-title a:focus,h2.tribe-events-page-title a:hover{color:#333;text-decoration:underline}#tribe-events-footer,#tribe-events-header{clear:both;margin-bottom:.5em}#tribe-events-footer .tribe-events-sub-nav,#tribe-events-header .tribe-events-sub-nav{line-height:normal;list-style-type:none;margin:0;overflow:hidden;padding:0;text-align:center}#tribe-events-footer .tribe-events-sub-nav li,#tribe-events-header .tribe-events-sub-nav li{display:inline-block;margin:0;vertical-align:middle;zoom:1}#tribe-events-footer .tribe-events-sub-nav .tribe-events-nav-previous,#tribe-events-header .tribe-events-sub-nav li{float:left;margin-right:5px;text-align:left}#tribe-events-footer .tribe-events-sub-nav .tribe-events-nav-next,#tribe-events-header .tribe-events-sub-nav .tribe-events-nav-next{float:right;margin-left:5px;text-align:right}#tribe-events-footer .tribe-events-sub-nav .tribe-events-nav-left,#tribe-events-header .tribe-events-sub-nav .tribe-events-nav-left{float:left;text-align:left}#tribe-events-footer .tribe-events-sub-nav .tribe-events-nav-right,#tribe-events-header .tribe-events-sub-nav .tribe-events-nav-right{float:right;text-align:right}.tribe-events-ajax-loading{background:#666;border-radius:5px;-webkit-box-shadow:none!important;-moz-box-shadow:none!important;box-shadow:none!important;display:none;left:50%;margin-left:-27px;padding:15px;position:absolute;top:150px;z-index:10}.tribe-events-ajax-loading.tribe-events-active-spinner,.tribe-events-ajax-loading.tribe-events-active-spinner img,.tribe-events-loading .tribe-events-ajax-loading{display:block}#tribe-events-header{position:relative}#tribe-events-footer{margin-bottom:1em}.events-list #tribe-events-footer,.tribe-events-day #tribe-events-footer,.tribe-events-map #tribe-events-footer{clear:both;margin:1.25em 0 18px}.tribe-events-map #tribe-events-header{margin:1em 0}.single-tribe_events #tribe-events-header{margin:1em 0 20px}.single-tribe_events #tribe-events-footer li,.single-tribe_events #tribe-events-header li{width:48%}#tribe-events-content .tribe-events-nav-date{padding-top:16px}select.tribe-events-dropdown{font-size:11px;margin:33px 9px 0 0;width:auto}#tribe-events-events-picker,#tribe-events-picker{display:inline}#tribe-events-content{margin-bottom:48px;padding:2px 0;position:relative}#tribe-events-content.tribe-events-list{padding:0}.tribe-events-othermonth .tribe-events-month-event-title,.tribe-events-othermonth div[id*=tribe-events-daynum-]{-khtml-opacity:.4;-ms-filter:'alpha(Opacity=40)';filter:alpha(opacity=40);-moz-opacity:.4;opacity:.4}.tribe-events-list h2.tribe-events-page-title{margin-bottom:15px}#tribe-events-content.tribe-events-list{margin-bottom:60px}.tribe-events-list .type-tribe_events{border-bottom:1px solid #ddd;margin:0;padding:2.25em 0}.tribe-events-list .type-tribe_events.tribe-events-first{padding-top:0}.tribe-events-list h2.tribe-events-list-event-title{border:none;font-size:1.4em;letter-spacing:0;line-height:1.4em;margin:0;padding:0;text-transform:none;display:inline;float:none}.tribe-events-event-details .tribe-events-event-meta address.tribe-events-address{font-family:inherit;font-size:inherit;font-style:normal;line-height:inherit}.tribe-events-list .tribe-events-event-image{float:left;margin:0 3% 0 0;width:30%}.tribe-events-list .tribe-events-event-image img{height:auto;margin:0;padding:0;width:100%}.tribe-events-list .tribe-events-event-image+div.tribe-events-content{float:left;position:relative;width:67%}.tribe-events-loop .tribe-events-event-meta{border:0;clear:both;float:none;font-size:14px;font-weight:700;line-height:1.5;margin:5px 0 15px;overflow:visible}.tribe-events-list .tribe-events-loop .tribe-events-event-meta .recurringinfo{display:inline-block;zoom:1}.tribe-events-event-meta address.tribe-events-address{display:inline;font-family:inherit;font-size:inherit;font-style:normal;line-height:inherit;margin-right:10px}.tribe-events-list .tribe-events-loop .tribe-events-event-meta .event-is-recurring{position:relative}.tribe-events-list .time-details,.tribe-events-list .tribe-events-venue-details{display:block;line-height:1.2;margin:0}.tribe-events-list .time-details{margin:0 0 8px}.tribe-events-list .tribe-events-event-cost{float:right;margin:0 0 5px 5px}.tribe-events-list .tribe-events-event-cost span{background:#eee;border:1px solid #ddd;display:block;font-style:normal;font-weight:700;line-height:1.3;padding:5px 10px;text-align:center;text-overflow:ellipsis}.tribe-events-list .tribe-events-loop .tribe-events-content{padding:0;width:100%}.tribe-events-list-separator-year{color:#ccc;display:block;font-size:38px;font-weight:700;padding:1em 2.25em 0;text-align:center}.tribe-events-list-separator-month{background-color:#eee;display:block;font-size:14px;font-weight:700;margin:2.5em 0 0;padding:6px 10px;text-transform:uppercase}.tribe-events-list-separator-month+.type-tribe_events.tribe-events-first{padding-top:2.25em}.tribe-events-list .type-tribe_events.tribe-event-end-month{border-bottom:0;padding-bottom:0}.tribe-events-loop{clear:both}.tribe-events-loop .type-tribe_events.tribe-events-last{border-bottom:0}.tribe-events-loop .tribe-events-content{float:left;padding:0 5% 0 0;width:60%}.single-tribe_venue .tribe-events-loop .tribe-events-content p{margin:0}.events-archive h3 .published,.single-tribe_venue h3 .published{font-size:18px;font-style:italic;margin-top:0;text-transform:none}.tribe-events-event-day,.tribe-events-event-meta-desc{color:#333}.single-tribe_events h2.tribe-events-single-event-title{font-size:1.7em;line-height:1;margin:0;padding:0}#tribe-events-content .tribe-events-single-event-description img.attachment-post-thumbnail{display:block;margin-left:auto;margin-right:auto;text-align:center}.tribe-events-meta-group .tribe-events-single-section-title{font-size:1.4em;font-weight:700;margin:20px 0 10px}.tribe-events-meta-group+.tribe-events-single-section-title{margin-top:0}.tribe-events-event-meta .tribe-events-meta-group address.tribe-events-address{display:block;margin:0}#eventbrite-embed{margin:24px 0;min-height:225px;width:100%}.eventbrite-ticket-embed{margin:0 0 30px}.tribe-events-schedule{margin:20px 0 0}.single-tribe_events .tribe-events-schedule .recurringinfo,.single-tribe_events .tribe-events-schedule .tribe-events-cost,.single-tribe_events .tribe-events-schedule .tribe-events-divider{font-size:1.2em}.single-tribe_events .tribe-events-schedule h3{display:inline-block;font-size:1.2em;margin:0;padding:0;vertical-align:middle;white-space:nowrap;zoom:1}.single-tribe_events .tribe-events-schedule .tribe-events-cost{vertical-align:middle}.single-tribe_events .tribe-events-event-image{clear:both;margin-bottom:30px;text-align:center}.single-tribe_events .tribe-events-event-meta{background:#fafafa;border:1px solid #eee;margin:30px 0}.single-tribe_events .tribe-events-venue-map{background:#eee;border:1px solid #ddd;border-radius:3px;display:inline-block;float:right;margin:20px 4% 2% 0;padding:5px;vertical-align:top;width:58%;zoom:1}.single-tribe_events #tribe-events-gmap{height:0!important;margin:0!important;padding-top:50%;width:100%!important}.single-tribe_events .tribe-events-meta-group .tribe-events-venue-map{float:none;margin:20px 0 0;width:100%}.single-tribe_events .tribe-events-meta-group #tribe-events-gmap{height:0!important;margin-top:50px;padding-top:100%;width:100%!important}.single-tribe_events .tribe-events-event-meta{font-size:13px}.tribe-events-event-meta .column,.tribe-events-event-meta .tribe-events-meta-group{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;float:left;margin:0 0 20px;padding:0 4%;text-align:left;vertical-align:top;width:33.3333%;zoom:1}.single-tribe_events .tribe-events-event-meta dl{margin:0}.single-tribe_events #tribe-events-content .tribe-events-event-meta dt{clear:left;font-weight:700;line-height:1;list-style:none}.single-tribe_events #tribe-events-content .tribe-events-event-meta dd{float:none;line-height:1.5;list-style:none;margin:0 0 10px;padding:0}#tribe-events-content .tribe-events-event-meta dd span.adr{display:block}.single-tribe_events .tribe-events-content{max-width:100%;padding:0;width:100%}.sidebar.single-tribe_events .tribe-events-content{padding:0}.tribe-events-day .tribe-events-day-time-slot h5{background-color:#eee;font-size:14px;font-weight:700;margin:2.5em 0 0;padding:6px 10px;text-transform:uppercase}.tribe-events-day .tribe-events-day-time-slot .type-tribe_events{margin-left:5%}#tribe-events-content table.tribe-events-calendar{border-collapse:collapse;clear:both;font-size:12px;margin:12px 0 .6em;table-layout:fixed;width:100%}#tribe-events-content .tribe-events-calendar td,#tribe-events-content table.tribe-events-calendar{border:1px solid #bbb}.tribe-events-calendar div[id*=tribe-events-daynum-],.tribe-events-calendar div[id*=tribe-events-daynum-] a{background-color:#f5f5f5;color:#333;font-size:11px;font-weight:700}.tribe-events-calendar td.tribe-events-present div[id*=tribe-events-daynum-],.tribe-events-calendar td.tribe-events-present div[id*=tribe-events-daynum-]>a{background-color:#666;color:#fff}.tribe-events-calendar td.tribe-events-past div[id*=tribe-events-daynum-],.tribe-events-calendar td.tribe-events-past div[id*=tribe-events-daynum-]>a{color:#999}#tribe-events-content .tribe-events-calendar td{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#114b7d;font-size:12px;height:110px;padding:0 0 .5em;vertical-align:top;width:14.28%}.recurring-info-tooltip,.tribe-events-calendar .tribe-events-tooltip,.tribe-events-week .tribe-events-tooltip{background-color:#f9f9f9;border:1px solid #666;bottom:30px;color:#333;display:none;left:3px;line-height:1.4;position:absolute;width:320px;z-index:1001}.tribe-events-tooltip .tribe-events-arrow{background-image:url(../images/tribe-tooltips.png);background-position:0 0;background-repeat:no-repeat;-webkit-background-size:44px 19px;background-size:44px 19px;bottom:-11px;display:block;height:11px;left:20px;position:absolute;width:18px}.recurring-info-tooltip,.tribe-events-calendar .tribe-events-right .tribe-events-tooltip,.tribe-events-week .tribe-events-right .tribe-events-tooltip{left:auto;right:3px}.tribe-events-right .tribe-events-tooltip .tribe-events-arrow{left:auto;right:30px}.tribe-events-tooltip ol,.tribe-events-tooltip ul{margin-left:1.6em}@media screen{#tribe-events-content .tribe-events-tooltip ol,#tribe-events-content .tribe-events-tooltip ul{margin-left:1.6em}}.recurringinfo{display:inline-block;position:relative;vertical-align:middle;zoom:1}.event-is-recurring{color:rgba(0,0,0,.7);font-style:normal;font-weight:500;position:relative}.event-is-recurring:hover{color:#000}.recurring-info-tooltip.tribe-events-tooltip{left:10px;padding-bottom:.8em;width:200px}.events-archive.events-gridview #tribe-events-content table .type-tribe_events{border-bottom:1px solid #e7e7e7;margin:0 5%;padding:6px 8px}.events-archive.events-gridview #tribe-events-content table .tribe-events-last{border-bottom:0}.tribe-events-viewmore{border-top:1px solid #e7e7e7;font-weight:700;line-height:1;margin:0 5%;padding:9px 8px}.tribe-events-calendar td .tribe-events-viewmore a{font-size:100%}.tribe-events-calendar th{background-color:#ddd;color:#333;height:10px;letter-spacing:1px;padding:4px 0;text-align:center;text-transform:uppercase;width:14.28%}.tribe-events-calendar td div[id*=tribe-events-daynum-]{line-height:1.2;padding:6px 9px}.tribe-events-calendar td a{font-size:91.7%}.tribe-events-calendar div[id*=tribe-events-daynum-],.tribe-events-calendar div[id*=tribe-events-event-]{margin:0;position:relative}#tribe-events-content .tribe-events-calendar div[id*=tribe-events-event-] h3.tribe-events-month-event-title{font-family:sans-serif;font-size:13px;font-weight:700;font-weight:normal;letter-spacing:0;line-height:1.25;margin:0;overflow:hidden;padding:0;text-transform:none}.tribe-events-calendar div[id*=tribe-events-event-] h3.tribe-events-month-event-title a{font-size:100%}#tribe-events-content .tribe-events-tooltip h4{background-color:#666;color:#fff;font-size:12px;font-weight:400;letter-spacing:1px;line-height:24px;margin:0;min-height:24px;padding:0 6px}.tribe-events-tooltip .tribe-events-event-body{font-size:11px;font-weight:400;padding:3px 6px 6px}.tribe-events-tooltip .duration{font-style:italic;margin:3px 0}.tribe-events-tooltip .tribe-events-event-thumb{float:left;padding:5px 5px 5px 0}.tribe-events-tooltip .tribe-events-event-thumb img{-webkit-box-shadow:none;box-shadow:none}.tribe-events-tooltip p.entry-summary{font-size:11px;line-height:1.5;padding:0}#tribe-mobile-container{display:none}.tribe-events-list-widget ol li{list-style:none;margin-bottom:30px}.tribe-events-list-widget .duration{font-weight:700}.datepicker{z-index:1000!important}.datepicker table tr td span,.datepicker td{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker td{border-top:1px solid #ededed}.datepicker table tr td span.active.active,.datepicker table tr td.active.active{background:#666}.datepicker table tr td span.active.active:hover,.datepicker table tr td.active.active:hover{background:#dadada;color:inherit}#tribe-events-bar{clear:none;height:auto;margin-bottom:30px;min-width:220px;position:relative;width:100%}#tribe-events-bar *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#tribe-bar-form{background:#f5f5f5;margin:0;position:relative;width:100%}#tribe-bar-form input{font-size:15px;margin:0 4px 0 0}#tribe-bar-form input[type=text]{background:0;border:none;border-bottom:1px dashed #b9b9b9;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-weight:700;height:auto;line-height:1;padding:0 0 5px;width:100%}#tribe-bar-form input[type=text]:focus{outline:0}input[name*=tribe-bar-]::-webkit-input-placeholder{color:#5f5f5f;font-style:italic;font-weight:400;line-height:1.3}input[name*=tribe-bar-]:-moz-placeholder{color:#5f5f5f;font-style:italic;font-weight:400;line-height:1.3}.tribe-event-placeholder{color:#5f5f5f;font-weight:400;font-style:italic;line-height:1.3}#tribe-bar-form .tribe-bar-submit input[type=submit]{-webkit-appearance:button;background:#666;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#fff;font-size:13px;height:auto;letter-spacing:0;line-height:20px;padding:10px;width:100%}.tribe-bar-submit input[type=submit]:hover{background:#999;color:#fff}#tribe-bar-form label{display:block;font-size:11px;font-weight:700;line-height:1;margin:0 0 5px;padding:0;text-transform:uppercase}#tribe-bar-dates .select2-choice{border-bottom:1px dashed #b9b9b9}#tribe-bar-form .tribe-bar-filters{float:left;margin:0;position:relative;width:100%}#tribe-bar-form #tribe-bar-views+.tribe-bar-filters{left:auto;right:16.66667%;width:83.3333%}#tribe-bar-form .tribe-bar-filters-inner{margin:0}#tribe-bar-form.tribe-bar-full .tribe-bar-filters{display:block!important}.tribe-bar-date-filter{float:left;margin-bottom:0;padding:15px;width:25%}.tribe-bar-search-filter{float:left;margin-bottom:0;padding:15px;width:33.3333%}.tribe-bar-submit{float:left;margin-bottom:0;margin-left:16.6667%;padding:15px;width:25%}#tribe-bar-form #tribe-bar-views{background:0 0;float:left;left:83.3333%;margin:0;padding:0 0 0 5px;position:relative;right:auto;width:16.66667%}#tribe-bar-views label:hover,#tribe-bar-views:hover{cursor:pointer}.tribe-bar-views-inner{background:#e0e0e0;margin:0;padding:15px 0 45px}#tribe-bar-form .tribe-bar-views-inner label{padding:0 15px;text-align:left}.tribe-bar-views-inner .select2-container{padding:0 15px}.tribe-select2-results-views.select2-drop{background:#dbdbdb;border:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;z-index:10001}#tribe-bar-form.tribe-bar-mini #tribe-bar-views{width:16.66667%}#tribe-bar-views .tribe-bar-views-list{border-radius:0 0 3px 3px;left:0;list-style-type:none;margin:0;padding:0 0 0 5px;position:absolute;top:auto;z-index:99}#tribe-bar-views li.tribe-bar-views-option{background:0 0;border:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;display:none;filter:'progid:DXImageTransform.Microsoft.gradient(enabled=false)';line-height:14px;list-style:none;margin:0;padding:0}#tribe-bar-views .tribe-bar-views-option.tribe-bar-active,#tribe-bar-views .tribe-bar-views-option:first-child,#tribe-bar-views.tribe-bar-views-open .tribe-bar-views-option{display:list-item}#tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option a{background:#e0e0e0;color:#444;display:block;padding:6px 15px;text-align:left;text-decoration:none}#tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option a:hover{background:#cacaca;color:inherit}#tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option.tribe-bar-active a:hover{background:#e0e0e0}#tribe-bar-views .tribe-bar-views-option:last-child a{-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.tribe-no-js #tribe-bar-views [name=tribe-bar-view]{display:block}#tribe-bar-views [name=tribe-bar-view]{display:none}#tribe-bar-views .tribe-bar-views-list{float:left;width:100%}#tribe-bar-views .tribe-bar-settings{display:none}#tribe-bar-form.tribe-bar-mini *{font-size:12px}#tribe-bar-form.tribe-bar-mini label{font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tribe-bar-mini .tribe-bar-filters{display:block!important;float:left;width:83.3333%}.tribe-bar-mini .tribe-bar-date-filter{padding:10px}.tribe-bar-mini .tribe-bar-search-filter{padding:10px;width:45%}.tribe-bar-mini .tribe-bar-submit{margin-left:5%;padding:10px;width:25%}#tribe-bar-form.tribe-bar-mini .tribe-bar-submit input[type=submit]{-webkit-appearance:button;font-size:11px;padding:10px 5px}.tribe-bar-mini #tribe-bar-views{width:16.66667%}.tribe-bar-mini .tribe-bar-views-inner{padding:10px 0 35px}.tribe-bar-mini .tribe-bar-views-inner label{padding:0 10px}.tribe-bar-mini #tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option a{padding:4px 15px}#tribe-bar-collapse-toggle{background:#f5f5f5;display:none;float:left;font-size:13px;font-weight:700;line-height:28px;padding:15px;position:relative;text-transform:uppercase}#tribe-bar-collapse-toggle:hover{cursor:pointer}#tribe-bar-collapse-toggle span.tribe-bar-toggle-arrow{display:inline-block;margin:0 4px;position:absolute;right:10px}#tribe-bar-collapse-toggle span.tribe-bar-toggle-arrow:after{border:solid transparent;border-color:rgba(136,183,213,0);border-top-color:inherit;border-width:8px;content:' ';height:0;pointer-events:none;position:absolute;right:0;top:10px;width:0}#tribe-bar-collapse-toggle.tribe-bar-filters-open span.tribe-bar-toggle-arrow:after{border-bottom-color:inherit;border-top-color:transparent;top:0}#tribe-bar-form.tribe-bar-collapse #tribe-bar-views+.tribe-bar-filters{clear:both;display:none;left:auto;margin-top:5px;overflow:hidden;right:auto;width:100%}.tribe-bar-collapse #tribe-bar-views,.tribe-bar-collapse .tribe-bar-filters-inner>div{height:auto;margin:0;width:100%}.tribe-bar-collapse #tribe-bar-collapse-toggle{display:block;width:70%}.tribe-bar-collapse #tribe-bar-collapse-toggle.tribe-bar-collapse-toggle-full-width{width:100%}#tribe-bar-form.tribe-bar-collapse #tribe-bar-views{float:left;left:auto;width:30%}#tribe-bar-form.tribe-bar-collapse .tribe-bar-views-inner{padding:10px 0 40px}#tribe-bar-form.tribe-bar-collapse .tribe-bar-views-inner label{margin:0}.tribe-bar-is-disabled .tribe-events-page-title{clear:none;line-height:45px;margin:0;text-align:left}.tribe-bar-disabled{float:right;position:relative;z-index:101}.tribe-bar-disabled #tribe-events-bar{float:none;min-width:0;width:auto}.tribe-bar-disabled #tribe-bar-form{border-radius:3px;width:auto}.tribe-bar-disabled .tribe-bar-filters{float:left}.tribe-bar-disabled .tribe-bar-filters .tribe-bar-date-filter{padding:5px 10px}.tribe-bar-disabled #tribe-bar-form label{font-size:10px}.tribe-bar-disabled #tribe-bar-form .tribe-bar-filters input[type=text]{border:none;display:block;font-size:13px;line-height:15px;margin:0;padding:0;width:85px}.tribe-bar-disabled #tribe-bar-form #tribe-bar-views+.tribe-bar-filters{left:auto;right:50%;width:50%}.tribe-bar-disabled .tribe-bar-date-filter,.tribe-events-uses-geolocation .tribe-bar-disabled .tribe-bar-date-filter{width:auto}.tribe-bar-disabled #tribe-bar-form #tribe-bar-views{float:left;font-size:16px;left:50%;padding:0;right:auto;width:50%}.tribe-bar-disabled .tribe-bar-views-inner{border-radius:0 3px 3px 0;min-width:100px;padding:5px 0 25px}.tribe-bar-disabled #tribe-bar-form .tribe-bar-views-inner label{padding:0 10px}.tribe-bar-disabled #tribe-bar-views .tribe-bar-views-list,.tribe-bar-disabled #tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option{margin:0}.tribe-bar-disabled #tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option a{margin:0;padding:4px 10px}.tribe-bar-disabled #tribe-bar-views .select2-container .select2-choice{font-size:13px;height:auto;line-height:18px}.tribe-bar-is-disabled .tribe-select2-results-views.select2-drop .select2-results li{padding:0 10px}.tribe-bar-disabled #tribe-bar-collapse-toggle,.tribe-bar-disabled .tribe-bar-submit{display:none}.tribe-bar-view-list a[class*=tribe-icon-],.tribe-bar-views-list span[class^=tribe-icon-],.tribe-select2-results-views span[class^=tribe-icon-]{background-position:0 50%;background-repeat:no-repeat;display:block;min-height:16px;padding-left:24px}.tribe-select2-results-views span[class^=tribe-icon-]{display:inline-block;min-height:16px}.tribe-bar-views-list span[class^=tribe-icon-],.tribe-select2-results-views span[class^=tribe-icon-]{background-image:url(../images/events-bar/icon-month.png);-webkit-background-size:15px 16px;background-size:15px 16px}.tribe-bar-view-list span[class^=tribe-icon-],.tribe-bar-views-list span.tribe-icon-list,.tribe-select2-results-views span.tribe-icon-list{background-image:url(../images/events-bar/icon-list.png);-webkit-background-size:15px 10px;background-size:15px 10px}.tribe-bar-view-list a.tribe-icon-list,.tribe-bar-view-list a.tribe-icon-month{background-position:10px 50%;padding-left:30px}.tribe-bar-view-list a.tribe-icon-month,.tribe-bar-views-list span.tribe-icon-month,.tribe-select2-results-views .tribe-icon-month{background-image:url(../images/events-bar/icon-month.png);-webkit-background-size:15px 16px;background-size:15px 16px}.tribe-bar-views-list span.tribe-icon-week,.tribe-select2-results-views span.tribe-icon-week{background-image:url(../images/events-bar/icon-week.png);-webkit-background-size:15px 16px;background-size:15px 16px}.tribe-bar-views-list span.tribe-icon-day,.tribe-select2-results-views span.tribe-icon-day{background-image:url(../images/events-bar/icon-day.png);-webkit-background-size:15px 16px;background-size:15px 16px}.tribe-bar-views-list span.tribe-icon-photo,.tribe-select2-results-views span.tribe-icon-photo{background-image:url(../images/events-bar/icon-photo.png);-webkit-background-size:15px 14px;background-size:15px 14px}.tribe-bar-views-list span.tribe-icon-map,.tribe-select2-results-views span.tribe-icon-map{background-image:url(../images/events-bar/icon-map.png);background-position:2px 50%;-webkit-background-size:12px 16px;background-size:12px 16px}.tribe-events-week.tribe-theme-parent-twentyfourteen #masthead,.tribe-events-week.tribe-theme-twentyfourteen #masthead{z-index:1001}.tribe-theme-parent-twentyfourteen #tribe-events-pg-template #tribe-events,.tribe-theme-twentyfourteen #tribe-events-pg-template #tribe-events{padding:20px}.tribe-theme-parent-twentyfourteen #tribe-bar-views .tribe-bar-views-list,.tribe-theme-twentyfourteen #tribe-bar-views .tribe-bar-views-list{z-index:3}@media screen and (min-width:1000px){.tribe-theme-parent-twentyfourteen #tribe-events-pg-template,.tribe-theme-twentyfourteen #tribe-events-pg-template{padding-left:220px}}#tribe-events-content .tribe-updated{display:inherit}@media screen and (max-width:400px){.list-view.events-archive .site-content .type-page .entry-content{display:initial}}.tribe-theme-twentyfifteen.events-single.tribe-events-page-template #tribe-events-pg-template{padding-top:8.3333%}.tribe-theme-twentyfifteen.events-single.tribe-events-page-template #tribe-events-content{padding:8.3333% 10%}.tribe-theme-twentyfifteen.single-tribe_events #tribe-events .tribe_events{box-shadow:none;margin-left:0;margin-right:0;padding-top:0}.tribe-theme-twentyfifteen.single-tribe_events #tribe-events .tribe-events-schedule h2{display:inline-block;font-size:1.2em;margin:0}.tribe-theme-twentyfifteen.single-tribe_events.page-template-page-php .tribe-events-single{box-shadow:none;margin-bottom:0!important;margin-left:0;margin-right:0}.tribe-theme-twentyfifteen.tribe-events-week .tribe-events-grid .hentry{margin-left:0;margin-right:0}.tribe-theme-twentyfifteen .tribe-events-list-widget .type-tribe_events{border-top:1px solid rgba(51,51,51,.1);box-shadow:none;margin-left:0;margin-right:0}.tribe-theme-twentyfifteen .tribe-events-list-widget .entry-title{font-size:2.2rem;font-size:22px;line-height:1.4545}.tribe-theme-twentyfifteen.tribe-events-page-template #tribe-events-content-wrapper{padding:3.333%}.tribe-theme-twentyfifteen .tribe-events-list .type-tribe_events,.tribe-theme-twentyfifteen .tribe-events-list .type-tribe_events.tribe-events-first{padding:8.333% 10%}.tribe-theme-twentyfifteen .tribe-events-day-time-slot .type-tribe_events{margin-left:0}.tribe-theme-twentyfifteen .type-tribe_events a.more-link{display:none}.tribe-theme-twentyfifteen .datepicker.dropdown-menu{max-width:340px}.tribe-theme-twentyfifteen .datepicker.dropdown-menu table,.tribe-theme-twentyfifteen .datepicker.dropdown-menu table.table-condensed{border-left-width:0;border-top-width:0}.tribe-theme-twentyfifteen .tribe-events-calendar td a,.tribe-theme-twentyfifteen .tribe-events-nav-next a,.tribe-theme-twentyfifteen .tribe-events-nav-previous a,.tribe-theme-twentyfifteen ul.tribe-bar-views-list li a{border-bottom:none}.tribe-theme-twentyfifteen.events-archive .entry-footer,.tribe-theme-twentyfifteen.single-tribe_events .entry-footer{display:none}.tribe-theme-twentyfifteen .tribe-events-list .time-details,.tribe-theme-twentyfifteen .tribe-events-list .tribe-events-venue-details{line-height:1.6}body.tribe-theme-twentysixteen table.tribe-events-calendar{table-layout:auto}body.tribe-theme-twentysixteen .tribe-events-single-section-title:first-child{margin-top:20px}body.tribe-theme-twentysixteen .tribe-events-content.entry-summary{font-size:inherit;margin-bottom:0;margin-top:5px}body.tribe-theme-twentysixteen.events-archive .entry-content,body.tribe-theme-twentysixteen.events-archive .entry-header{width:auto}@media (min--moz-device-pixel-ratio:2),(-o-min-device-pixel-ratio:2/1),(-webkit-min-device-pixel-ratio:2),(min-device-pixel-ratio:2){.tribe-events-tooltip .tribe-events-arrow{background-image:url(../images/tribe-tooltips@2x.png)}#tribe-bar-filters .tribe-bar-button-search .tribe-bar-btn-small{background-image:url(../images/events-bar/icon-search@2x.png)}#tribe-events-bar .tribe-bar-button-settings span{background-image:url(../images/events-bar/icon-gear@2x.png)}#tribe-events-bar [class^=tribe-bar-button-]:after{background-image:url(../vendor/select2/select2x2.png)}.tribe-bar-view-list a[class^=tribe-icon-],.tribe-bar-views-list span[class^=tribe-icon-],.tribe-select2-results-views span[class^=tribe-icon-]{background-image:url(../images/events-bar/icon-month@2x.png)}.tribe-bar-view-list span[class^=tribe-icon-],.tribe-bar-views-list span.tribe-icon-list,.tribe-select2-results-views span.tribe-icon-list{background-image:url(../images/events-bar/icon-list@2x.png)}.tribe-bar-view-list a.tribe-icon-month,.tribe-bar-views-list span.tribe-icon-month,.tribe-select2-results-views span.tribe-icon-month{background-image:url(../images/events-bar/icon-month@2x.png)}.tribe-bar-views-list span.tribe-icon-week,.tribe-select2-results-views span.tribe-icon-week{background-image:url(../images/events-bar/icon-week@2x.png)}.tribe-bar-views-list span.tribe-icon-day,.tribe-select2-results-views span.tribe-icon-day{background-image:url(../images/events-bar/icon-day@2x.png)}.tribe-bar-views-list span.tribe-icon-photo,.tribe-select2-results-views span.tribe-icon-photo{background-image:url(../images/events-bar/icon-photo@2x.png)}.tribe-bar-views-list span.tribe-icon-map,.tribe-select2-results-views span.tribe-icon-map{background-image:url(../images/events-bar/icon-map@2x.png)}}
1
+ .clearfix:after,.tribe-clear,.tribe-clearfix:after,.tribe-events-after-html{clear:both}#tribe-events-pg-template{margin:0 auto;max-width:1000px}#tribe-events .tribe-events-content p,.tribe-events-after-html p,.tribe-events-before-html p{line-height:1.7;margin:0 0 10px}#tribe-events-pg-template .tribe-events-content h1,#tribe-events-pg-template .tribe-events-content h2,#tribe-events-pg-template .tribe-events-content h3,#tribe-events-pg-template .tribe-events-content h4,#tribe-events-pg-template .tribe-events-content h5,#tribe-events-pg-template .tribe-events-content h6,.tribe-events-after-html h1,.tribe-events-after-html h2,.tribe-events-after-html h3,.tribe-events-after-html h4,.tribe-events-after-html h5,.tribe-events-after-html h6,.tribe-events-before-html h1,.tribe-events-before-html h2,.tribe-events-before-html h3,.tribe-events-before-html h4,.tribe-events-before-html h5,.tribe-events-before-html h6{margin:24px 0}#tribe-events-pg-template .tribe-events-content h1,.tribe-events-after-html h1,.tribe-events-before-html h1{font-size:21px;line-height:1.5}#tribe-events-pg-template .tribe-events-content h2,.tribe-events-after-html h2,.tribe-events-before-html h2{font-size:18px;line-height:1.6}#tribe-events-pg-template .tribe-events-content h3,.tribe-events-after-html h3,.tribe-events-before-html h3{font-size:16px;line-height:1.8}#tribe-events-pg-template .tribe-events-content h4,.tribe-events-after-html h4,.tribe-events-before-html h4{font-size:14px;line-height:1.8}#tribe-events-pg-template .tribe-events-content h5,.tribe-events-after-html h5,.tribe-events-before-html h5{font-size:13px;line-height:1.8}#tribe-events-pg-template .tribe-events-content h6,.tribe-events-after-html h6,.tribe-events-before-html h6{font-size:12px;line-height:1.8}#tribe-events-pg-template .tribe-events-content ul,.tribe-events-after-html ul,.tribe-events-before-html ul{list-style:disc}#tribe-events-pg-template .tribe-events-content ol,.tribe-events-after-html ol,.tribe-events-before-html ol{list-style:decimal}#tribe-events-pg-template .tribe-events-content ol li,#tribe-events-pg-template .tribe-events-content ul li,.tribe-events-after-html ol li,.tribe-events-after-html ul li,.tribe-events-before-html ol li,.tribe-events-before-html ul li{line-height:1.7;margin:0 0 20px}.tribe-events-back{margin:0 0 20px}#tribe-events-content a,.tribe-events-adv-list-widget .tribe-events-widget-link a,.tribe-events-adv-list-widget .tribe-events-widget-link a:hover,.tribe-events-back a,.tribe-events-back a:hover,.tribe-events-event-meta a,.tribe-events-list-widget .tribe-events-widget-link a,.tribe-events-list-widget .tribe-events-widget-link a:hover,ul.tribe-events-sub-nav a,ul.tribe-events-sub-nav a:hover{text-decoration:none}#tribe-events .tribe-events-button,.tribe-events-button{background-color:#666;background-image:none;border:0;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:none;box-shadow:none;color:#fff;cursor:pointer;display:inline-block;font-size:11px;font-weight:700;letter-spacing:1px;line-height:normal;padding:6px 9px;text-align:center;text-decoration:none;text-transform:uppercase;vertical-align:middle;zoom:1}.tribe-events-button.tribe-active{background-color:#666;color:#fff}#tribe-events .tribe-events-button:hover,.tribe-events-button.tribe-active:hover,.tribe-events-button.tribe-inactive,.tribe-events-button:hover{background-color:#ddd;color:#444;text-decoration:none}a.tribe-events-gcal,a.tribe-events-ical{clear:both;color:#fff;float:right;font-size:10px;font-weight:400;line-height:18px;margin-top:21px;padding:0 6px;text-decoration:none}.tribe-events-gcal{margin-right:9px}.single-tribe_events a.tribe-events-gcal,.single-tribe_events a.tribe-events-ical{float:none}.tribe-events-event-meta .tribe-events-gmap,.tribe-events-event-meta-desc .tribe-events-gmap{white-space:nowrap}.event .entry-title{color:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;padding:inherit}.updated-info{height:0;text-indent:-9999px}.tribe-events-event-image{margin:0 0 20px;text-align:center}.tribe-events-event-image img{height:auto;max-width:100%}.tribe-events-schedule h2{font-style:normal;font-weight:700}.tribe-events-event-schedule-details{display:inline}.tribe-events-divider{font-weight:700;padding:0 10px}.events-archive .entry-content,.events-archive .entry-header{width:98%}.events-archive footer.entry-meta,.events-archive header.entry-header,.events-archive span.edit-link,.single-tribe_events footer.entry-meta,.single-tribe_events header.entry-header,.single-tribe_organizer footer.entry-meta,.single-tribe_organizer header.entry-header,.single-tribe_venue footer.entry-meta,.single-tribe_venue header.entry-header{display:none}.tribe-events-notices{background:#d9edf7;border:1px solid #bce8f1;-webkit-border-radius:4px;border-radius:4px;color:#3a87ad;margin:10px 0 18px;padding:8px 35px 8px 14px;text-shadow:0 1px 0 #fff}div.tribe-events-notices>ul,div.tribe-events-notices>ul>li{list-style:none;margin:0;padding:0}#tribe-events-content p.tribe-events-promo{color:#999;font-size:12px}#tribe-events-content p.tribe-events-promo a{color:#666}.clearfix:after,.clearfix:before,.tribe-clearfix:after,.tribe-clearfix:before{content:'';display:table}.clearfix,.tribe-clearfix{zoom:1}.tribe-events-visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.tribe-hide-text{overflow:hidden;text-indent:100%;white-space:nowrap}.tribe-events-error{display:none}.tribe-events-multi-event-day{color:#0f81bb}#tribe-events-content .tribe-events-abbr{border-bottom:0;cursor:default}#tribe-bar-collapse-toggle:hover,#tribe-bar-views label:hover,#tribe-bar-views:hover{cursor:pointer}.tribe-events-spinner{height:32px;margin-left:-16px;width:32px}.tribe-events-spinner-medium{height:24px;width:24px}.tribe-events-spinner-small{height:16px;margin-left:-8px;width:16px}h2.tribe-events-page-title{clear:none;font-size:24px;font-weight:400;margin-bottom:.5em;position:relative;text-align:center;z-index:0}.tribe-events-filter-view .tribe-events-list h2.tribe-events-page-title{float:none;width:100%}h2.tribe-events-page-title a{color:#000}h2.tribe-events-page-title a:focus,h2.tribe-events-page-title a:hover{color:#333;text-decoration:underline}#tribe-events-footer,#tribe-events-header{clear:both;margin-bottom:.5em}#tribe-events-footer .tribe-events-sub-nav,#tribe-events-header .tribe-events-sub-nav{line-height:normal;list-style-type:none;margin:0;overflow:hidden;padding:0;text-align:center}#tribe-events-footer .tribe-events-sub-nav li,#tribe-events-header .tribe-events-sub-nav li{display:inline-block;margin:0;vertical-align:middle;zoom:1}#tribe-events-footer .tribe-events-sub-nav .tribe-events-nav-previous,#tribe-events-header .tribe-events-sub-nav li{float:left;margin-right:5px;text-align:left}#tribe-events-footer .tribe-events-sub-nav .tribe-events-nav-next,#tribe-events-header .tribe-events-sub-nav .tribe-events-nav-next{float:right;margin-left:5px;text-align:right}#tribe-events-footer .tribe-events-sub-nav .tribe-events-nav-left,#tribe-events-header .tribe-events-sub-nav .tribe-events-nav-left{float:left;text-align:left}#tribe-events-footer .tribe-events-sub-nav .tribe-events-nav-right,#tribe-events-header .tribe-events-sub-nav .tribe-events-nav-right{float:right;text-align:right}.tribe-events-ajax-loading{background:#666;border-radius:5px;-webkit-box-shadow:none!important;-moz-box-shadow:none!important;box-shadow:none!important;display:none;left:50%;margin-left:-27px;padding:15px;position:absolute;top:150px;z-index:10}#tribe-events-content,#tribe-events-header,.tribe-events-list .tribe-events-loop .tribe-events-event-meta .event-is-recurring{position:relative}.tribe-events-ajax-loading.tribe-events-active-spinner,.tribe-events-ajax-loading.tribe-events-active-spinner img,.tribe-events-loading .tribe-events-ajax-loading{display:block}#tribe-events-footer{margin-bottom:1em}.events-list #tribe-events-footer,.tribe-events-day #tribe-events-footer,.tribe-events-map #tribe-events-footer{clear:both;margin:1.25em 0 18px}.tribe-events-map #tribe-events-header{margin:1em 0}.single-tribe_events #tribe-events-header{margin:1em 0 20px}.single-tribe_events #tribe-events-footer li,.single-tribe_events #tribe-events-header li{width:48%}#tribe-events-content .tribe-events-nav-date{padding-top:16px}select.tribe-events-dropdown{font-size:11px;margin:33px 9px 0 0;width:auto}#tribe-events-events-picker,#tribe-events-picker{display:inline}#tribe-events-content{margin-bottom:48px;padding:2px 0}.tribe-events-othermonth .tribe-events-month-event-title,.tribe-events-othermonth div[id*=tribe-events-daynum-]{-khtml-opacity:.4;-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=40)';filter:alpha(opacity=40);-moz-opacity:.4;opacity:.4}.tribe-events-list h2.tribe-events-page-title{margin-bottom:15px}#tribe-events-content.tribe-events-list{padding:0;margin-bottom:60px}.tribe-events-list .type-tribe_events{border-bottom:1px solid #ddd;margin:0;padding:2.25em 0}.tribe-events-list .type-tribe_events.tribe-events-first{padding-top:0}.tribe-events-list h2.tribe-events-list-event-title{border:none;font-size:1.4em;letter-spacing:0;line-height:1.4em;margin:0;padding:0;text-transform:none;display:inline;float:none}.tribe-events-event-details .tribe-events-event-meta address.tribe-events-address{font-family:inherit;font-size:inherit;font-style:normal;line-height:inherit}.tribe-events-list .tribe-events-event-image{float:left;margin:0 3% 0 0;width:30%}.tribe-events-list .tribe-events-event-image img{height:auto;margin:0;padding:0;width:100%}.tribe-events-list .tribe-events-event-image+div.tribe-events-content{float:left;position:relative;width:67%}.tribe-events-loop .tribe-events-event-meta{border:0;clear:both;float:none;font-size:14px;font-weight:700;line-height:1.5;margin:5px 0 15px;overflow:visible}.tribe-events-list .tribe-events-loop .tribe-events-event-meta .recurringinfo{display:inline-block;zoom:1}.tribe-events-event-meta address.tribe-events-address{display:inline;font-family:inherit;font-size:inherit;font-style:normal;line-height:inherit;margin-right:10px}.tribe-events-list .time-details,.tribe-events-list .tribe-events-venue-details{display:block;line-height:1.2;margin:0}.tribe-events-list .time-details{margin:0 0 8px}.tribe-events-list .tribe-events-event-cost{float:right;margin:0 0 5px 5px}.tribe-events-list .tribe-events-event-cost span{background:#eee;border:1px solid #ddd;display:block;font-style:normal;font-weight:700;line-height:1.3;padding:5px 10px;text-align:center;text-overflow:ellipsis}.tribe-events-list .tribe-events-loop .tribe-events-content{padding:0;width:100%}.tribe-events-list-separator-year{color:#ccc;display:block;font-size:38px;font-weight:700;padding:1em 2.25em 0;text-align:center}.tribe-events-list-separator-month{background-color:#eee;display:block;font-size:14px;font-weight:700;margin:2.5em 0 0;padding:6px 10px;text-transform:uppercase}.tribe-events-list-separator-month+.type-tribe_events.tribe-events-first{padding-top:2.25em}.tribe-events-list .type-tribe_events.tribe-event-end-month{border-bottom:0;padding-bottom:0}.tribe-events-loop{clear:both}.tribe-events-loop .type-tribe_events.tribe-events-last{border-bottom:0}.tribe-events-loop .tribe-events-content{float:left;padding:0 5% 0 0;width:60%}.single-tribe_venue .tribe-events-loop .tribe-events-content p{margin:0}.events-archive h3 .published,.single-tribe_venue h3 .published{font-size:18px;font-style:italic;margin-top:0;text-transform:none}.tribe-events-event-day,.tribe-events-event-meta-desc{color:#333}.single-tribe_events h2.tribe-events-single-event-title{font-size:1.7em;line-height:1;margin:0;padding:0}#tribe-events-content .tribe-events-single-event-description img.attachment-post-thumbnail{display:block;margin-left:auto;margin-right:auto;text-align:center}.tribe-events-meta-group .tribe-events-single-section-title{font-size:1.4em;font-weight:700;margin:20px 0 10px}.tribe-events-meta-group+.tribe-events-single-section-title{margin-top:0}.tribe-events-event-meta .tribe-events-meta-group address.tribe-events-address{display:block;margin:0}#eventbrite-embed{margin:24px 0;min-height:225px;width:100%}.eventbrite-ticket-embed{margin:0 0 30px}.tribe-events-schedule{margin:20px 0 0}.single-tribe_events .tribe-events-schedule .recurringinfo,.single-tribe_events .tribe-events-schedule .tribe-events-cost,.single-tribe_events .tribe-events-schedule .tribe-events-divider{font-size:1.2em}.single-tribe_events .tribe-events-schedule h3{display:inline-block;font-size:1.2em;margin:0;padding:0;vertical-align:middle;white-space:nowrap;zoom:1}.single-tribe_events .tribe-events-schedule .tribe-events-cost{vertical-align:middle}.single-tribe_events .tribe-events-event-image{clear:both;margin-bottom:30px;text-align:center}.single-tribe_events .tribe-events-event-meta{background:#fafafa;border:1px solid #eee;margin:30px 0;font-size:13px}.single-tribe_events .tribe-events-venue-map{background:#eee;border:1px solid #ddd;border-radius:3px;display:inline-block;float:right;margin:20px 4% 2% 0;padding:5px;vertical-align:top;width:58%;zoom:1}.single-tribe_events #tribe-events-gmap{height:0!important;margin:0!important;padding-top:50%;width:100%!important}.single-tribe_events .tribe-events-meta-group .tribe-events-venue-map{float:none;margin:20px 0 0;width:100%}.single-tribe_events .tribe-events-meta-group #tribe-events-gmap{height:0!important;margin-top:50px;padding-top:100%;width:100%!important}.tribe-events-event-meta .column,.tribe-events-event-meta .tribe-events-meta-group{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;float:left;margin:0 0 20px;padding:0 4%;text-align:left;vertical-align:top;width:33.3333%;zoom:1}.single-tribe_events .tribe-events-event-meta dl{margin:0}.single-tribe_events #tribe-events-content .tribe-events-event-meta dt{clear:left;font-weight:700;line-height:1;list-style:none}.single-tribe_events #tribe-events-content .tribe-events-event-meta dd{float:none;line-height:1.5;list-style:none;margin:0 0 10px;padding:0}#tribe-events-content .tribe-events-event-meta dd span.adr{display:block}.single-tribe_events .tribe-events-content{max-width:100%;padding:0;width:100%}.sidebar.single-tribe_events .tribe-events-content{padding:0}.tribe-events-day .tribe-events-day-time-slot h5{background-color:#eee;font-size:14px;font-weight:700;margin:2.5em 0 0;padding:6px 10px;text-transform:uppercase}.tribe-events-day .tribe-events-day-time-slot .type-tribe_events{margin-left:5%}#tribe-events-content table.tribe-events-calendar{border-collapse:collapse;clear:both;font-size:12px;margin:12px 0 .6em;table-layout:fixed;width:100%}#tribe-events-content .tribe-events-calendar td,#tribe-events-content table.tribe-events-calendar{border:1px solid #bbb}.tribe-events-calendar div[id*=tribe-events-daynum-],.tribe-events-calendar div[id*=tribe-events-daynum-] a{background-color:#f5f5f5;color:#333;font-size:11px;font-weight:700}.tribe-events-calendar td.tribe-events-present div[id*=tribe-events-daynum-],.tribe-events-calendar td.tribe-events-present div[id*=tribe-events-daynum-]>a{background-color:#666;color:#fff}.tribe-events-calendar td.tribe-events-past div[id*=tribe-events-daynum-],.tribe-events-calendar td.tribe-events-past div[id*=tribe-events-daynum-]>a{color:#999}#tribe-events-content .tribe-events-calendar td{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#114b7d;font-size:12px;height:110px;padding:0 0 .5em;vertical-align:top;width:14.28%}.recurring-info-tooltip,.tribe-events-calendar .tribe-events-tooltip,.tribe-events-week .tribe-events-tooltip{background-color:#f9f9f9;border:1px solid #666;bottom:30px;color:#333;display:none;left:3px;line-height:1.4;position:absolute;width:320px;z-index:1001}.tribe-events-tooltip .tribe-events-arrow{background-image:url(../images/tribe-tooltips.png);background-position:0 0;background-repeat:no-repeat;-webkit-background-size:44px 19px;background-size:44px 19px;bottom:-11px;display:block;height:11px;left:20px;position:absolute;width:18px}.recurring-info-tooltip,.tribe-events-calendar .tribe-events-right .tribe-events-tooltip,.tribe-events-week .tribe-events-right .tribe-events-tooltip{left:auto;right:3px}.tribe-events-right .tribe-events-tooltip .tribe-events-arrow{left:auto;right:30px}.tribe-events-tooltip ol,.tribe-events-tooltip ul{margin-left:1.6em}@media screen{#tribe-events-content .tribe-events-tooltip ol,#tribe-events-content .tribe-events-tooltip ul{margin-left:1.6em}}.recurringinfo{display:inline-block;position:relative;vertical-align:middle;zoom:1}.event-is-recurring{color:rgba(0,0,0,.7);font-style:normal;font-weight:500;position:relative}.event-is-recurring:hover{color:#000}.recurring-info-tooltip.tribe-events-tooltip{left:10px;padding-bottom:.8em;width:200px}.events-archive.events-gridview #tribe-events-content table .type-tribe_events{border-bottom:1px solid #e7e7e7;margin:0 5%;padding:6px 8px}.events-archive.events-gridview #tribe-events-content table .tribe-events-last{border-bottom:0}.tribe-events-viewmore{border-top:1px solid #e7e7e7;font-weight:700;line-height:1;margin:0 5%;padding:9px 8px}.tribe-events-calendar td .tribe-events-viewmore a{font-size:100%}.tribe-events-calendar th{background-color:#ddd;color:#333;height:10px;letter-spacing:1px;padding:4px 0;text-align:center;text-transform:uppercase;width:14.28%}.tribe-events-calendar td div[id*=tribe-events-daynum-]{line-height:1.2;padding:6px 9px}.tribe-events-calendar td a{font-size:91.7%}.tribe-events-calendar div[id*=tribe-events-daynum-],.tribe-events-calendar div[id*=tribe-events-event-]{margin:0;position:relative}#tribe-events-content .tribe-events-calendar div[id*=tribe-events-event-] h3.tribe-events-month-event-title{font-family:sans-serif;font-size:13px;font-weight:700;font-weight:400;letter-spacing:0;line-height:1.25;margin:0;overflow:hidden;padding:0;text-transform:none}.tribe-events-calendar div[id*=tribe-events-event-] h3.tribe-events-month-event-title a{font-size:100%}#tribe-events-content .tribe-events-tooltip h4{background-color:#666;color:#fff;font-size:12px;font-weight:400;letter-spacing:1px;line-height:24px;margin:0;min-height:24px;padding:0 6px}.tribe-events-tooltip .tribe-events-event-body{font-size:11px;font-weight:400;padding:3px 6px 6px}.tribe-events-tooltip .duration{font-style:italic;margin:3px 0}.tribe-events-tooltip .tribe-events-event-thumb{float:left;padding:5px 5px 5px 0}.tribe-events-tooltip .tribe-events-event-thumb img{-webkit-box-shadow:none;box-shadow:none}.tribe-events-tooltip p.entry-summary{font-size:11px;line-height:1.5;padding:0}#tribe-mobile-container{display:none}.tribe-events-list-widget ol li{list-style:none;margin-bottom:30px}.tribe-events-list-widget .duration{font-weight:700}.datepicker{z-index:1000!important}.datepicker table tr td span,.datepicker td{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker td{border-top:1px solid #ededed}.datepicker table tr td span.active.active,.datepicker table tr td.active.active{background:#666}.datepicker table tr td span.active.active:hover,.datepicker table tr td.active.active:hover{background:#dadada;color:inherit}#tribe-events-bar{clear:none;height:auto;margin-bottom:30px;min-width:220px;position:relative;width:100%}#tribe-events-bar *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#tribe-bar-form{background:#f5f5f5;margin:0;position:relative;width:100%}#tribe-bar-form input{font-size:15px;margin:0 4px 0 0}#tribe-bar-form input[type=text]{background:0;border:none;border-bottom:1px dashed #b9b9b9;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-weight:700;height:auto;line-height:1;padding:0 0 5px;width:100%}#tribe-bar-form input[type=text]:focus{outline:0}input[name*=tribe-bar-]::-webkit-input-placeholder{color:#5f5f5f;font-style:italic;font-weight:400;line-height:1.3}input[name*=tribe-bar-]:-moz-placeholder{color:#5f5f5f;font-style:italic;font-weight:400;line-height:1.3}.tribe-event-placeholder{color:#5f5f5f;font-weight:400;font-style:italic;line-height:1.3}#tribe-bar-form .tribe-bar-submit input[type=submit]{-webkit-appearance:button;background:#666;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;color:#fff;font-size:13px;height:auto;letter-spacing:0;line-height:20px;padding:10px;width:100%}.tribe-bar-submit input[type=submit]:hover{background:#999;color:#fff}#tribe-bar-form label{display:block;font-size:11px;font-weight:700;line-height:1;margin:0 0 5px;padding:0;text-transform:uppercase}.tribe-bar-date-filter,.tribe-bar-search-filter,.tribe-bar-submit{margin-bottom:0;padding:15px;float:left}#tribe-bar-dates .select2-choice{border-bottom:1px dashed #b9b9b9}#tribe-bar-form .tribe-bar-filters{float:left;margin:0;position:relative;width:100%}#tribe-bar-form #tribe-bar-views+.tribe-bar-filters{left:auto;right:16.66667%;width:83.3333%}#tribe-bar-form .tribe-bar-filters-inner{margin:0}#tribe-bar-form.tribe-bar-full .tribe-bar-filters{display:block!important}.tribe-bar-date-filter{width:25%}.tribe-bar-search-filter{width:33.3333%}.tribe-bar-submit{margin-left:16.6667%;width:25%}#tribe-bar-form #tribe-bar-views{background:0 0;float:left;left:83.3333%;margin:0;padding:0 0 0 5px;position:relative;right:auto;width:16.66667%}.tribe-bar-views-inner{background:#e0e0e0;margin:0;padding:15px 0 45px}#tribe-bar-form .tribe-bar-views-inner label{padding:0 15px;text-align:left}.tribe-bar-views-inner .select2-container{padding:0 15px}.tribe-select2-results-views.select2-drop{background:#dbdbdb;border:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;z-index:10001}#tribe-bar-form.tribe-bar-mini #tribe-bar-views{width:16.66667%}#tribe-bar-views .tribe-bar-views-list{border-radius:0 0 3px 3px;left:0;list-style-type:none;margin:0;padding:0 0 0 5px;position:absolute;top:auto;z-index:99;float:left;width:100%}#tribe-bar-views li.tribe-bar-views-option{background:0 0;border:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;display:none;filter:'progid:DXImageTransform.Microsoft.gradient(enabled=false)';line-height:14px;list-style:none;margin:0;padding:0}#tribe-bar-views .tribe-bar-views-option.tribe-bar-active,#tribe-bar-views .tribe-bar-views-option:first-child,#tribe-bar-views.tribe-bar-views-open .tribe-bar-views-option{display:list-item}#tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option a{background:#e0e0e0;color:#444;display:block;padding:6px 15px;text-align:left;text-decoration:none}#tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option a:hover{background:#cacaca;color:inherit}#tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option.tribe-bar-active a:hover{background:#e0e0e0}#tribe-bar-views .tribe-bar-views-option:last-child a{-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.tribe-no-js #tribe-bar-views [name=tribe-bar-view]{display:block}#tribe-bar-views .tribe-bar-settings,#tribe-bar-views [name=tribe-bar-view]{display:none}#tribe-bar-form.tribe-bar-mini *{font-size:12px}#tribe-bar-form.tribe-bar-mini label{font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tribe-bar-mini .tribe-bar-filters{display:block!important;float:left;width:83.3333%}.tribe-bar-mini .tribe-bar-date-filter{padding:10px}.tribe-bar-mini .tribe-bar-search-filter{padding:10px;width:45%}.tribe-bar-mini .tribe-bar-submit{margin-left:5%;padding:10px;width:25%}#tribe-bar-form.tribe-bar-mini .tribe-bar-submit input[type=submit]{-webkit-appearance:button;font-size:11px;padding:10px 5px}.tribe-bar-mini #tribe-bar-views{width:16.66667%}.tribe-bar-mini .tribe-bar-views-inner{padding:10px 0 35px}.tribe-bar-mini .tribe-bar-views-inner label{padding:0 10px}.tribe-bar-mini #tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option a{padding:4px 15px}#tribe-bar-collapse-toggle{background:#f5f5f5;display:none;float:left;font-size:13px;font-weight:700;line-height:28px;padding:15px;position:relative;text-transform:uppercase}#tribe-bar-collapse-toggle span.tribe-bar-toggle-arrow{display:inline-block;margin:0 4px;position:absolute;right:10px}#tribe-bar-collapse-toggle span.tribe-bar-toggle-arrow:after{border:solid transparent;border-color:rgba(136,183,213,0);border-top-color:inherit;border-width:8px;content:' ';height:0;pointer-events:none;position:absolute;right:0;top:10px;width:0}#tribe-bar-collapse-toggle.tribe-bar-filters-open span.tribe-bar-toggle-arrow:after{border-bottom-color:inherit;border-top-color:transparent;top:0}#tribe-bar-form.tribe-bar-collapse #tribe-bar-views+.tribe-bar-filters{clear:both;display:none;left:auto;margin-top:5px;overflow:hidden;right:auto;width:100%}.tribe-bar-collapse #tribe-bar-views,.tribe-bar-collapse .tribe-bar-filters-inner>div{height:auto;margin:0;width:100%}.tribe-bar-collapse #tribe-bar-collapse-toggle{display:block;width:70%}.tribe-bar-collapse #tribe-bar-collapse-toggle.tribe-bar-collapse-toggle-full-width{width:100%}#tribe-bar-form.tribe-bar-collapse #tribe-bar-views{float:left;left:auto;width:30%}#tribe-bar-form.tribe-bar-collapse .tribe-bar-views-inner{padding:10px 0 40px}#tribe-bar-form.tribe-bar-collapse .tribe-bar-views-inner label{margin:0}.tribe-bar-is-disabled .tribe-events-page-title{clear:none;line-height:45px;margin:0;text-align:left}.tribe-bar-disabled{float:right;position:relative;z-index:101}.tribe-bar-disabled #tribe-events-bar{float:none;min-width:0;width:auto}.tribe-bar-disabled #tribe-bar-form{border-radius:3px;width:auto}.tribe-bar-disabled .tribe-bar-filters{float:left}.tribe-bar-disabled .tribe-bar-filters .tribe-bar-date-filter{padding:5px 10px}.tribe-bar-disabled #tribe-bar-form label{font-size:10px}.tribe-bar-disabled #tribe-bar-form .tribe-bar-filters input[type=text]{border:none;display:block;font-size:13px;line-height:15px;margin:0;padding:0;width:85px}.tribe-bar-disabled #tribe-bar-form #tribe-bar-views+.tribe-bar-filters{left:auto;right:50%;width:50%}.tribe-bar-disabled .tribe-bar-date-filter,.tribe-events-uses-geolocation .tribe-bar-disabled .tribe-bar-date-filter{width:auto}.tribe-bar-disabled #tribe-bar-form #tribe-bar-views{float:left;font-size:16px;left:50%;padding:0;right:auto;width:50%}.tribe-bar-disabled .tribe-bar-views-inner{border-radius:0 3px 3px 0;min-width:100px;padding:5px 0 25px}.tribe-bar-disabled #tribe-bar-form .tribe-bar-views-inner label{padding:0 10px}.tribe-bar-disabled #tribe-bar-views .tribe-bar-views-list,.tribe-bar-disabled #tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option{margin:0}.tribe-bar-disabled #tribe-bar-views .tribe-bar-views-list .tribe-bar-views-option a{margin:0;padding:4px 10px}.tribe-bar-disabled #tribe-bar-views .select2-container .select2-choice{font-size:13px;height:auto;line-height:18px}.tribe-bar-is-disabled .tribe-select2-results-views.select2-drop .select2-results li{padding:0 10px}.tribe-bar-disabled #tribe-bar-collapse-toggle,.tribe-bar-disabled .tribe-bar-submit{display:none}.tribe-bar-view-list a[class*=tribe-icon-],.tribe-bar-views-list span[class^=tribe-icon-],.tribe-select2-results-views span[class^=tribe-icon-]{background-position:0 50%;background-repeat:no-repeat;display:block;min-height:16px;padding-left:24px}.tribe-select2-results-views span[class^=tribe-icon-]{display:inline-block;min-height:16px}.tribe-bar-views-list span[class^=tribe-icon-],.tribe-select2-results-views span[class^=tribe-icon-]{background-image:url(../images/events-bar/icon-month.png);-webkit-background-size:15px 16px;background-size:15px 16px}.tribe-bar-view-list span[class^=tribe-icon-],.tribe-bar-views-list span.tribe-icon-list,.tribe-select2-results-views span.tribe-icon-list{background-image:url(../images/events-bar/icon-list.png);-webkit-background-size:15px 10px;background-size:15px 10px}.tribe-bar-view-list a.tribe-icon-list,.tribe-bar-view-list a.tribe-icon-month{background-position:10px 50%;padding-left:30px}.tribe-bar-view-list a.tribe-icon-month,.tribe-bar-views-list span.tribe-icon-month,.tribe-select2-results-views .tribe-icon-month{background-image:url(../images/events-bar/icon-month.png);-webkit-background-size:15px 16px;background-size:15px 16px}.tribe-bar-views-list span.tribe-icon-week,.tribe-select2-results-views span.tribe-icon-week{background-image:url(../images/events-bar/icon-week.png);-webkit-background-size:15px 16px;background-size:15px 16px}.tribe-bar-views-list span.tribe-icon-day,.tribe-select2-results-views span.tribe-icon-day{background-image:url(../images/events-bar/icon-day.png);-webkit-background-size:15px 16px;background-size:15px 16px}.tribe-bar-views-list span.tribe-icon-photo,.tribe-select2-results-views span.tribe-icon-photo{background-image:url(../images/events-bar/icon-photo.png);-webkit-background-size:15px 14px;background-size:15px 14px}.tribe-bar-views-list span.tribe-icon-map,.tribe-select2-results-views span.tribe-icon-map{background-image:url(../images/events-bar/icon-map.png);background-position:2px 50%;-webkit-background-size:12px 16px;background-size:12px 16px}.tribe-events-week.tribe-theme-parent-twentyfourteen #masthead,.tribe-events-week.tribe-theme-twentyfourteen #masthead{z-index:1001}.tribe-theme-parent-twentyfourteen #tribe-events-pg-template #tribe-events,.tribe-theme-twentyfourteen #tribe-events-pg-template #tribe-events{padding:20px}.tribe-theme-parent-twentyfourteen #tribe-bar-views .tribe-bar-views-list,.tribe-theme-twentyfourteen #tribe-bar-views .tribe-bar-views-list{z-index:3}@media screen and (min-width:1000px){.tribe-theme-parent-twentyfourteen #tribe-events-pg-template,.tribe-theme-twentyfourteen #tribe-events-pg-template{padding-left:220px}}#tribe-events-content .tribe-updated{display:inherit}@media screen and (max-width:400px){.list-view.events-archive .site-content .type-page .entry-content{display:initial}}.tribe-theme-twentyfifteen.events-single.tribe-events-page-template #tribe-events-pg-template{padding-top:8.3333%}.tribe-theme-twentyfifteen.events-single.tribe-events-page-template #tribe-events-content{padding:8.3333% 10%}.tribe-theme-twentyfifteen.single-tribe_events #tribe-events .tribe_events{box-shadow:none;margin-left:0;margin-right:0;padding-top:0}.tribe-theme-twentyfifteen.single-tribe_events #tribe-events .tribe-events-schedule h2{display:inline-block;font-size:1.2em;margin:0}.tribe-theme-twentyfifteen .type-tribe_events a.more-link,.tribe-theme-twentyfifteen.events-archive .entry-footer,.tribe-theme-twentyfifteen.single-tribe_events .entry-footer{display:none}.tribe-theme-twentyfifteen.single-tribe_events.page-template-page-php .tribe-events-single{box-shadow:none;margin-bottom:0!important;margin-left:0;margin-right:0}.tribe-theme-twentyfifteen.tribe-events-week .tribe-events-grid .hentry{margin-left:0;margin-right:0}.tribe-theme-twentyfifteen .tribe-events-list-widget .type-tribe_events{border-top:1px solid rgba(51,51,51,.1);box-shadow:none;margin-left:0;margin-right:0}.tribe-theme-twentyfifteen .tribe-events-list-widget .entry-title{font-size:2.2rem;font-size:22px;line-height:1.4545}.tribe-theme-twentyfifteen.tribe-events-page-template #tribe-events-content-wrapper{padding:3.333%}.tribe-theme-twentyfifteen .tribe-events-list .type-tribe_events,.tribe-theme-twentyfifteen .tribe-events-list .type-tribe_events.tribe-events-first{padding:8.333% 10%}.tribe-theme-twentyfifteen .tribe-events-day-time-slot .type-tribe_events{margin-left:0}.tribe-theme-twentyfifteen .datepicker.dropdown-menu{max-width:340px}.tribe-theme-twentyfifteen .datepicker.dropdown-menu table,.tribe-theme-twentyfifteen .datepicker.dropdown-menu table.table-condensed{border-left-width:0;border-top-width:0}.tribe-theme-twentyfifteen .tribe-events-calendar td a,.tribe-theme-twentyfifteen .tribe-events-nav-next a,.tribe-theme-twentyfifteen .tribe-events-nav-previous a,.tribe-theme-twentyfifteen ul.tribe-bar-views-list li a{border-bottom:none}.tribe-theme-twentyfifteen .tribe-events-list .time-details,.tribe-theme-twentyfifteen .tribe-events-list .tribe-events-venue-details{line-height:1.6}body.tribe-theme-twentysixteen table.tribe-events-calendar{table-layout:auto}body.tribe-theme-twentysixteen .tribe-events-single-section-title:first-child{margin-top:20px}body.tribe-theme-twentysixteen .tribe-events-content.entry-summary{font-size:inherit;margin-bottom:0;margin-top:5px}body.tribe-theme-twentysixteen.events-archive .entry-content,body.tribe-theme-twentysixteen.events-archive .entry-header{width:auto}body.tribe-theme-twentysixteen .datepicker table{border:0;width:auto}@media (min--moz-device-pixel-ratio:2),(-o-min-device-pixel-ratio:2/1),(-webkit-min-device-pixel-ratio:2),(min-device-pixel-ratio:2){.tribe-events-tooltip .tribe-events-arrow{background-image:url(../images/tribe-tooltips@2x.png)}#tribe-bar-filters .tribe-bar-button-search .tribe-bar-btn-small{background-image:url(../images/events-bar/icon-search@2x.png)}#tribe-events-bar .tribe-bar-button-settings span{background-image:url(../images/events-bar/icon-gear@2x.png)}#tribe-events-bar [class^=tribe-bar-button-]:after{background-image:url(../vendor/select2/select2x2.png)}.tribe-bar-view-list a[class^=tribe-icon-],.tribe-bar-views-list span[class^=tribe-icon-],.tribe-select2-results-views span[class^=tribe-icon-]{background-image:url(../images/events-bar/icon-month@2x.png)}.tribe-bar-view-list span[class^=tribe-icon-],.tribe-bar-views-list span.tribe-icon-list,.tribe-select2-results-views span.tribe-icon-list{background-image:url(../images/events-bar/icon-list@2x.png)}.tribe-bar-view-list a.tribe-icon-month,.tribe-bar-views-list span.tribe-icon-month,.tribe-select2-results-views span.tribe-icon-month{background-image:url(../images/events-bar/icon-month@2x.png)}.tribe-bar-views-list span.tribe-icon-week,.tribe-select2-results-views span.tribe-icon-week{background-image:url(../images/events-bar/icon-week@2x.png)}.tribe-bar-views-list span.tribe-icon-day,.tribe-select2-results-views span.tribe-icon-day{background-image:url(../images/events-bar/icon-day@2x.png)}.tribe-bar-views-list span.tribe-icon-photo,.tribe-select2-results-views span.tribe-icon-photo{background-image:url(../images/events-bar/icon-photo@2x.png)}.tribe-bar-views-list span.tribe-icon-map,.tribe-select2-results-views span.tribe-icon-map{background-image:url(../images/events-bar/icon-map@2x.png)}}
the-events-calendar.php CHANGED
@@ -2,7 +2,7 @@
2
  /*
3
  Plugin Name: The Events Calendar
4
  Description: The Events Calendar is a carefully crafted, extensible plugin that lets you easily share your events. Beautiful. Solid. Awesome.
5
- Version: 4.0.1
6
  Author: Modern Tribe, Inc.
7
  Author URI: http://m.tri.be/1x
8
  Text Domain: the-events-calendar
2
  /*
3
  Plugin Name: The Events Calendar
4
  Description: The Events Calendar is a carefully crafted, extensible plugin that lets you easily share your events. Beautiful. Solid. Awesome.
5
+ Version: 4.0.2
6
  Author: Modern Tribe, Inc.
7
  Author URI: http://m.tri.be/1x
8
  Text Domain: the-events-calendar
vendor/tickets/common/src/Tribe/Admin/Notice/Archive_Slug_Conflict.php CHANGED
@@ -51,20 +51,18 @@ class Tribe__Admin__Notice__Archive_Slug_Conflict {
51
  * Echoes the admin notice to the page
52
  */
53
  public function notice() {
54
-
55
  // What's happening?
56
  $page_title = apply_filters( 'the_title', $this->page->post_title );
57
  $line_1 = __( sprintf( 'The page "%1$s" uses the "/%2$s" slug: the Events Calendar plugin will show its calendar in place of the page.', $page_title, $this->archive_slug ), 'tribe-common' );
58
 
59
  // What the user can do
60
  $page_edit_link = get_edit_post_link( $this->page->ID );
61
- // $can_edit_page_link = sprintf( __( '<a href="%s">Edit the page slug</a>', 'tribe-common' ), $page_edit_link );
62
  $can_edit_page_link = sprintf( __( '<a href="%s">Edit the page slug</a>', 'tribe-common' ), $page_edit_link );
63
  $page_edit_link_string = current_user_can( 'edit_pages' ) ? $can_edit_page_link : __( 'Ask the site administrator to edit the page slug', 'tribe-common' );
64
 
65
  $settings_cap = apply_filters( 'tribe_settings_req_cap', 'manage_options' );
66
  $admin_slug = apply_filters( 'tribe_settings_admin_slug', 'tribe-common' );
67
- $setting_page_link = apply_filters( 'tribe_settings_url', admin_url( 'edit.php?page=' . $admin_slug . '#tribe-field-singleEventSlug' ) );
68
  $can_edit_settings_link = sprintf( __( '<a href="%s">edit Events settings</a>.', 'tribe-common' ), $setting_page_link );
69
  $events_settings_link_string = current_user_can( $settings_cap ) ? $can_edit_settings_link : __( ' ask the site administrator set a different Events URL slug.', 'tribe-common' );
70
 
51
  * Echoes the admin notice to the page
52
  */
53
  public function notice() {
 
54
  // What's happening?
55
  $page_title = apply_filters( 'the_title', $this->page->post_title );
56
  $line_1 = __( sprintf( 'The page "%1$s" uses the "/%2$s" slug: the Events Calendar plugin will show its calendar in place of the page.', $page_title, $this->archive_slug ), 'tribe-common' );
57
 
58
  // What the user can do
59
  $page_edit_link = get_edit_post_link( $this->page->ID );
 
60
  $can_edit_page_link = sprintf( __( '<a href="%s">Edit the page slug</a>', 'tribe-common' ), $page_edit_link );
61
  $page_edit_link_string = current_user_can( 'edit_pages' ) ? $can_edit_page_link : __( 'Ask the site administrator to edit the page slug', 'tribe-common' );
62
 
63
  $settings_cap = apply_filters( 'tribe_settings_req_cap', 'manage_options' );
64
  $admin_slug = apply_filters( 'tribe_settings_admin_slug', 'tribe-common' );
65
+ $setting_page_link = apply_filters( 'tribe_settings_url', admin_url( 'edit.php?page=' . $admin_slug . '#tribe-field-eventsSlug' ) );
66
  $can_edit_settings_link = sprintf( __( '<a href="%s">edit Events settings</a>.', 'tribe-common' ), $setting_page_link );
67
  $events_settings_link_string = current_user_can( $settings_cap ) ? $can_edit_settings_link : __( ' ask the site administrator set a different Events URL slug.', 'tribe-common' );
68
 
vendor/tickets/common/src/Tribe/Main.php CHANGED
@@ -17,7 +17,7 @@ class Tribe__Main {
17
  const OPTIONNAME = 'tribe_events_calendar_options';
18
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
19
 
20
- const VERSION = '4.0.1';
21
  const FEED_URL = 'https://theeventscalendar.com/feed/';
22
 
23
  protected $plugin_context;
17
  const OPTIONNAME = 'tribe_events_calendar_options';
18
  const OPTIONNAMENETWORK = 'tribe_events_calendar_network_options';
19
 
20
+ const VERSION = '4.0.2';
21
  const FEED_URL = 'https://theeventscalendar.com/feed/';
22
 
23
  protected $plugin_context;
vendor/tickets/common/tribe-common.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Description: An event settings framework for managing shared options
4
- Version: 3.12.3
5
  Author: Modern Tribe, Inc.
6
  Author URI: http://m.tri.be/1x
7
  Text Domain: tribe-common
1
  <?php
2
  /*
3
  Description: An event settings framework for managing shared options
4
+ Version: 4.0.2
5
  Author: Modern Tribe, Inc.
6
  Author URI: http://m.tri.be/1x
7
  Text Domain: tribe-common
vendor/tickets/event-tickets.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Description: Event Tickets allows you to sell tickets to events
4
- Version: 4.0.1
5
  Author: Modern Tribe, Inc.
6
  Author URI: http://m.tri.be/28
7
  License: GPLv2 or later
1
  <?php
2
  /*
3
  Description: Event Tickets allows you to sell tickets to events
4
+ Version: 4.0.2
5
  Author: Modern Tribe, Inc.
6
  Author URI: http://m.tri.be/28
7
  License: GPLv2 or later
vendor/tickets/readme.txt CHANGED
@@ -4,7 +4,7 @@ Contributors: ModernTribe, borkweb, zbtirrell, barry.hughes, bordoni, brianjesse
4
  Tags: events, add-on, ticket sales, tickets, calendar, community, registration, api, dates, date, posts, workshop, conference, meeting, seminar, concert, summit, The Events Calendar, Events Calendar PRO, ticket integration, event ticketing, RSVP, Event Tickets, Event Tickets Plus
5
  Requires at least: 3.9
6
  Tested up to: 4.4
7
- Stable tag: 4.0.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -60,7 +60,7 @@ Looking for something else?
60
 
61
  = SUBMITTING PATCHES =
62
 
63
- If you’ve identified a bug and want to submit a patch, we’d welcome it at our <a href="https://github.com/moderntribe/events-tickets" target="_blank">GitHub page for Event Tickets.</a> Simply cue up your proposed patch as a pull request, and we’ll review as part of our release cycle and merge into the codebase if appropriate from there. (If a pull request is rejected, we’ll do our best to tell you why). Users whose pull requests are accepted will receive credit in the plugin’s changelog. For more information, check out the readme at our GitHub page. Happy coding!
64
 
65
  == Installation ==
66
 
@@ -179,6 +179,11 @@ Our Premium Plugins:
179
 
180
  == Changelog ==
181
 
 
 
 
 
 
182
  = [4.0.1] 2015-12-10 =
183
 
184
  * Tweak - Removed The Events Calendar-specific fields from the Attendees Report as defaults. The Events Calendar will now hook into the report and inject event-specific fields
4
  Tags: events, add-on, ticket sales, tickets, calendar, community, registration, api, dates, date, posts, workshop, conference, meeting, seminar, concert, summit, The Events Calendar, Events Calendar PRO, ticket integration, event ticketing, RSVP, Event Tickets, Event Tickets Plus
5
  Requires at least: 3.9
6
  Tested up to: 4.4
7
+ Stable tag: 4.0.2
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
60
 
61
  = SUBMITTING PATCHES =
62
 
63
+ If you’ve identified a bug and want to submit a patch, we’d welcome it at our <a href="https://github.com/moderntribe/event-tickets" target="_blank">GitHub page for Event Tickets.</a> Simply cue up your proposed patch as a pull request, and we’ll review as part of our release cycle and merge into the codebase if appropriate from there. (If a pull request is rejected, we’ll do our best to tell you why). Users whose pull requests are accepted will receive credit in the plugin’s changelog. For more information, check out the readme at our GitHub page. Happy coding!
64
 
65
  == Installation ==
66
 
179
 
180
  == Changelog ==
181
 
182
+ = [4.0.2] 2015-12-16 =
183
+
184
+ * Tweak - Removing dates from ticket emails when those tickets are attached to non The Events Calendar event posts
185
+ * Fix - Fixed a settings page URL (Thanks for the tip Kristy!)
186
+
187
  = [4.0.1] 2015-12-10 =
188
 
189
  * Tweak - Removed The Events Calendar-specific fields from the Attendees Report as defaults. The Events Calendar will now hook into the report and inject event-specific fields
vendor/tickets/src/Tribe/Main.php CHANGED
@@ -9,7 +9,7 @@ class Tribe__Tickets__Main {
9
  /**
10
  * Current version of this plugin
11
  */
12
- const VERSION = '4.0.1';
13
 
14
  /**
15
  * Min required The Events Calendar version
9
  /**
10
  * Current version of this plugin
11
  */
12
+ const VERSION = '4.0.2';
13
 
14
  /**
15
  * Min required The Events Calendar version
vendor/tickets/src/Tribe/Ticket_Object.php CHANGED
@@ -95,6 +95,14 @@ if ( ! class_exists( 'Tribe__Tickets__Ticket_Object' ) ) {
95
  */
96
  protected $qty_pending = 0;
97
 
 
 
 
 
 
 
 
 
98
  /**
99
  * Holds whether or not stock is being managed
100
  *
@@ -320,6 +328,9 @@ if ( ! class_exists( 'Tribe__Tickets__Ticket_Object' ) ) {
320
  case 'qty_sold':
321
  return $this->qty_sold();
322
  break;
 
 
 
323
  }
324
 
325
  return null;
@@ -342,9 +353,33 @@ if ( ! class_exists( 'Tribe__Tickets__Ticket_Object' ) ) {
342
  case 'qty_sold':
343
  return $this->qty_sold( $value );
344
  break;
 
 
 
345
  }
346
 
347
  return null;
348
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349
  }
 
350
  }
95
  */
96
  protected $qty_pending = 0;
97
 
98
+ /**
99
+ * Number of tickets for which an order has been cancelled.
100
+ * Use $this->qty_cancelled( value ) to set manage and get the value
101
+ *
102
+ * @var int
103
+ */
104
+ protected $qty_cancelled = 0;
105
+
106
  /**
107
  * Holds whether or not stock is being managed
108
  *
328
  case 'qty_sold':
329
  return $this->qty_sold();
330
  break;
331
+ case 'qty_cancelled':
332
+ return $this->qty_cancelled();
333
+ break;
334
  }
335
 
336
  return null;
353
  case 'qty_sold':
354
  return $this->qty_sold( $value );
355
  break;
356
+ case 'qty_cancelled':
357
+ return $this->qty_cancelled( $value );
358
+ break;
359
  }
360
 
361
  return null;
362
  }
363
+
364
+ /**
365
+ * Method to manage the protected `qty_cancelled` propriety of the Object
366
+ * Prevents setting `qty_cancelled` lower then zero
367
+ *
368
+ * @param int|null $value This will overwrite the old value
369
+ * @return int
370
+ */
371
+ public function qty_cancelled( $value = null ) {
372
+ // If the Value was passed as numeric value overwrite
373
+ if ( is_numeric( $value ) ) {
374
+ $this->qty_cancelled = $value;
375
+ }
376
+
377
+ // Prevents qty_cancelled from going negative
378
+ $this->qty_cancelled = max( (int) $this->qty_cancelled, 0 );
379
+
380
+ // return the new Qty Cancelled
381
+ return $this->qty_cancelled;
382
+ }
383
  }
384
+
385
  }
vendor/tickets/src/admin-views/list.php CHANGED
@@ -93,11 +93,23 @@
93
  <?php
94
  $stock = $ticket->stock();
95
  $sold = $ticket->qty_sold();
 
96
 
97
  if ( empty( $stock ) && $stock !== 0 ) : ?>
98
  <?php echo sprintf( esc_html__( 'Sold %d', 'event-tickets' ), esc_html( $sold ) ); ?>
99
  <?php else : ?>
100
- <?php echo sprintf( esc_html__( 'Sold %1$d of %2$d', 'event-tickets' ), esc_html( $sold ), esc_html( $sold + $stock ) ); ?>
 
 
 
 
 
 
 
 
 
 
 
101
  <?php endif; ?>
102
  </td>
103
  <td width="40%" valign="top">
93
  <?php
94
  $stock = $ticket->stock();
95
  $sold = $ticket->qty_sold();
96
+ $cancelled = $ticket->qty_cancelled();
97
 
98
  if ( empty( $stock ) && $stock !== 0 ) : ?>
99
  <?php echo sprintf( esc_html__( 'Sold %d', 'event-tickets' ), esc_html( $sold ) ); ?>
100
  <?php else : ?>
101
+ <?php
102
+ $cancelled_entry = empty( $cancelled ) ? '' : esc_html(sprintf(
103
+ __( ' (%1$d %2$s)' ), $cancelled,
104
+ _n( 'unit cancelled', 'units cancelled', $cancelled, 'event-tickets' )
105
+ ));
106
+ $line = sprintf(
107
+ esc_html__( 'Sold %1$d of %2$d%3$s', 'event-tickets' ), esc_html( $sold ),
108
+ esc_html( $sold + $stock ), $cancelled_entry
109
+ );
110
+
111
+ echo $line;
112
+ ?>
113
  <?php endif; ?>
114
  </td>
115
  <td width="40%" valign="top">
vendor/tickets/src/template-tags/tickets.php CHANGED
@@ -205,7 +205,7 @@ if ( ! function_exists( 'tribe_tickets_get_ticket_stock_message' ) ) {
205
 
206
  $pending_message = '';
207
  if ( $pending > 0 ) {
208
- $pending_message = sprintf( _n( '(%d awaiting review)', '(%d awaiting review)', 'event-tickets', $pending ), (int) $pending );
209
  }
210
 
211
  if ( ! $stock ) {
205
 
206
  $pending_message = '';
207
  if ( $pending > 0 ) {
208
+ $pending_message = sprintf( _n( '(%d awaiting review)', '(%d awaiting review)', $pending, 'event-tickets' ), (int) $pending );
209
  }
210
 
211
  if ( ! $stock ) {
vendor/tickets/src/views/tickets/email.php CHANGED
@@ -243,6 +243,7 @@
243
  }
244
 
245
  $venue_label = '';
 
246
 
247
  if ( function_exists( 'tribe_get_venue_id' ) ) {
248
  $venue_id = tribe_get_venue_id( $event->ID );
@@ -262,7 +263,17 @@
262
  }
263
  }
264
 
265
- if ( function_exists( 'tribe_get_start_date' ) ) {
 
 
 
 
 
 
 
 
 
 
266
  $start_date = tribe_get_start_date( $event, true );
267
  }
268
 
243
  }
244
 
245
  $venue_label = '';
246
+ $venue_name = null;
247
 
248
  if ( function_exists( 'tribe_get_venue_id' ) ) {
249
  $venue_id = tribe_get_venue_id( $event->ID );
263
  }
264
  }
265
 
266
+ $start_date = null;
267
+
268
+ /**
269
+ * Filters whether or not the event start date should be included in the ticket email
270
+ *
271
+ * @var boolean Include start date? Defaults to false
272
+ * @var int Event ID
273
+ */
274
+ $include_start_date = apply_filters( 'event_tickets_email_include_start_date', false, $event->ID );
275
+
276
+ if ( $include_start_date && function_exists( 'tribe_get_start_date' ) ) {
277
  $start_date = tribe_get_start_date( $event, true );
278
  }
279