Version Description
Download this release
Release Info
Developer | theseed |
Plugin | All-in-One Event Calendar |
Version | 1.2 |
Comparing to | |
See all releases |
Code changes from version 1.1.3 to 1.2
- all-in-one-event-calendar.php +3 -3
- app/controller/class-ai1ec-calendar-controller.php +155 -31
- app/helper/class-ai1ec-app-helper.php +3 -1
- app/helper/class-ai1ec-calendar-helper.php +343 -148
- app/helper/class-ai1ec-events-helper.php +581 -532
- app/helper/class-ai1ec-settings-helper.php +6 -3
- app/model/class-ai1ec-event.php +41 -3
- app/view/agenda.php +4 -3
- app/view/calendar.php +12 -2
- app/view/class-ai1ec-agenda-widget.php +6 -6
- app/view/month.php +3 -3
- app/view/week.php +151 -0
- css/calendar.css +227 -33
- img/week-view.png +0 -0
- js/calendar.js +42 -20
- js/jquery.tablescroll.js +181 -0
- readme.txt +59 -54
- screenshot-10.png +0 -0
- screenshot-11.png +0 -0
- screenshot-12.png +0 -0
- screenshot-13.png +0 -0
- screenshot-9.png +0 -0
all-in-one-event-calendar.php
CHANGED
@@ -2,11 +2,11 @@
|
|
2 |
/**
|
3 |
* Plugin Name: All-in-One Event Calendar Plugin
|
4 |
* Plugin URI: http://theseednetwork.com/software/all-in-one-event-calendar-wordpress/
|
5 |
-
* Description: An event calendar system with month
|
6 |
-
* Version: 1.1.3
|
7 |
* Author: The Seed Studio
|
8 |
* Author URI: http://theseednetwork.com/
|
9 |
-
|
|
|
10 |
@set_time_limit( 0 );
|
11 |
@ini_set( "memory_limit", "256M" );
|
12 |
@ini_set( "max_input_time", "-1" );
|
2 |
/**
|
3 |
* Plugin Name: All-in-One Event Calendar Plugin
|
4 |
* Plugin URI: http://theseednetwork.com/software/all-in-one-event-calendar-wordpress/
|
5 |
+
* Description: An event calendar system with month, week & agenda views, upcoming events widget, color-coded categories, recurrence, and import/export of .ics feeds.
|
|
|
6 |
* Author: The Seed Studio
|
7 |
* Author URI: http://theseednetwork.com/
|
8 |
+
* Version: 1.2
|
9 |
+
*/ // NOTE: When updating version number also update first line of app/view/calendar.php
|
10 |
@set_time_limit( 0 );
|
11 |
@ini_set( "memory_limit", "256M" );
|
12 |
@ini_set( "max_input_time", "-1" );
|
app/controller/class-ai1ec-calendar-controller.php
CHANGED
@@ -47,10 +47,13 @@ class Ai1ec_Calendar_Controller {
|
|
47 |
if( basename( $_SERVER['SCRIPT_NAME'] ) == 'admin-ajax.php' )
|
48 |
{
|
49 |
add_action( 'wp_ajax_ai1ec_month', array( &$this, 'ajax_month' ) );
|
|
|
50 |
add_action( 'wp_ajax_ai1ec_agenda', array( &$this, 'ajax_agenda' ) );
|
|
|
|
|
51 |
add_action( 'wp_ajax_nopriv_ai1ec_month', array( &$this, 'ajax_month' ) );
|
|
|
52 |
add_action( 'wp_ajax_nopriv_ai1ec_agenda', array( &$this, 'ajax_agenda' ) );
|
53 |
-
add_action( 'wp_ajax_ai1ec_term_filter', array( &$this, 'ajax_term_filter' ) );
|
54 |
add_action( 'wp_ajax_nopriv_ai1ec_term_filter', array( &$this, 'ajax_term_filter' ) );
|
55 |
}
|
56 |
}
|
@@ -72,36 +75,47 @@ class Ai1ec_Calendar_Controller {
|
|
72 |
// object
|
73 |
$this->request['action'] = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
|
74 |
if( ! in_array( $this->request['action'],
|
75 |
-
array( 'ai1ec_month', 'ai1ec_agenda', 'ai1ec_term_filter' ) ) )
|
76 |
$this->request['action'] = 'ai1ec_' . $ai1ec_settings->default_calendar_view;
|
77 |
|
78 |
switch( $this->request['action'] )
|
79 |
{
|
80 |
case 'ai1ec_month':
|
81 |
$this->request['ai1ec_month_offset'] =
|
82 |
-
isset( $_REQUEST['ai1ec_month_offset'] ) ?
|
83 |
-
intval( $_REQUEST['ai1ec_month_offset'] ) : 0;
|
84 |
// Parse active event parameter as an integer ID
|
85 |
-
$this->request['ai1ec_active_event'] = isset( $_REQUEST['ai1ec_active_event'] ) ? intval( $_REQUEST['ai1ec_active_event'] ) :
|
86 |
// Category/tag filter parameters
|
87 |
-
$this->request['ai1ec_cat_ids'] = isset( $_REQUEST['ai1ec_cat_ids'] ) ? $_REQUEST['ai1ec_cat_ids'] :
|
88 |
-
$this->request['ai1ec_tag_ids'] = isset( $_REQUEST['ai1ec_tag_ids'] ) ? $_REQUEST['ai1ec_tag_ids'] :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
break;
|
90 |
|
91 |
case 'ai1ec_agenda':
|
92 |
$this->request['ai1ec_page_offset'] =
|
93 |
-
isset( $_REQUEST['ai1ec_page_offset'] ) ?
|
94 |
-
intval( $_REQUEST['ai1ec_page_offset'] ) : 0;
|
95 |
// Parse active event parameter as an integer ID
|
96 |
-
$this->request['ai1ec_active_event'] = isset( $_REQUEST['ai1ec_active_event'] ) ? intval( $_REQUEST['ai1ec_active_event'] ) :
|
97 |
// Category/tag filter parameters
|
98 |
-
$this->request['ai1ec_cat_ids'] = isset( $_REQUEST['ai1ec_cat_ids'] ) ? $_REQUEST['ai1ec_cat_ids'] :
|
99 |
-
$this->request['ai1ec_tag_ids'] = isset( $_REQUEST['ai1ec_tag_ids'] ) ? $_REQUEST['ai1ec_tag_ids'] :
|
|
|
100 |
break;
|
101 |
|
102 |
case 'ai1ec_term_filter':
|
103 |
-
$this->request['ai1ec_post_ids'] = isset( $_REQUEST['ai1ec_post_ids'] ) ? $_REQUEST['ai1ec_post_ids'] :
|
104 |
-
$this->request['ai1ec_term_ids'] = isset( $_REQUEST['ai1ec_term_ids'] ) ? $_REQUEST['ai1ec_term_ids'] :
|
105 |
break;
|
106 |
}
|
107 |
}
|
@@ -142,9 +156,11 @@ class Ai1ec_Calendar_Controller {
|
|
142 |
$this->load_css();
|
143 |
$this->load_js();
|
144 |
|
|
|
145 |
// Define arguments for specific calendar sub-view (month, agenda, etc.)
|
146 |
$args = array(
|
147 |
'active_event' => $this->request['ai1ec_active_event'],
|
|
|
148 |
);
|
149 |
|
150 |
// Find out which view of the calendar page was requested
|
@@ -155,6 +171,11 @@ class Ai1ec_Calendar_Controller {
|
|
155 |
$view = $this->get_month_view( $args );
|
156 |
break;
|
157 |
|
|
|
|
|
|
|
|
|
|
|
158 |
case 'ai1ec_agenda':
|
159 |
$args['page_offset'] = $this->request['ai1ec_page_offset'];
|
160 |
$view = $this->get_agenda_view( $args );
|
@@ -166,9 +187,10 @@ class Ai1ec_Calendar_Controller {
|
|
166 |
else
|
167 |
$create_event_url = false;
|
168 |
|
169 |
-
// Validate preselected category/tag IDs
|
170 |
-
$cat_ids
|
171 |
-
$tag_ids
|
|
|
172 |
|
173 |
$categories = get_terms( 'events_categories', array( 'orderby' => 'name' ) );
|
174 |
foreach( $categories as &$cat ) {
|
@@ -182,6 +204,7 @@ class Ai1ec_Calendar_Controller {
|
|
182 |
'tags' => get_terms( 'events_tags', array( 'orderby' => 'name' ) ),
|
183 |
'selected_cat_ids' => $cat_ids,
|
184 |
'selected_tag_ids' => $tag_ids,
|
|
|
185 |
'show_subscribe_buttons' => ! $ai1ec_settings->turn_off_subscription_buttons
|
186 |
);
|
187 |
|
@@ -204,6 +227,8 @@ class Ai1ec_Calendar_Controller {
|
|
204 |
* event category slugs
|
205 |
* array tags => restrict events returned to the given set of
|
206 |
* event tag names
|
|
|
|
|
207 |
*
|
208 |
* @return string returns string of view output
|
209 |
**/
|
@@ -215,12 +240,13 @@ class Ai1ec_Calendar_Controller {
|
|
215 |
|
216 |
$defaults = array(
|
217 |
'month_offset' => 0,
|
218 |
-
'active_event' =>
|
219 |
'categories' => array(),
|
220 |
-
'tags' => array()
|
|
|
221 |
);
|
222 |
$args = wp_parse_args( $args, $defaults );
|
223 |
-
|
224 |
extract( $args );
|
225 |
|
226 |
// Get components of localized time
|
@@ -228,20 +254,86 @@ class Ai1ec_Calendar_Controller {
|
|
228 |
// Use first day of the month as reference timestamp, and apply month offset
|
229 |
$timestamp = gmmktime( 0, 0, 0, $bits['mon'] + $month_offset, 1, $bits['year'] );
|
230 |
|
231 |
-
$days_events = $ai1ec_calendar_helper->get_events_for_month( $timestamp,
|
|
|
232 |
$cell_array = $ai1ec_calendar_helper->get_month_cell_array( $timestamp, $days_events );
|
233 |
$pagination_links = $ai1ec_calendar_helper->get_month_pagination_links( $month_offset );
|
234 |
|
235 |
$view_args = array(
|
236 |
-
'title'
|
237 |
-
'weekdays'
|
238 |
-
'cell_array'
|
239 |
'pagination_links' => $pagination_links,
|
240 |
-
'active_event'
|
|
|
241 |
);
|
242 |
return apply_filters( 'ai1ec_get_month_view', $ai1ec_view_helper->get_view( 'month.php', $view_args ), $view_args );
|
243 |
}
|
244 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
245 |
/**
|
246 |
* get_agenda_view function
|
247 |
*
|
@@ -275,7 +367,8 @@ class Ai1ec_Calendar_Controller {
|
|
275 |
$event_results = $ai1ec_calendar_helper->get_events_relative_to(
|
276 |
$timestamp,
|
277 |
$ai1ec_settings->agenda_events_per_page,
|
278 |
-
$page_offset
|
|
|
279 |
);
|
280 |
$dates = $ai1ec_calendar_helper->get_agenda_date_array( $event_results['events'] );
|
281 |
|
@@ -290,7 +383,8 @@ class Ai1ec_Calendar_Controller {
|
|
290 |
'page_offset' => $page_offset,
|
291 |
'pagination_links' => $pagination_links,
|
292 |
'active_event' => $active_event,
|
293 |
-
'expanded' => $ai1ec_settings->agenda_events_expanded
|
|
|
294 |
);
|
295 |
return apply_filters( 'ai1ec_get_agenda_view', $ai1ec_view_helper->get_view( 'agenda.php', $args ), $args );
|
296 |
}
|
@@ -301,7 +395,7 @@ class Ai1ec_Calendar_Controller {
|
|
301 |
* AJAX request handler for month view.
|
302 |
*
|
303 |
* @return void
|
304 |
-
|
305 |
function ajax_month() {
|
306 |
global $ai1ec_view_helper;
|
307 |
|
@@ -311,6 +405,7 @@ class Ai1ec_Calendar_Controller {
|
|
311 |
$args = array(
|
312 |
'month_offset' => $this->request['ai1ec_month_offset'],
|
313 |
'active_event' => $this->request['ai1ec_active_event'],
|
|
|
314 |
);
|
315 |
|
316 |
// Return this data structure to the client
|
@@ -321,6 +416,33 @@ class Ai1ec_Calendar_Controller {
|
|
321 |
$ai1ec_view_helper->json_response( $data );
|
322 |
}
|
323 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
324 |
/**
|
325 |
* ajax_agenda function
|
326 |
*
|
@@ -335,8 +457,9 @@ class Ai1ec_Calendar_Controller {
|
|
335 |
|
336 |
// View arguments
|
337 |
$args = array(
|
338 |
-
'page_offset'
|
339 |
'active_event' => $this->request['ai1ec_active_event'],
|
|
|
340 |
);
|
341 |
|
342 |
// Return this data structure to the client
|
@@ -448,12 +571,13 @@ class Ai1ec_Calendar_Controller {
|
|
448 |
{
|
449 |
global $ai1ec_settings;
|
450 |
|
451 |
-
// Include
|
452 |
wp_enqueue_script( 'jquery.scrollTo', AI1EC_JS_URL . '/jquery.scrollTo-min.js', array( 'jquery' ), 1 );
|
|
|
453 |
// Include element selector function
|
454 |
wp_enqueue_script( 'ai1ec-element-selector', AI1EC_JS_URL . '/element-selector.js', array( 'jquery', 'jquery.scrollTo' ), 1 );
|
455 |
// Include custom script
|
456 |
-
wp_enqueue_script( 'ai1ec-calendar', AI1EC_JS_URL . '/calendar.js', array( 'jquery', 'jquery.scrollTo' ), 1 );
|
457 |
|
458 |
$data = array(
|
459 |
// Point script to AJAX URL
|
47 |
if( basename( $_SERVER['SCRIPT_NAME'] ) == 'admin-ajax.php' )
|
48 |
{
|
49 |
add_action( 'wp_ajax_ai1ec_month', array( &$this, 'ajax_month' ) );
|
50 |
+
add_action( 'wp_ajax_ai1ec_week', array( &$this, 'ajax_week' ) );
|
51 |
add_action( 'wp_ajax_ai1ec_agenda', array( &$this, 'ajax_agenda' ) );
|
52 |
+
add_action( 'wp_ajax_ai1ec_term_filter', array( &$this, 'ajax_term_filter' ) );
|
53 |
+
|
54 |
add_action( 'wp_ajax_nopriv_ai1ec_month', array( &$this, 'ajax_month' ) );
|
55 |
+
add_action( 'wp_ajax_nopriv_ai1ec_week', array( &$this, 'ajax_week' ) );
|
56 |
add_action( 'wp_ajax_nopriv_ai1ec_agenda', array( &$this, 'ajax_agenda' ) );
|
|
|
57 |
add_action( 'wp_ajax_nopriv_ai1ec_term_filter', array( &$this, 'ajax_term_filter' ) );
|
58 |
}
|
59 |
}
|
75 |
// object
|
76 |
$this->request['action'] = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
|
77 |
if( ! in_array( $this->request['action'],
|
78 |
+
array( 'ai1ec_month', 'ai1ec_week', 'ai1ec_agenda', 'ai1ec_term_filter' ) ) )
|
79 |
$this->request['action'] = 'ai1ec_' . $ai1ec_settings->default_calendar_view;
|
80 |
|
81 |
switch( $this->request['action'] )
|
82 |
{
|
83 |
case 'ai1ec_month':
|
84 |
$this->request['ai1ec_month_offset'] =
|
85 |
+
isset( $_REQUEST['ai1ec_month_offset'] ) ? intval( $_REQUEST['ai1ec_month_offset'] ) : 0;
|
|
|
86 |
// Parse active event parameter as an integer ID
|
87 |
+
$this->request['ai1ec_active_event'] = isset( $_REQUEST['ai1ec_active_event'] ) ? intval( $_REQUEST['ai1ec_active_event'] ) : null;
|
88 |
// Category/tag filter parameters
|
89 |
+
$this->request['ai1ec_cat_ids'] = isset( $_REQUEST['ai1ec_cat_ids'] ) ? $_REQUEST['ai1ec_cat_ids'] : null;
|
90 |
+
$this->request['ai1ec_tag_ids'] = isset( $_REQUEST['ai1ec_tag_ids'] ) ? $_REQUEST['ai1ec_tag_ids'] : null;
|
91 |
+
$this->request['ai1ec_post_ids'] = isset( $_REQUEST['ai1ec_post_ids'] ) ? $_REQUEST['ai1ec_post_ids'] : null;
|
92 |
+
break;
|
93 |
+
|
94 |
+
case 'ai1ec_week':
|
95 |
+
$this->request['ai1ec_week_offset'] =
|
96 |
+
isset( $_REQUEST['ai1ec_week_offset'] ) ? intval( $_REQUEST['ai1ec_week_offset'] ) : 0;
|
97 |
+
// Parse active event parameter as an integer ID
|
98 |
+
$this->request['ai1ec_active_event'] = isset( $_REQUEST['ai1ec_active_event'] ) ? intval( $_REQUEST['ai1ec_active_event'] ) : null;
|
99 |
+
// Category/tag filter parameters
|
100 |
+
$this->request['ai1ec_cat_ids'] = isset( $_REQUEST['ai1ec_cat_ids'] ) ? $_REQUEST['ai1ec_cat_ids'] : null;
|
101 |
+
$this->request['ai1ec_tag_ids'] = isset( $_REQUEST['ai1ec_tag_ids'] ) ? $_REQUEST['ai1ec_tag_ids'] : null;
|
102 |
+
$this->request['ai1ec_post_ids'] = isset( $_REQUEST['ai1ec_post_ids'] ) ? $_REQUEST['ai1ec_post_ids'] : null;
|
103 |
break;
|
104 |
|
105 |
case 'ai1ec_agenda':
|
106 |
$this->request['ai1ec_page_offset'] =
|
107 |
+
isset( $_REQUEST['ai1ec_page_offset'] ) ? intval( $_REQUEST['ai1ec_page_offset'] ) : 0;
|
|
|
108 |
// Parse active event parameter as an integer ID
|
109 |
+
$this->request['ai1ec_active_event'] = isset( $_REQUEST['ai1ec_active_event'] ) ? intval( $_REQUEST['ai1ec_active_event'] ) : null;
|
110 |
// Category/tag filter parameters
|
111 |
+
$this->request['ai1ec_cat_ids'] = isset( $_REQUEST['ai1ec_cat_ids'] ) ? $_REQUEST['ai1ec_cat_ids'] : null;
|
112 |
+
$this->request['ai1ec_tag_ids'] = isset( $_REQUEST['ai1ec_tag_ids'] ) ? $_REQUEST['ai1ec_tag_ids'] : null;
|
113 |
+
$this->request['ai1ec_post_ids'] = isset( $_REQUEST['ai1ec_post_ids'] ) ? $_REQUEST['ai1ec_post_ids'] : null;
|
114 |
break;
|
115 |
|
116 |
case 'ai1ec_term_filter':
|
117 |
+
$this->request['ai1ec_post_ids'] = isset( $_REQUEST['ai1ec_post_ids'] ) ? $_REQUEST['ai1ec_post_ids'] : null;
|
118 |
+
$this->request['ai1ec_term_ids'] = isset( $_REQUEST['ai1ec_term_ids'] ) ? $_REQUEST['ai1ec_term_ids'] : null;
|
119 |
break;
|
120 |
}
|
121 |
}
|
156 |
$this->load_css();
|
157 |
$this->load_js();
|
158 |
|
159 |
+
$post_ids = array_filter( explode( ',', $this->request['ai1ec_post_ids'] ), 'is_numeric' );
|
160 |
// Define arguments for specific calendar sub-view (month, agenda, etc.)
|
161 |
$args = array(
|
162 |
'active_event' => $this->request['ai1ec_active_event'],
|
163 |
+
'post_ids' => $post_ids,
|
164 |
);
|
165 |
|
166 |
// Find out which view of the calendar page was requested
|
171 |
$view = $this->get_month_view( $args );
|
172 |
break;
|
173 |
|
174 |
+
case 'ai1ec_week':
|
175 |
+
$args['week_offset'] = $this->request['ai1ec_week_offset'];
|
176 |
+
$view = $this->get_week_view( $args );
|
177 |
+
break;
|
178 |
+
|
179 |
case 'ai1ec_agenda':
|
180 |
$args['page_offset'] = $this->request['ai1ec_page_offset'];
|
181 |
$view = $this->get_agenda_view( $args );
|
187 |
else
|
188 |
$create_event_url = false;
|
189 |
|
190 |
+
// Validate preselected category/tag/post IDs
|
191 |
+
$cat_ids = join( ',', array_filter( explode( ',', $this->request['ai1ec_cat_ids'] ), 'is_numeric' ) );
|
192 |
+
$tag_ids = join( ',', array_filter( explode( ',', $this->request['ai1ec_tag_ids'] ), 'is_numeric' ) );
|
193 |
+
$post_ids = join( ',', $post_ids );
|
194 |
|
195 |
$categories = get_terms( 'events_categories', array( 'orderby' => 'name' ) );
|
196 |
foreach( $categories as &$cat ) {
|
204 |
'tags' => get_terms( 'events_tags', array( 'orderby' => 'name' ) ),
|
205 |
'selected_cat_ids' => $cat_ids,
|
206 |
'selected_tag_ids' => $tag_ids,
|
207 |
+
'selected_post_ids' => $post_ids,
|
208 |
'show_subscribe_buttons' => ! $ai1ec_settings->turn_off_subscription_buttons
|
209 |
);
|
210 |
|
227 |
* event category slugs
|
228 |
* array tags => restrict events returned to the given set of
|
229 |
* event tag names
|
230 |
+
* array post_ids => restrict events returned to the given set of
|
231 |
+
* post IDs
|
232 |
*
|
233 |
* @return string returns string of view output
|
234 |
**/
|
240 |
|
241 |
$defaults = array(
|
242 |
'month_offset' => 0,
|
243 |
+
'active_event' => null,
|
244 |
'categories' => array(),
|
245 |
+
'tags' => array(),
|
246 |
+
'post_ids' => array(),
|
247 |
);
|
248 |
$args = wp_parse_args( $args, $defaults );
|
249 |
+
|
250 |
extract( $args );
|
251 |
|
252 |
// Get components of localized time
|
254 |
// Use first day of the month as reference timestamp, and apply month offset
|
255 |
$timestamp = gmmktime( 0, 0, 0, $bits['mon'] + $month_offset, 1, $bits['year'] );
|
256 |
|
257 |
+
$days_events = $ai1ec_calendar_helper->get_events_for_month( $timestamp,
|
258 |
+
array( 'cat_ids' => $categories, 'cat_ids' => $tags, 'post_ids' => $post_ids ) );
|
259 |
$cell_array = $ai1ec_calendar_helper->get_month_cell_array( $timestamp, $days_events );
|
260 |
$pagination_links = $ai1ec_calendar_helper->get_month_pagination_links( $month_offset );
|
261 |
|
262 |
$view_args = array(
|
263 |
+
'title' => date_i18n( 'F Y', $timestamp, true ),
|
264 |
+
'weekdays' => $ai1ec_calendar_helper->get_weekdays(),
|
265 |
+
'cell_array' => $cell_array,
|
266 |
'pagination_links' => $pagination_links,
|
267 |
+
'active_event' => $active_event,
|
268 |
+
'post_ids' => join( ',', $post_ids ),
|
269 |
);
|
270 |
return apply_filters( 'ai1ec_get_month_view', $ai1ec_view_helper->get_view( 'month.php', $view_args ), $view_args );
|
271 |
}
|
272 |
|
273 |
+
/**
|
274 |
+
* get_week_view function
|
275 |
+
*
|
276 |
+
* Return the embedded week view of the calendar, optionally filtered by
|
277 |
+
* event categories and tags.
|
278 |
+
*
|
279 |
+
* @param array $args associative array with any of these elements:
|
280 |
+
* int week_offset => specifies which week to display relative to the
|
281 |
+
* current week
|
282 |
+
* int active_event => specifies which event to make visible when
|
283 |
+
* page is loaded
|
284 |
+
* array categories => restrict events returned to the given set of
|
285 |
+
* event category slugs
|
286 |
+
* array tags => restrict events returned to the given set of
|
287 |
+
* event tag names
|
288 |
+
* array post_ids => restrict events returned to the given set of
|
289 |
+
* post IDs
|
290 |
+
*
|
291 |
+
* @return string returns string of view output
|
292 |
+
*/
|
293 |
+
function get_week_view( $args )
|
294 |
+
{
|
295 |
+
global $ai1ec_view_helper,
|
296 |
+
$ai1ec_events_helper,
|
297 |
+
$ai1ec_calendar_helper;
|
298 |
+
|
299 |
+
$defaults = array(
|
300 |
+
'week_offset' => 0,
|
301 |
+
'active_event' => null,
|
302 |
+
'categories' => array(),
|
303 |
+
'tags' => array(),
|
304 |
+
'post_ids' => array(),
|
305 |
+
);
|
306 |
+
$args = wp_parse_args( $args, $defaults );
|
307 |
+
|
308 |
+
extract( $args );
|
309 |
+
|
310 |
+
// Get components of localized time
|
311 |
+
$bits = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( time() ) );
|
312 |
+
// Day shift is initially the first day of the week according to settings
|
313 |
+
$day_shift = $ai1ec_events_helper->get_week_start_day_offset( $bits['wday'] );
|
314 |
+
// Then apply week offset
|
315 |
+
$day_shift += $args['week_offset'] * 7;
|
316 |
+
|
317 |
+
// Now apply to reference timestamp
|
318 |
+
$timestamp = gmmktime( 0, 0, 0, $bits['mon'], $bits['mday'] + $day_shift, $bits['year'] );
|
319 |
+
|
320 |
+
$cell_array = $ai1ec_calendar_helper->get_week_cell_array( $timestamp,
|
321 |
+
array( 'cat_ids' => $categories, 'cat_ids' => $tags, 'post_ids' => $post_ids ) );
|
322 |
+
$pagination_links = $ai1ec_calendar_helper->get_week_pagination_links( $week_offset );
|
323 |
+
|
324 |
+
$view_args = array(
|
325 |
+
'title' => sprintf( __( 'Week of %s', AI1EC_PLUGIN_NAME ), date_i18n( __( 'F j' ), $timestamp, true ) ),
|
326 |
+
'cell_array' => $cell_array,
|
327 |
+
'now_top' => $bits['hours'] * 60 + $bits['minutes'],
|
328 |
+
'pagination_links' => $pagination_links,
|
329 |
+
'active_event' => $active_event,
|
330 |
+
'post_ids' => join( ',', $post_ids ),
|
331 |
+
'done_allday_label' => false,
|
332 |
+
'done_grid' => false
|
333 |
+
);
|
334 |
+
return apply_filters( 'ai1ec_get_week_view', $ai1ec_view_helper->get_view( 'week.php', $view_args ), $view_args );
|
335 |
+
}
|
336 |
+
|
337 |
/**
|
338 |
* get_agenda_view function
|
339 |
*
|
367 |
$event_results = $ai1ec_calendar_helper->get_events_relative_to(
|
368 |
$timestamp,
|
369 |
$ai1ec_settings->agenda_events_per_page,
|
370 |
+
$page_offset,
|
371 |
+
array( 'post_ids' => $post_ids )
|
372 |
);
|
373 |
$dates = $ai1ec_calendar_helper->get_agenda_date_array( $event_results['events'] );
|
374 |
|
383 |
'page_offset' => $page_offset,
|
384 |
'pagination_links' => $pagination_links,
|
385 |
'active_event' => $active_event,
|
386 |
+
'expanded' => $ai1ec_settings->agenda_events_expanded,
|
387 |
+
'post_ids' => join( ',', $post_ids ),
|
388 |
);
|
389 |
return apply_filters( 'ai1ec_get_agenda_view', $ai1ec_view_helper->get_view( 'agenda.php', $args ), $args );
|
390 |
}
|
395 |
* AJAX request handler for month view.
|
396 |
*
|
397 |
* @return void
|
398 |
+
*/
|
399 |
function ajax_month() {
|
400 |
global $ai1ec_view_helper;
|
401 |
|
405 |
$args = array(
|
406 |
'month_offset' => $this->request['ai1ec_month_offset'],
|
407 |
'active_event' => $this->request['ai1ec_active_event'],
|
408 |
+
'post_ids' => array_filter( explode( ',', $this->request['ai1ec_post_ids'] ), 'is_numeric' ),
|
409 |
);
|
410 |
|
411 |
// Return this data structure to the client
|
416 |
$ai1ec_view_helper->json_response( $data );
|
417 |
}
|
418 |
|
419 |
+
/**
|
420 |
+
* ajax_week function
|
421 |
+
*
|
422 |
+
* AJAX request handler for week view.
|
423 |
+
*
|
424 |
+
* @return void
|
425 |
+
*/
|
426 |
+
function ajax_week() {
|
427 |
+
global $ai1ec_view_helper;
|
428 |
+
|
429 |
+
$this->process_request();
|
430 |
+
|
431 |
+
// View arguments
|
432 |
+
$args = array(
|
433 |
+
'week_offset' => $this->request['ai1ec_week_offset'],
|
434 |
+
'active_event' => $this->request['ai1ec_active_event'],
|
435 |
+
'post_ids' => array_filter( explode( ',', $this->request['ai1ec_post_ids'] ), 'is_numeric' ),
|
436 |
+
);
|
437 |
+
|
438 |
+
// Return this data structure to the client
|
439 |
+
$data = array(
|
440 |
+
'body_class' => join( ' ', $this->body_class() ),
|
441 |
+
'html' => $this->get_week_view( $args ),
|
442 |
+
);
|
443 |
+
$ai1ec_view_helper->json_response( $data );
|
444 |
+
}
|
445 |
+
|
446 |
/**
|
447 |
* ajax_agenda function
|
448 |
*
|
457 |
|
458 |
// View arguments
|
459 |
$args = array(
|
460 |
+
'page_offset' => $this->request['ai1ec_page_offset'],
|
461 |
'active_event' => $this->request['ai1ec_active_event'],
|
462 |
+
'post_ids' => array_filter( explode( ',', $this->request['ai1ec_post_ids'] ), 'is_numeric' ),
|
463 |
);
|
464 |
|
465 |
// Return this data structure to the client
|
571 |
{
|
572 |
global $ai1ec_settings;
|
573 |
|
574 |
+
// Include dependent jQuery plugins
|
575 |
wp_enqueue_script( 'jquery.scrollTo', AI1EC_JS_URL . '/jquery.scrollTo-min.js', array( 'jquery' ), 1 );
|
576 |
+
wp_enqueue_script( 'jquery.tableScroll', AI1EC_JS_URL . '/jquery.tablescroll.js', array( 'jquery' ), 1 );
|
577 |
// Include element selector function
|
578 |
wp_enqueue_script( 'ai1ec-element-selector', AI1EC_JS_URL . '/element-selector.js', array( 'jquery', 'jquery.scrollTo' ), 1 );
|
579 |
// Include custom script
|
580 |
+
wp_enqueue_script( 'ai1ec-calendar', AI1EC_JS_URL . '/calendar.js', array( 'jquery', 'jquery.scrollTo', 'jquery.tableScroll' ), 1 );
|
581 |
|
582 |
$data = array(
|
583 |
// Point script to AJAX URL
|
app/helper/class-ai1ec-app-helper.php
CHANGED
@@ -570,7 +570,9 @@ class Ai1ec_App_Helper {
|
|
570 |
if( $term->term_id == AI1EC_FAKE_CATEGORY_ID )
|
571 |
$link = $ai1ec_calendar_helper->get_calendar_url( null );
|
572 |
else
|
573 |
-
$link = $ai1ec_calendar_helper->get_calendar_url( null,
|
|
|
|
|
574 |
}
|
575 |
|
576 |
return $link;
|
570 |
if( $term->term_id == AI1EC_FAKE_CATEGORY_ID )
|
571 |
$link = $ai1ec_calendar_helper->get_calendar_url( null );
|
572 |
else
|
573 |
+
$link = $ai1ec_calendar_helper->get_calendar_url( null,
|
574 |
+
array( 'cat_ids' => array( $term->term_id ) )
|
575 |
+
);
|
576 |
}
|
577 |
|
578 |
return $link;
|
app/helper/class-ai1ec-calendar-helper.php
CHANGED
@@ -47,17 +47,19 @@ class Ai1ec_Calendar_Helper {
|
|
47 |
/**
|
48 |
* get_events_for_month function
|
49 |
*
|
50 |
-
* Return an array of all dates for the
|
51 |
* array, with each element's value being another array of event objects
|
52 |
* representing the events occuring on that date.
|
53 |
*
|
54 |
* @param int $time the UNIX timestamp of a date within the desired month
|
55 |
-
* @param array $
|
56 |
-
*
|
|
|
|
|
57 |
*
|
58 |
* @return array array of arrays as per function description
|
59 |
**/
|
60 |
-
function get_events_for_month( $time, $
|
61 |
{
|
62 |
global $ai1ec_events_helper;
|
63 |
|
@@ -66,29 +68,30 @@ class Ai1ec_Calendar_Helper {
|
|
66 |
$bits = $ai1ec_events_helper->gmgetdate( $time );
|
67 |
$last_day = gmdate( 't', $time );
|
68 |
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
|
74 |
// ==========================================
|
75 |
// = Iterate through each date of the month =
|
76 |
// ==========================================
|
77 |
for( $day = 1; $day <= $last_day; $day++ )
|
78 |
-
|
79 |
-
|
80 |
$start_time = gmmktime( 0, 0, 0, $bits['mon'], $day, $bits['year'] );
|
81 |
$end_time = gmmktime( 0, 0, 0, $bits['mon'], $day + 1, $bits['year'] );
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
|
|
89 |
}
|
90 |
|
91 |
-
return apply_filters( 'ai1ec_get_events_for_month', $days_events, $time, $
|
92 |
}
|
93 |
|
94 |
/**
|
@@ -96,7 +99,8 @@ class Ai1ec_Calendar_Helper {
|
|
96 |
*
|
97 |
* Return an array of weeks, each containing an array of days, each
|
98 |
* containing the date for the day ['date'] (if inside the month) and
|
99 |
-
* the events ['events'] (if any) for the day
|
|
|
100 |
*
|
101 |
* @param int $timestamp UNIX timestamp of the 1st day of the desired
|
102 |
* month to display
|
@@ -142,9 +146,9 @@ class Ai1ec_Calendar_Helper {
|
|
142 |
'today' =>
|
143 |
$bits['year'] == $today['year'] &&
|
144 |
$bits['mon'] == $today['mon'] &&
|
145 |
-
|
146 |
'events' => $days_events[$i]
|
147 |
-
|
148 |
// If reached the end of the week, increment week
|
149 |
if( count( $weeks[$week] ) == 7 )
|
150 |
$week++;
|
@@ -158,69 +162,172 @@ class Ai1ec_Calendar_Helper {
|
|
158 |
return $weeks;
|
159 |
}
|
160 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
161 |
/**
|
162 |
* get_events_between function
|
163 |
*
|
164 |
* Return all events starting after the given start time and before the
|
165 |
-
* given end time
|
166 |
-
*
|
167 |
-
*
|
168 |
-
*
|
169 |
-
* @param int $
|
170 |
-
* @param
|
171 |
-
*
|
172 |
-
*
|
173 |
-
*
|
|
|
|
|
|
|
|
|
174 |
**/
|
175 |
-
function get_events_between( $start_time, $end_time, $
|
176 |
-
|
|
|
177 |
|
178 |
// Convert timestamps to MySQL format in GMT time
|
179 |
$start_time = $ai1ec_events_helper->local_to_gmt( $start_time );
|
180 |
$end_time = $ai1ec_events_helper->local_to_gmt( $end_time );
|
181 |
|
182 |
// Query arguments
|
183 |
-
$args = array(
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
$args[] = 'private';
|
192 |
-
}
|
193 |
-
else if( is_user_logged_in() ) {
|
194 |
-
// get user info
|
195 |
-
get_currentuserinfo();
|
196 |
-
|
197 |
-
/**
|
198 |
-
* include post_status = published
|
199 |
-
* or
|
200 |
-
* post_status = private and author = logged in user
|
201 |
-
*/
|
202 |
-
$post_status = "AND " .
|
203 |
-
"( " .
|
204 |
-
"post_status = %s " .
|
205 |
-
|
206 |
-
"OR " .
|
207 |
-
|
208 |
-
"( " .
|
209 |
-
"post_status = %s " .
|
210 |
-
|
211 |
-
"AND " .
|
212 |
-
|
213 |
-
"post_author = %d " .
|
214 |
-
") " .
|
215 |
-
") ";
|
216 |
-
|
217 |
-
$args[] = 'publish';
|
218 |
-
$args[] = 'private';
|
219 |
-
$args[] = $current_user->ID;
|
220 |
-
} else {
|
221 |
-
$post_status = "AND post_status = %s ";
|
222 |
-
$args[] = 'publish';
|
223 |
-
}
|
224 |
|
225 |
$query = $wpdb->prepare(
|
226 |
"SELECT p.*, e.post_id, i.id AS instance_id, " .
|
@@ -235,10 +342,13 @@ class Ai1ec_Calendar_Helper {
|
|
235 |
"FROM {$wpdb->prefix}ai1ec_events e " .
|
236 |
"INNER JOIN $wpdb->posts p ON p.ID = e.post_id " .
|
237 |
"INNER JOIN {$wpdb->prefix}ai1ec_event_instances i ON e.post_id = i.post_id " .
|
|
|
238 |
"WHERE post_type = '" . AI1EC_POST_TYPE . "' " .
|
239 |
-
"AND
|
240 |
-
|
241 |
-
|
|
|
|
|
242 |
"ORDER BY allday DESC, i.start ASC, post_title ASC",
|
243 |
$args );
|
244 |
|
@@ -261,9 +371,10 @@ class Ai1ec_Calendar_Helper {
|
|
261 |
* @param int $time limit to events starting after this (local) UNIX time
|
262 |
* @param int $limit return a maximum of this number of items
|
263 |
* @param int $page_offset offset the result set by $limit times this number
|
264 |
-
* @param array $filter Array of filters for the events returned.
|
265 |
-
*
|
266 |
-
*
|
|
|
267 |
*
|
268 |
* @return array three-element array:
|
269 |
* ['events'] an array of matching event objects
|
@@ -271,7 +382,8 @@ class Ai1ec_Calendar_Helper {
|
|
271 |
* ['next'] true if more next events
|
272 |
**/
|
273 |
function get_events_relative_to( $time, $limit = 0, $page_offset = 0, $filter = array() ) {
|
274 |
-
|
|
|
275 |
|
276 |
// Figure out what the beginning of the day is to properly query all-day
|
277 |
// events; then convert to GMT time
|
@@ -287,47 +399,14 @@ class Ai1ec_Calendar_Helper {
|
|
287 |
$first_record = $page_offset * $limit;
|
288 |
else
|
289 |
$first_record = ( -$page_offset - 1 ) * $limit;
|
290 |
-
|
291 |
-
// administrators and editors can see private posts
|
292 |
-
if( current_user_can( 'administrator' ) || current_user_can( 'editor' ) ) {
|
293 |
-
$post_status = "AND ( post_status = %s OR post_status = %s ) ";
|
294 |
-
$args[] = 'publish';
|
295 |
-
$args[] = 'private';
|
296 |
-
}
|
297 |
-
else if( is_user_logged_in() ) {
|
298 |
-
// get user info
|
299 |
-
get_currentuserinfo();
|
300 |
-
|
301 |
-
/**
|
302 |
-
* include post_status = published
|
303 |
-
* or
|
304 |
-
* post_status = private and author = logged in user
|
305 |
-
*/
|
306 |
-
$post_status = "AND " .
|
307 |
-
"( " .
|
308 |
-
"post_status = %s " .
|
309 |
-
|
310 |
-
"OR " .
|
311 |
-
|
312 |
-
"( " .
|
313 |
-
"post_status = %s " .
|
314 |
|
315 |
-
|
|
|
316 |
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
|
321 |
-
$args[] = 'publish';
|
322 |
-
$args[] = 'private';
|
323 |
-
$args[] = $current_user->ID;
|
324 |
-
} else {
|
325 |
-
$post_status = "AND post_status = %s ";
|
326 |
-
$args[] = 'publish';
|
327 |
-
}
|
328 |
-
|
329 |
-
// Get the Join (filter_join) and Where (filter_where) statements based on $filter elements specified
|
330 |
-
$filter = $this->_get_filter_sql( $filter );
|
331 |
$query = $wpdb->prepare(
|
332 |
"SELECT SQL_CALC_FOUND_ROWS p.*, e.post_id, i.id AS instance_id, " .
|
333 |
"UNIX_TIMESTAMP( i.start ) AS start, " .
|
@@ -348,7 +427,7 @@ class Ai1ec_Calendar_Helper {
|
|
348 |
: "i.start < FROM_UNIXTIME( %d ) "
|
349 |
) .
|
350 |
$filter['filter_where'] .
|
351 |
-
$
|
352 |
// Reverse order when viewing negative pages, to get correct set of
|
353 |
// records. Then reverse results later to order them properly.
|
354 |
"ORDER BY i.start " . ( $page_offset >= 0 ? 'ASC' : 'DESC' ) .
|
@@ -358,7 +437,7 @@ class Ai1ec_Calendar_Helper {
|
|
358 |
|
359 |
$events = $wpdb->get_results( $query, ARRAY_A );
|
360 |
|
361 |
-
//
|
362 |
if( $page_offset < 0 ) $events = array_reverse( $events );
|
363 |
|
364 |
foreach( $events as &$event ) {
|
@@ -383,11 +462,13 @@ class Ai1ec_Calendar_Helper {
|
|
383 |
$query = $wpdb->prepare(
|
384 |
"SELECT COUNT(*) " .
|
385 |
"FROM {$wpdb->prefix}ai1ec_events e " .
|
386 |
-
|
387 |
-
|
|
|
388 |
"WHERE post_type = '" . AI1EC_POST_TYPE . "' " .
|
389 |
"AND i.start < FROM_UNIXTIME( %d ) " .
|
390 |
-
|
|
|
391 |
$args );
|
392 |
$prev = $wpdb->get_var( $query );
|
393 |
$next = $more;
|
@@ -445,16 +526,17 @@ class Ai1ec_Calendar_Helper {
|
|
445 |
*
|
446 |
* Returns the URL of the configured calendar page in the default view,
|
447 |
* optionally preloaded at the month containing the given event (rather than
|
448 |
-
* today's date), and optionally prefiltered by the given
|
449 |
-
* tag IDs.
|
450 |
*
|
451 |
-
* @param object|null $event
|
452 |
-
* @param array
|
453 |
-
*
|
|
|
|
|
454 |
*
|
455 |
* @return string The URL for this calendar
|
456 |
**/
|
457 |
-
function get_calendar_url( $event = null, $
|
458 |
global $ai1ec_settings, $ai1ec_events_helper, $ai1ec_app_helper, $wpdb;
|
459 |
|
460 |
$url = get_permalink( $ai1ec_settings->calendar_page_id );
|
@@ -470,12 +552,25 @@ class Ai1ec_Calendar_Helper {
|
|
470 |
$today = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( time() ) );
|
471 |
$desired = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( $event->start ) );
|
472 |
$month_offset =
|
473 |
-
|
474 |
$desired['mon'] - $today['mon'];
|
475 |
|
476 |
$url .= "ai1ec_month_offset=$month_offset";
|
477 |
break;
|
478 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
479 |
case 'agenda':
|
480 |
// Find out how many event instances are between today's first
|
481 |
// instance and the desired event's instance
|
@@ -505,12 +600,13 @@ class Ai1ec_Calendar_Helper {
|
|
505 |
$url .= "&ai1ec_active_event=$event->post_id";
|
506 |
}
|
507 |
|
508 |
-
|
509 |
-
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
|
|
514 |
|
515 |
return $url;
|
516 |
}
|
@@ -528,7 +624,7 @@ class Ai1ec_Calendar_Helper {
|
|
528 |
static $weekdays;
|
529 |
|
530 |
if( ! isset( $weekdays ) )
|
531 |
-
|
532 |
$time = strtotime( 'next Sunday' );
|
533 |
$time = strtotime( "+{$ai1ec_settings->week_start_day} days", $time );
|
534 |
|
@@ -544,7 +640,7 @@ class Ai1ec_Calendar_Helper {
|
|
544 |
/**
|
545 |
* get_month_pagination_links function
|
546 |
*
|
547 |
-
* Returns
|
548 |
* calendar:
|
549 |
* previous year, previous month, next month, and next year, in that order.
|
550 |
* Each element's key is an associative array containing the link's ID
|
@@ -589,6 +685,53 @@ class Ai1ec_Calendar_Helper {
|
|
589 |
return $links;
|
590 |
}
|
591 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
592 |
/**
|
593 |
* get_agenda_pagination_links function
|
594 |
*
|
@@ -627,29 +770,83 @@ class Ai1ec_Calendar_Helper {
|
|
627 |
return $links;
|
628 |
}
|
629 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
630 |
/**
|
631 |
* _get_filter_sql function
|
632 |
*
|
633 |
* Takes an array of filtering options and turns it into JOIN and WHERE statements
|
634 |
* for running an SQL query limited to the specified options
|
635 |
*
|
636 |
-
* @param array
|
637 |
* ['cat_ids'] => non-associatative array of category IDs
|
638 |
* ['tag_ids'] => non-associatative array of tag IDs
|
639 |
* ['post_ids'] => non-associatative array of event post IDs
|
640 |
-
*
|
641 |
-
* @return array Returns the same $filter array modified to have:
|
642 |
* ['filter_join'] the Join statements for the SQL
|
643 |
* ['filter_where'] the Where statements for the SQL
|
644 |
-
|
645 |
-
|
|
|
|
|
646 |
global $wpdb;
|
647 |
|
648 |
// Set up the filter join and where strings
|
649 |
$filter['filter_join'] = '';
|
650 |
$filter['filter_where'] = '';
|
651 |
|
652 |
-
// By default open the Where with an AND ( .. ) to group all statements.
|
|
|
653 |
// TODO - make this cleaner by supporting the choice of AND/OR logic
|
654 |
$where_logic = ' AND (';
|
655 |
|
@@ -681,11 +878,9 @@ class Ai1ec_Calendar_Helper {
|
|
681 |
}
|
682 |
|
683 |
// Close the Where statement bracket if any Where statements were set
|
684 |
-
if( $filter['filter_where'] != '') {
|
685 |
$filter['filter_where'] .= ' ) ';
|
686 |
}
|
687 |
-
|
688 |
-
return $filter;
|
689 |
-
}
|
690 |
}
|
691 |
// END class
|
47 |
/**
|
48 |
* get_events_for_month function
|
49 |
*
|
50 |
+
* Return an array of all dates for the given month as an associative
|
51 |
* array, with each element's value being another array of event objects
|
52 |
* representing the events occuring on that date.
|
53 |
*
|
54 |
* @param int $time the UNIX timestamp of a date within the desired month
|
55 |
+
* @param array $filter Array of filters for the events returned:
|
56 |
+
* ['cat_ids'] => non-associatative array of category IDs
|
57 |
+
* ['tag_ids'] => non-associatative array of tag IDs
|
58 |
+
* ['post_ids'] => non-associatative array of post IDs
|
59 |
*
|
60 |
* @return array array of arrays as per function description
|
61 |
**/
|
62 |
+
function get_events_for_month( $time, $filter = array() )
|
63 |
{
|
64 |
global $ai1ec_events_helper;
|
65 |
|
68 |
$bits = $ai1ec_events_helper->gmgetdate( $time );
|
69 |
$last_day = gmdate( 't', $time );
|
70 |
|
71 |
+
$start_time = gmmktime( 0, 0, 0, $bits['mon'], 1, $bits['year'] );
|
72 |
+
$end_time = gmmktime( 0, 0, 0, $bits['mon'], $last_day + 1, $bits['year'] );
|
73 |
+
|
74 |
+
$month_events = $this->get_events_between( $start_time, $end_time, $filter );
|
75 |
|
76 |
// ==========================================
|
77 |
// = Iterate through each date of the month =
|
78 |
// ==========================================
|
79 |
for( $day = 1; $day <= $last_day; $day++ )
|
80 |
+
{
|
81 |
+
$_events = array();
|
82 |
$start_time = gmmktime( 0, 0, 0, $bits['mon'], $day, $bits['year'] );
|
83 |
$end_time = gmmktime( 0, 0, 0, $bits['mon'], $day + 1, $bits['year'] );
|
84 |
+
|
85 |
+
// Itemize events that fall under the current day
|
86 |
+
foreach( $month_events as $event ) {
|
87 |
+
$event_start = $ai1ec_events_helper->gmt_to_local( $event->start );
|
88 |
+
if( $event_start >= $start_time && $event_start < $end_time )
|
89 |
+
$_events[] = $event;
|
90 |
+
}
|
91 |
+
$days_events[$day] = $_events;
|
92 |
}
|
93 |
|
94 |
+
return apply_filters( 'ai1ec_get_events_for_month', $days_events, $time, $filter );
|
95 |
}
|
96 |
|
97 |
/**
|
99 |
*
|
100 |
* Return an array of weeks, each containing an array of days, each
|
101 |
* containing the date for the day ['date'] (if inside the month) and
|
102 |
+
* the events ['events'] (if any) for the day, and a boolean ['today']
|
103 |
+
* indicating whether that day is today.
|
104 |
*
|
105 |
* @param int $timestamp UNIX timestamp of the 1st day of the desired
|
106 |
* month to display
|
146 |
'today' =>
|
147 |
$bits['year'] == $today['year'] &&
|
148 |
$bits['mon'] == $today['mon'] &&
|
149 |
+
$i == $today['mday'],
|
150 |
'events' => $days_events[$i]
|
151 |
+
);
|
152 |
// If reached the end of the week, increment week
|
153 |
if( count( $weeks[$week] ) == 7 )
|
154 |
$week++;
|
162 |
return $weeks;
|
163 |
}
|
164 |
|
165 |
+
/**
|
166 |
+
* get_week_cell_array function
|
167 |
+
*
|
168 |
+
* Return an associative array of weekdays, indexed by the day's date,
|
169 |
+
* starting the day given by $timestamp, each element an associative array
|
170 |
+
* containing three elements:
|
171 |
+
* ['today'] => whether the day is today
|
172 |
+
* ['allday'] => non-associative ordered array of events that are all-day
|
173 |
+
* ['notallday'] => non-associative ordered array of non-all-day events to
|
174 |
+
* display for that day, each element another associative
|
175 |
+
* array like so:
|
176 |
+
* ['top'] => how many minutes offset from the start of the day
|
177 |
+
* ['height'] => how many minutes this event spans
|
178 |
+
* ['indent'] => how much to indent this event to accommodate multiple
|
179 |
+
* events occurring at the same time (0, 1, 2, etc., to
|
180 |
+
* be multiplied by whatever desired px/em amount)
|
181 |
+
* ['event'] => event data object
|
182 |
+
*
|
183 |
+
* @param int $timestamp the UNIX timestamp of the first day of the week
|
184 |
+
* @param array $filter Array of filters for the events returned:
|
185 |
+
* ['cat_ids'] => non-associatative array of category IDs
|
186 |
+
* ['tag_ids'] => non-associatative array of tag IDs
|
187 |
+
* ['post_ids'] => non-associatative array of post IDs
|
188 |
+
*
|
189 |
+
* @return array array of arrays as per function description
|
190 |
+
**/
|
191 |
+
function get_week_cell_array( $timestamp, $filter = array() )
|
192 |
+
{
|
193 |
+
global $ai1ec_events_helper, $ai1ec_settings;
|
194 |
+
|
195 |
+
// Decompose given date and current time into components, used below
|
196 |
+
$bits = $ai1ec_events_helper->gmgetdate( $timestamp );
|
197 |
+
$now = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( time() ) );
|
198 |
+
|
199 |
+
// Do one SQL query to find all events for the week, including spanning
|
200 |
+
$week_events = $this->get_events_between(
|
201 |
+
$timestamp,
|
202 |
+
gmmktime( 0, 0, 0, $bits['mon'], $bits['mday'] + 7, $bits['year'] ),
|
203 |
+
$filter,
|
204 |
+
true );
|
205 |
+
|
206 |
+
// Split up events on a per-day basis
|
207 |
+
$all_events = array();
|
208 |
+
foreach( $week_events as $evt ) {
|
209 |
+
$evt_start = $ai1ec_events_helper->gmt_to_local( $evt->start );
|
210 |
+
$evt_end = $ai1ec_events_helper->gmt_to_local( $evt->end );
|
211 |
+
|
212 |
+
// Iterate through each day of the week and generate new event object
|
213 |
+
// based on this one for each day that it spans
|
214 |
+
for( $day = $bits['mday']; $day < $bits['mday'] + 7; $day++ ) {
|
215 |
+
$day_start = gmmktime( 0, 0, 0, $bits['mon'], $day, $bits['year'] );
|
216 |
+
$day_end = gmmktime( 0, 0, 0, $bits['mon'], $day + 1, $bits['year'] );
|
217 |
+
|
218 |
+
// If event falls on this day, make a copy.
|
219 |
+
if( $evt_end > $day_start && $evt_start < $day_end ) {
|
220 |
+
$_evt = clone $evt;
|
221 |
+
if( $evt_start < $day_start ) {
|
222 |
+
// If event starts before this day, adjust copy's start time
|
223 |
+
$_evt->start = $ai1ec_events_helper->local_to_gmt( $day_start );
|
224 |
+
$_evt->start_truncated = true;
|
225 |
+
}
|
226 |
+
if( $evt_end > $day_end ) {
|
227 |
+
// If event ends after this day, adjust copy's end time
|
228 |
+
$_evt->end = $ai1ec_events_helper->local_to_gmt( $day_end );
|
229 |
+
$_evt->end_truncated = true;
|
230 |
+
}
|
231 |
+
|
232 |
+
// Place copy of event in appropriate category
|
233 |
+
if( $_evt->allday )
|
234 |
+
$all_events[$day_start]['allday'][] = $_evt;
|
235 |
+
else
|
236 |
+
$all_events[$day_start]['notallday'][] = $_evt;
|
237 |
+
}
|
238 |
+
}
|
239 |
+
}
|
240 |
+
|
241 |
+
// This will store the returned array
|
242 |
+
$days = array();
|
243 |
+
// =========================================
|
244 |
+
// = Iterate through each date of the week =
|
245 |
+
// =========================================
|
246 |
+
for( $day = $bits['mday']; $day < $bits['mday'] + 7; $day++ )
|
247 |
+
{
|
248 |
+
$day_date = gmmktime( 0, 0, 0, $bits['mon'], $day, $bits['year'] );
|
249 |
+
// Re-fetch date bits, since $bits['mday'] + 7 might be in the next month
|
250 |
+
$day_bits = $ai1ec_events_helper->gmgetdate( $day_date );
|
251 |
+
|
252 |
+
// Initialize empty arrays for this day if no events to minimize warnings
|
253 |
+
if( ! isset( $all_events[$day_date]['allday'] ) ) $all_events[$day_date]['allday'] = array();
|
254 |
+
if( ! isset( $all_events[$day_date]['notallday'] ) ) $all_events[$day_date]['notallday'] = array();
|
255 |
+
|
256 |
+
$notallday = array();
|
257 |
+
$evt_stack = array( 0 ); // Stack to keep track of indentation
|
258 |
+
foreach( $all_events[$day_date]['notallday'] as $evt )
|
259 |
+
{
|
260 |
+
$start_bits = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( $evt->start ) );
|
261 |
+
|
262 |
+
// Calculate top and bottom edges of current event
|
263 |
+
$top = $start_bits['hours'] * 60 + $start_bits['minutes'];
|
264 |
+
$bottom = min( $top + $evt->getDuration() / 60, 1440 );
|
265 |
+
|
266 |
+
// While there's more than one event in the stack and this event's top
|
267 |
+
// position is beyond the last event's bottom, pop the stack
|
268 |
+
while( count( $evt_stack ) > 1 && $top >= end( $evt_stack ) )
|
269 |
+
array_pop( $evt_stack );
|
270 |
+
// Indentation is number of stacked events minus 1
|
271 |
+
$indent = count( $evt_stack ) - 1;
|
272 |
+
// Push this event onto the top of the stack
|
273 |
+
array_push( $evt_stack, $bottom );
|
274 |
+
|
275 |
+
$notallday[] = array(
|
276 |
+
'top' => $top,
|
277 |
+
'height' => $bottom - $top,
|
278 |
+
'indent' => $indent,
|
279 |
+
'event' => $evt,
|
280 |
+
);
|
281 |
+
}
|
282 |
+
|
283 |
+
$days[$day_date] = array(
|
284 |
+
'today' =>
|
285 |
+
$day_bits['year'] == $now['year'] &&
|
286 |
+
$day_bits['mon'] == $now['mon'] &&
|
287 |
+
$day_bits['mday'] == $now['mday'],
|
288 |
+
'allday' => $all_events[$day_date]['allday'],
|
289 |
+
'notallday' => $notallday,
|
290 |
+
);
|
291 |
+
}
|
292 |
+
|
293 |
+
return apply_filters( 'ai1ec_get_week_cell_array', $days, $timestamp, $filter );
|
294 |
+
}
|
295 |
+
|
296 |
/**
|
297 |
* get_events_between function
|
298 |
*
|
299 |
* Return all events starting after the given start time and before the
|
300 |
+
* given end time that the currently logged in user has permission to view.
|
301 |
+
* If $spanning is true, then also include events that span this
|
302 |
+
* period. All-day events are returned first.
|
303 |
+
*
|
304 |
+
* @param int $start_time limit to events starting after this (local) UNIX time
|
305 |
+
* @param int $end_time limit to events starting before this (local) UNIX time
|
306 |
+
* @param array $filter Array of filters for the events returned:
|
307 |
+
* ['cat_ids'] => non-associatative array of category IDs
|
308 |
+
* ['tag_ids'] => non-associatative array of tag IDs
|
309 |
+
* ['post_ids'] => non-associatative array of post IDs
|
310 |
+
* @param bool $spanning also include events that span this period
|
311 |
+
*
|
312 |
+
* @return array list of matching event objects
|
313 |
**/
|
314 |
+
function get_events_between( $start_time, $end_time, $filter, $spanning = false ) {
|
315 |
+
|
316 |
+
global $wpdb, $ai1ec_events_helper;
|
317 |
|
318 |
// Convert timestamps to MySQL format in GMT time
|
319 |
$start_time = $ai1ec_events_helper->local_to_gmt( $start_time );
|
320 |
$end_time = $ai1ec_events_helper->local_to_gmt( $end_time );
|
321 |
|
322 |
// Query arguments
|
323 |
+
$args = array( $start_time, $end_time );
|
324 |
+
|
325 |
+
// Get post status Where snippet and associated SQL arguments
|
326 |
+
$this->_get_post_status_sql( $post_status_where = '', $args );
|
327 |
+
|
328 |
+
// Get the Join (filter_join) and Where (filter_where) statements based on
|
329 |
+
// $filter elements specified
|
330 |
+
$this->_get_filter_sql( $filter );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
331 |
|
332 |
$query = $wpdb->prepare(
|
333 |
"SELECT p.*, e.post_id, i.id AS instance_id, " .
|
342 |
"FROM {$wpdb->prefix}ai1ec_events e " .
|
343 |
"INNER JOIN $wpdb->posts p ON p.ID = e.post_id " .
|
344 |
"INNER JOIN {$wpdb->prefix}ai1ec_event_instances i ON e.post_id = i.post_id " .
|
345 |
+
$filter['filter_join'] .
|
346 |
"WHERE post_type = '" . AI1EC_POST_TYPE . "' " .
|
347 |
+
"AND " .
|
348 |
+
( $spanning ? "i.end > FROM_UNIXTIME( %d ) AND i.start < FROM_UNIXTIME( %d ) "
|
349 |
+
: "i.start >= FROM_UNIXTIME( %d ) AND i.start < FROM_UNIXTIME( %d ) " ) .
|
350 |
+
$filter['filter_where'] .
|
351 |
+
$post_status_where .
|
352 |
"ORDER BY allday DESC, i.start ASC, post_title ASC",
|
353 |
$args );
|
354 |
|
371 |
* @param int $time limit to events starting after this (local) UNIX time
|
372 |
* @param int $limit return a maximum of this number of items
|
373 |
* @param int $page_offset offset the result set by $limit times this number
|
374 |
+
* @param array $filter Array of filters for the events returned.
|
375 |
+
* ['cat_ids'] => non-associatative array of category IDs
|
376 |
+
* ['tag_ids'] => non-associatative array of tag IDs
|
377 |
+
* ['post_ids'] => non-associatative array of post IDs
|
378 |
*
|
379 |
* @return array three-element array:
|
380 |
* ['events'] an array of matching event objects
|
382 |
* ['next'] true if more next events
|
383 |
**/
|
384 |
function get_events_relative_to( $time, $limit = 0, $page_offset = 0, $filter = array() ) {
|
385 |
+
|
386 |
+
global $wpdb, $ai1ec_events_helper;
|
387 |
|
388 |
// Figure out what the beginning of the day is to properly query all-day
|
389 |
// events; then convert to GMT time
|
399 |
$first_record = $page_offset * $limit;
|
400 |
else
|
401 |
$first_record = ( -$page_offset - 1 ) * $limit;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
402 |
|
403 |
+
// Get post status Where snippet and associated SQL arguments
|
404 |
+
$this->_get_post_status_sql( $post_status_where = '', $args );
|
405 |
|
406 |
+
// Get the Join (filter_join) and Where (filter_where) statements based on
|
407 |
+
// $filter elements specified
|
408 |
+
$this->_get_filter_sql( $filter );
|
409 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
410 |
$query = $wpdb->prepare(
|
411 |
"SELECT SQL_CALC_FOUND_ROWS p.*, e.post_id, i.id AS instance_id, " .
|
412 |
"UNIX_TIMESTAMP( i.start ) AS start, " .
|
427 |
: "i.start < FROM_UNIXTIME( %d ) "
|
428 |
) .
|
429 |
$filter['filter_where'] .
|
430 |
+
$post_status_where .
|
431 |
// Reverse order when viewing negative pages, to get correct set of
|
432 |
// records. Then reverse results later to order them properly.
|
433 |
"ORDER BY i.start " . ( $page_offset >= 0 ? 'ASC' : 'DESC' ) .
|
437 |
|
438 |
$events = $wpdb->get_results( $query, ARRAY_A );
|
439 |
|
440 |
+
// Reorder records if in negative page offset
|
441 |
if( $page_offset < 0 ) $events = array_reverse( $events );
|
442 |
|
443 |
foreach( $events as &$event ) {
|
462 |
$query = $wpdb->prepare(
|
463 |
"SELECT COUNT(*) " .
|
464 |
"FROM {$wpdb->prefix}ai1ec_events e " .
|
465 |
+
"INNER JOIN {$wpdb->prefix}ai1ec_event_instances i ON e.post_id = i.post_id " .
|
466 |
+
"INNER JOIN $wpdb->posts p ON e.post_id = p.ID " .
|
467 |
+
$filter['filter_join'] .
|
468 |
"WHERE post_type = '" . AI1EC_POST_TYPE . "' " .
|
469 |
"AND i.start < FROM_UNIXTIME( %d ) " .
|
470 |
+
$filter['filter_where'] .
|
471 |
+
$post_status_where,
|
472 |
$args );
|
473 |
$prev = $wpdb->get_var( $query );
|
474 |
$next = $more;
|
526 |
*
|
527 |
* Returns the URL of the configured calendar page in the default view,
|
528 |
* optionally preloaded at the month containing the given event (rather than
|
529 |
+
* today's date), and optionally prefiltered by the given filters.
|
|
|
530 |
*
|
531 |
+
* @param object|null $event The event to focus the calendar on
|
532 |
+
* @param array $filter Array of filters for the events returned.
|
533 |
+
* ['cat_ids'] => non-associatative array of category IDs
|
534 |
+
* ['tag_ids'] => non-associatative array of tag IDs
|
535 |
+
* ['post_ids'] => non-associatative array of post IDs
|
536 |
*
|
537 |
* @return string The URL for this calendar
|
538 |
**/
|
539 |
+
function get_calendar_url( $event = null, $filter = array() ) {
|
540 |
global $ai1ec_settings, $ai1ec_events_helper, $ai1ec_app_helper, $wpdb;
|
541 |
|
542 |
$url = get_permalink( $ai1ec_settings->calendar_page_id );
|
552 |
$today = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( time() ) );
|
553 |
$desired = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( $event->start ) );
|
554 |
$month_offset =
|
555 |
+
( $desired['year'] - $today['year'] ) * 12 +
|
556 |
$desired['mon'] - $today['mon'];
|
557 |
|
558 |
$url .= "ai1ec_month_offset=$month_offset";
|
559 |
break;
|
560 |
|
561 |
+
case 'week':
|
562 |
+
// Get components of localized timstamps and calculate week offset
|
563 |
+
/* TODO - code this; first need to find out first day of week based on week start day,
|
564 |
+
then calculate how many weeks off we are from that one
|
565 |
+
$today = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( time() ) );
|
566 |
+
$desired = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( $event->start ) );
|
567 |
+
$week_offset =
|
568 |
+
( $desired['year'] - $today['year'] ) * 12 +
|
569 |
+
$desired['mon'] - $today['mon'];
|
570 |
+
|
571 |
+
$url .= "ai1ec_week_offset=$week_offset";*/
|
572 |
+
break;
|
573 |
+
|
574 |
case 'agenda':
|
575 |
// Find out how many event instances are between today's first
|
576 |
// instance and the desired event's instance
|
600 |
$url .= "&ai1ec_active_event=$event->post_id";
|
601 |
}
|
602 |
|
603 |
+
// Add filter parameters
|
604 |
+
foreach( $filter as $key => $val ) {
|
605 |
+
if( $val ) {
|
606 |
+
$url .= $ai1ec_app_helper->get_param_delimiter_char( $url ) .
|
607 |
+
"ai1ec_$key=" . join( ',', $val );
|
608 |
+
}
|
609 |
+
}
|
610 |
|
611 |
return $url;
|
612 |
}
|
624 |
static $weekdays;
|
625 |
|
626 |
if( ! isset( $weekdays ) )
|
627 |
+
{
|
628 |
$time = strtotime( 'next Sunday' );
|
629 |
$time = strtotime( "+{$ai1ec_settings->week_start_day} days", $time );
|
630 |
|
640 |
/**
|
641 |
* get_month_pagination_links function
|
642 |
*
|
643 |
+
* Returns a non-associative array of four links for the month view of the
|
644 |
* calendar:
|
645 |
* previous year, previous month, next month, and next year, in that order.
|
646 |
* Each element's key is an associative array containing the link's ID
|
685 |
return $links;
|
686 |
}
|
687 |
|
688 |
+
/**
|
689 |
+
* get_week_pagination_links function
|
690 |
+
*
|
691 |
+
* Returns a non-associative array of two links for the week view of the
|
692 |
+
* calendar:
|
693 |
+
* previous week, next week, in that order.
|
694 |
+
* Each element's key is an associative array containing the link's ID
|
695 |
+
* ['id'], text ['text'] and value to assign to link's href ['href'].
|
696 |
+
*
|
697 |
+
* @param int $cur_offset week offset of current week, needed for hrefs
|
698 |
+
*
|
699 |
+
* @return array array of link information as described above
|
700 |
+
**/
|
701 |
+
function get_week_pagination_links( $cur_offset ) {
|
702 |
+
global $ai1ec_events_helper;
|
703 |
+
|
704 |
+
$links = array();
|
705 |
+
|
706 |
+
// Base timestamp on offset week
|
707 |
+
$bits = $ai1ec_events_helper->gmgetdate( $ai1ec_events_helper->gmt_to_local( time() ) );
|
708 |
+
$bits['mday'] += $ai1ec_events_helper->get_week_start_day_offset( $bits['wday'] );
|
709 |
+
$bits['mday'] += $cur_offset * 7;
|
710 |
+
|
711 |
+
$links[] = array(
|
712 |
+
'id' => 'ai1ec-prev-week',
|
713 |
+
'text' =>
|
714 |
+
'‹ ' .
|
715 |
+
sprintf(
|
716 |
+
__( 'Week of %s', AI1EC_PLUGIN_NAME ),
|
717 |
+
date_i18n( __( 'M j' ), gmmktime( 0, 0, 0, $bits['mon'], $bits['mday'] - 7, $bits['year'] ), true )
|
718 |
+
),
|
719 |
+
'href' => '#action=ai1ec_week&ai1ec_week_offset=' . ( $cur_offset - 1 ),
|
720 |
+
);
|
721 |
+
$links[] = array(
|
722 |
+
'id' => 'ai1ec-next-week',
|
723 |
+
'text' =>
|
724 |
+
sprintf(
|
725 |
+
__( 'Week of %s', AI1EC_PLUGIN_NAME ),
|
726 |
+
date_i18n( __( 'M j' ), gmmktime( 0, 0, 0, $bits['mon'], $bits['mday'] + 7, $bits['year'] ), true )
|
727 |
+
)
|
728 |
+
. ' ›',
|
729 |
+
'href' => '#action=ai1ec_week&ai1ec_week_offset=' . ( $cur_offset + 1 ),
|
730 |
+
);
|
731 |
+
|
732 |
+
return $links;
|
733 |
+
}
|
734 |
+
|
735 |
/**
|
736 |
* get_agenda_pagination_links function
|
737 |
*
|
770 |
return $links;
|
771 |
}
|
772 |
|
773 |
+
/**
|
774 |
+
* _get_post_status_sql function
|
775 |
+
*
|
776 |
+
* Returns SQL snippet for properly matching event posts, as well as array
|
777 |
+
* of arguments to pass to $wpdb->prepare, in function argument references.
|
778 |
+
* Nothing is returned by the function.
|
779 |
+
*
|
780 |
+
* @param string &$sql The variable to store the SQL snippet into
|
781 |
+
* @param array &$args The variable to store the SQL arguments into
|
782 |
+
*
|
783 |
+
* @return void
|
784 |
+
*/
|
785 |
+
function _get_post_status_sql( &$sql, &$args )
|
786 |
+
{
|
787 |
+
global $current_user;
|
788 |
+
|
789 |
+
// Query the correct post status
|
790 |
+
if( current_user_can( 'administrator' ) || current_user_can( 'editor' ) )
|
791 |
+
{
|
792 |
+
// User has privilege of seeing all published and private posts
|
793 |
+
|
794 |
+
$post_status = "AND ( post_status = %s OR post_status = %s ) ";
|
795 |
+
$args[] = 'publish';
|
796 |
+
$args[] = 'private';
|
797 |
+
}
|
798 |
+
elseif( is_user_logged_in() )
|
799 |
+
{
|
800 |
+
// User has privilege of seeing all published and only their own private
|
801 |
+
// posts.
|
802 |
+
|
803 |
+
// get user info
|
804 |
+
get_currentuserinfo();
|
805 |
+
|
806 |
+
// include post_status = published
|
807 |
+
// OR
|
808 |
+
// post_status = private AND author = logged-in user
|
809 |
+
$post_status =
|
810 |
+
"AND ( " .
|
811 |
+
"post_status = %s " .
|
812 |
+
"OR ( post_status = %s AND post_author = %d ) " .
|
813 |
+
") ";
|
814 |
+
|
815 |
+
$args[] = 'publish';
|
816 |
+
$args[] = 'private';
|
817 |
+
$args[] = $current_user->ID;
|
818 |
+
} else {
|
819 |
+
// User can only see published posts.
|
820 |
+
$post_status = "AND post_status = %s ";
|
821 |
+
$args[] = 'publish';
|
822 |
+
}
|
823 |
+
}
|
824 |
+
|
825 |
/**
|
826 |
* _get_filter_sql function
|
827 |
*
|
828 |
* Takes an array of filtering options and turns it into JOIN and WHERE statements
|
829 |
* for running an SQL query limited to the specified options
|
830 |
*
|
831 |
+
* @param array &$filter Array of filters for the events returned.
|
832 |
* ['cat_ids'] => non-associatative array of category IDs
|
833 |
* ['tag_ids'] => non-associatative array of tag IDs
|
834 |
* ['post_ids'] => non-associatative array of event post IDs
|
835 |
+
* This array is modified to have:
|
|
|
836 |
* ['filter_join'] the Join statements for the SQL
|
837 |
* ['filter_where'] the Where statements for the SQL
|
838 |
+
*
|
839 |
+
* @return void
|
840 |
+
*/
|
841 |
+
function _get_filter_sql( &$filter ) {
|
842 |
global $wpdb;
|
843 |
|
844 |
// Set up the filter join and where strings
|
845 |
$filter['filter_join'] = '';
|
846 |
$filter['filter_where'] = '';
|
847 |
|
848 |
+
// By default open the Where with an AND ( .. ) to group all statements.
|
849 |
+
// Later, set it to OR to join statements together.
|
850 |
// TODO - make this cleaner by supporting the choice of AND/OR logic
|
851 |
$where_logic = ' AND (';
|
852 |
|
878 |
}
|
879 |
|
880 |
// Close the Where statement bracket if any Where statements were set
|
881 |
+
if( $filter['filter_where'] != '' ) {
|
882 |
$filter['filter_where'] .= ' ) ';
|
883 |
}
|
884 |
+
}
|
|
|
|
|
885 |
}
|
886 |
// END class
|
app/helper/class-ai1ec-events-helper.php
CHANGED
@@ -55,11 +55,11 @@ class Ai1ec_Events_Helper {
|
|
55 |
* @return Ai1ec_Event The associated event object
|
56 |
**/
|
57 |
static function get_event( $post_id )
|
58 |
-
|
59 |
$event = wp_cache_get( $post_id, AI1EC_POST_TYPE );
|
60 |
if( $event === false ) {
|
61 |
-
|
62 |
-
|
63 |
$event = new Ai1ec_Event( $post_id, $instance_id );
|
64 |
|
65 |
if( ! $event->post_id )
|
@@ -95,7 +95,7 @@ class Ai1ec_Events_Helper {
|
|
95 |
"WHERE ical_feed_url = %s " .
|
96 |
"AND ical_uid = %s " .
|
97 |
"AND start = FROM_UNIXTIME( %d ) " .
|
98 |
-
|
99 |
"( recurrence_rules IS NULL OR recurrence_rules = '' )";
|
100 |
$args = array( $feed, $uid, $start );
|
101 |
if( ! is_null( $exclude_post_id ) ) {
|
@@ -161,7 +161,7 @@ class Ai1ec_Events_Helper {
|
|
161 |
|
162 |
$freq->firstOccurrence();
|
163 |
while( ( $next = $freq->nextOccurrence( $start ) ) > 0 &&
|
164 |
-
|
165 |
{
|
166 |
$count++;
|
167 |
$start = $next;
|
@@ -205,12 +205,12 @@ class Ai1ec_Events_Helper {
|
|
205 |
// If event spans a day and end time is not midnight, or spans more than
|
206 |
// a day, then create instance for each spanning day
|
207 |
if( ( $start['mday'] != $end['mday'] &&
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
// Else cache single instance of event
|
212 |
} else {
|
213 |
-
|
214 |
}
|
215 |
*/
|
216 |
$this->insert_event_in_cache_table( $e );
|
@@ -228,42 +228,42 @@ class Ai1ec_Events_Helper {
|
|
228 |
* @return void
|
229 |
**/
|
230 |
function insert_event_in_cache_table( $event ) {
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
}
|
246 |
|
247 |
/**
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
$event_start = $e['start'];
|
268 |
// End time is beginning of next day
|
269 |
$event_end = mktime(
|
@@ -286,9 +286,9 @@ class Ai1ec_Events_Helper {
|
|
286 |
$event_end += 60 * 60 * 24;
|
287 |
// Cache intermediate days
|
288 |
while( $event_end < $e['end'] ) {
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
}
|
293 |
|
294 |
// ===========================================
|
@@ -301,7 +301,7 @@ class Ai1ec_Events_Helper {
|
|
301 |
if( $event_end > $event_start )
|
302 |
// Cache last day
|
303 |
$this->insert_event_in_cache_table( array( 'post_id' => $e['post_id'], 'start' => $event_start, 'end' => $event_end ) );
|
304 |
-
|
305 |
|
306 |
/**
|
307 |
* Returns the various preset recurrence options available (e.g.,
|
@@ -311,23 +311,23 @@ class Ai1ec_Events_Helper {
|
|
311 |
* equivalents
|
312 |
*/
|
313 |
function get_repeat_patterns() {
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
|
332 |
/**
|
333 |
* Generates and returns repeat dropdown
|
@@ -337,16 +337,16 @@ class Ai1ec_Events_Helper {
|
|
337 |
* @return String Repeat dropdown
|
338 |
*/
|
339 |
function create_repeat_dropdown( $selected = null ) {
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
}
|
351 |
|
352 |
/**
|
@@ -402,9 +402,9 @@ class Ai1ec_Events_Helper {
|
|
402 |
$until += date( 'Z', $until ); // Add timezone offset
|
403 |
$end = 2;
|
404 |
} elseif( $count )
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
}
|
409 |
}
|
410 |
return array(
|
@@ -432,7 +432,7 @@ class Ai1ec_Events_Helper {
|
|
432 |
<?php
|
433 |
return ob_get_clean();
|
434 |
}
|
435 |
-
|
436 |
/**
|
437 |
* create_select_element function
|
438 |
*
|
@@ -441,7 +441,7 @@ class Ai1ec_Events_Helper {
|
|
441 |
* @return void
|
442 |
**/
|
443 |
function create_select_element( $name, $options = array(), $selected = false, $disabled_keys = array() ) {
|
444 |
-
|
445 |
?>
|
446 |
<select name="<?php echo $name ?>" id="<?php echo $name ?>">
|
447 |
<?php foreach( $options as $key => $val ): ?>
|
@@ -453,7 +453,7 @@ class Ai1ec_Events_Helper {
|
|
453 |
<?php
|
454 |
return ob_get_clean();
|
455 |
}
|
456 |
-
|
457 |
/**
|
458 |
* create_on_the_select function
|
459 |
*
|
@@ -462,35 +462,35 @@ class Ai1ec_Events_Helper {
|
|
462 |
* @return void
|
463 |
**/
|
464 |
function create_on_the_select( $f_selected = false, $s_selected = false ) {
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
473 |
-
|
474 |
-
|
475 |
-
|
476 |
-
|
477 |
-
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
-
|
488 |
-
|
489 |
-
|
490 |
-
|
491 |
-
|
492 |
}
|
493 |
-
|
494 |
/**
|
495 |
* undocumented function
|
496 |
*
|
@@ -499,21 +499,21 @@ class Ai1ec_Events_Helper {
|
|
499 |
* @return void
|
500 |
**/
|
501 |
function create_list_element( $name, $options = array(), $selected = array() ) {
|
502 |
-
|
503 |
?>
|
504 |
<ul class="ai1ec_date_select <?php echo $name?>" id="<?php echo $name?>">
|
505 |
-
|
506 |
-
|
507 |
-
|
508 |
-
|
509 |
-
|
510 |
<?php endforeach ?>
|
511 |
</ul>
|
512 |
<input type="hidden" name="<?php echo $name ?>" value="<?php echo implode( ',', $selected ) ?>" />
|
513 |
<?php
|
514 |
return ob_get_clean();
|
515 |
}
|
516 |
-
|
517 |
/**
|
518 |
* create_montly_date_select function
|
519 |
*
|
@@ -522,14 +522,14 @@ class Ai1ec_Events_Helper {
|
|
522 |
* @return void
|
523 |
**/
|
524 |
function create_montly_date_select( $selected = array() ) {
|
525 |
-
|
526 |
-
|
527 |
-
|
528 |
-
|
529 |
-
|
530 |
-
|
531 |
}
|
532 |
-
|
533 |
/**
|
534 |
* create_yearly_date_select function
|
535 |
*
|
@@ -538,27 +538,27 @@ class Ai1ec_Events_Helper {
|
|
538 |
* @return void
|
539 |
**/
|
540 |
function create_yearly_date_select( $selected = array() ) {
|
541 |
-
|
542 |
-
|
543 |
-
|
544 |
-
|
545 |
-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
}
|
551 |
-
|
552 |
function get_frequency( $index ) {
|
553 |
-
|
554 |
-
|
555 |
-
|
556 |
-
|
557 |
-
|
558 |
-
|
559 |
-
|
560 |
}
|
561 |
-
|
562 |
/**
|
563 |
* row_frequency function
|
564 |
*
|
@@ -567,22 +567,22 @@ class Ai1ec_Events_Helper {
|
|
567 |
* @return void
|
568 |
**/
|
569 |
function row_frequency( $visible = false, $selected = false ) {
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
|
578 |
-
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
|
583 |
-
|
584 |
}
|
585 |
-
|
586 |
/**
|
587 |
* row_daily function
|
588 |
*
|
@@ -591,15 +591,15 @@ class Ai1ec_Events_Helper {
|
|
591 |
* @return void
|
592 |
**/
|
593 |
function row_daily( $visible = false, $selected = 1 ) {
|
594 |
-
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
}
|
602 |
-
|
603 |
/**
|
604 |
* row_weekly function
|
605 |
*
|
@@ -608,28 +608,28 @@ class Ai1ec_Events_Helper {
|
|
608 |
* @return void
|
609 |
**/
|
610 |
function row_weekly( $visible = false, $count = 1, $selected = array() ) {
|
611 |
-
|
612 |
-
|
613 |
-
|
614 |
-
|
615 |
-
|
616 |
-
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
|
628 |
-
|
629 |
-
|
630 |
-
|
631 |
}
|
632 |
-
|
633 |
/**
|
634 |
* get_weekday_by_id function
|
635 |
*
|
@@ -640,30 +640,30 @@ class Ai1ec_Events_Helper {
|
|
640 |
* @return string
|
641 |
**/
|
642 |
function get_weekday_by_id( $day_id, $by_value = false ) {
|
643 |
-
|
644 |
-
|
645 |
-
|
646 |
-
|
647 |
-
|
648 |
-
|
649 |
-
|
650 |
-
|
651 |
-
|
652 |
-
|
653 |
-
|
654 |
-
|
655 |
-
|
656 |
-
|
657 |
-
|
658 |
-
|
659 |
-
|
660 |
-
|
661 |
-
|
662 |
-
|
663 |
-
|
664 |
-
|
665 |
}
|
666 |
-
|
667 |
/**
|
668 |
* row_monthly function
|
669 |
*
|
@@ -672,19 +672,19 @@ class Ai1ec_Events_Helper {
|
|
672 |
* @return void
|
673 |
**/
|
674 |
function row_monthly( $visible = false, $count = 1, $ai1ec_monthly_each = 0, $ai1ec_monthly_on_the = 0, $month = array(), $first = false, $second = false ) {
|
675 |
-
|
676 |
-
|
677 |
-
|
678 |
-
|
679 |
-
|
680 |
-
|
681 |
-
|
682 |
-
|
683 |
-
|
684 |
-
|
685 |
-
|
686 |
}
|
687 |
-
|
688 |
/**
|
689 |
* row_yearly function
|
690 |
*
|
@@ -693,15 +693,15 @@ class Ai1ec_Events_Helper {
|
|
693 |
* @return void
|
694 |
**/
|
695 |
function row_yearly( $visible = false, $count = 1, $year = array(), $first = false, $second = false ) {
|
696 |
-
|
697 |
-
|
698 |
-
|
699 |
-
|
700 |
-
|
701 |
-
|
702 |
-
|
703 |
-
|
704 |
-
|
705 |
}
|
706 |
|
707 |
/**
|
@@ -726,7 +726,7 @@ class Ai1ec_Events_Helper {
|
|
726 |
*
|
727 |
* @param int | bool $start Events start before this (GMT) time
|
728 |
* @param int | bool $end Events end before this (GMT) time
|
729 |
-
* @param array $filter Array of filters for the events returned.
|
730 |
* ['cat_ids'] => non-associatative array of category IDs
|
731 |
* ['tag_ids'] => non-associatative array of tag IDs
|
732 |
* ['post_ids'] => non-associatative array of post IDs
|
@@ -734,40 +734,40 @@ class Ai1ec_Events_Helper {
|
|
734 |
* @return array Matching events
|
735 |
**/
|
736 |
function get_matching_events( $start = false, $end = false, $filter = array() ) {
|
737 |
-
|
738 |
|
739 |
// holds event_categories sql
|
740 |
-
|
741 |
-
|
742 |
-
|
743 |
-
|
744 |
-
|
745 |
-
|
746 |
-
|
747 |
-
|
748 |
-
|
749 |
-
|
750 |
-
|
751 |
-
|
752 |
-
|
753 |
-
|
754 |
-
|
755 |
-
|
756 |
-
|
757 |
-
|
758 |
-
|
759 |
-
|
760 |
-
|
761 |
-
|
762 |
-
|
763 |
-
|
764 |
-
|
765 |
-
|
766 |
-
|
767 |
-
|
768 |
-
|
769 |
-
|
770 |
-
|
771 |
$filter = $ai1ec_calendar_helper->_get_filter_sql( $filter );
|
772 |
|
773 |
$query = $wpdb->prepare(
|
@@ -776,39 +776,39 @@ class Ai1ec_Events_Helper {
|
|
776 |
e.show_map, e.contact_name, e.contact_phone, e.contact_email, e.cost, e.ical_feed_url, e.ical_source_url,
|
777 |
e.ical_organizer, e.ical_contact, e.ical_uid " .
|
778 |
"FROM $wpdb->posts " .
|
779 |
-
|
780 |
$filter['filter_join'] .
|
781 |
"WHERE post_type = '" . AI1EC_POST_TYPE . "' " .
|
782 |
-
|
783 |
-
|
784 |
-
|
785 |
-
|
786 |
$args );
|
787 |
|
788 |
$events = $wpdb->get_results( $query, ARRAY_A );
|
789 |
|
790 |
-
|
791 |
-
|
792 |
-
|
793 |
-
|
794 |
-
|
795 |
-
|
796 |
-
|
797 |
-
|
798 |
|
799 |
-
|
800 |
if( empty( $event->recurrence_rules ) ) {
|
801 |
// if start time is set, and event start time is before the range
|
802 |
// it, continue to the next event
|
803 |
if( $start !== false && $event->start < $start ) {
|
804 |
-
|
805 |
-
|
806 |
}
|
807 |
// if end time is set, and event end time is after
|
808 |
// it, continue to the next event
|
809 |
if( $end !== false && $ev->end < $end ) {
|
810 |
-
|
811 |
-
|
812 |
}
|
813 |
}
|
814 |
}
|
@@ -844,7 +844,7 @@ class Ai1ec_Events_Helper {
|
|
844 |
* @return string
|
845 |
**/
|
846 |
function get_short_time( $timestamp, $convert_from_gmt = true ) {
|
847 |
-
|
848 |
if( $convert_from_gmt )
|
849 |
$timestamp = $this->gmt_to_local( $timestamp );
|
850 |
return date_i18n( $time_format, $timestamp, true );
|
@@ -878,7 +878,7 @@ class Ai1ec_Events_Helper {
|
|
878 |
* @return string
|
879 |
**/
|
880 |
function get_medium_time( $timestamp, $convert_from_gmt = true ) {
|
881 |
-
|
882 |
if( $convert_from_gmt )
|
883 |
$timestamp = $this->gmt_to_local( $timestamp );
|
884 |
return date_i18n( $time_format, $timestamp, true );
|
@@ -896,8 +896,8 @@ class Ai1ec_Events_Helper {
|
|
896 |
* @return string
|
897 |
**/
|
898 |
function get_long_time( $timestamp, $convert_from_gmt = true ) {
|
899 |
-
|
900 |
-
|
901 |
if( $convert_from_gmt )
|
902 |
$timestamp = $this->gmt_to_local( $timestamp );
|
903 |
return date_i18n( $date_format, $timestamp, true ) . ' @ ' . date_i18n( $time_format, $timestamp, true );
|
@@ -915,7 +915,7 @@ class Ai1ec_Events_Helper {
|
|
915 |
* @return string
|
916 |
**/
|
917 |
function get_long_date( $timestamp, $convert_from_gmt = true ) {
|
918 |
-
|
919 |
if( $convert_from_gmt )
|
920 |
$timestamp = $this->gmt_to_local( $timestamp );
|
921 |
return date_i18n( $date_format, $timestamp, true );
|
@@ -933,12 +933,12 @@ class Ai1ec_Events_Helper {
|
|
933 |
function gmt_to_local( $timestamp ) {
|
934 |
$offset = get_option( 'gmt_offset' );
|
935 |
$tz = get_option( 'timezone_string', 'America/Los_Angeles' );
|
936 |
-
|
937 |
$offset = $this->get_timezone_offset( 'UTC', $tz, $timestamp );
|
938 |
|
939 |
if( ! $offset )
|
940 |
$offset = get_option( 'gmt_offset' ) * 3600;
|
941 |
-
|
942 |
return $timestamp + $offset;
|
943 |
}
|
944 |
|
@@ -954,15 +954,15 @@ class Ai1ec_Events_Helper {
|
|
954 |
function local_to_gmt( $timestamp ) {
|
955 |
$offset = get_option( 'gmt_offset' );
|
956 |
$tz = get_option( 'timezone_string', 'America/Los_Angeles' );
|
957 |
-
|
958 |
$offset = $this->get_timezone_offset( 'UTC', $tz, $timestamp );
|
959 |
|
960 |
if( ! $offset )
|
961 |
$offset = get_option( 'gmt_offset' ) * 3600;
|
962 |
-
|
963 |
return $timestamp - $offset;
|
964 |
}
|
965 |
-
|
966 |
/**
|
967 |
* get_timezone_offset function
|
968 |
*
|
@@ -978,7 +978,7 @@ class Ai1ec_Events_Helper {
|
|
978 |
if( $origin_tz === null )
|
979 |
if( ! is_string( $origin_tz = date_default_timezone_get() ) )
|
980 |
return false; // A UTC timestamp was returned -- bail out!
|
981 |
-
|
982 |
try {
|
983 |
$origin_dtz = new DateTimeZone( $origin_tz );
|
984 |
$remote_dtz = new DateTimeZone( $remote_tz );
|
@@ -989,7 +989,7 @@ class Ai1ec_Events_Helper {
|
|
989 |
} catch( Exception $e ) {
|
990 |
return false;
|
991 |
}
|
992 |
-
|
993 |
return $offset;
|
994 |
}
|
995 |
|
@@ -1034,10 +1034,10 @@ class Ai1ec_Events_Helper {
|
|
1034 |
function get_gmap_url( &$event ) {
|
1035 |
$location_arg = urlencode( $event->address );
|
1036 |
$lang = $this->get_lang();
|
1037 |
-
|
1038 |
return "http://www.google.com/maps?f=q&hl=" . $lang . "&source=embed&q=" . $location_arg;
|
1039 |
}
|
1040 |
-
|
1041 |
/**
|
1042 |
* get_lang function
|
1043 |
*
|
@@ -1051,7 +1051,7 @@ class Ai1ec_Events_Helper {
|
|
1051 |
|
1052 |
return ( isset( $locale[0] ) && $locale[0] != '' ) ? $locale[0] : 'en';
|
1053 |
}
|
1054 |
-
|
1055 |
/**
|
1056 |
* get_region function
|
1057 |
*
|
@@ -1062,7 +1062,7 @@ class Ai1ec_Events_Helper {
|
|
1062 |
**/
|
1063 |
function get_region() {
|
1064 |
$locale = explode( '_', get_locale() );
|
1065 |
-
|
1066 |
$region = ( isset( $locale[1] ) && $locale[1] != '' ) ? strtolower( $locale[1] ) : '';
|
1067 |
|
1068 |
// Primary ccTLD for United Kingdom is uk.
|
@@ -1081,7 +1081,7 @@ class Ai1ec_Events_Helper {
|
|
1081 |
* @return string The excerpt.
|
1082 |
**/
|
1083 |
function trim_excerpt( $text )
|
1084 |
-
|
1085 |
$raw_excerpt = $text;
|
1086 |
|
1087 |
$text = strip_shortcodes( $text );
|
@@ -1123,14 +1123,14 @@ class Ai1ec_Events_Helper {
|
|
1123 |
// = Sanitize provided IDs against SQL injection =
|
1124 |
// ===============================================
|
1125 |
if( ! is_array( $post_ids ) )
|
1126 |
-
|
1127 |
foreach( $post_ids as &$post_id ) {
|
1128 |
$post_id = intval( $post_id );
|
1129 |
}
|
1130 |
$post_ids = join( ',', $post_ids );
|
1131 |
|
1132 |
if( ! is_array( $term_ids ) )
|
1133 |
-
|
1134 |
foreach( $term_ids as &$term_id ) {
|
1135 |
$term_id = intval( $term_id );
|
1136 |
}
|
@@ -1156,12 +1156,12 @@ class Ai1ec_Events_Helper {
|
|
1156 |
* @return string
|
1157 |
*/
|
1158 |
function get_category_color( $term_id ) {
|
1159 |
-
|
1160 |
|
1161 |
-
|
1162 |
-
|
1163 |
-
|
1164 |
-
|
1165 |
}
|
1166 |
|
1167 |
/**
|
@@ -1174,12 +1174,12 @@ class Ai1ec_Events_Helper {
|
|
1174 |
* @return string
|
1175 |
**/
|
1176 |
function get_category_color_square( $term_id ) {
|
1177 |
-
|
1178 |
-
|
1179 |
-
|
1180 |
-
|
1181 |
|
1182 |
-
|
1183 |
}
|
1184 |
|
1185 |
/**
|
@@ -1192,15 +1192,48 @@ class Ai1ec_Events_Helper {
|
|
1192 |
* @return string
|
1193 |
**/
|
1194 |
function get_event_category_color_style( $term_id, $allday = false ) {
|
1195 |
-
|
1196 |
-
|
1197 |
-
|
1198 |
-
|
1199 |
-
|
1200 |
-
|
1201 |
-
|
1202 |
-
|
1203 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1204 |
}
|
1205 |
|
1206 |
/**
|
@@ -1212,15 +1245,15 @@ class Ai1ec_Events_Helper {
|
|
1212 |
* @return string
|
1213 |
**/
|
1214 |
function get_event_category_colors( $cats ) {
|
1215 |
-
|
1216 |
|
1217 |
-
|
1218 |
-
|
1219 |
-
|
1220 |
-
|
1221 |
-
|
1222 |
|
1223 |
-
|
1224 |
}
|
1225 |
|
1226 |
/**
|
@@ -1232,12 +1265,12 @@ class Ai1ec_Events_Helper {
|
|
1232 |
* @return void
|
1233 |
**/
|
1234 |
function create_end_dropdown( $selected = null ) {
|
1235 |
-
|
1236 |
|
1237 |
$options = array(
|
1238 |
-
|
1239 |
-
|
1240 |
-
|
1241 |
);
|
1242 |
|
1243 |
?>
|
@@ -1255,7 +1288,7 @@ class Ai1ec_Events_Helper {
|
|
1255 |
|
1256 |
return $output;
|
1257 |
}
|
1258 |
-
|
1259 |
/**
|
1260 |
* rrule_to_text function
|
1261 |
*
|
@@ -1264,34 +1297,34 @@ class Ai1ec_Events_Helper {
|
|
1264 |
* @return void
|
1265 |
**/
|
1266 |
function rrule_to_text( $rrule = '') {
|
1267 |
-
|
1268 |
-
|
1269 |
-
|
1270 |
-
|
1271 |
-
|
1272 |
-
|
1273 |
-
|
1274 |
-
|
1275 |
-
|
1276 |
-
|
1277 |
-
|
1278 |
-
|
1279 |
-
|
1280 |
-
|
1281 |
-
|
1282 |
-
|
1283 |
-
|
1284 |
-
|
1285 |
-
|
1286 |
-
|
1287 |
-
|
1288 |
-
|
1289 |
-
|
1290 |
-
|
1291 |
-
|
1292 |
-
|
1293 |
}
|
1294 |
-
|
1295 |
/**
|
1296 |
* _get_sentence_by function
|
1297 |
*
|
@@ -1300,101 +1333,101 @@ class Ai1ec_Events_Helper {
|
|
1300 |
* @return void
|
1301 |
**/
|
1302 |
function _get_sentence_by( &$txt, $freq, $rc ) {
|
1303 |
-
|
1304 |
-
|
1305 |
-
|
1306 |
-
|
1307 |
-
|
1308 |
-
|
1309 |
-
|
1310 |
-
|
1311 |
-
|
1312 |
-
|
1313 |
-
|
1314 |
-
|
1315 |
-
|
1316 |
-
|
1317 |
-
|
1318 |
-
|
1319 |
-
|
1320 |
-
|
1321 |
-
|
1322 |
-
|
1323 |
-
|
1324 |
-
|
1325 |
-
|
1326 |
-
|
1327 |
-
|
1328 |
-
|
1329 |
-
|
1330 |
-
|
1331 |
-
|
1332 |
-
|
1333 |
-
|
1334 |
-
|
1335 |
-
|
1336 |
-
|
1337 |
-
|
1338 |
-
|
1339 |
-
|
1340 |
-
|
1341 |
-
|
1342 |
-
|
1343 |
-
|
1344 |
-
|
1345 |
-
|
1346 |
-
|
1347 |
-
|
1348 |
-
|
1349 |
-
|
1350 |
-
|
1351 |
-
|
1352 |
-
|
1353 |
-
|
1354 |
-
|
1355 |
-
|
1356 |
-
|
1357 |
-
|
1358 |
-
|
1359 |
-
|
1360 |
-
|
1361 |
-
|
1362 |
-
|
1363 |
-
|
1364 |
-
|
1365 |
-
|
1366 |
-
|
1367 |
-
|
1368 |
-
|
1369 |
-
|
1370 |
-
|
1371 |
-
|
1372 |
-
|
1373 |
-
|
1374 |
-
|
1375 |
-
|
1376 |
-
|
1377 |
-
|
1378 |
-
|
1379 |
-
|
1380 |
-
|
1381 |
-
|
1382 |
-
|
1383 |
-
|
1384 |
-
|
1385 |
-
|
1386 |
-
|
1387 |
-
|
1388 |
-
|
1389 |
-
|
1390 |
-
|
1391 |
-
|
1392 |
-
|
1393 |
-
|
1394 |
-
|
1395 |
-
|
1396 |
}
|
1397 |
-
|
1398 |
/**
|
1399 |
* _ordinal function
|
1400 |
*
|
@@ -1404,17 +1437,17 @@ class Ai1ec_Events_Helper {
|
|
1404 |
**/
|
1405 |
function _ordinal( $cdnl ) {
|
1406 |
$locale = explode( '_', get_locale() );
|
1407 |
-
|
1408 |
if( isset( $locale[0] ) && $locale[0] != 'en' )
|
1409 |
return $cdnl;
|
1410 |
-
|
1411 |
-
|
1412 |
-
|
1413 |
-
|
1414 |
-
|
1415 |
-
|
1416 |
-
|
1417 |
-
|
1418 |
/**
|
1419 |
* _get_interval function
|
1420 |
*
|
@@ -1423,58 +1456,58 @@ class Ai1ec_Events_Helper {
|
|
1423 |
* @return void
|
1424 |
**/
|
1425 |
function _get_interval( &$txt, $freq, $interval ) {
|
1426 |
-
|
1427 |
-
|
1428 |
-
|
1429 |
-
|
1430 |
-
|
1431 |
-
|
1432 |
-
|
1433 |
-
|
1434 |
-
|
1435 |
-
|
1436 |
-
|
1437 |
-
|
1438 |
-
|
1439 |
-
|
1440 |
-
|
1441 |
-
|
1442 |
-
|
1443 |
-
|
1444 |
-
|
1445 |
-
|
1446 |
-
|
1447 |
-
|
1448 |
-
|
1449 |
-
|
1450 |
-
|
1451 |
-
|
1452 |
-
|
1453 |
-
|
1454 |
-
|
1455 |
-
|
1456 |
-
|
1457 |
-
|
1458 |
-
|
1459 |
-
|
1460 |
-
|
1461 |
-
|
1462 |
-
|
1463 |
-
|
1464 |
-
|
1465 |
-
|
1466 |
-
|
1467 |
-
|
1468 |
-
|
1469 |
-
|
1470 |
-
|
1471 |
-
|
1472 |
-
|
1473 |
-
|
1474 |
-
|
1475 |
-
|
1476 |
}
|
1477 |
-
|
1478 |
/**
|
1479 |
* _ending_sentence function
|
1480 |
*
|
@@ -1495,7 +1528,7 @@ class Ai1ec_Events_Helper {
|
|
1495 |
else
|
1496 |
$txt .= ' - ' . __( 'forever', AI1EC_PLUGIN_NAME );
|
1497 |
}
|
1498 |
-
|
1499 |
/**
|
1500 |
* undocumented function
|
1501 |
*
|
@@ -1504,25 +1537,25 @@ class Ai1ec_Events_Helper {
|
|
1504 |
* @return void
|
1505 |
**/
|
1506 |
function convert_rrule_to_text() {
|
1507 |
-
|
1508 |
-
|
1509 |
-
|
1510 |
-
|
1511 |
-
|
1512 |
-
|
1513 |
-
|
1514 |
-
|
1515 |
-
|
1516 |
-
|
1517 |
-
|
1518 |
-
|
1519 |
-
|
1520 |
-
|
1521 |
-
|
1522 |
-
|
1523 |
-
|
1524 |
-
|
1525 |
-
|
1526 |
"error" => $error,
|
1527 |
"message" => stripslashes( $message )
|
1528 |
);
|
@@ -1530,7 +1563,7 @@ class Ai1ec_Events_Helper {
|
|
1530 |
echo json_encode( $output );
|
1531 |
exit();
|
1532 |
}
|
1533 |
-
|
1534 |
/**
|
1535 |
* post_type_link function
|
1536 |
*
|
@@ -1540,13 +1573,29 @@ class Ai1ec_Events_Helper {
|
|
1540 |
**/
|
1541 |
function post_type_link( $permalink, $post, $leavename ) {
|
1542 |
global $ai1ec_app_helper;
|
1543 |
-
|
1544 |
if( $post->post_type == AI1EC_POST_TYPE ) {
|
1545 |
$delimiter = $ai1ec_app_helper->get_param_delimiter_char( $permalink );
|
1546 |
return $permalink . $delimiter . 'instance_id=';
|
1547 |
}
|
1548 |
-
|
1549 |
return $permalink;
|
1550 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1551 |
}
|
1552 |
// END class
|
55 |
* @return Ai1ec_Event The associated event object
|
56 |
**/
|
57 |
static function get_event( $post_id )
|
58 |
+
{
|
59 |
$event = wp_cache_get( $post_id, AI1EC_POST_TYPE );
|
60 |
if( $event === false ) {
|
61 |
+
// try to get the event instance id, if it is not set get the post id
|
62 |
+
$instance_id = isset( $_REQUEST["instance_id"] ) ? (int) $_REQUEST["instance_id"] : false;
|
63 |
$event = new Ai1ec_Event( $post_id, $instance_id );
|
64 |
|
65 |
if( ! $event->post_id )
|
95 |
"WHERE ical_feed_url = %s " .
|
96 |
"AND ical_uid = %s " .
|
97 |
"AND start = FROM_UNIXTIME( %d ) " .
|
98 |
+
( $has_recurrence ? 'AND NOT ' : 'AND ' ) .
|
99 |
"( recurrence_rules IS NULL OR recurrence_rules = '' )";
|
100 |
$args = array( $feed, $uid, $start );
|
101 |
if( ! is_null( $exclude_post_id ) ) {
|
161 |
|
162 |
$freq->firstOccurrence();
|
163 |
while( ( $next = $freq->nextOccurrence( $start ) ) > 0 &&
|
164 |
+
$count < 1000 )
|
165 |
{
|
166 |
$count++;
|
167 |
$start = $next;
|
205 |
// If event spans a day and end time is not midnight, or spans more than
|
206 |
// a day, then create instance for each spanning day
|
207 |
if( ( $start['mday'] != $end['mday'] &&
|
208 |
+
( $end['hours'] || $end['minutes'] || $end['seconds'] ) )
|
209 |
+
|| $e['end'] - $e['start'] > 60 * 60 * 24 ) {
|
210 |
+
$this->create_cache_table_entries( $e );
|
211 |
// Else cache single instance of event
|
212 |
} else {
|
213 |
+
$this->insert_event_in_cache_table( $e );
|
214 |
}
|
215 |
*/
|
216 |
$this->insert_event_in_cache_table( $e );
|
228 |
* @return void
|
229 |
**/
|
230 |
function insert_event_in_cache_table( $event ) {
|
231 |
+
global $wpdb;
|
232 |
+
|
233 |
+
// Return the start/end times to GMT zone
|
234 |
+
$event['start'] = $this->local_to_gmt( $event['start'] ) + date( 'Z', $event['start'] );
|
235 |
+
$event['end'] = $this->local_to_gmt( $event['end'] ) + date( 'Z', $event['end'] );
|
236 |
+
|
237 |
+
$wpdb->query(
|
238 |
+
$wpdb->prepare(
|
239 |
+
"INSERT INTO {$wpdb->prefix}ai1ec_event_instances " .
|
240 |
+
" ( post_id, start, end ) " .
|
241 |
+
"VALUES ( %d, FROM_UNIXTIME( %d ), FROM_UNIXTIME( %d ) )",
|
242 |
+
$event
|
243 |
+
)
|
244 |
+
);
|
245 |
}
|
246 |
|
247 |
/**
|
248 |
+
* create_cache_table_entries function
|
249 |
+
*
|
250 |
+
* Create a new entry for each day that the event spans.
|
251 |
+
*
|
252 |
+
* @param array $e Event array
|
253 |
+
*
|
254 |
+
* @return void
|
255 |
+
**/
|
256 |
+
function create_cache_table_entries( $e )
|
257 |
+
{
|
258 |
+
global $ai1ec_events_helper;
|
259 |
+
|
260 |
+
// Decompose start dates into components
|
261 |
+
$start_bits = getdate( $e['start'] );
|
262 |
+
|
263 |
+
// ============================================
|
264 |
+
// = Calculate the time for event's first day =
|
265 |
+
// ============================================
|
266 |
+
// Start time is event's original start time
|
267 |
$event_start = $e['start'];
|
268 |
// End time is beginning of next day
|
269 |
$event_end = mktime(
|
286 |
$event_end += 60 * 60 * 24;
|
287 |
// Cache intermediate days
|
288 |
while( $event_end < $e['end'] ) {
|
289 |
+
$this->insert_event_in_cache_table( array( 'post_id' => $e['post_id'], 'start' => $event_start, 'end' => $event_end ) );
|
290 |
+
$event_start = $event_end; // Start time is previous end time
|
291 |
+
$event_end += 24 * 60 * 60; // Increment end time by 1 day
|
292 |
}
|
293 |
|
294 |
// ===========================================
|
301 |
if( $event_end > $event_start )
|
302 |
// Cache last day
|
303 |
$this->insert_event_in_cache_table( array( 'post_id' => $e['post_id'], 'start' => $event_start, 'end' => $event_end ) );
|
304 |
+
}
|
305 |
|
306 |
/**
|
307 |
* Returns the various preset recurrence options available (e.g.,
|
311 |
* equivalents
|
312 |
*/
|
313 |
function get_repeat_patterns() {
|
314 |
+
// Calling functions when creating an array does not seem to work when
|
315 |
+
// the assigned to variable is static. This is a workaround.
|
316 |
+
static $options;
|
317 |
+
if( !isset( $options ) ) {
|
318 |
+
$temp = array(
|
319 |
+
' ' => __( 'No repeat', AI1EC_PLUGIN_NAME ),
|
320 |
+
'1' => __( 'Every day', AI1EC_PLUGIN_NAME ),
|
321 |
+
'2' => __( 'Every week', AI1EC_PLUGIN_NAME ),
|
322 |
+
'3' => __( 'Every month', AI1EC_PLUGIN_NAME ),
|
323 |
+
'4' => __( 'Every year', AI1EC_PLUGIN_NAME ),
|
324 |
+
'5' => '-----------',
|
325 |
+
'6' => __( 'Custom...', AI1EC_PLUGIN_NAME ),
|
326 |
+
);
|
327 |
+
$options = $temp;
|
328 |
+
}
|
329 |
+
return $options;
|
330 |
+
}
|
331 |
|
332 |
/**
|
333 |
* Generates and returns repeat dropdown
|
337 |
* @return String Repeat dropdown
|
338 |
*/
|
339 |
function create_repeat_dropdown( $selected = null ) {
|
340 |
+
$options = array(
|
341 |
+
' ' => __( 'No repeat', AI1EC_PLUGIN_NAME ),
|
342 |
+
1 => __( 'Every day', AI1EC_PLUGIN_NAME ),
|
343 |
+
2 => __( 'Every week', AI1EC_PLUGIN_NAME ),
|
344 |
+
3 => __( 'Every month', AI1EC_PLUGIN_NAME ),
|
345 |
+
4 => __( 'Every year', AI1EC_PLUGIN_NAME ),
|
346 |
+
5 => '-----------',
|
347 |
+
6 => __( 'Custom...', AI1EC_PLUGIN_NAME ),
|
348 |
+
);
|
349 |
+
return $this->create_select_element( 'ai1ec_repeat', $options, $selected, array( 5 ) );
|
350 |
}
|
351 |
|
352 |
/**
|
402 |
$until += date( 'Z', $until ); // Add timezone offset
|
403 |
$end = 2;
|
404 |
} elseif( $count )
|
405 |
+
$end = 1;
|
406 |
+
else
|
407 |
+
$end = 0;
|
408 |
}
|
409 |
}
|
410 |
return array(
|
432 |
<?php
|
433 |
return ob_get_clean();
|
434 |
}
|
435 |
+
|
436 |
/**
|
437 |
* create_select_element function
|
438 |
*
|
441 |
* @return void
|
442 |
**/
|
443 |
function create_select_element( $name, $options = array(), $selected = false, $disabled_keys = array() ) {
|
444 |
+
ob_start();
|
445 |
?>
|
446 |
<select name="<?php echo $name ?>" id="<?php echo $name ?>">
|
447 |
<?php foreach( $options as $key => $val ): ?>
|
453 |
<?php
|
454 |
return ob_get_clean();
|
455 |
}
|
456 |
+
|
457 |
/**
|
458 |
* create_on_the_select function
|
459 |
*
|
462 |
* @return void
|
463 |
**/
|
464 |
function create_on_the_select( $f_selected = false, $s_selected = false ) {
|
465 |
+
$ret = "";
|
466 |
+
|
467 |
+
$first_options = array(
|
468 |
+
'0' => __( 'first', AI1EC_PLUGIN_NAME ),
|
469 |
+
'1' => __( 'second', AI1EC_PLUGIN_NAME ),
|
470 |
+
'2' => __( 'third', AI1EC_PLUGIN_NAME ),
|
471 |
+
'3' => __( 'fourth', AI1EC_PLUGIN_NAME ),
|
472 |
+
'4' => '------',
|
473 |
+
'5' => __( 'last', AI1EC_PLUGIN_NAME )
|
474 |
+
);
|
475 |
+
$ret = $this->create_select_element( 'ai1ec_monthly_each_select', $first_options, $f_selected, array( 4 ) );
|
476 |
+
|
477 |
+
$second_options = array(
|
478 |
+
'0' => __( 'Sunday', AI1EC_PLUGIN_NAME ),
|
479 |
+
'1' => __( 'Monday', AI1EC_PLUGIN_NAME ),
|
480 |
+
'2' => __( 'Tuesday', AI1EC_PLUGIN_NAME ),
|
481 |
+
'3' => __( 'Wednesday', AI1EC_PLUGIN_NAME ),
|
482 |
+
'4' => __( 'Thursday', AI1EC_PLUGIN_NAME ),
|
483 |
+
'5' => __( 'Friday', AI1EC_PLUGIN_NAME ),
|
484 |
+
'6' => __( 'Saturday', AI1EC_PLUGIN_NAME ),
|
485 |
+
'7' => '--------',
|
486 |
+
'8' => __( 'day', AI1EC_PLUGIN_NAME ),
|
487 |
+
'9' => __( 'weekday', AI1EC_PLUGIN_NAME ),
|
488 |
+
'10' => __( 'weekend day', AI1EC_PLUGIN_NAME )
|
489 |
+
);
|
490 |
+
|
491 |
+
return $ret . $this->create_select_element( 'ai1ec_monthly_on_the_select', $second_options, $s_selected, array( 7 ) );
|
492 |
}
|
493 |
+
|
494 |
/**
|
495 |
* undocumented function
|
496 |
*
|
499 |
* @return void
|
500 |
**/
|
501 |
function create_list_element( $name, $options = array(), $selected = array() ) {
|
502 |
+
ob_start();
|
503 |
?>
|
504 |
<ul class="ai1ec_date_select <?php echo $name?>" id="<?php echo $name?>">
|
505 |
+
<?php foreach( $options as $key => $val ): ?>
|
506 |
+
<li<?php echo in_array( $key, $selected ) ? 'class="ai1ec_selected"' : '' ?>>
|
507 |
+
<?php echo $val ?>
|
508 |
+
<input type="hidden" name="<?php echo $name . '_' . $key ?>" value="<?php echo $key ?>" />
|
509 |
+
</li>
|
510 |
<?php endforeach ?>
|
511 |
</ul>
|
512 |
<input type="hidden" name="<?php echo $name ?>" value="<?php echo implode( ',', $selected ) ?>" />
|
513 |
<?php
|
514 |
return ob_get_clean();
|
515 |
}
|
516 |
+
|
517 |
/**
|
518 |
* create_montly_date_select function
|
519 |
*
|
522 |
* @return void
|
523 |
**/
|
524 |
function create_montly_date_select( $selected = array() ) {
|
525 |
+
$options = array();
|
526 |
+
|
527 |
+
for( $i = 1; $i <= 31; ++$i )
|
528 |
+
$options[$i] = $i;
|
529 |
+
|
530 |
+
return $this->create_list_element( 'ai1ec_montly_date_select', $options, $selected );
|
531 |
}
|
532 |
+
|
533 |
/**
|
534 |
* create_yearly_date_select function
|
535 |
*
|
538 |
* @return void
|
539 |
**/
|
540 |
function create_yearly_date_select( $selected = array() ) {
|
541 |
+
global $wp_locale;
|
542 |
+
$options = array();
|
543 |
+
|
544 |
+
for( $i = 1; $i <= 12; ++$i ) {
|
545 |
+
$x = $i < 10 ? 0 . $i : $i;
|
546 |
+
$options[$i] = $wp_locale->month_abbrev[$wp_locale->month[$x]];
|
547 |
+
}
|
548 |
+
|
549 |
+
return $this->create_list_element( 'ai1ec_yearly_date_select', $options, $selected );
|
550 |
}
|
551 |
+
|
552 |
function get_frequency( $index ) {
|
553 |
+
$frequency = array(
|
554 |
+
0 => __( 'Daily', AI1EC_PLUGIN_NAME ),
|
555 |
+
1 => __( 'Weekly', AI1EC_PLUGIN_NAME ),
|
556 |
+
2 => __( 'Monthly', AI1EC_PLUGIN_NAME ),
|
557 |
+
3 => __( 'Yearly', AI1EC_PLUGIN_NAME ),
|
558 |
+
);
|
559 |
+
return $frequency[$index];
|
560 |
}
|
561 |
+
|
562 |
/**
|
563 |
* row_frequency function
|
564 |
*
|
567 |
* @return void
|
568 |
**/
|
569 |
function row_frequency( $visible = false, $selected = false ) {
|
570 |
+
global $ai1ec_view_helper;
|
571 |
+
|
572 |
+
$frequency = array(
|
573 |
+
0 => __( 'Daily', AI1EC_PLUGIN_NAME ),
|
574 |
+
1 => __( 'Weekly', AI1EC_PLUGIN_NAME ),
|
575 |
+
2 => __( 'Monthly', AI1EC_PLUGIN_NAME ),
|
576 |
+
3 => __( 'Yearly', AI1EC_PLUGIN_NAME ),
|
577 |
+
);
|
578 |
+
|
579 |
+
$args = array(
|
580 |
+
'visible' => $visible,
|
581 |
+
'frequency' => $this->create_select_element( 'ai1ec_frequency', $frequency, $selected )
|
582 |
+
);
|
583 |
+
return $ai1ec_view_helper->get_view( 'row_frequency.php', $args );
|
584 |
}
|
585 |
+
|
586 |
/**
|
587 |
* row_daily function
|
588 |
*
|
591 |
* @return void
|
592 |
**/
|
593 |
function row_daily( $visible = false, $selected = 1 ) {
|
594 |
+
global $ai1ec_view_helper;
|
595 |
+
|
596 |
+
$args = array(
|
597 |
+
'visible' => $visible,
|
598 |
+
'count' => $this->create_count_input( 'ai1ec_daily_count', $selected, 365 ) . __( 'day(s)', AI1EC_PLUGIN_NAME )
|
599 |
+
);
|
600 |
+
return $ai1ec_view_helper->get_view( 'row_daily.php', $args );
|
601 |
}
|
602 |
+
|
603 |
/**
|
604 |
* row_weekly function
|
605 |
*
|
608 |
* @return void
|
609 |
**/
|
610 |
function row_weekly( $visible = false, $count = 1, $selected = array() ) {
|
611 |
+
global $ai1ec_view_helper, $wp_locale;
|
612 |
+
$start_of_week = get_option( 'start_of_week', 1 );
|
613 |
+
|
614 |
+
$options = array();
|
615 |
+
// get days from start_of_week until the last day
|
616 |
+
for( $i = $start_of_week; $i <= 6; ++$i )
|
617 |
+
$options[$this->get_weekday_by_id( $i )] = $wp_locale->weekday_initial[$wp_locale->weekday[$i]];
|
618 |
+
|
619 |
+
// get days from 0 until start_of_week
|
620 |
+
if( $start_of_week > 0 ) {
|
621 |
+
for( $i = 0; $i < $start_of_week; $i++ )
|
622 |
+
$options[$this->get_weekday_by_id( $i )] = $wp_locale->weekday_initial[$wp_locale->weekday[$i]];
|
623 |
+
}
|
624 |
+
|
625 |
+
$args = array(
|
626 |
+
'visible' => $visible,
|
627 |
+
'count' => $this->create_count_input( 'ai1ec_weekly_count', $count, 52 ) . __( 'week(s)', AI1EC_PLUGIN_NAME ),
|
628 |
+
'week_days' => $this->create_list_element( 'ai1ec_weekly_date_select', $options, $selected )
|
629 |
+
);
|
630 |
+
return $ai1ec_view_helper->get_view( 'row_weekly.php', $args );
|
631 |
}
|
632 |
+
|
633 |
/**
|
634 |
* get_weekday_by_id function
|
635 |
*
|
640 |
* @return string
|
641 |
**/
|
642 |
function get_weekday_by_id( $day_id, $by_value = false ) {
|
643 |
+
// do not translate this !!!
|
644 |
+
$week_days = array(
|
645 |
+
0 => 'SU',
|
646 |
+
1 => 'MO',
|
647 |
+
2 => 'TU',
|
648 |
+
3 => 'WE',
|
649 |
+
4 => 'TH',
|
650 |
+
5 => 'FR',
|
651 |
+
6 => 'SA'
|
652 |
+
);
|
653 |
+
|
654 |
+
if( $by_value ) {
|
655 |
+
while( $_name = current( $week_days ) ) {
|
656 |
+
if( $_name == $day_id ) {
|
657 |
+
return key( $week_days );
|
658 |
+
}
|
659 |
+
next( $week_days );
|
660 |
+
}
|
661 |
+
return false;
|
662 |
+
}
|
663 |
+
else
|
664 |
+
return $week_days[$day_id];
|
665 |
}
|
666 |
+
|
667 |
/**
|
668 |
* row_monthly function
|
669 |
*
|
672 |
* @return void
|
673 |
**/
|
674 |
function row_monthly( $visible = false, $count = 1, $ai1ec_monthly_each = 0, $ai1ec_monthly_on_the = 0, $month = array(), $first = false, $second = false ) {
|
675 |
+
global $ai1ec_view_helper;
|
676 |
+
|
677 |
+
$args = array(
|
678 |
+
'visible' => $visible,
|
679 |
+
'count' => $this->create_count_input( 'ai1ec_monthly_count', $count, 12 ) . __( 'month(s)', AI1EC_PLUGIN_NAME ),
|
680 |
+
'ai1ec_monthly_each' => $ai1ec_monthly_each,
|
681 |
+
'ai1ec_monthly_on_the' => $ai1ec_monthly_on_the,
|
682 |
+
'month' => $this->create_montly_date_select( $month ),
|
683 |
+
'on_the_select' => $this->create_on_the_select( $first, $second )
|
684 |
+
);
|
685 |
+
return $ai1ec_view_helper->get_view( 'row_monthly.php', $args );
|
686 |
}
|
687 |
+
|
688 |
/**
|
689 |
* row_yearly function
|
690 |
*
|
693 |
* @return void
|
694 |
**/
|
695 |
function row_yearly( $visible = false, $count = 1, $year = array(), $first = false, $second = false ) {
|
696 |
+
global $ai1ec_view_helper;
|
697 |
+
|
698 |
+
$args = array(
|
699 |
+
'visible' => $visible,
|
700 |
+
'count' => $this->create_count_input( 'ai1ec_yearly_count', $count, 10 ) . __( 'year(s)', AI1EC_PLUGIN_NAME ),
|
701 |
+
'year' => $this->create_yearly_date_select( $year ),
|
702 |
+
'on_the_select' => $this->create_on_the_select( $first, $second )
|
703 |
+
);
|
704 |
+
return $ai1ec_view_helper->get_view( 'row_yearly.php', $args );
|
705 |
}
|
706 |
|
707 |
/**
|
726 |
*
|
727 |
* @param int | bool $start Events start before this (GMT) time
|
728 |
* @param int | bool $end Events end before this (GMT) time
|
729 |
+
* @param array $filter Array of filters for the events returned.
|
730 |
* ['cat_ids'] => non-associatative array of category IDs
|
731 |
* ['tag_ids'] => non-associatative array of tag IDs
|
732 |
* ['post_ids'] => non-associatative array of post IDs
|
734 |
* @return array Matching events
|
735 |
**/
|
736 |
function get_matching_events( $start = false, $end = false, $filter = array() ) {
|
737 |
+
global $wpdb, $ai1ec_calendar_helper;
|
738 |
|
739 |
// holds event_categories sql
|
740 |
+
$c_sql = '';
|
741 |
+
$c_where_sql = '';
|
742 |
+
// holds event_tags sql
|
743 |
+
$t_sql = '';
|
744 |
+
$t_where_sql ='';
|
745 |
+
// holds posts sql
|
746 |
+
$p_where_sql = '';
|
747 |
+
// holds start sql
|
748 |
+
$start_where_sql = '';
|
749 |
+
// holds end sql
|
750 |
+
$end_where_sql = '';
|
751 |
+
// hold escape values
|
752 |
+
$args = array();
|
753 |
+
|
754 |
+
// =============================
|
755 |
+
// = Generating start date sql =
|
756 |
+
// =============================
|
757 |
+
if( $start !== false ) {
|
758 |
+
$start_where_sql = "AND (e.start >= FROM_UNIXTIME( %d ) OR e.recurrence_rules != '')";
|
759 |
+
$args[] = $start;
|
760 |
+
}
|
761 |
+
|
762 |
+
// ===========================
|
763 |
+
// = Generating end date sql =
|
764 |
+
// ===========================
|
765 |
+
if( $end !== false ) {
|
766 |
+
$end_where_sql = "AND (e.end <= FROM_UNIXTIME( %d ) OR e.recurrence_rules != '')";
|
767 |
+
$args[] = $end;
|
768 |
+
}
|
769 |
+
|
770 |
+
// Get the Join (filter_join) and Where (filter_where) statements based on $filter elements specified
|
771 |
$filter = $ai1ec_calendar_helper->_get_filter_sql( $filter );
|
772 |
|
773 |
$query = $wpdb->prepare(
|
776 |
e.show_map, e.contact_name, e.contact_phone, e.contact_email, e.cost, e.ical_feed_url, e.ical_source_url,
|
777 |
e.ical_organizer, e.ical_contact, e.ical_uid " .
|
778 |
"FROM $wpdb->posts " .
|
779 |
+
"INNER JOIN {$wpdb->prefix}ai1ec_events AS e ON e.post_id = ID " .
|
780 |
$filter['filter_join'] .
|
781 |
"WHERE post_type = '" . AI1EC_POST_TYPE . "' " .
|
782 |
+
"AND post_status = 'publish' " .
|
783 |
+
$filter['filter_where'] .
|
784 |
+
$start_where_sql .
|
785 |
+
$end_where_sql,
|
786 |
$args );
|
787 |
|
788 |
$events = $wpdb->get_results( $query, ARRAY_A );
|
789 |
|
790 |
+
foreach( $events as &$event ) {
|
791 |
+
try{
|
792 |
+
$event = new Ai1ec_Event( $event );
|
793 |
+
} catch( Ai1ec_Event_Not_Found $n ) {
|
794 |
+
unset( $event );
|
795 |
+
// The event is not found, continue to the next event
|
796 |
+
continue;
|
797 |
+
}
|
798 |
|
799 |
+
// if there are recurrence rules, include the event, else...
|
800 |
if( empty( $event->recurrence_rules ) ) {
|
801 |
// if start time is set, and event start time is before the range
|
802 |
// it, continue to the next event
|
803 |
if( $start !== false && $event->start < $start ) {
|
804 |
+
unset( $event );
|
805 |
+
continue;
|
806 |
}
|
807 |
// if end time is set, and event end time is after
|
808 |
// it, continue to the next event
|
809 |
if( $end !== false && $ev->end < $end ) {
|
810 |
+
unset( $event );
|
811 |
+
continue;
|
812 |
}
|
813 |
}
|
814 |
}
|
844 |
* @return string
|
845 |
**/
|
846 |
function get_short_time( $timestamp, $convert_from_gmt = true ) {
|
847 |
+
$time_format = get_option( 'time_format', 'g:ia' );
|
848 |
if( $convert_from_gmt )
|
849 |
$timestamp = $this->gmt_to_local( $timestamp );
|
850 |
return date_i18n( $time_format, $timestamp, true );
|
878 |
* @return string
|
879 |
**/
|
880 |
function get_medium_time( $timestamp, $convert_from_gmt = true ) {
|
881 |
+
$time_format = get_option( 'time_format', 'g:ia' );
|
882 |
if( $convert_from_gmt )
|
883 |
$timestamp = $this->gmt_to_local( $timestamp );
|
884 |
return date_i18n( $time_format, $timestamp, true );
|
896 |
* @return string
|
897 |
**/
|
898 |
function get_long_time( $timestamp, $convert_from_gmt = true ) {
|
899 |
+
$date_format = get_option( 'date_format', 'D, F j' );
|
900 |
+
$time_format = get_option( 'time_format', 'g:i' );
|
901 |
if( $convert_from_gmt )
|
902 |
$timestamp = $this->gmt_to_local( $timestamp );
|
903 |
return date_i18n( $date_format, $timestamp, true ) . ' @ ' . date_i18n( $time_format, $timestamp, true );
|
915 |
* @return string
|
916 |
**/
|
917 |
function get_long_date( $timestamp, $convert_from_gmt = true ) {
|
918 |
+
$date_format = get_option( 'date_format', 'D, F j' );
|
919 |
if( $convert_from_gmt )
|
920 |
$timestamp = $this->gmt_to_local( $timestamp );
|
921 |
return date_i18n( $date_format, $timestamp, true );
|
933 |
function gmt_to_local( $timestamp ) {
|
934 |
$offset = get_option( 'gmt_offset' );
|
935 |
$tz = get_option( 'timezone_string', 'America/Los_Angeles' );
|
936 |
+
|
937 |
$offset = $this->get_timezone_offset( 'UTC', $tz, $timestamp );
|
938 |
|
939 |
if( ! $offset )
|
940 |
$offset = get_option( 'gmt_offset' ) * 3600;
|
941 |
+
|
942 |
return $timestamp + $offset;
|
943 |
}
|
944 |
|
954 |
function local_to_gmt( $timestamp ) {
|
955 |
$offset = get_option( 'gmt_offset' );
|
956 |
$tz = get_option( 'timezone_string', 'America/Los_Angeles' );
|
957 |
+
|
958 |
$offset = $this->get_timezone_offset( 'UTC', $tz, $timestamp );
|
959 |
|
960 |
if( ! $offset )
|
961 |
$offset = get_option( 'gmt_offset' ) * 3600;
|
962 |
+
|
963 |
return $timestamp - $offset;
|
964 |
}
|
965 |
+
|
966 |
/**
|
967 |
* get_timezone_offset function
|
968 |
*
|
978 |
if( $origin_tz === null )
|
979 |
if( ! is_string( $origin_tz = date_default_timezone_get() ) )
|
980 |
return false; // A UTC timestamp was returned -- bail out!
|
981 |
+
|
982 |
try {
|
983 |
$origin_dtz = new DateTimeZone( $origin_tz );
|
984 |
$remote_dtz = new DateTimeZone( $remote_tz );
|
989 |
} catch( Exception $e ) {
|
990 |
return false;
|
991 |
}
|
992 |
+
|
993 |
return $offset;
|
994 |
}
|
995 |
|
1034 |
function get_gmap_url( &$event ) {
|
1035 |
$location_arg = urlencode( $event->address );
|
1036 |
$lang = $this->get_lang();
|
1037 |
+
|
1038 |
return "http://www.google.com/maps?f=q&hl=" . $lang . "&source=embed&q=" . $location_arg;
|
1039 |
}
|
1040 |
+
|
1041 |
/**
|
1042 |
* get_lang function
|
1043 |
*
|
1051 |
|
1052 |
return ( isset( $locale[0] ) && $locale[0] != '' ) ? $locale[0] : 'en';
|
1053 |
}
|
1054 |
+
|
1055 |
/**
|
1056 |
* get_region function
|
1057 |
*
|
1062 |
**/
|
1063 |
function get_region() {
|
1064 |
$locale = explode( '_', get_locale() );
|
1065 |
+
|
1066 |
$region = ( isset( $locale[1] ) && $locale[1] != '' ) ? strtolower( $locale[1] ) : '';
|
1067 |
|
1068 |
// Primary ccTLD for United Kingdom is uk.
|
1081 |
* @return string The excerpt.
|
1082 |
**/
|
1083 |
function trim_excerpt( $text )
|
1084 |
+
{
|
1085 |
$raw_excerpt = $text;
|
1086 |
|
1087 |
$text = strip_shortcodes( $text );
|
1123 |
// = Sanitize provided IDs against SQL injection =
|
1124 |
// ===============================================
|
1125 |
if( ! is_array( $post_ids ) )
|
1126 |
+
$post_ids = explode( ',', $post_ids );
|
1127 |
foreach( $post_ids as &$post_id ) {
|
1128 |
$post_id = intval( $post_id );
|
1129 |
}
|
1130 |
$post_ids = join( ',', $post_ids );
|
1131 |
|
1132 |
if( ! is_array( $term_ids ) )
|
1133 |
+
$term_ids = explode( ',', $term_ids );
|
1134 |
foreach( $term_ids as &$term_id ) {
|
1135 |
$term_id = intval( $term_id );
|
1136 |
}
|
1156 |
* @return string
|
1157 |
*/
|
1158 |
function get_category_color( $term_id ) {
|
1159 |
+
global $wpdb;
|
1160 |
|
1161 |
+
$term_id = (int) $term_id;
|
1162 |
+
$table_name = $wpdb->prefix . 'ai1ec_event_category_colors';
|
1163 |
+
$color = $wpdb->get_var( "SELECT term_color FROM {$table_name} WHERE term_id = {$term_id}" );
|
1164 |
+
return $color;
|
1165 |
}
|
1166 |
|
1167 |
/**
|
1174 |
* @return string
|
1175 |
**/
|
1176 |
function get_category_color_square( $term_id ) {
|
1177 |
+
$color = $this->get_category_color( $term_id );
|
1178 |
+
$cat = get_term( $term_id, 'events_categories' );
|
1179 |
+
if( ! is_null( $color ) && ! empty( $color ) )
|
1180 |
+
return '<div class="ai1ec-category-color" style="background:' . $color . '" title="' . esc_attr( $cat->name ) . '"></div>';
|
1181 |
|
1182 |
+
return '';
|
1183 |
}
|
1184 |
|
1185 |
/**
|
1192 |
* @return string
|
1193 |
**/
|
1194 |
function get_event_category_color_style( $term_id, $allday = false ) {
|
1195 |
+
$color = $this->get_category_color( $term_id );
|
1196 |
+
if( ! is_null( $color ) && ! empty( $color ) ) {
|
1197 |
+
if( $allday )
|
1198 |
+
return 'background: ' . $color . ';';
|
1199 |
+
else
|
1200 |
+
return 'color: ' . $color . ' !important;';
|
1201 |
+
}
|
1202 |
+
|
1203 |
+
return '';
|
1204 |
+
}
|
1205 |
+
|
1206 |
+
/**
|
1207 |
+
* get_event_category_faded_color function
|
1208 |
+
*
|
1209 |
+
* Returns a faded version of the event's category color in hex format.
|
1210 |
+
*
|
1211 |
+
* @param int $term_id The Event Category's term ID
|
1212 |
+
* @return string
|
1213 |
+
**/
|
1214 |
+
function get_event_category_faded_color( $term_id ) {
|
1215 |
+
$color = $this->get_category_color( $term_id );
|
1216 |
+
if( ! is_null( $color ) && ! empty( $color ) ) {
|
1217 |
+
|
1218 |
+
$color1 = substr( $color, 1 );
|
1219 |
+
$color2 = 'ffffff';
|
1220 |
+
|
1221 |
+
$c1_p1 = hexdec( substr( $color1, 0, 2 ) );
|
1222 |
+
$c1_p2 = hexdec( substr( $color1, 2, 2 ) );
|
1223 |
+
$c1_p3 = hexdec( substr( $color1, 4, 2 ) );
|
1224 |
+
|
1225 |
+
$c2_p1 = hexdec( substr( $color2, 0, 2 ) );
|
1226 |
+
$c2_p2 = hexdec( substr( $color2, 2, 2 ) );
|
1227 |
+
$c2_p3 = hexdec( substr( $color2, 4, 2 ) );
|
1228 |
+
|
1229 |
+
$m_p1 = dechex( round( $c1_p1 * 0.3 + $c2_p1 * 0.7 ) );
|
1230 |
+
$m_p2 = dechex( round( $c1_p2 * 0.3 + $c2_p2 * 0.7 ) );
|
1231 |
+
$m_p3 = dechex( round( $c1_p3 * 0.3 + $c2_p3 * 0.7 ) );
|
1232 |
+
|
1233 |
+
return '#' . $m_p1 . $m_p2 . $m_p3;
|
1234 |
+
}
|
1235 |
+
|
1236 |
+
return '';
|
1237 |
}
|
1238 |
|
1239 |
/**
|
1245 |
* @return string
|
1246 |
**/
|
1247 |
function get_event_category_colors( $cats ) {
|
1248 |
+
$sqrs = '';
|
1249 |
|
1250 |
+
foreach( $cats as $cat ) {
|
1251 |
+
$tmp = $this->get_category_color_square( $cat->term_id );
|
1252 |
+
if( ! empty( $tmp ) )
|
1253 |
+
$sqrs .= $tmp;
|
1254 |
+
}
|
1255 |
|
1256 |
+
return $sqrs;
|
1257 |
}
|
1258 |
|
1259 |
/**
|
1265 |
* @return void
|
1266 |
**/
|
1267 |
function create_end_dropdown( $selected = null ) {
|
1268 |
+
ob_start();
|
1269 |
|
1270 |
$options = array(
|
1271 |
+
0 => __( 'Never', AI1EC_PLUGIN_NAME ),
|
1272 |
+
1 => __( 'After', AI1EC_PLUGIN_NAME ),
|
1273 |
+
2 => __( 'On date', AI1EC_PLUGIN_NAME )
|
1274 |
);
|
1275 |
|
1276 |
?>
|
1288 |
|
1289 |
return $output;
|
1290 |
}
|
1291 |
+
|
1292 |
/**
|
1293 |
* rrule_to_text function
|
1294 |
*
|
1297 |
* @return void
|
1298 |
**/
|
1299 |
function rrule_to_text( $rrule = '') {
|
1300 |
+
$txt = '';
|
1301 |
+
$rc = new SG_iCal_Recurrence( new SG_iCal_Line( 'RRULE:' . $rrule ) );
|
1302 |
+
switch( $rc->getFreq() ) {
|
1303 |
+
case 'DAILY':
|
1304 |
+
$this->_get_interval( $txt, 'daily', $rc->getInterval() );
|
1305 |
+
$this->_ending_sentence( $txt, $rc );
|
1306 |
+
break;
|
1307 |
+
case 'WEEKLY':
|
1308 |
+
$this->_get_interval( $txt, 'weekly', $rc->getInterval() );
|
1309 |
+
$this->_get_sentence_by( $txt, 'weekly', $rc );
|
1310 |
+
$this->_ending_sentence( $txt, $rc );
|
1311 |
+
break;
|
1312 |
+
case 'MONTHLY':
|
1313 |
+
$this->_get_interval( $txt, 'monthly', $rc->getInterval() );
|
1314 |
+
$this->_get_sentence_by( $txt, 'monthly', $rc );
|
1315 |
+
$this->_ending_sentence( $txt, $rc );
|
1316 |
+
break;
|
1317 |
+
case 'YEARLY':
|
1318 |
+
$this->_get_interval( $txt, 'yearly', $rc->getInterval() );
|
1319 |
+
$this->_get_sentence_by( $txt, 'yearly', $rc );
|
1320 |
+
$this->_ending_sentence( $txt, $rc );
|
1321 |
+
break;
|
1322 |
+
default:
|
1323 |
+
$txt = $rrule;
|
1324 |
+
}
|
1325 |
+
return $txt;
|
1326 |
}
|
1327 |
+
|
1328 |
/**
|
1329 |
* _get_sentence_by function
|
1330 |
*
|
1333 |
* @return void
|
1334 |
**/
|
1335 |
function _get_sentence_by( &$txt, $freq, $rc ) {
|
1336 |
+
global $wp_locale;
|
1337 |
+
|
1338 |
+
switch( $freq ) {
|
1339 |
+
case 'weekly':
|
1340 |
+
if( $rc->getByDay() ) {
|
1341 |
+
if( count( $rc->getByDay() ) > 1 ) {
|
1342 |
+
// if there are more than 3 days
|
1343 |
+
// use days's abbr
|
1344 |
+
if( count( $rc->getByDay() ) > 2 ) {
|
1345 |
+
$_days = '';
|
1346 |
+
foreach( $rc->getByDay() as $d ) {
|
1347 |
+
$day = $this->get_weekday_by_id( $d, true );
|
1348 |
+
$_days .= ' ' . $wp_locale->weekday_abbrev[$wp_locale->weekday[$day]] . ',';
|
1349 |
+
}
|
1350 |
+
// remove the last ' and'
|
1351 |
+
$_days = substr( $_days, 0, -1 );
|
1352 |
+
$txt .= ' ' . _x( 'on', 'Recurrence editor - weekly tab', AI1EC_PLUGIN_NAME ) . $_days;
|
1353 |
+
} else {
|
1354 |
+
$_days = '';
|
1355 |
+
foreach( $rc->getByDay() as $d ) {
|
1356 |
+
$day = $this->get_weekday_by_id( $d, true );
|
1357 |
+
$_days .= ' ' . $wp_locale->weekday[$day] . ' ' . __( 'and', AI1EC_PLUGIN_NAME );
|
1358 |
+
}
|
1359 |
+
// remove the last ' and'
|
1360 |
+
$_days = substr( $_days, 0, -4 );
|
1361 |
+
$txt .= ' ' . _x( 'on', 'Recurrence editor - weekly tab', AI1EC_PLUGIN_NAME ) . $_days;
|
1362 |
+
}
|
1363 |
+
} else {
|
1364 |
+
$_days = '';
|
1365 |
+
foreach( $rc->getByDay() as $d ) {
|
1366 |
+
$day = $this->get_weekday_by_id( $d, true );
|
1367 |
+
$_days .= ' ' . $wp_locale->weekday[$day];
|
1368 |
+
}
|
1369 |
+
$txt .= ' ' . _x( 'on', 'Recurrence editor - weekly tab', AI1EC_PLUGIN_NAME ) . $_days;
|
1370 |
+
}
|
1371 |
+
}
|
1372 |
+
break;
|
1373 |
+
case 'monthly':
|
1374 |
+
if( $rc->getByMonthDay() ) {
|
1375 |
+
// if there are more than 2 days
|
1376 |
+
if( count( $rc->getByMonthDay() ) > 2 ) {
|
1377 |
+
$_days = '';
|
1378 |
+
foreach( $rc->getByMonthDay() as $m_day ) {
|
1379 |
+
$_days .= ' ' . $this->_ordinal( $m_day ) . ',';
|
1380 |
+
}
|
1381 |
+
$_days = substr( $_days, 0, -1 );
|
1382 |
+
$txt .= ' ' . _x( 'on', 'Recurrence editor - monthly tab', AI1EC_PLUGIN_NAME ) . $_days . ' ' . __( 'of the month', AI1EC_PLUGIN_NAME );
|
1383 |
+
} else if( count( $rc->getByMonthDay() ) > 1 ) {
|
1384 |
+
$_days = '';
|
1385 |
+
foreach( $rc->getByMonthDay() as $m_day ) {
|
1386 |
+
$_days .= ' ' . $this->_ordinal( $m_day ) . ' ' . __( 'and', AI1EC_PLUGIN_NAME );
|
1387 |
+
}
|
1388 |
+
$_days = substr( $_days, 0, -4 );
|
1389 |
+
$txt .= ' ' . _x( 'on', 'Recurrence editor - monthly tab', AI1EC_PLUGIN_NAME ) . $_days . ' ' . __( 'of the month', AI1EC_PLUGIN_NAME );
|
1390 |
+
} else {
|
1391 |
+
$_days = '';
|
1392 |
+
foreach( $rc->getByMonthDay() as $m_day ) {
|
1393 |
+
$_days .= ' ' . $this->_ordinal( $m_day );
|
1394 |
+
}
|
1395 |
+
$txt .= ' ' . _x( 'on', 'Recurrence editor - monthly tab', AI1EC_PLUGIN_NAME ) . $_days . ' ' . __( 'of the month', AI1EC_PLUGIN_NAME );
|
1396 |
+
}
|
1397 |
+
}
|
1398 |
+
break;
|
1399 |
+
case 'yearly':
|
1400 |
+
if( $rc->getByMonth() ) {
|
1401 |
+
// if there are more than 2 months
|
1402 |
+
if( count( $rc->getByMonth() ) > 2 ) {
|
1403 |
+
$_months = '';
|
1404 |
+
foreach( $rc->getByMonth() as $_m ) {
|
1405 |
+
$_m = $_m < 10 ? 0 . $_m : $_m;
|
1406 |
+
$_months .= ' ' . $wp_locale->month_abbrev[$wp_locale->month[$_m]] . ',';
|
1407 |
+
}
|
1408 |
+
$_months = substr( $_months, 0, -1 );
|
1409 |
+
$txt .= ' ' . _x( 'on', 'Recurrence editor - yearly tab', AI1EC_PLUGIN_NAME ) . $_months;
|
1410 |
+
} else if( count( $rc->getByMonth() ) > 1 ) {
|
1411 |
+
$_months = '';
|
1412 |
+
foreach( $rc->getByMonth() as $_m ) {
|
1413 |
+
$_m = $_m < 10 ? 0 . $_m : $_m;
|
1414 |
+
$_months .= ' ' . $wp_locale->month[$_m] . ' ' . __( 'and', AI1EC_PLUGIN_NAME );
|
1415 |
+
}
|
1416 |
+
$_months = substr( $_months, 0, -4 );
|
1417 |
+
$txt .= ' ' . _x( 'on', 'Recurrence editor - yearly tab', AI1EC_PLUGIN_NAME ) . $_months;
|
1418 |
+
} else {
|
1419 |
+
$_months = '';
|
1420 |
+
foreach( $rc->getByMonth() as $_m ) {
|
1421 |
+
$_m = $_m < 10 ? 0 . $_m : $_m;
|
1422 |
+
$_months .= ' ' . $wp_locale->month[$_m];
|
1423 |
+
}
|
1424 |
+
$txt .= ' ' . _x( 'on', 'Recurrence editor - yearly tab', AI1EC_PLUGIN_NAME ) . $_months;
|
1425 |
+
}
|
1426 |
+
}
|
1427 |
+
break;
|
1428 |
+
}
|
1429 |
}
|
1430 |
+
|
1431 |
/**
|
1432 |
* _ordinal function
|
1433 |
*
|
1437 |
**/
|
1438 |
function _ordinal( $cdnl ) {
|
1439 |
$locale = explode( '_', get_locale() );
|
1440 |
+
|
1441 |
if( isset( $locale[0] ) && $locale[0] != 'en' )
|
1442 |
return $cdnl;
|
1443 |
+
|
1444 |
+
$test_c = abs($cdnl) % 10;
|
1445 |
+
$ext = ( ( abs( $cdnl ) % 100 < 21 && abs( $cdnl ) % 100 > 4 ) ? 'th'
|
1446 |
+
: ( ( $test_c < 4 ) ? ( $test_c < 3 ) ? ( $test_c < 2 ) ? ( $test_c < 1 )
|
1447 |
+
? 'th' : 'st' : 'nd' : 'rd' : 'th' ) );
|
1448 |
+
return $cdnl.$ext;
|
1449 |
+
}
|
1450 |
+
|
1451 |
/**
|
1452 |
* _get_interval function
|
1453 |
*
|
1456 |
* @return void
|
1457 |
**/
|
1458 |
function _get_interval( &$txt, $freq, $interval ) {
|
1459 |
+
switch( $freq ) {
|
1460 |
+
case 'daily':
|
1461 |
+
// check if interval is set
|
1462 |
+
if( ! $interval || $interval == 1 ) {
|
1463 |
+
$txt = __( 'Daily', AI1EC_PLUGIN_NAME );
|
1464 |
+
} else {
|
1465 |
+
if( $interval == 2 ) {
|
1466 |
+
$txt = __( 'Every other day', AI1EC_PLUGIN_NAME );
|
1467 |
+
} else {
|
1468 |
+
$txt = sprintf( __( 'Every %d days', AI1EC_PLUGIN_NAME ), $interval );
|
1469 |
+
}
|
1470 |
+
}
|
1471 |
+
break;
|
1472 |
+
case 'weekly':
|
1473 |
+
// check if interval is set
|
1474 |
+
if( ! $interval || $interval == 1 ) {
|
1475 |
+
$txt = __( 'Weekly', AI1EC_PLUGIN_NAME );
|
1476 |
+
} else {
|
1477 |
+
if( $interval == 2 ) {
|
1478 |
+
$txt = __( 'Every other week', AI1EC_PLUGIN_NAME );
|
1479 |
+
} else {
|
1480 |
+
$txt = sprintf( __( 'Every %d weeks', AI1EC_PLUGIN_NAME ), $interval );
|
1481 |
+
}
|
1482 |
+
}
|
1483 |
+
break;
|
1484 |
+
case 'monthly':
|
1485 |
+
// check if interval is set
|
1486 |
+
if( ! $interval || $interval == 1 ) {
|
1487 |
+
$txt = __( 'Monthly', AI1EC_PLUGIN_NAME );
|
1488 |
+
} else {
|
1489 |
+
if( $interval == 2 ) {
|
1490 |
+
$txt = __( 'Every other month', AI1EC_PLUGIN_NAME );
|
1491 |
+
} else {
|
1492 |
+
$txt = sprintf( __( 'Every %d months', AI1EC_PLUGIN_NAME ), $interval );
|
1493 |
+
}
|
1494 |
+
}
|
1495 |
+
break;
|
1496 |
+
case 'yearly':
|
1497 |
+
// check if interval is set
|
1498 |
+
if( ! $interval || $interval == 1 ) {
|
1499 |
+
$txt = __( 'Yearly', AI1EC_PLUGIN_NAME );
|
1500 |
+
} else {
|
1501 |
+
if( $interval == 2 ) {
|
1502 |
+
$txt = __( 'Every other year', AI1EC_PLUGIN_NAME );
|
1503 |
+
} else {
|
1504 |
+
$txt = sprintf( __( 'Every %d years', AI1EC_PLUGIN_NAME ), $interval );
|
1505 |
+
}
|
1506 |
+
}
|
1507 |
+
break;
|
1508 |
+
}
|
1509 |
}
|
1510 |
+
|
1511 |
/**
|
1512 |
* _ending_sentence function
|
1513 |
*
|
1528 |
else
|
1529 |
$txt .= ' - ' . __( 'forever', AI1EC_PLUGIN_NAME );
|
1530 |
}
|
1531 |
+
|
1532 |
/**
|
1533 |
* undocumented function
|
1534 |
*
|
1537 |
* @return void
|
1538 |
**/
|
1539 |
function convert_rrule_to_text() {
|
1540 |
+
$error = false;
|
1541 |
+
// check to see if RRULE is set
|
1542 |
+
if( isset( $_REQUEST["rrule"] ) ) {
|
1543 |
+
|
1544 |
+
// check to see if rrule is empty
|
1545 |
+
if( empty( $_REQUEST["rrule"] ) ) {
|
1546 |
+
$error = true;
|
1547 |
+
$message = 'Recurrence rule cannot be empty!';
|
1548 |
+
} else {
|
1549 |
+
// convert rrule to text
|
1550 |
+
$message = $this->rrule_to_text( $_REQUEST["rrule"] );
|
1551 |
+
}
|
1552 |
+
|
1553 |
+
} else {
|
1554 |
+
$error = true;
|
1555 |
+
$message = 'Recurrence rule is not provided!';
|
1556 |
+
}
|
1557 |
+
|
1558 |
+
$output = array(
|
1559 |
"error" => $error,
|
1560 |
"message" => stripslashes( $message )
|
1561 |
);
|
1563 |
echo json_encode( $output );
|
1564 |
exit();
|
1565 |
}
|
1566 |
+
|
1567 |
/**
|
1568 |
* post_type_link function
|
1569 |
*
|
1573 |
**/
|
1574 |
function post_type_link( $permalink, $post, $leavename ) {
|
1575 |
global $ai1ec_app_helper;
|
1576 |
+
|
1577 |
if( $post->post_type == AI1EC_POST_TYPE ) {
|
1578 |
$delimiter = $ai1ec_app_helper->get_param_delimiter_char( $permalink );
|
1579 |
return $permalink . $delimiter . 'instance_id=';
|
1580 |
}
|
1581 |
+
|
1582 |
return $permalink;
|
1583 |
}
|
1584 |
+
|
1585 |
+
/**
|
1586 |
+
* get_week_start_day_offset function
|
1587 |
+
*
|
1588 |
+
* Returns the day offset of the first day of the week given a weekday in
|
1589 |
+
* question.
|
1590 |
+
*
|
1591 |
+
* @param int $wday The weekday to get information about
|
1592 |
+
* @return int A value between -6 and 0 indicating the week start
|
1593 |
+
* day relative to the given weekday.
|
1594 |
+
*/
|
1595 |
+
function get_week_start_day_offset( $wday ) {
|
1596 |
+
global $ai1ec_settings;
|
1597 |
+
|
1598 |
+
return - ( 7 - ( $ai1ec_settings->week_start_day - $wday ) ) % 7;
|
1599 |
+
}
|
1600 |
}
|
1601 |
// END class
|
app/helper/class-ai1ec-settings-helper.php
CHANGED
@@ -147,6 +147,9 @@ class Ai1ec_Settings_Helper {
|
|
147 |
<option value="month" <?php echo $view == 'month' ? 'selected' : '' ?>>
|
148 |
<?php _e( 'Month', AI1EC_PLUGIN_NAME ) ?>
|
149 |
</option>
|
|
|
|
|
|
|
150 |
<option value="agenda" <?php echo $view == 'agenda' ? 'selected' : '' ?>>
|
151 |
<?php _e( 'Agenda', AI1EC_PLUGIN_NAME ) ?>
|
152 |
</option>
|
@@ -154,7 +157,7 @@ class Ai1ec_Settings_Helper {
|
|
154 |
<?php
|
155 |
return ob_get_clean();
|
156 |
}
|
157 |
-
|
158 |
/**
|
159 |
* get_timezone_dropdown function
|
160 |
*
|
@@ -186,7 +189,7 @@ class Ai1ec_Settings_Helper {
|
|
186 |
<?php
|
187 |
return ob_get_clean();
|
188 |
}
|
189 |
-
|
190 |
/**
|
191 |
* get_date_format_dropdown function
|
192 |
*
|
@@ -213,7 +216,7 @@ class Ai1ec_Settings_Helper {
|
|
213 |
<?php
|
214 |
return ob_get_clean();
|
215 |
}
|
216 |
-
|
217 |
/**
|
218 |
* get_cron_freq_dropdown function
|
219 |
*
|
147 |
<option value="month" <?php echo $view == 'month' ? 'selected' : '' ?>>
|
148 |
<?php _e( 'Month', AI1EC_PLUGIN_NAME ) ?>
|
149 |
</option>
|
150 |
+
<option value="week" <?php echo $view == 'week' ? 'selected' : '' ?>>
|
151 |
+
<?php _e( 'Week', AI1EC_PLUGIN_NAME ) ?>
|
152 |
+
</option>
|
153 |
<option value="agenda" <?php echo $view == 'agenda' ? 'selected' : '' ?>>
|
154 |
<?php _e( 'Agenda', AI1EC_PLUGIN_NAME ) ?>
|
155 |
</option>
|
157 |
<?php
|
158 |
return ob_get_clean();
|
159 |
}
|
160 |
+
|
161 |
/**
|
162 |
* get_timezone_dropdown function
|
163 |
*
|
189 |
<?php
|
190 |
return ob_get_clean();
|
191 |
}
|
192 |
+
|
193 |
/**
|
194 |
* get_date_format_dropdown function
|
195 |
*
|
216 |
<?php
|
217 |
return ob_get_clean();
|
218 |
}
|
219 |
+
|
220 |
/**
|
221 |
* get_cron_freq_dropdown function
|
222 |
*
|
app/model/class-ai1ec-event.php
CHANGED
@@ -51,6 +51,26 @@ class Ai1ec_Event {
|
|
51 |
**/
|
52 |
var $end;
|
53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
/**
|
55 |
* allday class variable
|
56 |
*
|
@@ -236,6 +256,13 @@ class Ai1ec_Event {
|
|
236 |
**/
|
237 |
private $color_style;
|
238 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
239 |
/**
|
240 |
* tags_html class variable
|
241 |
*
|
@@ -283,7 +310,7 @@ class Ai1ec_Event {
|
|
283 |
|
284 |
if( ! $post || $post->post_status == 'auto-draft' )
|
285 |
throw new Ai1ec_Event_Not_Found( "Post with ID '$data' could not be retrieved from the database." );
|
286 |
-
|
287 |
$left_join = "";
|
288 |
$select_sql = "e.post_id, e.recurrence_rules, e.exception_rules, e.allday, " .
|
289 |
"e.recurrence_dates, e.exception_dates, e.venue, e.country, e.address, e.city, e.province, e.postal_code, " .
|
@@ -291,10 +318,10 @@ class Ai1ec_Event {
|
|
291 |
"e.ical_organizer, e.ical_contact, e.ical_uid, " .
|
292 |
"GROUP_CONCAT( ttc.term_id ) AS categories, " .
|
293 |
"GROUP_CONCAT( ttt.term_id ) AS tags ";
|
294 |
-
|
295 |
if( $instance ) {
|
296 |
$select_sql .= ", UNIX_TIMESTAMP( aei.start ) as start, UNIX_TIMESTAMP( aei.end ) as end ";
|
297 |
-
|
298 |
$instance = (int) $instance;
|
299 |
$left_join = "LEFT JOIN {$wpdb->prefix}ai1ec_event_instances aei ON aei.id = $instance ";
|
300 |
} else {
|
@@ -560,6 +587,17 @@ class Ai1ec_Event {
|
|
560 |
}
|
561 |
return $this->color_style;
|
562 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
563 |
// ===============================================
|
564 |
// = HTML of category color boxes for this event =
|
565 |
// ===============================================
|
51 |
**/
|
52 |
var $end;
|
53 |
|
54 |
+
/**
|
55 |
+
* start_truncated class variable
|
56 |
+
*
|
57 |
+
* Whether this copy of the event was broken up for rendering and the start
|
58 |
+
* time is not its "real" start time.
|
59 |
+
*
|
60 |
+
* @var bool
|
61 |
+
**/
|
62 |
+
var $start_truncated;
|
63 |
+
|
64 |
+
/**
|
65 |
+
* end_truncated class variable
|
66 |
+
*
|
67 |
+
* Whether this copy of the event was broken up for rendering and the end
|
68 |
+
* time is not its "real" end time.
|
69 |
+
*
|
70 |
+
* @var bool
|
71 |
+
**/
|
72 |
+
var $end_truncated;
|
73 |
+
|
74 |
/**
|
75 |
* allday class variable
|
76 |
*
|
256 |
**/
|
257 |
private $color_style;
|
258 |
|
259 |
+
/**
|
260 |
+
* faded_color class variable
|
261 |
+
*
|
262 |
+
* @var string
|
263 |
+
**/
|
264 |
+
private $faded_color;
|
265 |
+
|
266 |
/**
|
267 |
* tags_html class variable
|
268 |
*
|
310 |
|
311 |
if( ! $post || $post->post_status == 'auto-draft' )
|
312 |
throw new Ai1ec_Event_Not_Found( "Post with ID '$data' could not be retrieved from the database." );
|
313 |
+
|
314 |
$left_join = "";
|
315 |
$select_sql = "e.post_id, e.recurrence_rules, e.exception_rules, e.allday, " .
|
316 |
"e.recurrence_dates, e.exception_dates, e.venue, e.country, e.address, e.city, e.province, e.postal_code, " .
|
318 |
"e.ical_organizer, e.ical_contact, e.ical_uid, " .
|
319 |
"GROUP_CONCAT( ttc.term_id ) AS categories, " .
|
320 |
"GROUP_CONCAT( ttt.term_id ) AS tags ";
|
321 |
+
|
322 |
if( $instance ) {
|
323 |
$select_sql .= ", UNIX_TIMESTAMP( aei.start ) as start, UNIX_TIMESTAMP( aei.end ) as end ";
|
324 |
+
|
325 |
$instance = (int) $instance;
|
326 |
$left_join = "LEFT JOIN {$wpdb->prefix}ai1ec_event_instances aei ON aei.id = $instance ";
|
327 |
} else {
|
587 |
}
|
588 |
return $this->color_style;
|
589 |
|
590 |
+
// =========================================
|
591 |
+
// = Faded version of event category color =
|
592 |
+
// =========================================
|
593 |
+
case 'faded_color':
|
594 |
+
if( $this->faded_color === null ) {
|
595 |
+
$categories = wp_get_post_terms( $this->post_id, 'events_categories' );
|
596 |
+
if( $categories && ! empty( $categories ) )
|
597 |
+
$this->faded_color = $ai1ec_events_helper->get_event_category_faded_color( $categories[0]->term_id );
|
598 |
+
}
|
599 |
+
return $this->faded_color;
|
600 |
+
|
601 |
// ===============================================
|
602 |
// = HTML of category color boxes for this event =
|
603 |
// ===============================================
|
app/view/agenda.php
CHANGED
@@ -8,15 +8,16 @@
|
|
8 |
<?php _e( '− Collapse All', AI1EC_PLUGIN_NAME ) ?>
|
9 |
</a
|
10 |
><?php endif ?><a
|
11 |
-
id="ai1ec-today" class="ai1ec-load-view ai1ec-button" href="#action=ai1ec_agenda">
|
12 |
<?php _e( 'Today', AI1EC_PLUGIN_NAME ) ?>
|
13 |
</a>
|
14 |
</span>
|
15 |
<ul class="ai1ec-pagination">
|
16 |
<?php foreach( $pagination_links as $link ): ?>
|
17 |
<li>
|
18 |
-
<a id="<?php echo $link['id'] ?>"
|
19 |
-
|
|
|
20 |
<?php echo esc_html( $link['text'] ) ?>
|
21 |
</a>
|
22 |
</li>
|
8 |
<?php _e( '− Collapse All', AI1EC_PLUGIN_NAME ) ?>
|
9 |
</a
|
10 |
><?php endif ?><a
|
11 |
+
id="ai1ec-today" class="ai1ec-load-view ai1ec-button" href="#action=ai1ec_agenda&ai1ec_post_ids=<?php echo $post_ids ?>">
|
12 |
<?php _e( 'Today', AI1EC_PLUGIN_NAME ) ?>
|
13 |
</a>
|
14 |
</span>
|
15 |
<ul class="ai1ec-pagination">
|
16 |
<?php foreach( $pagination_links as $link ): ?>
|
17 |
<li>
|
18 |
+
<a id="<?php echo $link['id'] ?>"
|
19 |
+
class="ai1ec-load-view ai1ec-button"
|
20 |
+
href="<?php echo esc_attr( $link['href'] ) ?>&ai1ec_post_ids=<?php echo $post_ids ?>">
|
21 |
<?php echo esc_html( $link['text'] ) ?>
|
22 |
</a>
|
23 |
</li>
|
app/view/calendar.php
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
<table class="ai1ec-calendar-toolbar">
|
2 |
<tbody>
|
3 |
<tr>
|
@@ -6,14 +7,21 @@
|
|
6 |
<ul class="ai1ec-view-tabs">
|
7 |
<li>
|
8 |
<a id="ai1ec-view-month" class="ai1ec-load-view ai1ec-button"
|
9 |
-
href="#action=ai1ec_month">
|
10 |
<img src="<?php echo AI1EC_IMAGE_URL ?>/month-view.png" alt="<?php _e( 'Month', AI1EC_PLUGIN_NAME ) ?>" />
|
11 |
<?php _e( 'Month', AI1EC_PLUGIN_NAME ) ?>
|
12 |
</a>
|
13 |
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
<li>
|
15 |
<a id="ai1ec-view-agenda" class="ai1ec-load-view ai1ec-button"
|
16 |
-
href="#action=ai1ec_agenda">
|
17 |
<img src="<?php echo AI1EC_IMAGE_URL ?>/agenda-view.png" alt="<?php _e( 'Month', AI1EC_PLUGIN_NAME ) ?>" />
|
18 |
<?php _e( 'Agenda', AI1EC_PLUGIN_NAME ) ?>
|
19 |
</a>
|
@@ -84,6 +92,7 @@
|
|
84 |
</div>
|
85 |
</td>
|
86 |
<?php endif // $categories || $tags ?>
|
|
|
87 |
</tr>
|
88 |
</tbody>
|
89 |
</table>
|
@@ -109,3 +118,4 @@
|
|
109 |
<?php _e( 'Subscribe in Google Calendar', AI1EC_PLUGIN_NAME ) ?>
|
110 |
</a>
|
111 |
<?php endif ?>
|
|
1 |
+
<!-- START All-in-One Event Calendar Plugin - Version 1.2 -->
|
2 |
<table class="ai1ec-calendar-toolbar">
|
3 |
<tbody>
|
4 |
<tr>
|
7 |
<ul class="ai1ec-view-tabs">
|
8 |
<li>
|
9 |
<a id="ai1ec-view-month" class="ai1ec-load-view ai1ec-button"
|
10 |
+
href="#action=ai1ec_month&ai1ec_post_ids=<?php echo $selected_post_ids ?>">
|
11 |
<img src="<?php echo AI1EC_IMAGE_URL ?>/month-view.png" alt="<?php _e( 'Month', AI1EC_PLUGIN_NAME ) ?>" />
|
12 |
<?php _e( 'Month', AI1EC_PLUGIN_NAME ) ?>
|
13 |
</a>
|
14 |
</li>
|
15 |
+
<li>
|
16 |
+
<a id="ai1ec-view-week" class="ai1ec-load-view ai1ec-button"
|
17 |
+
href="#action=ai1ec_week&ai1ec_post_ids=<?php echo $selected_post_ids ?>">
|
18 |
+
<img src="<?php echo AI1EC_IMAGE_URL ?>/week-view.png" alt="<?php _e( 'Week', AI1EC_PLUGIN_NAME ) ?>" />
|
19 |
+
<?php _e( 'Week', AI1EC_PLUGIN_NAME ) ?>
|
20 |
+
</a>
|
21 |
+
</li>
|
22 |
<li>
|
23 |
<a id="ai1ec-view-agenda" class="ai1ec-load-view ai1ec-button"
|
24 |
+
href="#action=ai1ec_agenda&ai1ec_post_ids=<?php echo $selected_post_ids ?>">
|
25 |
<img src="<?php echo AI1EC_IMAGE_URL ?>/agenda-view.png" alt="<?php _e( 'Month', AI1EC_PLUGIN_NAME ) ?>" />
|
26 |
<?php _e( 'Agenda', AI1EC_PLUGIN_NAME ) ?>
|
27 |
</a>
|
92 |
</div>
|
93 |
</td>
|
94 |
<?php endif // $categories || $tags ?>
|
95 |
+
|
96 |
</tr>
|
97 |
</tbody>
|
98 |
</table>
|
118 |
<?php _e( 'Subscribe in Google Calendar', AI1EC_PLUGIN_NAME ) ?>
|
119 |
</a>
|
120 |
<?php endif ?>
|
121 |
+
<!-- END All-in-One Event Calendar Plugin -->
|
app/view/class-ai1ec-agenda-widget.php
CHANGED
@@ -136,7 +136,7 @@ class Ai1ec_Agenda_Widget extends WP_Widget
|
|
136 |
$ai1ec_events_helper,
|
137 |
$ai1ec_calendar_helper,
|
138 |
$ai1ec_settings;
|
139 |
-
|
140 |
$defaults = array(
|
141 |
'hide_on_calendar_page' => true,
|
142 |
'event_cat_ids' => array(),
|
@@ -160,10 +160,10 @@ class Ai1ec_Agenda_Widget extends WP_Widget
|
|
160 |
$timestamp = $ai1ec_events_helper->gmt_to_local( time() );
|
161 |
|
162 |
// Set $limit to the specified category/tag
|
163 |
-
$limit = array(
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
);
|
168 |
|
169 |
// Get events, then classify into date array
|
@@ -175,7 +175,7 @@ class Ai1ec_Agenda_Widget extends WP_Widget
|
|
175 |
$args['show_subscribe_buttons'] = $instance['show_subscribe_buttons'];
|
176 |
$args['show_calendar_button'] = $instance['show_calendar_button'];
|
177 |
$args['dates'] = $dates;
|
178 |
-
$args['calendar_url'] = $ai1ec_calendar_helper->get_calendar_url( null, $
|
179 |
$args['subscribe_url'] = AI1EC_EXPORT_URL . $subscribe_filter;
|
180 |
|
181 |
$ai1ec_view_helper->display( 'agenda-widget.php', $args );
|
136 |
$ai1ec_events_helper,
|
137 |
$ai1ec_calendar_helper,
|
138 |
$ai1ec_settings;
|
139 |
+
|
140 |
$defaults = array(
|
141 |
'hide_on_calendar_page' => true,
|
142 |
'event_cat_ids' => array(),
|
160 |
$timestamp = $ai1ec_events_helper->gmt_to_local( time() );
|
161 |
|
162 |
// Set $limit to the specified category/tag
|
163 |
+
$limit = array(
|
164 |
+
'cat_ids' => $instance['event_cat_ids'],
|
165 |
+
'tag_ids' => $instance['event_tag_ids'],
|
166 |
+
'post_ids' => $instance['event_post_ids'],
|
167 |
);
|
168 |
|
169 |
// Get events, then classify into date array
|
175 |
$args['show_subscribe_buttons'] = $instance['show_subscribe_buttons'];
|
176 |
$args['show_calendar_button'] = $instance['show_calendar_button'];
|
177 |
$args['dates'] = $dates;
|
178 |
+
$args['calendar_url'] = $ai1ec_calendar_helper->get_calendar_url( null, $limit );
|
179 |
$args['subscribe_url'] = AI1EC_EXPORT_URL . $subscribe_filter;
|
180 |
|
181 |
$ai1ec_view_helper->display( 'agenda-widget.php', $args );
|
app/view/month.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<h2 class="ai1ec-calendar-title"><?php echo esc_html( $title ) ?></h2>
|
2 |
<span class="ai1ec-title-buttons">
|
3 |
-
<a id="ai1ec-today" class="ai1ec-load-view ai1ec-button" href="#action=ai1ec_month">
|
4 |
<?php _e( 'Today', AI1EC_PLUGIN_NAME ) ?>
|
5 |
</a>
|
6 |
</span>
|
@@ -9,7 +9,7 @@
|
|
9 |
<li>
|
10 |
<a id="<?php echo $link['id'] ?>"
|
11 |
class="ai1ec-load-view ai1ec-button"
|
12 |
-
href="<?php echo esc_attr( $link['href'] ) ?>">
|
13 |
<?php echo esc_html( $link['text'] ) ?>
|
14 |
</a>
|
15 |
</li>
|
@@ -70,7 +70,7 @@
|
|
70 |
</div>
|
71 |
</div><!-- .event-popup -->
|
72 |
|
73 |
-
<div class="ai1ec-event <?php if( $event->post_id == $active_event ) echo 'ai1ec-active-event' ?>" <?php echo $event->color_style
|
74 |
<?php if( ! $event->allday ): ?>
|
75 |
<span class="ai1ec-event-time"><?php echo esc_html( $event->short_start_time ) ?></span>
|
76 |
<?php endif ?>
|
1 |
<h2 class="ai1ec-calendar-title"><?php echo esc_html( $title ) ?></h2>
|
2 |
<span class="ai1ec-title-buttons">
|
3 |
+
<a id="ai1ec-today" class="ai1ec-load-view ai1ec-button" href="#action=ai1ec_month&ai1ec_post_ids=<?php echo $post_ids ?>">
|
4 |
<?php _e( 'Today', AI1EC_PLUGIN_NAME ) ?>
|
5 |
</a>
|
6 |
</span>
|
9 |
<li>
|
10 |
<a id="<?php echo $link['id'] ?>"
|
11 |
class="ai1ec-load-view ai1ec-button"
|
12 |
+
href="<?php echo esc_attr( $link['href'] ) ?>&ai1ec_post_ids=<?php echo $post_ids ?>">
|
13 |
<?php echo esc_html( $link['text'] ) ?>
|
14 |
</a>
|
15 |
</li>
|
70 |
</div>
|
71 |
</div><!-- .event-popup -->
|
72 |
|
73 |
+
<div class="ai1ec-event <?php if( $event->post_id == $active_event ) echo 'ai1ec-active-event' ?>" style="<?php echo $event->color_style ?>">
|
74 |
<?php if( ! $event->allday ): ?>
|
75 |
<span class="ai1ec-event-time"><?php echo esc_html( $event->short_start_time ) ?></span>
|
76 |
<?php endif ?>
|
app/view/week.php
ADDED
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<h2 class="ai1ec-calendar-title"><?php echo esc_html( $title ) ?></h2>
|
2 |
+
<span class="ai1ec-title-buttons">
|
3 |
+
<a id="ai1ec-today" class="ai1ec-load-view ai1ec-button" href="#action=ai1ec_week&ai1ec_post_ids=<?php echo $post_ids ?>">
|
4 |
+
<?php _e( 'Today', AI1EC_PLUGIN_NAME ) ?>
|
5 |
+
</a>
|
6 |
+
</span>
|
7 |
+
<ul class="ai1ec-pagination">
|
8 |
+
<?php foreach( $pagination_links as $link ) : ?>
|
9 |
+
<li>
|
10 |
+
<a id="<?php echo $link['id'] ?>"
|
11 |
+
class="ai1ec-load-view ai1ec-button"
|
12 |
+
href="<?php echo esc_attr( $link['href'] ) ?>&ai1ec_post_ids=<?php echo $post_ids ?>">
|
13 |
+
<?php echo esc_html( $link['text'] ) ?>
|
14 |
+
</a>
|
15 |
+
</li>
|
16 |
+
<?php endforeach ?>
|
17 |
+
</ul>
|
18 |
+
<table class="ai1ec-week-view-original">
|
19 |
+
<thead>
|
20 |
+
<tr>
|
21 |
+
<?php foreach( $cell_array as $date => $day ) : ?>
|
22 |
+
<th class="ai1ec-weekday <?php if( $day['today'] ) echo 'ai1ec-today' ?>">
|
23 |
+
<span class="ai1ec-weekday-date"><?php echo date_i18n( 'j', $date, true ) ?></span>
|
24 |
+
<span class="ai1ec-weekday-day"><?php echo date_i18n( 'D', $date, true ) ?></span>
|
25 |
+
</th>
|
26 |
+
<?php endforeach // weekday ?>
|
27 |
+
</tr>
|
28 |
+
<tr>
|
29 |
+
<?php foreach( $cell_array as $day ) : ?>
|
30 |
+
<td class="ai1ec-allday-events <?php if( $day['today'] ) echo 'ai1ec-today' ?>">
|
31 |
+
|
32 |
+
<?php if( ! $done_allday_label ) : ?>
|
33 |
+
<div class="ai1ec-allday-label"><?php _e( 'All-day', AI1EC_PLUGIN_NAME ) ?></div>
|
34 |
+
<?php $done_allday_label = true ?>
|
35 |
+
<?php endif ?>
|
36 |
+
|
37 |
+
<?php foreach( $day['allday'] as $event ) : ?>
|
38 |
+
<a href="<?php echo esc_attr( get_permalink( $event->post_id ) ) . $event->instance_id ?>"
|
39 |
+
class="ai1ec-event-container
|
40 |
+
ai1ec-event-id-<?php echo $event->post_id ?>
|
41 |
+
ai1ec-event-instance-id-<?php echo $event->instance_id ?>
|
42 |
+
ai1ec-allday
|
43 |
+
<?php if( $event->start_truncated ) echo 'ai1ec-start-truncated' ?>
|
44 |
+
<?php if( $event->end_truncated ) echo 'ai1ec-end-truncated' ?>">
|
45 |
+
|
46 |
+
<?php // Insert post ID for use by JavaScript filtering later ?>
|
47 |
+
<input type="hidden" class="ai1ec-post-id" value="<?php echo $event->post_id ?>" />
|
48 |
+
|
49 |
+
<div class="ai1ec-event-popup">
|
50 |
+
<div class="ai1ec-event-summary">
|
51 |
+
<?php if( $event->category_colors ): ?>
|
52 |
+
<div class="ai1ec-category-colors"><?php echo $event->category_colors ?></div>
|
53 |
+
<?php endif ?>
|
54 |
+
<?php if( $event->post_excerpt ): ?>
|
55 |
+
<strong><?php _e( 'Summary:', AI1EC_PLUGIN_NAME ) ?></strong>
|
56 |
+
<p><?php echo esc_html( $event->post_excerpt ) ?></p>
|
57 |
+
<?php endif ?>
|
58 |
+
<div class="ai1ec-read-more"><?php esc_html_e( 'click anywhere for details', AI1EC_PLUGIN_NAME ) ?></div>
|
59 |
+
</div>
|
60 |
+
<div class="ai1ec-event-popup-bg">
|
61 |
+
<span class="ai1ec-event-title">
|
62 |
+
<?php if( function_exists( 'mb_strimwidth' ) ) : ?>
|
63 |
+
<?php echo esc_html( mb_strimwidth( apply_filters( 'the_title', $event->post->post_title ), 0, 35, '...' ) ) ?></span>
|
64 |
+
<?php else : ?>
|
65 |
+
<?php $read_more = strlen( apply_filters( 'the_title', $event->post->post_title ) ) > 35 ? '...' : '' ?>
|
66 |
+
<?php echo esc_html( substr( apply_filters( 'the_title', $event->post->post_title ), 0, 35 ) . $read_more ); ?>
|
67 |
+
<?php endif; ?>
|
68 |
+
</span>
|
69 |
+
<small><?php esc_html_e( '(all-day)', AI1EC_PLUGIN_NAME ) ?></small>
|
70 |
+
</div>
|
71 |
+
</div><!-- .event-popup -->
|
72 |
+
|
73 |
+
<div class="ai1ec-event <?php if( $event->post_id == $active_event ) echo 'ai1ec-active-event' ?>" style="<?php echo $event->color_style ?>">
|
74 |
+
<span class="ai1ec-event-title"><?php echo esc_html( apply_filters( 'the_title', $event->post->post_title ) ) ?></span>
|
75 |
+
</div>
|
76 |
+
|
77 |
+
</a>
|
78 |
+
<?php endforeach // allday ?>
|
79 |
+
|
80 |
+
</td>
|
81 |
+
<?php endforeach // weekday ?>
|
82 |
+
</tr>
|
83 |
+
</thead>
|
84 |
+
<tbody>
|
85 |
+
<tr class="ai1ec-week">
|
86 |
+
<?php foreach( $cell_array as $day ): ?>
|
87 |
+
<td <?php if( $day['today'] ) echo 'class="ai1ec-today"' ?>>
|
88 |
+
|
89 |
+
<?php if( ! $done_grid ) : ?>
|
90 |
+
<div class="ai1ec-grid-container">
|
91 |
+
<?php for( $hour = 0; $hour < 24; $hour++ ) : ?>
|
92 |
+
<div class="ai1ec-hour-marker <?php if( $hour >= 8 && $hour < 18 ) echo 'ai1ec-business-hour' ?>" style="top: <?php echo $hour * 60 ?>px;">
|
93 |
+
<div><?php echo esc_html( date_i18n( 'g a', gmmktime( $hour ) ) ) ?></div>
|
94 |
+
</div>
|
95 |
+
<?php for( $quarter = 1; $quarter < 4; $quarter++ ) : ?>
|
96 |
+
<div class="ai1ec-quarter-marker" style="top: <?php echo $hour * 60 + $quarter * 15 ?>px;"></div>
|
97 |
+
<?php endfor ?>
|
98 |
+
<?php endfor ?>
|
99 |
+
<div class="ai1ec-now-marker" style="top: <?php echo $now_top ?>px;"></div>
|
100 |
+
</div>
|
101 |
+
<?php $done_grid = true ?>
|
102 |
+
<?php endif ?>
|
103 |
+
|
104 |
+
<div class="ai1ec-day">
|
105 |
+
<?php foreach( $day['notallday'] as $notallday ): ?>
|
106 |
+
<?php extract( $notallday ) ?>
|
107 |
+
<a href="<?php echo esc_attr( get_permalink( $event->post_id ) ) . $event->instance_id ?>"
|
108 |
+
class="ai1ec-event-container
|
109 |
+
ai1ec-event-id-<?php echo $event->post_id ?>
|
110 |
+
ai1ec-event-instance-id-<?php echo $event->instance_id ?>
|
111 |
+
<?php if( $event->start_truncated ) echo 'ai1ec-start-truncated' ?>
|
112 |
+
<?php if( $event->end_truncated ) echo 'ai1ec-end-truncated' ?>"
|
113 |
+
style="top: <?php echo $top ?>px; height: <?php echo max( $height, 31 ) ?>px; left: <?php echo $indent * 8 ?>px; <?php echo $event->color_style ?> <?php if( $event->faded_color ) echo "border: 2px solid $event->faded_color !important;" ?> background: linear-gradient( top, #fff, <?php echo $event->faded_color ?> ) !important; background: -o-linear-gradient( top, #fff, <?php echo $event->faded_color ?> ) !important; background: -moz-linear-gradient( top, #fff, <?php echo $event->faded_color ?> ) !important; background: -webkit-gradient( linear, left top, left bottom, color-stop( 0, # ), color-stop( 1, <?php echo $event->faded_color ?> ) ) !important; background: -webkit-linear-gradient( top, #fff, <?php echo $event->faded_color ?> ) !important;">
|
114 |
+
|
115 |
+
<?php if( $event->start_truncated ) : ?><div class="ai1ec-start-truncator">◤</div><?php endif ?>
|
116 |
+
<?php if( $event->end_truncated ) : ?><div class="ai1ec-end-truncator">◢</div><?php endif ?>
|
117 |
+
|
118 |
+
<?php // Insert post ID for use by JavaScript filtering later ?>
|
119 |
+
<input type="hidden" class="ai1ec-post-id" value="<?php echo $event->post_id ?>" />
|
120 |
+
|
121 |
+
<div class="ai1ec-event-popup">
|
122 |
+
<div class="ai1ec-event-summary">
|
123 |
+
<?php if( $event->category_colors ): ?>
|
124 |
+
<div class="ai1ec-category-colors"><?php echo $event->category_colors ?></div>
|
125 |
+
<?php endif ?>
|
126 |
+
<?php if( $event->post_excerpt ): ?>
|
127 |
+
<strong><?php _e( 'Summary:', AI1EC_PLUGIN_NAME ) ?></strong>
|
128 |
+
<p><?php echo esc_html( $event->post_excerpt ) ?></p>
|
129 |
+
<?php endif ?>
|
130 |
+
<div class="ai1ec-read-more"><?php esc_html_e( 'click anywhere for details', AI1EC_PLUGIN_NAME ) ?></div>
|
131 |
+
</div>
|
132 |
+
<div class="ai1ec-event-popup-bg">
|
133 |
+
<span class="ai1ec-event-time"><?php echo esc_html( $event->short_start_time ) ?></span>
|
134 |
+
<span class="ai1ec-event-title"><?php echo esc_html( apply_filters( 'the_title', $event->post->post_title ) ) ?></span>
|
135 |
+
</span>
|
136 |
+
</div>
|
137 |
+
</div><!-- .event-popup -->
|
138 |
+
|
139 |
+
<div class="ai1ec-event <?php if( $event->post_id == $active_event ) echo 'ai1ec-active-event' ?>">
|
140 |
+
<span class="ai1ec-event-time"><?php echo esc_html( $event->short_start_time ) ?></span>
|
141 |
+
<span class="ai1ec-event-title"><?php echo esc_html( apply_filters( 'the_title', $event->post->post_title ) ) ?></span>
|
142 |
+
</div>
|
143 |
+
|
144 |
+
</a>
|
145 |
+
<?php endforeach // events ?>
|
146 |
+
</div>
|
147 |
+
</td>
|
148 |
+
<?php endforeach // day ?>
|
149 |
+
</tr>
|
150 |
+
</tbody>
|
151 |
+
</table>
|
css/calendar.css
CHANGED
@@ -6,9 +6,14 @@
|
|
6 |
.ai1ec-container small {
|
7 |
margin: 0 !important;
|
8 |
}
|
|
|
|
|
|
|
|
|
9 |
|
10 |
/* Active buttons */
|
11 |
.ai1ec-action-month #ai1ec-view-month,
|
|
|
12 |
.ai1ec-action-agenda #ai1ec-view-agenda {
|
13 |
color: #000;
|
14 |
background: #ddd;
|
@@ -163,7 +168,10 @@ a.ai1ec-pagination {
|
|
163 |
.ai1ec-action-month .ai1ec-pagination a {
|
164 |
width: 7em;
|
165 |
}
|
166 |
-
.ai1ec-action-
|
|
|
|
|
|
|
167 |
float: right;
|
168 |
width: 9em;
|
169 |
}
|
@@ -171,8 +179,9 @@ a.ai1ec-pagination {
|
|
171 |
width: 4em;
|
172 |
}
|
173 |
|
174 |
-
/* Month
|
175 |
-
table.ai1ec-month-view
|
|
|
176 |
border-collapse: collapse;
|
177 |
border: 1px solid #ddd !important;
|
178 |
margin: 0 !important;
|
@@ -181,7 +190,28 @@ table.ai1ec-month-view {
|
|
181 |
clear: both;
|
182 |
width: 100% !important;
|
183 |
}
|
184 |
-
.ai1ec-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
185 |
border: 1px solid #ddd !important;
|
186 |
vertical-align: top;
|
187 |
background: none !important;
|
@@ -189,13 +219,17 @@ table.ai1ec-month-view {
|
|
189 |
.ai1ec-month-view td.ai1ec-empty {
|
190 |
background: #f8f8f8 !important;
|
191 |
}
|
192 |
-
.ai1ec-month-view th
|
|
|
|
|
|
|
193 |
padding: 0.2em !important;
|
194 |
-
|
|
|
|
|
|
|
|
|
195 |
font: bold 9pt Tahoma, Geneva, sans-serif !important;
|
196 |
-
text-align: center !important;
|
197 |
-
background: #f2f2f2 !important;
|
198 |
-
border: none !important;
|
199 |
color: #999 !important;
|
200 |
text-shadow: 0 1px 0 #fff;
|
201 |
-o-text-shadow: 0 1px 0 #fff;
|
@@ -203,15 +237,38 @@ table.ai1ec-month-view {
|
|
203 |
-moz-text-shadow: 0 1px 0 #fff;
|
204 |
-webkit-text-shadow: 0 1px 0 #fff;
|
205 |
}
|
206 |
-
.ai1ec-month-view
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
207 |
padding: 0 !important;
|
208 |
text-align: left;
|
209 |
}
|
210 |
-
.ai1ec-month-view .ai1ec-day
|
|
|
|
|
211 |
position: relative;
|
|
|
|
|
212 |
min-height: 5em;
|
213 |
}
|
214 |
-
.ai1ec-
|
|
|
|
|
|
|
|
|
215 |
background: #ffd !important;
|
216 |
background: rgba(255,255,128,0.3) !important;
|
217 |
}
|
@@ -230,36 +287,119 @@ table.ai1ec-month-view {
|
|
230 |
-webkit-text-shadow: 0 1px 0 #fff;
|
231 |
}
|
232 |
|
233 |
-
/*
|
234 |
-
.ai1ec-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
235 |
position: relative;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
236 |
font: 9pt Tahoma, Geneva, sans-serif !important;
|
237 |
text-decoration: none !important;
|
238 |
display: block;
|
239 |
border: none !important;
|
|
|
|
|
|
|
|
|
|
|
240 |
}
|
241 |
-
.ai1ec-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
242 |
border-radius: 0.3em;
|
243 |
-o-border-radius: 0.3em;
|
244 |
-moz-border-radius: 0.3em;
|
245 |
-webkit-border-radius: 0.3em;
|
246 |
-
margin: 1px
|
247 |
-
padding: 0
|
248 |
white-space: nowrap;
|
249 |
overflow: hidden;
|
250 |
-
|
251 |
}
|
252 |
-
.ai1ec-month-view .ai1ec-allday .ai1ec-event
|
|
|
253 |
background: #568;
|
254 |
color: #fff !important;
|
255 |
}
|
256 |
-
.ai1ec-month-view .ai1ec-category-colors
|
|
|
257 |
float: right;
|
258 |
font-size: 1.2em;
|
259 |
margin-top: 1px;
|
260 |
}
|
261 |
.ai1ec-month-view .ai1ec-event-popup,
|
262 |
-
.ai1ec-month-view .ai1ec-event-summary
|
|
|
|
|
263 |
border: 2px solid #d4c4b0;
|
264 |
box-shadow: 1px 5px 8px rgba(0,0,0,0.08);
|
265 |
-o-box-shadow: 1px 5px 8px rgba(0,0,0,0.08);
|
@@ -268,7 +408,8 @@ table.ai1ec-month-view {
|
|
268 |
-webkit-box-shadow: 1px 5px 8px rgba(0,0,0,0.08);
|
269 |
background: #fff;
|
270 |
}
|
271 |
-
.ai1ec-month-view .ai1ec-event-popup
|
|
|
272 |
position: absolute;
|
273 |
z-index: 5;
|
274 |
display: none;
|
@@ -282,32 +423,41 @@ table.ai1ec-month-view {
|
|
282 |
-moz-border-radius: 0 0.3em 0.3em 0;
|
283 |
-webkit-border-radius: 0 0.3em 0.3em 0;
|
284 |
}
|
285 |
-
.ai1ec-
|
|
|
|
|
|
|
|
|
286 |
border-radius: 0.3em 0 0 0.3em;
|
287 |
-o-border-radius: 0.3em 0 0 0.3em;
|
288 |
-
-ms-border-radius: 0.3em 0 0 0.3em;
|
289 |
-moz-border-radius: 0.3em 0 0 0.3em;
|
290 |
-webkit-border-radius: 0.3em 0 0 0.3em;
|
291 |
}
|
292 |
-
.ai1ec-month-view .ai1ec-event-popup-bg
|
|
|
293 |
position: relative;
|
294 |
left: -2px;
|
295 |
margin-right: -1px;
|
296 |
padding: 2px 2px 2px 5px;
|
297 |
background: #fff;
|
298 |
}
|
299 |
-
.ai1ec-month-view .ai1ec-shifted-right .ai1ec-event-popup-bg
|
|
|
300 |
left: 1px;
|
301 |
padding: 2px 5px 2px 2px;
|
302 |
}
|
303 |
.ai1ec-month-view .ai1ec-event-summary,
|
304 |
-
.ai1ec-month-view .ai1ec-event-summary p
|
|
|
|
|
305 |
font-size: 0.95em !important;
|
306 |
}
|
307 |
-
.ai1ec-month-view .ai1ec-event-summary p
|
|
|
308 |
line-height: 1.4em !important;
|
309 |
}
|
310 |
-
.ai1ec-month-view .ai1ec-event-summary
|
|
|
311 |
position: absolute;
|
312 |
overflow: hidden;
|
313 |
top: -2px;
|
@@ -328,22 +478,31 @@ table.ai1ec-month-view {
|
|
328 |
background: -webkit-linear-gradient( #fff 1.5em, #fdfadc );
|
329 |
color: #6d5e4a;
|
330 |
}
|
331 |
-
.ai1ec-month-view .ai1ec-shifted-right .ai1ec-event-summary
|
|
|
332 |
left: 100%;
|
333 |
border-radius: 0 0.3em 0.3em 0.3em;
|
334 |
-o-border-radius: 0 0.3em 0.3em 0.3em;
|
335 |
-moz-border-radius: 0 0.3em 0.3em 0.3em;
|
336 |
-webkit-border-radius: 0 0.3em 0.3em 0.3em;
|
337 |
}
|
338 |
-
.ai1ec-month-view .ai1ec-event-summary p
|
|
|
339 |
margin: 0 0 0.3em !important;
|
340 |
padding: 0 !important;
|
341 |
}
|
342 |
-
.ai1ec-month-view .ai1ec-event-time
|
|
|
343 |
font-size: 8pt;
|
344 |
font-weight: bold;
|
345 |
}
|
346 |
-
.ai1ec-
|
|
|
|
|
|
|
|
|
|
|
|
|
347 |
text-align: center;
|
348 |
font-size: 8pt;
|
349 |
color: #aaa;
|
@@ -394,6 +553,41 @@ table.ai1ec-month-view {
|
|
394 |
cursor: default;
|
395 |
}
|
396 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
397 |
/* Agenda view */
|
398 |
.ai1ec-agenda-view {
|
399 |
clear: both;
|
6 |
.ai1ec-container small {
|
7 |
margin: 0 !important;
|
8 |
}
|
9 |
+
/* Some themes pollute table row backgrounds - this line undoes this: */
|
10 |
+
.ai1ec-container tr {
|
11 |
+
background: none !important;
|
12 |
+
}
|
13 |
|
14 |
/* Active buttons */
|
15 |
.ai1ec-action-month #ai1ec-view-month,
|
16 |
+
.ai1ec-action-week #ai1ec-view-week,
|
17 |
.ai1ec-action-agenda #ai1ec-view-agenda {
|
18 |
color: #000;
|
19 |
background: #ddd;
|
168 |
.ai1ec-action-month .ai1ec-pagination a {
|
169 |
width: 7em;
|
170 |
}
|
171 |
+
.ai1ec-action-week .ai1ec-pagination a {
|
172 |
+
width: 8em;
|
173 |
+
}
|
174 |
+
.ai1ec-action-agenda .ai1ec-pagination a {
|
175 |
float: right;
|
176 |
width: 9em;
|
177 |
}
|
179 |
width: 4em;
|
180 |
}
|
181 |
|
182 |
+
/* Month, week tables */
|
183 |
+
table.ai1ec-month-view,
|
184 |
+
.ai1ec-week-view table {
|
185 |
border-collapse: collapse;
|
186 |
border: 1px solid #ddd !important;
|
187 |
margin: 0 !important;
|
190 |
clear: both;
|
191 |
width: 100% !important;
|
192 |
}
|
193 |
+
.ai1ec-week-view .tablescroll_wrapper {
|
194 |
+
position: relative;
|
195 |
+
border-bottom: 1px solid #ddd;
|
196 |
+
}
|
197 |
+
table.ai1ec-week-view-original {
|
198 |
+
visibility: hidden;
|
199 |
+
height: 400px;
|
200 |
+
}
|
201 |
+
table.ai1ec-week-view-original.tablescroll_body {
|
202 |
+
visibility: visible;
|
203 |
+
height: auto;
|
204 |
+
}
|
205 |
+
.ai1ec-week-view table.tablescroll_head,
|
206 |
+
.ai1ec-week-view table.tablescroll_head th {
|
207 |
+
border-bottom: none !important;
|
208 |
+
}
|
209 |
+
table.ai1ec-week-view-original.tablescroll_body,
|
210 |
+
table.ai1ec-week-view-original.tablescroll_body tr:first-child td {
|
211 |
+
border-top: none !important;
|
212 |
+
}
|
213 |
+
.ai1ec-month-view td,
|
214 |
+
.ai1ec-week-view td {
|
215 |
border: 1px solid #ddd !important;
|
216 |
vertical-align: top;
|
217 |
background: none !important;
|
219 |
.ai1ec-month-view td.ai1ec-empty {
|
220 |
background: #f8f8f8 !important;
|
221 |
}
|
222 |
+
.ai1ec-month-view th,
|
223 |
+
.ai1ec-week-view th {
|
224 |
+
border: none !important;
|
225 |
+
background: #f2f2f2 !important;
|
226 |
padding: 0.2em !important;
|
227 |
+
}
|
228 |
+
.ai1ec-month-view th,
|
229 |
+
.ai1ec-week-view th,
|
230 |
+
.ai1ec-week-view .ai1ec-hour-marker div,
|
231 |
+
.ai1ec-week-view .ai1ec-allday-label {
|
232 |
font: bold 9pt Tahoma, Geneva, sans-serif !important;
|
|
|
|
|
|
|
233 |
color: #999 !important;
|
234 |
text-shadow: 0 1px 0 #fff;
|
235 |
-o-text-shadow: 0 1px 0 #fff;
|
237 |
-moz-text-shadow: 0 1px 0 #fff;
|
238 |
-webkit-text-shadow: 0 1px 0 #fff;
|
239 |
}
|
240 |
+
.ai1ec-month-view th {
|
241 |
+
text-align: center !important;
|
242 |
+
}
|
243 |
+
.ai1ec-week-view th {
|
244 |
+
text-align: left !important;
|
245 |
+
}
|
246 |
+
.ai1ec-week-view th .ai1ec-weekday-date {
|
247 |
+
font-size: 10.5pt !important;
|
248 |
+
font-weight: normal !important;
|
249 |
+
}
|
250 |
+
.ai1ec-week-view th .ai1ec-weekday-day {
|
251 |
+
font-size: 9pt !important;
|
252 |
+
font-weight: normal !important;
|
253 |
+
}
|
254 |
+
.ai1ec-month-view td,
|
255 |
+
.ai1ec-week-view td {
|
256 |
padding: 0 !important;
|
257 |
text-align: left;
|
258 |
}
|
259 |
+
.ai1ec-month-view .ai1ec-day,
|
260 |
+
.ai1ec-week-view .ai1ec-day,
|
261 |
+
.ai1ec-week-view .ai1ec-allday-events {
|
262 |
position: relative;
|
263 |
+
}
|
264 |
+
.ai1ec-month-view .ai1ec-day {
|
265 |
min-height: 5em;
|
266 |
}
|
267 |
+
.ai1ec-week-view .ai1ec-day {
|
268 |
+
height: 1440px;
|
269 |
+
}
|
270 |
+
.ai1ec-month-view .ai1ec-today,
|
271 |
+
.ai1ec-week-view .ai1ec-today {
|
272 |
background: #ffd !important;
|
273 |
background: rgba(255,255,128,0.3) !important;
|
274 |
}
|
287 |
-webkit-text-shadow: 0 1px 0 #fff;
|
288 |
}
|
289 |
|
290 |
+
/* Week view now marker */
|
291 |
+
.ai1ec-week-view .ai1ec-grid-container {
|
292 |
+
position: absolute;
|
293 |
+
top: auto;
|
294 |
+
left: 0;
|
295 |
+
right: 0;
|
296 |
+
}
|
297 |
+
.ai1ec-week-view .ai1ec-now-marker,
|
298 |
+
.ai1ec-week-view .ai1ec-hour-marker,
|
299 |
+
.ai1ec-week-view .ai1ec-quarter-marker {
|
300 |
+
position: absolute;
|
301 |
+
left: 0;
|
302 |
+
right: 0;
|
303 |
+
padding-right: 8px;
|
304 |
+
}
|
305 |
+
.ai1ec-week-view .ai1ec-hour-marker {
|
306 |
+
border-top: 1px solid #e8e8e8;
|
307 |
+
border-top: 1px solid rgba(0,0,0,0.08);
|
308 |
+
height: 60px;
|
309 |
+
background: #f2f2f2 !important;
|
310 |
+
background: rgba(0,0,0,0.054) !important;
|
311 |
+
}
|
312 |
+
.ai1ec-week-view .ai1ec-hour-marker div,
|
313 |
+
.ai1ec-week-view .ai1ec-allday-label {
|
314 |
position: relative;
|
315 |
+
z-index: 2;
|
316 |
+
margin-left: 1px;
|
317 |
+
padding: 0 0.2em;
|
318 |
+
font-size: 8pt !important;
|
319 |
+
font-weight: normal !important;
|
320 |
+
background: #f2f2f2;
|
321 |
+
float: left;
|
322 |
+
border-radius: 0.3em;
|
323 |
+
-moz-border-radius: 0.3em;
|
324 |
+
-webkit-border-radius: 0.3em;
|
325 |
+
}
|
326 |
+
.ai1ec-week-view .ai1ec-allday-label {
|
327 |
+
margin-top: 1px;
|
328 |
+
}
|
329 |
+
.ai1ec-week-view .ai1ec-hour-marker.ai1ec-business-hour {
|
330 |
+
background: #fff !important;
|
331 |
+
background: transparent !important;
|
332 |
+
}
|
333 |
+
.ai1ec-week-view .ai1ec-quarter-marker {
|
334 |
+
border-top: 1px solid #f4f4f4;
|
335 |
+
border-top: 1px solid rgba(0,0,0,0.05);
|
336 |
+
}
|
337 |
+
.ai1ec-week-view .ai1ec-now-marker {
|
338 |
+
border-top: 1px solid #f2c539;
|
339 |
+
border-bottom: 1px solid rgba(0, 0, 0, 0.15);
|
340 |
+
z-index: 2;
|
341 |
+
}
|
342 |
+
/* Event summaries in month/week view, including popups */
|
343 |
+
.ai1ec-month-view a.ai1ec-event-container,
|
344 |
+
.ai1ec-week-view a.ai1ec-event-container {
|
345 |
font: 9pt Tahoma, Geneva, sans-serif !important;
|
346 |
text-decoration: none !important;
|
347 |
display: block;
|
348 |
border: none !important;
|
349 |
+
color: #568 !important;
|
350 |
+
}
|
351 |
+
.ai1ec-month-view a.ai1ec-event-container,
|
352 |
+
.ai1ec-week-view .ai1ec-allday-events a.ai1ec-event-container {
|
353 |
+
position: relative;
|
354 |
}
|
355 |
+
.ai1ec-week-view .ai1ec-week a.ai1ec-event-container {
|
356 |
+
position: absolute;
|
357 |
+
box-sizing: border-box;
|
358 |
+
-o-box-sizing: border-box;
|
359 |
+
-moz-box-sizing: border-box;
|
360 |
+
-webkit-box-sizing: border-box;
|
361 |
+
right: 0;
|
362 |
+
border-radius: 0.3em;
|
363 |
+
-moz-border-radius: 0.3em;
|
364 |
+
-webkit-border-radius: 0.3em;
|
365 |
+
box-shadow: 0 3px 6px rgba(0,0,0,0.2);
|
366 |
+
-moz-box-shadow: 0 3px 6px rgba(0,0,0,0.2);
|
367 |
+
-webkit-box-shadow: 0 3px 6px rgba(0,0,0,0.2);
|
368 |
+
border: 2px solid #ced3dd !important;
|
369 |
+
background: #fff !important;
|
370 |
+
background: linear-gradient( top, #fff, #ced3dd ) !important;
|
371 |
+
background: -o-linear-gradient( top, #fff, #ced3dd ) !important;
|
372 |
+
background: -moz-linear-gradient( top, #fff, #ced3dd ) !important;
|
373 |
+
background: -webkit-gradient( linear, left top, left bottom, color-stop( 0, #fff ), color-stop( 1, #ced3dd ) ) !important;
|
374 |
+
background: -webkit-linear-gradient( top, #fff, #ced3dd ) !important;
|
375 |
+
}
|
376 |
+
.ai1ec-month-view .ai1ec-event,
|
377 |
+
.ai1ec-week-view .ai1ec-event {
|
378 |
border-radius: 0.3em;
|
379 |
-o-border-radius: 0.3em;
|
380 |
-moz-border-radius: 0.3em;
|
381 |
-webkit-border-radius: 0.3em;
|
382 |
+
margin: 1px 0 0;
|
383 |
+
padding: 0 3px 1px;
|
384 |
white-space: nowrap;
|
385 |
overflow: hidden;
|
386 |
+
max-height: 100%;
|
387 |
}
|
388 |
+
.ai1ec-month-view .ai1ec-allday .ai1ec-event,
|
389 |
+
.ai1ec-week-view .ai1ec-allday .ai1ec-event {
|
390 |
background: #568;
|
391 |
color: #fff !important;
|
392 |
}
|
393 |
+
.ai1ec-month-view .ai1ec-category-colors,
|
394 |
+
.ai1ec-week-view .ai1ec-category-colors {
|
395 |
float: right;
|
396 |
font-size: 1.2em;
|
397 |
margin-top: 1px;
|
398 |
}
|
399 |
.ai1ec-month-view .ai1ec-event-popup,
|
400 |
+
.ai1ec-month-view .ai1ec-event-summary,
|
401 |
+
.ai1ec-week-view .ai1ec-event-popup,
|
402 |
+
.ai1ec-week-view .ai1ec-event-summary {
|
403 |
border: 2px solid #d4c4b0;
|
404 |
box-shadow: 1px 5px 8px rgba(0,0,0,0.08);
|
405 |
-o-box-shadow: 1px 5px 8px rgba(0,0,0,0.08);
|
408 |
-webkit-box-shadow: 1px 5px 8px rgba(0,0,0,0.08);
|
409 |
background: #fff;
|
410 |
}
|
411 |
+
.ai1ec-month-view .ai1ec-event-popup,
|
412 |
+
.ai1ec-week-view .ai1ec-event-popup {
|
413 |
position: absolute;
|
414 |
z-index: 5;
|
415 |
display: none;
|
423 |
-moz-border-radius: 0 0.3em 0.3em 0;
|
424 |
-webkit-border-radius: 0 0.3em 0.3em 0;
|
425 |
}
|
426 |
+
.ai1ec-week-view .ai1ec-week .ai1ec-event-popup {
|
427 |
+
top: -3px;
|
428 |
+
}
|
429 |
+
.ai1ec-month-view .ai1ec-event-popup.ai1ec-shifted-right,
|
430 |
+
.ai1ec-week-view .ai1ec-event-popup.ai1ec-shifted-right {
|
431 |
border-radius: 0.3em 0 0 0.3em;
|
432 |
-o-border-radius: 0.3em 0 0 0.3em;
|
|
|
433 |
-moz-border-radius: 0.3em 0 0 0.3em;
|
434 |
-webkit-border-radius: 0.3em 0 0 0.3em;
|
435 |
}
|
436 |
+
.ai1ec-month-view .ai1ec-event-popup-bg,
|
437 |
+
.ai1ec-week-view .ai1ec-event-popup-bg {
|
438 |
position: relative;
|
439 |
left: -2px;
|
440 |
margin-right: -1px;
|
441 |
padding: 2px 2px 2px 5px;
|
442 |
background: #fff;
|
443 |
}
|
444 |
+
.ai1ec-month-view .ai1ec-shifted-right .ai1ec-event-popup-bg,
|
445 |
+
.ai1ec-week-view .ai1ec-shifted-right .ai1ec-event-popup-bg {
|
446 |
left: 1px;
|
447 |
padding: 2px 5px 2px 2px;
|
448 |
}
|
449 |
.ai1ec-month-view .ai1ec-event-summary,
|
450 |
+
.ai1ec-month-view .ai1ec-event-summary p,
|
451 |
+
.ai1ec-week-view .ai1ec-event-summary,
|
452 |
+
.ai1ec-week-view .ai1ec-event-summary p {
|
453 |
font-size: 0.95em !important;
|
454 |
}
|
455 |
+
.ai1ec-month-view .ai1ec-event-summary p,
|
456 |
+
.ai1ec-week-view .ai1ec-event-summary p {
|
457 |
line-height: 1.4em !important;
|
458 |
}
|
459 |
+
.ai1ec-month-view .ai1ec-event-summary,
|
460 |
+
.ai1ec-week-view .ai1ec-event-summary {
|
461 |
position: absolute;
|
462 |
overflow: hidden;
|
463 |
top: -2px;
|
478 |
background: -webkit-linear-gradient( #fff 1.5em, #fdfadc );
|
479 |
color: #6d5e4a;
|
480 |
}
|
481 |
+
.ai1ec-month-view .ai1ec-shifted-right .ai1ec-event-summary,
|
482 |
+
.ai1ec-week-view .ai1ec-shifted-right .ai1ec-event-summary {
|
483 |
left: 100%;
|
484 |
border-radius: 0 0.3em 0.3em 0.3em;
|
485 |
-o-border-radius: 0 0.3em 0.3em 0.3em;
|
486 |
-moz-border-radius: 0 0.3em 0.3em 0.3em;
|
487 |
-webkit-border-radius: 0 0.3em 0.3em 0.3em;
|
488 |
}
|
489 |
+
.ai1ec-month-view .ai1ec-event-summary p,
|
490 |
+
.ai1ec-week-view .ai1ec-event-summary p {
|
491 |
margin: 0 0 0.3em !important;
|
492 |
padding: 0 !important;
|
493 |
}
|
494 |
+
.ai1ec-month-view .ai1ec-event-time,
|
495 |
+
.ai1ec-week-view .ai1ec-event-time {
|
496 |
font-size: 8pt;
|
497 |
font-weight: bold;
|
498 |
}
|
499 |
+
.ai1ec-week-view .ai1ec-week .ai1ec-event-title {
|
500 |
+
display: block;
|
501 |
+
white-space: normal;
|
502 |
+
font-size: 8pt !important;
|
503 |
+
}
|
504 |
+
.ai1ec-month-view .ai1ec-read-more,
|
505 |
+
.ai1ec-week-view .ai1ec-read-more {
|
506 |
text-align: center;
|
507 |
font-size: 8pt;
|
508 |
color: #aaa;
|
553 |
cursor: default;
|
554 |
}
|
555 |
|
556 |
+
/* Truncated events */
|
557 |
+
.ai1ec-week-view .ai1ec-start-truncated .ai1ec-event-time {
|
558 |
+
display: none;
|
559 |
+
}
|
560 |
+
.ai1ec-week-view .ai1ec-week a.ai1ec-event-container.ai1ec-start-truncated {
|
561 |
+
border-top-left-radius: 0;
|
562 |
+
border-top-right-radius: 0;
|
563 |
+
-moz-border-radius-topleft: 0;
|
564 |
+
-moz-border-radius-topright: 0;
|
565 |
+
-webkit-border-top-left-radius: 0;
|
566 |
+
-webkit-border-top-right-radius: 0;
|
567 |
+
}
|
568 |
+
.ai1ec-week-view .ai1ec-week .ai1ec-start-truncator {
|
569 |
+
position: absolute;
|
570 |
+
top: -2px;
|
571 |
+
left: -2px;
|
572 |
+
line-height: 1em;
|
573 |
+
font-size: 6pt;
|
574 |
+
}
|
575 |
+
.ai1ec-week-view .ai1ec-week a.ai1ec-event-container.ai1ec-end-truncated {
|
576 |
+
border-bottom-left-radius: 0;
|
577 |
+
border-bottom-right-radius: 0;
|
578 |
+
-moz-border-radius-bottomleft: 0;
|
579 |
+
-moz-border-radius-bottomright: 0;
|
580 |
+
-webkit-border-bottom-left-radius: 0;
|
581 |
+
-webkit-border-bottom-right-radius: 0;
|
582 |
+
}
|
583 |
+
.ai1ec-week-view .ai1ec-week .ai1ec-end-truncator {
|
584 |
+
position: absolute;
|
585 |
+
bottom: -2px;
|
586 |
+
right: -2px;
|
587 |
+
line-height: 1em;
|
588 |
+
font-size: 6pt;
|
589 |
+
}
|
590 |
+
|
591 |
/* Agenda view */
|
592 |
.ai1ec-agenda-view {
|
593 |
clear: both;
|
img/week-view.png
ADDED
Binary file
|
js/calendar.js
CHANGED
@@ -1,21 +1,22 @@
|
|
1 |
-
//Used to ensure that Entities used in L10N strings are correct
|
2 |
-
function ai1ec_convert_entities(o) {
|
3 |
var c, v;
|
4 |
-
|
5 |
-
|
6 |
-
|
|
|
7 |
e.innerHTML = s;
|
8 |
-
return !e.firstChild ? s : e.firstChild.nodeValue;
|
9 |
}
|
10 |
return s;
|
11 |
}
|
12 |
|
13 |
-
if
|
14 |
-
return c(o);
|
15 |
-
} else if
|
16 |
-
for
|
17 |
-
if
|
18 |
-
o[v] = c(o[v]);
|
19 |
}
|
20 |
}
|
21 |
}
|
@@ -149,7 +150,7 @@ jQuery( document ).ready( function( $ ) {
|
|
149 |
load_view( $(this).attr( 'href' ) );
|
150 |
} );
|
151 |
|
152 |
-
// *** Month
|
153 |
|
154 |
/**
|
155 |
* Callback for mouseenter event on .ai1ec-event element
|
@@ -196,22 +197,35 @@ jQuery( document ).ready( function( $ ) {
|
|
196 |
.data( 'ai1ec_mouseinside', false );
|
197 |
}
|
198 |
|
199 |
-
// Register popup hover handlers for month
|
200 |
-
$('.ai1ec-month-view .ai1ec-event')
|
201 |
.live( 'mouseenter', show_popup );
|
202 |
-
$('.ai1ec-month-view .ai1ec-event-popup')
|
203 |
.live( 'mouseleave', hide_popup )
|
204 |
.live( 'mousemove', function() {
|
205 |
// Track whether popup contains mouse cursor
|
206 |
$(this).data( 'ai1ec_mouseinside', true );
|
207 |
} );
|
208 |
// Hide any popups that were visible when the window lost focus
|
209 |
-
if( $('.ai1ec-month-view').length ) {
|
210 |
$(window).blur( function() {
|
211 |
$('.ai1ec-event-popup:visible').each( hide_popup );
|
212 |
} );
|
213 |
}
|
214 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
215 |
/**
|
216 |
* Trims date boxes for which there are too many listed events.
|
217 |
*/
|
@@ -539,12 +553,16 @@ jQuery( document ).ready( function( $ ) {
|
|
539 |
} );
|
540 |
post_ids = post_ids.join(); // Store IDs as comma-separated values
|
541 |
|
|
|
|
|
|
|
542 |
// ===========================
|
543 |
// = Pop up the active event =
|
544 |
// ===========================
|
545 |
if( $( '.ai1ec-active-event:first' ).length ) {
|
546 |
-
// Pop up any active event in month view
|
547 |
-
$( '.ai1ec-month-view .ai1ec-active-event:first
|
|
|
548 |
$(this)
|
549 |
.each( show_popup )
|
550 |
.prev() // .ai1ec-popup
|
@@ -562,11 +580,15 @@ jQuery( document ).ready( function( $ ) {
|
|
562 |
}
|
563 |
);
|
564 |
}
|
|
|
|
|
|
|
|
|
565 |
|
566 |
// Apply category/tag filters if any; hide all events by default, then fade
|
567 |
// in filtered ones.
|
568 |
if( $('.ai1ec-dropdown.ai1ec-selected').length ) {
|
569 |
-
$('.ai1ec-month-view .ai1ec-event-container, .ai1ec-agenda-view .ai1ec-event').hide();
|
570 |
apply_filters();
|
571 |
} else {
|
572 |
// Else do month view trimming
|
1 |
+
// Used to ensure that Entities used in L10N strings are correct
|
2 |
+
function ai1ec_convert_entities( o ) {
|
3 |
var c, v;
|
4 |
+
|
5 |
+
c = function( s ) {
|
6 |
+
if( /&[^;]+;/.test( s ) ) {
|
7 |
+
var e = document.createElement( 'div' );
|
8 |
e.innerHTML = s;
|
9 |
+
return ! e.firstChild ? s : e.firstChild.nodeValue;
|
10 |
}
|
11 |
return s;
|
12 |
}
|
13 |
|
14 |
+
if( typeof o === 'string' ) {
|
15 |
+
return c( o );
|
16 |
+
} else if( typeof o === 'object' ) {
|
17 |
+
for( v in o ) {
|
18 |
+
if( typeof o[v] === 'string' ) {
|
19 |
+
o[v] = c( o[v] );
|
20 |
}
|
21 |
}
|
22 |
}
|
150 |
load_view( $(this).attr( 'href' ) );
|
151 |
} );
|
152 |
|
153 |
+
// *** Month/week views ***
|
154 |
|
155 |
/**
|
156 |
* Callback for mouseenter event on .ai1ec-event element
|
197 |
.data( 'ai1ec_mouseinside', false );
|
198 |
}
|
199 |
|
200 |
+
// Register popup hover handlers for month/week views
|
201 |
+
$('.ai1ec-month-view .ai1ec-event, .ai1ec-week-view .ai1ec-event')
|
202 |
.live( 'mouseenter', show_popup );
|
203 |
+
$('.ai1ec-month-view .ai1ec-event-popup, .ai1ec-week-view .ai1ec-event-popup')
|
204 |
.live( 'mouseleave', hide_popup )
|
205 |
.live( 'mousemove', function() {
|
206 |
// Track whether popup contains mouse cursor
|
207 |
$(this).data( 'ai1ec_mouseinside', true );
|
208 |
} );
|
209 |
// Hide any popups that were visible when the window lost focus
|
210 |
+
if( $('.ai1ec-month-view, .ai1ec-week-view').length ) {
|
211 |
$(window).blur( function() {
|
212 |
$('.ai1ec-event-popup:visible').each( hide_popup );
|
213 |
} );
|
214 |
}
|
215 |
|
216 |
+
// ================================
|
217 |
+
// = Week view hover-raise effect =
|
218 |
+
// ================================
|
219 |
+
$( '.ai1ec-week-view .ai1ec-week a.ai1ec-event-container' )
|
220 |
+
.live( 'mouseenter',
|
221 |
+
function() {
|
222 |
+
$(this).delay( 500 ).queue( function() { $(this).css( 'z-index', 5 ) } );
|
223 |
+
} )
|
224 |
+
.live( 'mouseleave',
|
225 |
+
function() {
|
226 |
+
$(this).clearQueue().css( 'z-index', 'auto' );
|
227 |
+
} );
|
228 |
+
|
229 |
/**
|
230 |
* Trims date boxes for which there are too many listed events.
|
231 |
*/
|
553 |
} );
|
554 |
post_ids = post_ids.join(); // Store IDs as comma-separated values
|
555 |
|
556 |
+
// Make week view table scrollable
|
557 |
+
$( 'table.ai1ec-week-view-original' ).tableScroll( { height: 400, containerClass: 'ai1ec-week-view' } );
|
558 |
+
|
559 |
// ===========================
|
560 |
// = Pop up the active event =
|
561 |
// ===========================
|
562 |
if( $( '.ai1ec-active-event:first' ).length ) {
|
563 |
+
// Pop up any active event in month/week view views
|
564 |
+
$( '.ai1ec-month-view .ai1ec-active-event:first, .ai1ec-week-view .ai1ec-active-event:first' )
|
565 |
+
.each( function() {
|
566 |
$(this)
|
567 |
.each( show_popup )
|
568 |
.prev() // .ai1ec-popup
|
580 |
}
|
581 |
);
|
582 |
}
|
583 |
+
else if( $( '.ai1ec-week-view' ).length ) {
|
584 |
+
// If no active event, then in week view, scroll down to 6am.
|
585 |
+
$( '.ai1ec-week-view .tablescroll_wrapper' ).scrollTo( '.ai1ec-hour-marker:eq(6)' );
|
586 |
+
}
|
587 |
|
588 |
// Apply category/tag filters if any; hide all events by default, then fade
|
589 |
// in filtered ones.
|
590 |
if( $('.ai1ec-dropdown.ai1ec-selected').length ) {
|
591 |
+
$('.ai1ec-month-view .ai1ec-event-container, .ai1ec-week-view .ai1ec-event-container, .ai1ec-agenda-view .ai1ec-event').hide();
|
592 |
apply_filters();
|
593 |
} else {
|
594 |
// Else do month view trimming
|
js/jquery.tablescroll.js
ADDED
@@ -0,0 +1,181 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
|
3 |
+
Copyright (c) 2009 Dimas Begunoff, http://www.farinspace.com
|
4 |
+
|
5 |
+
Licensed under the MIT license
|
6 |
+
http://en.wikipedia.org/wiki/MIT_License
|
7 |
+
|
8 |
+
Permission is hereby granted, free of charge, to any person
|
9 |
+
obtaining a copy of this software and associated documentation
|
10 |
+
files (the "Software"), to deal in the Software without
|
11 |
+
restriction, including without limitation the rights to use,
|
12 |
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
13 |
+
copies of the Software, and to permit persons to whom the
|
14 |
+
Software is furnished to do so, subject to the following
|
15 |
+
conditions:
|
16 |
+
|
17 |
+
The above copyright notice and this permission notice shall be
|
18 |
+
included in all copies or substantial portions of the Software.
|
19 |
+
|
20 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
21 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
22 |
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
23 |
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
24 |
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
25 |
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
26 |
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
27 |
+
OTHER DEALINGS IN THE SOFTWARE.
|
28 |
+
|
29 |
+
*/
|
30 |
+
|
31 |
+
;(function($){
|
32 |
+
|
33 |
+
var scrollbarWidth = 0;
|
34 |
+
|
35 |
+
// http://jdsharp.us/jQuery/minute/calculate-scrollbar-width.php
|
36 |
+
function getScrollbarWidth()
|
37 |
+
{
|
38 |
+
if (scrollbarWidth) return scrollbarWidth;
|
39 |
+
var div = $('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div></div>');
|
40 |
+
$('body').append(div);
|
41 |
+
var w1 = $('div', div).innerWidth();
|
42 |
+
div.css('overflow-y', 'auto');
|
43 |
+
var w2 = $('div', div).innerWidth();
|
44 |
+
$(div).remove();
|
45 |
+
scrollbarWidth = (w1 - w2);
|
46 |
+
return scrollbarWidth;
|
47 |
+
}
|
48 |
+
|
49 |
+
$.fn.tableScroll = function(options)
|
50 |
+
{
|
51 |
+
if (options == 'undo')
|
52 |
+
{
|
53 |
+
var container = $(this).parent().parent();
|
54 |
+
if (container.hasClass('tablescroll_wrapper'))
|
55 |
+
{
|
56 |
+
container.find('.tablescroll_head thead').prependTo(this);
|
57 |
+
container.find('.tablescroll_foot tfoot').appendTo(this);
|
58 |
+
container.before(this);
|
59 |
+
container.empty();
|
60 |
+
}
|
61 |
+
return;
|
62 |
+
}
|
63 |
+
|
64 |
+
var settings = $.extend({},$.fn.tableScroll.defaults,options);
|
65 |
+
|
66 |
+
// Bail out if there's no vertical overflow
|
67 |
+
//if ($(this).height() <= settings.height)
|
68 |
+
//{
|
69 |
+
// return this;
|
70 |
+
//}
|
71 |
+
|
72 |
+
settings.scrollbarWidth = getScrollbarWidth();
|
73 |
+
|
74 |
+
this.each(function()
|
75 |
+
{
|
76 |
+
var flush = settings.flush;
|
77 |
+
|
78 |
+
var tb = $(this).addClass('tablescroll_body');
|
79 |
+
|
80 |
+
var wrapper = $('<div class="tablescroll_wrapper"></div>').insertBefore(tb).append(tb);
|
81 |
+
|
82 |
+
// check for a predefined container
|
83 |
+
if (!wrapper.parent('div').hasClass(settings.containerClass))
|
84 |
+
{
|
85 |
+
$('<div></div>').addClass(settings.containerClass).insertBefore(wrapper).append(wrapper);
|
86 |
+
}
|
87 |
+
|
88 |
+
var width = settings.width ? settings.width : tb.outerWidth();
|
89 |
+
|
90 |
+
wrapper.css
|
91 |
+
({
|
92 |
+
'width': width+'px',
|
93 |
+
'height': settings.height+'px',
|
94 |
+
'overflow': 'auto'
|
95 |
+
});
|
96 |
+
|
97 |
+
tb.css('width',width+'px');
|
98 |
+
|
99 |
+
// with border difference
|
100 |
+
var wrapper_width = wrapper.outerWidth();
|
101 |
+
var diff = wrapper_width-width;
|
102 |
+
|
103 |
+
// assume table will scroll
|
104 |
+
wrapper.css({width:((width-diff)+settings.scrollbarWidth)+'px'});
|
105 |
+
tb.css('width',(width-diff)+'px');
|
106 |
+
|
107 |
+
if (tb.outerHeight() <= settings.height)
|
108 |
+
{
|
109 |
+
wrapper.css({height:'auto',width:(width-diff)+'px'});
|
110 |
+
flush = false;
|
111 |
+
}
|
112 |
+
|
113 |
+
// using wrap does not put wrapper in the DOM right
|
114 |
+
// away making it unavailable for use during runtime
|
115 |
+
// tb.wrap(wrapper);
|
116 |
+
|
117 |
+
// possible speed enhancements
|
118 |
+
var has_thead = $('thead',tb).length ? true : false ;
|
119 |
+
var has_tfoot = $('tfoot',tb).length ? true : false ;
|
120 |
+
var thead_tr_first = $('thead tr:first',tb);
|
121 |
+
var tbody_tr_first = $('tbody tr:first',tb);
|
122 |
+
var tfoot_tr_first = $('tfoot tr:first',tb);
|
123 |
+
|
124 |
+
// remember width of last cell
|
125 |
+
var w = 0;
|
126 |
+
|
127 |
+
$('th, td',thead_tr_first).each(function(i)
|
128 |
+
{
|
129 |
+
w = $(this).width();
|
130 |
+
|
131 |
+
$('th:eq('+i+'), td:eq('+i+')',thead_tr_first).css('width',w+'px');
|
132 |
+
$('th:eq('+i+'), td:eq('+i+')',tbody_tr_first).css('width',w+'px');
|
133 |
+
if (has_tfoot) $('th:eq('+i+'), td:eq('+i+')',tfoot_tr_first).css('width',w+'px');
|
134 |
+
});
|
135 |
+
|
136 |
+
if (has_thead)
|
137 |
+
{
|
138 |
+
var tbh = $('<table class="tablescroll_head" cellspacing="0"></table>').insertBefore(wrapper).prepend($('thead',tb));
|
139 |
+
}
|
140 |
+
|
141 |
+
if (has_tfoot)
|
142 |
+
{
|
143 |
+
var tbf = $('<table class="tablescroll_foot" cellspacing="0"></table>').insertAfter(wrapper).prepend($('tfoot',tb));
|
144 |
+
}
|
145 |
+
|
146 |
+
if (tbh != undefined)
|
147 |
+
{
|
148 |
+
tbh.css('width',width+'px');
|
149 |
+
|
150 |
+
if (flush)
|
151 |
+
{
|
152 |
+
$('tr:first th:last, tr:first td:last',tbh).css('width',(w+settings.scrollbarWidth)+'px');
|
153 |
+
tbh.css('width',wrapper.outerWidth() + 'px');
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
+
if (tbf != undefined)
|
158 |
+
{
|
159 |
+
tbf.css('width',width+'px');
|
160 |
+
|
161 |
+
if (flush)
|
162 |
+
{
|
163 |
+
$('tr:first th:last, tr:first td:last',tbf).css('width',(w+settings.scrollbarWidth)+'px');
|
164 |
+
tbf.css('width',wrapper.outerWidth() + 'px');
|
165 |
+
}
|
166 |
+
}
|
167 |
+
});
|
168 |
+
|
169 |
+
return this;
|
170 |
+
};
|
171 |
+
|
172 |
+
// public
|
173 |
+
$.fn.tableScroll.defaults =
|
174 |
+
{
|
175 |
+
flush: true, // makes the last thead and tbody column flush with the scrollbar
|
176 |
+
width: null, // width of the table (head, body and foot), null defaults to the tables natural width
|
177 |
+
height: 100, // height of the scrollable area
|
178 |
+
containerClass: 'tablescroll' // the plugin wraps the table in a div with this css class
|
179 |
+
};
|
180 |
+
|
181 |
+
})(jQuery);
|
readme.txt
CHANGED
@@ -4,31 +4,31 @@ Donate link: http://theseednetwork.com/software/all-in-one-event-calendar-wordpr
|
|
4 |
Tags: calendar, event, events, ics, ics calendar, ical-feed, ics feed, wordpress ics importer, wordpress ical importer, upcoming events, todo, notes, journal, freebusy, availability, web calendar, web events, webcal, google calendar, ical, iCalendar, all-in-one, ai1ec, google calendar sync, ical sync, events sync, holiday calendar, calendar 2011, events 2011, widget, events widget, upcoming events widget, calendar widget, agenda widget
|
5 |
Requires at least: 3.1.3
|
6 |
Tested up to: 3.2.1
|
7 |
-
Stable tag: 1.
|
8 |
|
9 |
-
An event calendar system with month
|
10 |
|
11 |
== Description ==
|
12 |
|
13 |
-
Welcome to the [All-in-One Event Calendar Plugin](http://theseednetwork.com/software/all-in-one-event-calendar-wordpress/), from [The Seed
|
14 |
|
15 |
-
Our new calendar system combines a clean visual design, solid architectural patterns and
|
|
|
|
|
16 |
|
17 |
= Calendar Features For Users =
|
18 |
|
19 |
This plugin has many features we hope will prove useful to users, including:
|
20 |
|
21 |
-
* Recurring
|
22 |
-
* Filtering by event category or tag
|
23 |
-
* Easy sharing with Google Calendar, Apple iCal, MS Outlook and any other system that accepts iCalendar (.ics) feeds
|
24 |
-
* Embedded Google Maps
|
25 |
-
* Color-coded events based on category
|
26 |
-
* Event-registration ready
|
27 |
-
* Month and agenda views
|
28 |
-
* Upcoming Events widget
|
29 |
-
*
|
30 |
-
|
31 |
-
(* Limited recurrence patterns available in first release. Full support to come in the next release.)
|
32 |
|
33 |
= Features for Website and Blog Owners =
|
34 |
|
@@ -48,63 +48,67 @@ The All-in-One Event Calendar Plugin also has a few features that will prove use
|
|
48 |
* Each event links to the original calendar
|
49 |
* Your calendar can be embedded into a WordPress page without needing to create template files or modify the theme
|
50 |
|
51 |
-
[Check out the DEMO »](http://demo.
|
52 |
|
53 |
-
[Track the development process »](http://trac.
|
54 |
|
55 |
-
[Bug reports (
|
56 |
|
57 |
-
[Get Premium Support »](http://theseednetwork.com/get-supported) from [The Seed Studio
|
58 |
|
59 |
== Changelog ==
|
|
|
|
|
|
|
|
|
60 |
= Version 1.1.3 =
|
61 |
-
* Fixed: last date issue for recurring events "until" end date [#147](http://trac.
|
62 |
* Fixed an issue with settings page not saving changes.
|
63 |
* Fixed issues when subscribing to calendars.
|
64 |
-
* Export only published events [#95](http://trac.
|
65 |
-
* Added translation patch. Thank you josjo! [#150](http://trac.
|
66 |
-
* Add language and region awareness in functions for Google Map. Thank you josjo! [#102](http://trac.
|
67 |
-
* Small translation error in class-ai1ec-app-helper.php. Thank you josjo! [#94](http://trac.
|
68 |
-
* Added Dutch, Spanish, and Swedish translations. For up to date language files, visit
|
69 |
|
70 |
= Version 1.1.2 =
|
71 |
-
* Fixed: Problem in repeat UI when selecting months before October [#136](http://trac.
|
72 |
-
* Fixed: Append instance_id only to events permalink [#140](http://trac.
|
73 |
-
* Fixed: Events ending on date problem [#141](http://trac.
|
74 |
* Feature: Added French translations
|
75 |
|
76 |
= Version 1.1.1 =
|
77 |
* Fixes a problem when plugin is enabled for first time
|
78 |
|
79 |
= Version 1.1 =
|
80 |
-
* Feature: New recurrence UI when adding events [#40](http://trac.
|
81 |
-
* Feature: Translate recurrence rule to Human readable format that allows localization [#40](http://trac.
|
82 |
-
* Feature: Add Filter by Categories, Tags to Widget [#44](http://trac.
|
83 |
-
* Feature: Add option to keep all events expanded in the agenda view [#33](http://trac.
|
84 |
-
* Feature: Make it possible to globalize the date picker. Thank you josjo! [#52](http://trac.
|
85 |
-
* Fixed: On recurring events show the date time of the current event and NOT the original event [#39](http://trac.
|
86 |
-
* Fixed: Events posted in Standard time from Daylight Savings Time are wrong [#42](http://trac.
|
87 |
-
* Fixed: Multi-day Events listing twice [#56](http://trac.
|
88 |
-
* Fixed: %e is not supported in gmstrftime on Windows [#53](http://trac.
|
89 |
-
* Improved: IE9 Support [#11](http://trac.
|
90 |
-
* Improved: Corrected as many as possible HTML validation errors [#9](http://trac.
|
91 |
* Improved: Optimization changes for better performance.
|
92 |
|
93 |
= Version 1.0.9 =
|
94 |
* Fixed a problem with timezone dropdown list
|
95 |
|
96 |
= Version 1.0.8 =
|
97 |
-
* Added better if not full localization support [#25](http://trac.
|
98 |
-
* Added qTranslate support and output to post data using WordPress filters [#1](http://trac.
|
99 |
-
* Added uninstall support [#7](http://trac.
|
100 |
-
* Added 24h time in time pickers [#26](http://trac.
|
101 |
-
* Fixed an issue when event duration time is decremented in single (detailed) view [#2](http://trac.
|
102 |
-
* Fixed an issue with times for ics imported events [#6](http://trac.
|
103 |
-
* Better timezone control [#27](http://trac.
|
104 |
-
* Fixed the category filter in agenda view [#12](http://trac.
|
105 |
-
* Fixed event date being set to null when using quick edit [#16](http://trac.
|
106 |
-
* Fixed a bug in time pickers [#17](http://trac.
|
107 |
-
* Deprecated function split() is removed [#8](http://trac.
|
108 |
|
109 |
= Version 1.0.7 =
|
110 |
* Fixed issue with some MySQL version
|
@@ -176,10 +180,11 @@ To place the calendar in a DOM/HTML element besides the default page content con
|
|
176 |
6. Front-end: Month view of calendar with mouse cursor hovering over event
|
177 |
7. Front-end: Month view of calendar with active category filter
|
178 |
8. Front-end: Month view of calendar with active tag filter
|
179 |
-
9. Front-end:
|
180 |
-
10.
|
181 |
-
11.
|
182 |
-
12. Upcoming Events widget
|
|
|
183 |
|
184 |
== Upgrade Notice ==
|
185 |
|
4 |
Tags: calendar, event, events, ics, ics calendar, ical-feed, ics feed, wordpress ics importer, wordpress ical importer, upcoming events, todo, notes, journal, freebusy, availability, web calendar, web events, webcal, google calendar, ical, iCalendar, all-in-one, ai1ec, google calendar sync, ical sync, events sync, holiday calendar, calendar 2011, events 2011, widget, events widget, upcoming events widget, calendar widget, agenda widget
|
5 |
Requires at least: 3.1.3
|
6 |
Tested up to: 3.2.1
|
7 |
+
Stable tag: 1.2
|
8 |
|
9 |
+
An event calendar system with month, week & agenda views, upcoming events widget, color-coded categories, recurrence, and import/export of .ics feeds.
|
10 |
|
11 |
== Description ==
|
12 |
|
13 |
+
Welcome to the [All-in-One Event Calendar Plugin](http://theseednetwork.com/software/all-in-one-event-calendar-wordpress/), from [The Seed Network](http://theseednetwork.com/), a web development company. The All-in-One Event Calendar is a new way to list your events in WordPress and easily share them with the rest of the world.
|
14 |
|
15 |
+
Our new calendar system combines a clean visual design, solid architectural patterns and a powerful set of features to create the most advanced calendar system available for WordPress. Best of all: it’s completely free.
|
16 |
+
|
17 |
+
**New in version 1.2:** A beautifully rendered, scrolling **Week view**!
|
18 |
|
19 |
= Calendar Features For Users =
|
20 |
|
21 |
This plugin has many features we hope will prove useful to users, including:
|
22 |
|
23 |
+
* **Recurring** events
|
24 |
+
* **Filtering** by event category or tag
|
25 |
+
* Easy **sharing** with Google Calendar, Apple iCal, MS Outlook and any other system that accepts iCalendar (.ics) feeds
|
26 |
+
* Embedded **Google Maps**
|
27 |
+
* **Color-coded** events based on category
|
28 |
+
* **Event-registration** ready
|
29 |
+
* **Month**, **week** and **agenda** views
|
30 |
+
* **Upcoming Events** widget
|
31 |
+
* Direct links to **filtered calendar views**
|
|
|
|
|
32 |
|
33 |
= Features for Website and Blog Owners =
|
34 |
|
48 |
* Each event links to the original calendar
|
49 |
* Your calendar can be embedded into a WordPress page without needing to create template files or modify the theme
|
50 |
|
51 |
+
**[Check out the DEMO »](http://demo.theseednetwork.com/)**
|
52 |
|
53 |
+
**[Track the development process »](http://trac.theseednetwork.com/roadmap)**
|
54 |
|
55 |
+
**[Bug reports »](http://trac.theseednetwork.com/newticket)** ([registration](http://trac.theseednetwork.com/register) required)
|
56 |
|
57 |
+
**[Get Premium Support »](http://theseednetwork.com/get-supported)** from [The Seed Studio](http://theseednetwork.com/)
|
58 |
|
59 |
== Changelog ==
|
60 |
+
= Version 1.2 =
|
61 |
+
* Added scrollable Week view [#117](http://trac.the-seed.ca/ticket/117)
|
62 |
+
* Fixed some notice-level errors
|
63 |
+
|
64 |
= Version 1.1.3 =
|
65 |
+
* Fixed: last date issue for recurring events "until" end date [#147](http://trac.theseednetwork.com/ticket/147)
|
66 |
* Fixed an issue with settings page not saving changes.
|
67 |
* Fixed issues when subscribing to calendars.
|
68 |
+
* Export only published events [#95](http://trac.theseednetwork.com/ticket/95)
|
69 |
+
* Added translation patch. Thank you josjo! [#150](http://trac.theseednetwork.com/ticket/150)
|
70 |
+
* Add language and region awareness in functions for Google Map. Thank you josjo! [#102](http://trac.theseednetwork.com/ticket/102)
|
71 |
+
* Small translation error in class-ai1ec-app-helper.php. Thank you josjo! [#94](http://trac.theseednetwork.com/ticket/94)
|
72 |
+
* Added Dutch, Spanish, and Swedish translations. For up to date language files, visit [ticket #78](http://trac.theseednetwork.com/ticket/78).
|
73 |
|
74 |
= Version 1.1.2 =
|
75 |
+
* Fixed: Problem in repeat UI when selecting months before October [#136](http://trac.theseednetwork.com/ticket/136)
|
76 |
+
* Fixed: Append instance_id only to events permalink [#140](http://trac.theseednetwork.com/ticket/140)
|
77 |
+
* Fixed: Events ending on date problem [#141](http://trac.theseednetwork.com/ticket/141)
|
78 |
* Feature: Added French translations
|
79 |
|
80 |
= Version 1.1.1 =
|
81 |
* Fixes a problem when plugin is enabled for first time
|
82 |
|
83 |
= Version 1.1 =
|
84 |
+
* Feature: New recurrence UI when adding events [#40](http://trac.theseednetwork.com/ticket/40)
|
85 |
+
* Feature: Translate recurrence rule to Human readable format that allows localization [#40](http://trac.theseednetwork.com/ticket/40)
|
86 |
+
* Feature: Add Filter by Categories, Tags to Widget [#44](http://trac.theseednetwork.com/ticket/44)
|
87 |
+
* Feature: Add option to keep all events expanded in the agenda view [#33](http://trac.theseednetwork.com/ticket/33)
|
88 |
+
* Feature: Make it possible to globalize the date picker. Thank you josjo! [#52](http://trac.theseednetwork.com/ticket/52)
|
89 |
+
* Fixed: On recurring events show the date time of the current event and NOT the original event [#39](http://trac.theseednetwork.com/ticket/39)
|
90 |
+
* Fixed: Events posted in Standard time from Daylight Savings Time are wrong [#42](http://trac.theseednetwork.com/ticket/42)
|
91 |
+
* Fixed: Multi-day Events listing twice [#56](http://trac.theseednetwork.com/ticket/56)
|
92 |
+
* Fixed: %e is not supported in gmstrftime on Windows [#53](http://trac.theseednetwork.com/ticket/53)
|
93 |
+
* Improved: IE9 Support [#11](http://trac.theseednetwork.com/ticket/11)
|
94 |
+
* Improved: Corrected as many as possible HTML validation errors [#9](http://trac.theseednetwork.com/ticket/9)
|
95 |
* Improved: Optimization changes for better performance.
|
96 |
|
97 |
= Version 1.0.9 =
|
98 |
* Fixed a problem with timezone dropdown list
|
99 |
|
100 |
= Version 1.0.8 =
|
101 |
+
* Added better if not full localization support [#25](http://trac.theseednetwork.com/ticket/25) [#23](http://trac.theseednetwork.com/ticket/23) [#10](http://trac.theseednetwork.com/ticket/10) - thank you josjo
|
102 |
+
* Added qTranslate support and output to post data using WordPress filters [#1](http://trac.theseednetwork.com/ticket/1)
|
103 |
+
* Added uninstall support [#7](http://trac.theseednetwork.com/ticket/7)
|
104 |
+
* Added 24h time in time pickers [#26](http://trac.theseednetwork.com/ticket/26) - thank you josjo
|
105 |
+
* Fixed an issue when event duration time is decremented in single (detailed) view [#2](http://trac.theseednetwork.com/ticket/2)
|
106 |
+
* Fixed an issue with times for ics imported events [#6](http://trac.theseednetwork.com/ticket/6)
|
107 |
+
* Better timezone control [#27](http://trac.theseednetwork.com/ticket/27)
|
108 |
+
* Fixed the category filter in agenda view [#12](http://trac.theseednetwork.com/ticket/12)
|
109 |
+
* Fixed event date being set to null when using quick edit [#16](http://trac.theseednetwork.com/ticket/16)
|
110 |
+
* Fixed a bug in time pickers [#17](http://trac.theseednetwork.com/ticket/17) - thank you josjo
|
111 |
+
* Deprecated function split() is removed [#8](http://trac.theseednetwork.com/ticket/8)
|
112 |
|
113 |
= Version 1.0.7 =
|
114 |
* Fixed issue with some MySQL version
|
180 |
6. Front-end: Month view of calendar with mouse cursor hovering over event
|
181 |
7. Front-end: Month view of calendar with active category filter
|
182 |
8. Front-end: Month view of calendar with active tag filter
|
183 |
+
9. Front-end: Week view of calendar
|
184 |
+
10. Front-end: Agenda view of calendar
|
185 |
+
11. Settings page
|
186 |
+
12. Upcoming Events widget
|
187 |
+
13. Upcoming Events widget - configuration options
|
188 |
|
189 |
== Upgrade Notice ==
|
190 |
|
screenshot-10.png
CHANGED
Binary file
|
screenshot-11.png
CHANGED
Binary file
|
screenshot-12.png
CHANGED
Binary file
|
screenshot-13.png
ADDED
Binary file
|
screenshot-9.png
CHANGED
Binary file
|