PluginProbe
Calendar / 1.2.1
Calendar v1.2.1
trunk 1.0 1.1 1.1.1 1.1.2 1.2 1.2.1 1.2.2 1.2.3 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.14 1.3.15 1.3.16 1.3.17 1.3.18 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 All 28 releases
calendar / calendar.php

calendar.php in Calendar 1.2.1, at calendar.php

2,342 lines 84.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 Plugin Name: Calendar
4 Plugin URI: http://www.kjowebservices.co.uk
5 Description: This plugin allows you to display a calendar of all your events and appointments as a page on your site.
6 Author: Kieran O'Shea
7 Author URI: http://www.kjowebservices.co.uk
8 Version: 1.2.1
9 */
10
11 /* Copyright 2008 KJO Web Services (email : sales@kjowebservices.co.uk)
12
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2 of the License, or
16 (at your option) any later version.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 */
27
28 // Define the tables used in Calendar
29 define('WP_CALENDAR_TABLE', $table_prefix . 'calendar');
30 define('WP_CALENDAR_CONFIG_TABLE', $table_prefix . 'calendar_config');
31 define('WP_CALENDAR_CATEGORIES_TABLE', $table_prefix . 'calendar_categories');
32
33 // Create a master category for Calendar and its sub-pages
34 add_action('admin_menu', 'calendar_menu');
35
36 // Enable the ability for the calendar to be loaded from pages
37 add_filter('the_content','calendar_insert');
38
39 // Add the function that puts style information in the header
40 add_action('wp_head', 'calendar_wp_head');
41
42 // Add the function that deals with deleted users
43 add_action('delete_user', 'deal_with_deleted_user');
44
45 // Add the widgets if we are using version 2.5
46 add_action('widgets_init', 'widget_init_calendar_today');
47 add_action('widgets_init', 'widget_init_calendar_upcoming');
48
49 // Before we get on with the functions, we need to define the initial style used for Calendar
50
51 // Function to deal with events posted by a user when that user is deleted
52 function deal_with_deleted_user($id)
53 {
54 global $wpdb;
55
56 // This wouldn't work unless the database was up to date. Lets check.
57 check_calendar();
58
59 // Do the query
60 $wpdb->get_results("UPDATE ".WP_CALENDAR_TABLE." SET event_author=".$wpdb->get_var("SELECT MIN(ID) FROM ".$wpdb->prefix."users",0,0)." WHERE event_author=".$id);
61 }
62
63 // Function to add the calendar style into the header
64 function calendar_wp_head()
65 {
66 global $wpdb;
67
68 // If the calendar isn't installed or upgraded this won't work
69 check_calendar();
70
71 $styles = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='calendar_style'");
72 if (!empty($styles))
73 {
74 foreach ($styles as $style)
75 {
76 echo '<style type="text/css">
77 <!--
78 ';
79 echo $style->config_value.'
80 ';
81 echo '//-->
82 </style>
83 ';
84 }
85 }
86 }
87
88 // Function to deal with adding the calendar menus
89 function calendar_menu()
90 {
91 global $wpdb;
92
93 // We make use of the Calendar tables so we must have installed Calendar
94 check_calendar();
95
96 // Set admin as the only one who can use Calendar for security
97 $allowed_group = 'manage_options';
98
99 // Use the database to *potentially* override the above if allowed
100 $configs = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='can_manage_events'");
101 if (!empty($configs))
102 {
103 foreach ($configs as $config)
104 {
105 $allowed_group = $config->config_value;
106 }
107 }
108
109 // Add the admin panel pages for Calendar. Use permissions pulled from above
110 if (function_exists('add_menu_page'))
111 {
112 add_menu_page(__('Calendar'), __('Calendar'), $allowed_group, __FILE__, 'edit_calendar');
113 }
114 if (function_exists('add_submenu_page'))
115 {
116 add_submenu_page(__FILE__, __('Manage Calendar'), __('Manage Calendar'), $allowed_group, __FILE__, 'edit_calendar');
117 add_action( "admin_head", 'calendar_add_javascript' );
118 // Note only admin can change calendar options
119 add_submenu_page(__FILE__, __('Manage Categories'), __('Manage Categories'), 'manage_options', 'manage-categories', 'manage_categories');
120 add_submenu_page(__FILE__, __('Calendar Config'), __('Calendar Options'), 'manage_options', 'calendar-config', 'edit_calendar_config');
121 }
122 }
123
124 // Function to add the javascript to the admin header
125 function calendar_add_javascript()
126 {
127 echo '<script type="text/javascript" src="';
128 bloginfo('url');
129 echo '/wp-content/plugins/calendar/javascript.js"></script>
130 <script type="text/javascript">document.write(getCalendarStyles());</script>
131 ';
132 }
133
134 // Function to deal with loading the calendar into pages
135 function calendar_insert($content)
136 {
137 if (preg_match('{CALENDAR}',$content))
138 {
139 $content = str_replace('{CALENDAR}',calendar(),$content);
140 }
141 return $content;
142 }
143
144 // Function to check what version of Calendar is installed and install if needed
145 function check_calendar()
146 {
147 // Checks to make sure Calendar is installed, if not it adds the default
148 // database tables and populates them with test data. If it is, then the
149 // version is checked through various means and if it is not up to date
150 // then it is upgraded.
151
152 // Lets see if this is first run and create us a table if it is!
153 global $wpdb, $initial_style;
154
155 // All this style info will go into the database on a new install
156 // This looks nice in the Kubrick theme
157 $initial_style = " .calnk a:hover {
158 background-position:0 0;
159 text-decoration:none;
160 color:#000000;
161 border-bottom:1px dotted #000000;
162 }
163 .calnk a:visited {
164 text-decoration:none;
165 color:#000000;
166 border-bottom:1px dotted #000000;
167 }
168 .calnk a {
169 text-decoration:none;
170 color:#000000;
171 border-bottom:1px dotted #000000;
172 }
173 .calnk a span {
174 display:none;
175 }
176 .calnk a:hover span {
177 color:#333333;
178 background:#F6F79B;
179 display:block;
180 position:absolute;
181 margin-top:1px;
182 padding:5px;
183 width:150px;
184 z-index:100;
185 }
186 .calendar-table {
187 border:none;
188 width:100%;
189 }
190 .calendar-heading {
191 height:25px;
192 text-align:center;
193 border:1px solid #D6DED5;
194 background-color:#E4EBE3;
195 }
196 .calendar-next {
197 width:25%;
198 text-align:center;
199 }
200 .calendar-prev {
201 width:25%;
202 text-align:center;
203 }
204 .calendar-month {
205 width:50%;
206 text-align:center;
207 font-weight:bold;
208 }
209 .normal-day-heading {
210 text-align:center;
211 width:25px;
212 height:25px;
213 font-size:0.8em;
214 border:1px solid #DFE6DE;
215 background-color:#EBF2EA;
216 }
217 .weekend-heading {
218 text-align:center;
219 width:25px;
220 height:25px;
221 font-size:0.8em;
222 border:1px solid #DFE6DE;
223 background-color:#EBF2EA;
224 color:#FF0000;
225 }
226 .day-with-date {
227 vertical-align:text-top;
228 text-align:left;
229 width:60px;
230 height:60px;
231 border:1px solid #DFE6DE;
232 }
233 .no-events {
234
235 }
236 .day-without-date {
237 width:60px;
238 height:60px;
239 border:1px solid #E9F0E8;
240 }
241 span.weekend {
242 color:#FF0000;
243 }
244 .current-day {
245 vertical-align:text-top;
246 text-align:left;
247 width:60px;
248 height:60px;
249 border:1px solid #BFBFBF;
250 background-color:#E4EBE3;
251 }
252 span.event {
253 font-size:0.75em;
254 }
255 .kjo-link {
256 font-size:0.75em;
257 text-align:center;
258 }
259 .event-title {
260 text-align:center;
261 font-weight:bold;
262 font-size:1.2em;
263 }
264 .event-title-break {
265 width:96%;
266 margin-left:2%;
267 margin-right:2%;
268 margin-top:5px;
269 margin-bottom:5px;
270 text-align:center;
271 height:1px;
272 background-color:#000000;
273 }
274 .event-content-break {
275 width:96%;
276 margin-left:2%;
277 margin-right:2%;
278 margin-top:5px;
279 margin-bottom:5px;
280 text-align:center;
281 height:1px;
282 background-color:#000000;
283 }
284 .calendar-date-switcher {
285 height:25px;
286 text-align:center;
287 border:1px solid #D6DED5;
288 background-color:#E4EBE3;
289 }
290 .calendar-date-switcher form {
291 margin:0;
292 padding:0;
293 }
294 .calendar-date-switcher input {
295 border:1px #D6DED5 solid;
296 }
297 .calendar-date-switcher select {
298 border:1px #D6DED5 solid;
299 }
300 .cat-key {
301 width:100%;
302 margin-top:10px;
303 padding:5px;
304 border:1px solid #D6DED5;
305 }";
306
307
308 // Assume this is not a new install until we prove otherwise
309 $new_install = false;
310 $vone_point_one_upgrade = false;
311 $vone_point_two_beta_upgrade = false;
312
313 $wp_calendar_exists = false;
314 $wp_calendar_config_exists = false;
315 $wp_calendar_config_version_number_exists = false;
316
317 // Determine the calendar version
318 $tables = $wpdb->get_results("show tables;");
319 foreach ( $tables as $table )
320 {
321 foreach ( $table as $value )
322 {
323 if ( $value == WP_CALENDAR_TABLE )
324 {
325 $wp_calendar_exists = true;
326 }
327 if ( $value == WP_CALENDAR_CONFIG_TABLE )
328 {
329 $wp_calendar_config_exists = true;
330
331 // We now try and find the calendar version number
332 // This will be a lot easier than finding other stuff
333 // in the future.
334 $version_number = $wpdb->get_var("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='calendar_version'");
335 if ($version_number == "1.2")
336 {
337 $wp_calendar_config_version_number_exists = true;
338 }
339 }
340 }
341 }
342
343 if ($wp_calendar_exists == false && $wp_calendar_config_exists == false)
344 {
345 $new_install = true;
346 }
347 else if ($wp_calendar_exists == true && $wp_calendar_config_exists == false)
348 {
349 $vone_point_one_upgrade = true;
350 }
351 else if ($wp_calendar_exists == true && $wp_calendar_config_exists == true && $wp_calendar_config_version_number_exists == false)
352 {
353 $vone_point_two_beta_upgrade = true;
354 }
355
356 // Now we've determined what the current install is or isn't
357 // we perform operations according to the findings
358 if ( $new_install == true )
359 {
360 $sql = "CREATE TABLE " . WP_CALENDAR_TABLE . " (
361 event_id INT(11) NOT NULL AUTO_INCREMENT ,
362 event_begin DATE NOT NULL ,
363 event_end DATE NOT NULL ,
364 event_title VARCHAR(30) NOT NULL ,
365 event_desc TEXT NOT NULL ,
366 event_time TIME ,
367 event_recur CHAR(1) ,
368 event_repeats INT(3) ,
369 event_author BIGINT(20) UNSIGNED,
370 PRIMARY KEY (event_id)
371 )";
372 $wpdb->get_results($sql);
373 $sql = "CREATE TABLE " . WP_CALENDAR_CONFIG_TABLE . " (
374 config_item VARCHAR(30) NOT NULL ,
375 config_value TEXT NOT NULL ,
376 PRIMARY KEY (config_item)
377 )";
378 $wpdb->get_results($sql);
379 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='can_manage_events', config_value='edit_posts'";
380 $wpdb->get_results($sql);
381 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='calendar_style', config_value='".$initial_style."'";
382 $wpdb->get_results($sql);
383 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_author', config_value='false'";
384 $wpdb->get_results($sql);
385 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_jump', config_value='false'";
386 $wpdb->get_results($sql);
387 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_todays', config_value='true'";
388 $wpdb->get_results($sql);
389 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_upcoming', config_value='true'";
390 $wpdb->get_results($sql);
391 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_upcoming_days', config_value=7";
392 $wpdb->get_results($sql);
393
394 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='calendar_version', config_value='1.2'";
395 $wpdb->get_results($sql);
396 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='enable_categories', config_value='false'";
397 $wpdb->get_results($sql);
398 $sql = "ALTER TABLE ".WP_CALENDAR_TABLE." ADD COLUMN event_category BIGINT(20) UNSIGNED";
399 $wpdb->get_results($sql);
400 $sql = "UPDATE " . WP_CALENDAR_TABLE . " SET event_category=1";
401 $wpdb->get_results($sql);
402 $sql = "ALTER TABLE ".WP_CALENDAR_TABLE." ADD COLUMN event_link TEXT";
403 $wpdb->get_results($sql);
404 $sql = "UPDATE " . WP_CALENDAR_TABLE . " SET event_link=''";
405 $wpdb->get_results($sql);
406 $sql = "CREATE TABLE " . WP_CALENDAR_CATEGORIES_TABLE . " (
407 category_id INT(11) NOT NULL AUTO_INCREMENT,
408 category_name VARCHAR(30) NOT NULL ,
409 category_colour VARCHAR(30) NOT NULL ,
410 PRIMARY KEY (category_id)
411 )";
412 $wpdb->get_results($sql);
413 $sql = "INSERT INTO " . WP_CALENDAR_CATEGORIES_TABLE . " SET category_id=0, category_name='General', category_colour='#F6F79B'";
414 $wpdb->get_results($sql);
415 }
416 else if ($vone_point_one_upgrade == true)
417 {
418 $sql = "ALTER TABLE ".WP_CALENDAR_TABLE." ADD COLUMN event_author BIGINT(20) UNSIGNED";
419 $wpdb->get_results($sql);
420 $sql = "UPDATE ".WP_CALENDAR_TABLE." SET event_author=".$wpdb->get_var("SELECT MIN(ID) FROM ".$wpdb->prefix."users",0,0);
421 $wpdb->get_results($sql);
422 $sql = "ALTER TABLE ".WP_CALENDAR_TABLE." MODIFY event_desc TEXT NOT NULL";
423 $wpdb->get_results($sql);
424 $sql = "CREATE TABLE " . WP_CALENDAR_CONFIG_TABLE . " (
425 config_item VARCHAR(30) NOT NULL ,
426 config_value TEXT NOT NULL ,
427 PRIMARY KEY (config_item)
428 )";
429 $wpdb->get_results($sql);
430 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='can_manage_events', config_value='edit_posts'";
431 $wpdb->get_results($sql);
432 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='calendar_style', config_value='".$initial_style."'";
433 $wpdb->get_results($sql);
434 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_author', config_value='false'";
435 $wpdb->get_results($sql);
436 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_jump', config_value='false'";
437 $wpdb->get_results($sql);
438 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_todays', config_value='true'";
439 $wpdb->get_results($sql);
440 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_upcoming', config_value='true'";
441 $wpdb->get_results($sql);
442 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='display_upcoming_days', config_value=7";
443 $wpdb->get_results($sql);
444
445 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='calendar_version', config_value='1.2'";
446 $wpdb->get_results($sql);
447 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='enable_categories', config_value='false'";
448 $wpdb->get_results($sql);
449 $sql = "ALTER TABLE ".WP_CALENDAR_TABLE." ADD COLUMN event_category BIGINT(20) UNSIGNED";
450 $wpdb->get_results($sql);
451 $sql = "UPDATE " . WP_CALENDAR_TABLE . " SET event_category=1";
452 $wpdb->get_results($sql);
453 $sql = "ALTER TABLE ".WP_CALENDAR_TABLE." ADD COLUMN event_link TEXT";
454 $wpdb->get_results($sql);
455 $sql = "UPDATE " . WP_CALENDAR_TABLE . " SET event_link=''";
456 $wpdb->get_results($sql);
457 $sql = "CREATE TABLE " . WP_CALENDAR_CATEGORIES_TABLE . " (
458 category_id INT(11) NOT NULL AUTO_INCREMENT,
459 category_name VARCHAR(30) NOT NULL ,
460 category_colour VARCHAR(30) NOT NULL ,
461 PRIMARY KEY (category_id)
462 )";
463 $wpdb->get_results($sql);
464 $sql = "INSERT INTO " . WP_CALENDAR_CATEGORIES_TABLE . " SET category_id=0, category_name='General', category_colour='#F6F79B'";
465 $wpdb->get_results($sql);
466 }
467 else if ($vone_point_two_beta_upgrade == true)
468 {
469 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='calendar_version', config_value='1.2'";
470 $wpdb->get_results($sql);
471 $sql = "INSERT INTO ".WP_CALENDAR_CONFIG_TABLE." SET config_item='enable_categories', config_value='false'";
472 $wpdb->get_results($sql);
473 $sql = "ALTER TABLE ".WP_CALENDAR_TABLE." ADD COLUMN event_category BIGINT(20) UNSIGNED";
474 $wpdb->get_results($sql);
475 $sql = "UPDATE " . WP_CALENDAR_TABLE . " SET event_category=1";
476 $wpdb->get_results($sql);
477 $sql = "ALTER TABLE ".WP_CALENDAR_TABLE." ADD COLUMN event_link TEXT";
478 $wpdb->get_results($sql);
479 $sql = "UPDATE " . WP_CALENDAR_TABLE . " SET event_link=''";
480 $wpdb->get_results($sql);
481 $sql = "CREATE TABLE " . WP_CALENDAR_CATEGORIES_TABLE . " (
482 category_id INT(11) NOT NULL AUTO_INCREMENT,
483 category_name VARCHAR(30) NOT NULL ,
484 category_colour VARCHAR(30) NOT NULL ,
485 PRIMARY KEY (category_id)
486 )";
487 $wpdb->get_results($sql);
488 $sql = "INSERT INTO " . WP_CALENDAR_CATEGORIES_TABLE . " SET category_id=1, category_name='General', category_colour='#F6F79B'";
489 $wpdb->get_results($sql);
490 $sql = "UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value='".$initial_style."' WHERE config_item='calendar_style'";
491 $wpdb->get_results($sql);
492 }
493 }
494
495 // Used on the manage events admin page to display a list of events
496 function wp_events_display_list()
497 {
498 global $wpdb;
499
500 $events = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_TABLE . " ORDER BY event_begin DESC");
501
502 if ( !empty($events) )
503 {
504 ?>
505 <table width="100%" cellpadding="3" cellspacing="3">
506 <tr>
507 <th scope="col"><?php _e('ID') ?></th>
508 <th scope="col"><?php _e('Title') ?></th>
509 <th scope="col"><?php _e('Description') ?></th>
510 <th scope="col"><?php _e('Start Date') ?></th>
511 <th scope="col"><?php _e('End Date') ?></th>
512 <th scope="col"><?php _e('Recurs') ?></th>
513 <th scope="col"><?php _e('Repeats') ?></th>
514 <th scope="col"><?php _e('Author') ?></th>
515 <th scope="col"><?php _e('Category') ?></th>
516 <th scope="col"><?php _e('Edit') ?></th>
517 <th scope="col"><?php _e('Delete') ?></th>
518 </tr>
519 <?php
520 $class = '';
521 foreach ( $events as $event )
522 {
523 $class = ($class == 'alternate') ? '' : 'alternate';
524 ?>
525 <tr class="<?php echo $class; ?>">
526 <th scope="row"><?php echo $event->event_id; ?></th>
527 <td><?php echo $event->event_title; ?></td>
528 <td><?php echo $event->event_desc; ?></td>
529 <td><?php echo $event->event_begin; ?></td>
530 <td><?php echo $event->event_end; ?></td>
531 <td>
532 <?php
533 // Interpret the DB values into something human readable
534 if ($event->event_recur == 'S') { echo 'Never'; }
535 else if ($event->event_recur == 'W') { echo 'Weekly'; }
536 else if ($event->event_recur == 'M') { echo 'Monthly'; }
537 else if ($event->event_recur == 'Y') { echo 'Yearly'; }
538 ?>
539 </td>
540 <td>
541 <?php
542 // Interpret the DB values into something human readable
543 if ($event->event_recur == 'S') { echo 'N/A'; }
544 else if ($event->event_repeats == 0) { echo 'Forever'; }
545 else if ($event->event_repeats > 0) { echo $event->event_repeats.' Times'; }
546 ?>
547 </td>
548 <td><?php $e = get_userdata($event->event_author); echo $e->display_name; ?></td>
549 <?php
550 $sql = "SELECT * FROM " . WP_CALENDAR_CATEGORIES_TABLE . " WHERE category_id=".$event->event_category;
551 $this_cat = $wpdb->get_row($sql);
552 ?>
553 <td style="background-color:<?php echo $this_cat->category_colour;?>;"><?php echo $this_cat->category_name; ?></td>
554 <?php unset($this_cat); ?>
555 <td><a href="<?php echo $_SERVER['REQUEST_URI'] ?>&amp;action=edit&amp;event_id=<?php echo $event->event_id;?>" class='edit'><?php echo __('Edit'); ?></a></td>
556 <td><a href="<?php echo $_SERVER['REQUEST_URI'] ?>&amp;action=delete&amp;event_id=<?php echo $event->event_id;?>" class="delete" onclick="return confirm('Are you sure you want to delete this event?')"><?php echo __('Delete'); ?></a></td>
557 </tr>
558 <?php
559 }
560 ?>
561 </table>
562 <?php
563 }
564 else
565 {
566 ?>
567 <p><?php _e("There are no events in the database!") ?></p>
568 <?php
569 }
570 }
571
572
573 // The event edit form for the manage events admin page
574 function wp_events_edit_form($mode='add', $event_id=false)
575 {
576 global $wpdb;
577 $data = false;
578
579 if ( $event_id !== false )
580 {
581 if ( intval($event_id) != $event_id )
582 {
583 echo "<div class=\"error\"><p>Bad Monkey! No banana!</p></div>";
584 return;
585 }
586 else
587 {
588 $data = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_TABLE . " WHERE event_id='" . mysql_escape_string($event_id) . "' LIMIT 1");
589 if ( empty($data) )
590 {
591 echo "<div class=\"error\"><p>An event with that ID couldn't be found</p></div>";
592 return;
593 }
594 $data = $data[0];
595 }
596 }
597
598 ?>
599 <div id="pop_up_cal" style="position:absolute;margin-left:150px;visibility:hidden;background-color:white;layer-background-color:white;"></div>
600 <form name="quoteform" id="quoteform" class="wrap" method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
601 <input type="hidden" name="action" value="<?php echo $mode; ?>">
602 <input type="hidden" name="event_id" value="<?php echo $event_id; ?>">
603
604 <div id="item_manager">
605 <div style="float: left; width: 98%; clear: both;" class="top">
606 <!-- List URL -->
607 <fieldset class="small"><legend><?php _e('Event Title'); ?></legend>
608 <input type="text" name="event_title" class="input" size="40" maxlength="30"
609 value="<?php if ( !empty($data) ) echo htmlspecialchars($data->event_title); ?>" />
610 </fieldset>
611
612 <fieldset class="small"><legend><?php _e('Event Description'); ?></legend>
613 <textarea name="event_desc" class="input" rows="5" cols="50"><?php if ( !empty($data) ) echo htmlspecialchars($data->event_desc); ?></textarea>
614 </fieldset>
615
616 <fieldset class="small"><legend><?php _e('Event Category'); ?></legend>
617 <select name="event_category">
618 <?php
619 // Grab all the categories and list them
620 $sql = "SELECT * FROM " . WP_CALENDAR_CATEGORIES_TABLE;
621 $cats = $wpdb->get_results($sql);
622 foreach($cats as $cat)
623 {
624 echo '<option value="'.$cat->category_id.'"';
625 if (!empty($data))
626 {
627 if ($data->event_category == $cat->category_id)
628 {
629 echo 'selected="selected"';
630 }
631 }
632 echo '>'.$cat->category_name.'</option>
633 ';
634 }
635 ?>
636 </select>
637 </fieldset>
638
639 <fieldset class="small"><legend><?php _e('Event Link (Optional)'); ?></legend>
640 <input type="text" name="event_link" class="input" size="40" value="<?php if ( !empty($data) ) echo htmlspecialchars($data->event_link); ?>" />
641 </fieldset>
642
643 <fieldset class="small"><legend><?php _e('Start Date'); ?></legend>
644 <script type="text/javascript">
645 var cal_begin = new CalendarPopup('pop_up_cal');
646 </script>
647 <input type="text" name="event_begin" class="input" size=12
648 value="<?php
649 if ( !empty($data) )
650 {
651 echo htmlspecialchars($data->event_begin);
652 }
653 else
654 {
655 echo date("Y-m-d");
656 }
657 ?>" /> <a href="#" onClick="cal_begin.select(document.forms['quoteform'].event_begin,'event_begin_anchor','yyyy-MM-dd'); return false;" name="event_begin_anchor" id="event_begin_anchor">Select Date</a>
658 </fieldset>
659
660 <fieldset class="small"><legend><?php _e('End Date'); ?></legend>
661 <script type="text/javascript">
662 function check_and_print() {
663 var cal_end = new CalendarPopup('pop_up_cal');
664 var newDate = new Date();
665 newDate.setFullYear(document.forms['quoteform'].event_begin.value.split('-')[0],document.forms['quoteform'].event_begin.value.split('-')[1]-1,document.forms['quoteform'].event_begin.value.split('-')[2]);
666 newDate.setDate(newDate.getDate()-1);
667 cal_end.addDisabledDates(null, formatDate(newDate, "yyyy-MM-dd"));
668 cal_end.select(document.forms['quoteform'].event_end,'event_end_anchor','yyyy-MM-dd');
669 }
670 </script>
671 <input type="text" name="event_end" class="input" size=12
672 value="<?php
673 if ( !empty($data) )
674 {
675 echo htmlspecialchars($data->event_end);
676 }
677 else
678 {
679 echo date("Y-m-d");
680 }
681 ?>" /> <a href="#" onClick="check_and_print(); return false;" name="event_end_anchor" id="event_end_anchor">Select Date</a>
682 </fieldset>
683
684 <fieldset class="small"><legend><?php _e('Time (hh:mm)(optional, set blank if not required)'); ?></legend>
685 <input type="text" name="event_time" class="input" size=12
686 value="<?php
687 if ( !empty($data) )
688 {
689 if ($data->event_time == "00:00:00")
690 {
691 echo '';
692 }
693 else
694 {
695 echo date("H:i",strtotime(htmlspecialchars($data->event_time)));
696 }
697 }
698 else
699 {
700 echo date("H:i");
701 }
702 ?>" /> <?php _e('Current time difference from GMT is '); echo get_option('gmt_offset'); _e(' hour(s)'); ?>
703 </fieldset>
704
705 <fieldset class="small"><legend><?php _e('Recurring Events'); ?></legend>
706 <?php
707 if ($data->event_repeats != NULL)
708 {
709 $repeats = $data->event_repeats;
710 }
711 else
712 {
713 $repeats = 0;
714 }
715
716 if ($data->event_recur == "S")
717 {
718 $selected_s = 'selected="selected"';
719 }
720 else if ($data->event_recur == "W")
721 {
722 $selected_w = 'selected="selected"';
723 }
724 else if ($data->event_recur == "M")
725 {
726 $selected_m = 'selected="selected"';
727 }
728 else if ($data->event_recur == "Y")
729 {
730 $selected_y = 'selected="selected"';
731 }
732 ?>
733 Repeats for
734 <input type="text" name="event_repeats" class="input" size="1" value="<?php echo $repeats; ?>" />
735 <select name="event_recur" class="input">
736 <option class="input" <?php echo $selected_s; ?> value="S">None</option>
737 <option class="input" <?php echo $selected_w; ?> value="W">Weeks</option>
738 <option class="input" <?php echo $selected_m; ?> value="M">Months</option>
739 <option class="input" <?php echo $selected_y; ?> value="Y">Years</option>
740 </select><br />
741 Entering 0 means forever. Where the recurrance interval <br />
742 is left at none, the event will not reoccur.
743 </fieldset>
744 <br />
745 <input type="submit" name="save" class="button bold" value="Save &raquo;" />
746 </div>
747 <div style="clear:both; height:1px;">&nbsp;</div>
748 </div>
749 </form>
750 <?php
751 }
752
753 // The actual function called to render the manage events page and
754 // to deal with posts
755 function edit_calendar()
756 {
757 global $current_user, $wpdb;
758 ?>
759 <style type="text/css">
760 <!--
761 .error {
762 background: lightcoral;
763 border: 1px solid #e64f69;
764 margin: 1em 5% 10px;
765 padding: 0 1em 0 1em;
766 }
767
768 .center {
769 text-align: center;
770 }
771 .right { text-align: right;
772 }
773 .left {
774 text-align: left;
775 }
776 .top {
777 vertical-align: top;
778 }
779 .bold {
780 font-weight: bold;
781 }
782 .private {
783 color: #e64f69;
784 }
785 //-->
786 </style>
787
788 <?php
789
790 // First some quick cleaning up
791 $edit = $create = $save = $delete = false;
792
793 // Make sure we are collecting the variables we need to select years and months
794 $action = !empty($_REQUEST['action']) ? $_REQUEST['action'] : '';
795 $event_id = !empty($_REQUEST['event_id']) ? $_REQUEST['event_id'] : '';
796
797
798 // Lets see if this is first run and create us a table if it is!
799 check_calendar();
800
801 // Deal with adding an event to the database
802 if ( $action == 'add' )
803 {
804 $title = !empty($_REQUEST['event_title']) ? $_REQUEST['event_title'] : '';
805 $desc = !empty($_REQUEST['event_desc']) ? $_REQUEST['event_desc'] : '';
806 $begin = !empty($_REQUEST['event_begin']) ? $_REQUEST['event_begin'] : '';
807 $end = !empty($_REQUEST['event_end']) ? $_REQUEST['event_end'] : '';
808 $time = !empty($_REQUEST['event_time']) ? $_REQUEST['event_time'] : '';
809 $recur = !empty($_REQUEST['event_recur']) ? $_REQUEST['event_recur'] : '';
810 $repeats = !empty($_REQUEST['event_repeats']) ? $_REQUEST['event_repeats'] : '';
811 $category = !empty($_REQUEST['event_category']) ? $_REQUEST['event_category'] : '';
812 $linky = !empty($_REQUEST['event_link']) ? $_REQUEST['event_link'] : '';
813
814 // Deal with the fools who have left magic quotes turned on
815 if ( ini_get('magic_quotes_gpc') )
816 {
817 $title = stripslashes($title);
818 $desc = stripslashes($desc);
819 $begin = stripslashes($begin);
820 $end = stripslashes($end);
821 $time = stripslashes($time);
822 $recur = stripslashes($recur);
823 $repeats = stripslashes($repeats);
824 $category = stripslashes($category);
825 $linky = stripslashes($linky);
826 }
827
828 $sql = "INSERT INTO " . WP_CALENDAR_TABLE . " SET event_title='" . mysql_escape_string($title)
829 . "', event_desc='" . mysql_escape_string($desc) . "', event_begin='" . mysql_escape_string($begin)
830 . "', event_end='" . mysql_escape_string($end) . "', event_time='" . mysql_escape_string($time) . "', event_recur='" . mysql_escape_string($recur) . "', event_repeats='" . mysql_escape_string($repeats) . "', event_author=".$current_user->ID.", event_category=".mysql_escape_string($category).", event_link='".mysql_escape_string($linky)."'";
831
832 $wpdb->get_results($sql);
833
834 $sql = "SELECT event_id FROM " . WP_CALENDAR_TABLE . " WHERE event_title='" . mysql_escape_string($title) . "'"
835 . " AND event_desc='" . mysql_escape_string($desc) . "' AND event_begin='" . mysql_escape_string($begin) . "' AND event_end='" . mysql_escape_string($end) . "' AND event_recur='" . mysql_escape_string($recur) . "' AND event_repeats='" . mysql_escape_string($repeats) . "' LIMIT 1";
836 $result = $wpdb->get_results($sql);
837
838 if ( empty($result) || empty($result[0]->event_id) )
839 {
840 ?>
841 <div class="error"><p><strong>Error:</strong> For some bizare reason your event was not added. Why not try again?</p></div>
842 <?php
843 }
844 else
845 {
846 ?>
847 <div class="updated"><p>Event added. It will now show in your calendar.</p></div>
848 <?php
849 }
850 }
851 // Permit saving of events that have been edited
852 elseif ( $action == 'edit_save' )
853 {
854 $title = !empty($_REQUEST['event_title']) ? $_REQUEST['event_title'] : '';
855 $desc = !empty($_REQUEST['event_desc']) ? $_REQUEST['event_desc'] : '';
856 $begin = !empty($_REQUEST['event_begin']) ? $_REQUEST['event_begin'] : '';
857 $end = !empty($_REQUEST['event_end']) ? $_REQUEST['event_end'] : '';
858 $time = !empty($_REQUEST['event_time']) ? $_REQUEST['event_time'] : '';
859 $recur = !empty($_REQUEST['event_recur']) ? $_REQUEST['event_recur'] : '';
860 $repeats = !empty($_REQUEST['event_repeats']) ? $_REQUEST['event_repeats'] : '';
861 $category = !empty($_REQUEST['event_category']) ? $_REQUEST['event_category'] : '';
862 $linky = !empty($_REQUEST['event_link']) ? $_REQUEST['event_link'] : '';
863
864 // Deal with the fools who have left magic quotes turned on
865 if ( ini_get('magic_quotes_gpc') )
866 {
867 $title = stripslashes($title);
868 $desc = stripslashes($desc);
869 $begin = stripslashes($begin);
870 $end = stripslashes($end);
871 $time = stripslashes($time);
872 $recur = stripslashes($recur);
873 $repeats = stripslashes($repeats);
874 $category = stripslashes($category);
875 $linky = stripslashes($linky);
876 }
877
878 if ( empty($event_id) )
879 {
880 ?>
881 <div class="error"><p><strong>Failure:</strong> You can't update an event if you haven't submitted an event id</p></div>
882 <?php
883 }
884 else
885 {
886 $sql = "UPDATE " . WP_CALENDAR_TABLE . " SET event_title='" . mysql_escape_string($title)
887 . "', event_desc='" . mysql_escape_string($desc) . "', event_begin='" . mysql_escape_string($begin)
888 . "', event_end='" . mysql_escape_string($end) . "', event_time='" . mysql_escape_string($time) . "', event_recur='" . mysql_escape_string($recur) . "', event_repeats='" . mysql_escape_string($repeats) . "', event_author=".$current_user->ID . ", event_category=".mysql_escape_string($category).", event_link='".mysql_escape_string($linky)."' WHERE event_id='" . mysql_escape_string($event_id) . "'";
889
890 $wpdb->get_results($sql);
891
892 $sql = "SELECT event_id FROM " . WP_CALENDAR_TABLE . " WHERE event_title='" . mysql_escape_string($title) . "'"
893 . " AND event_desc='" . mysql_escape_string($desc) . "' AND event_begin='" . mysql_escape_string($begin) . "' AND event_end='" . mysql_escape_string($end) . "' AND event_recur='" . mysql_escape_string($recur) . "' AND event_repeats='" . mysql_escape_string($repeats) . "' LIMIT 1";
894 $result = $wpdb->get_results($sql);
895
896 if ( empty($result) || empty($result[0]->event_id) )
897 {
898 ?>
899 <div class="error"><p><strong>Failure:</strong> For some reason the event didnt update. Why not try again? </p></div>
900 <?php
901 }
902 else
903 {
904 ?>
905 <div class="updated"><p>Event updated successfully</p></div>
906 <?php
907 }
908 }
909 }
910 // Deal with deleting an event from the database
911 elseif ( $action == 'delete' )
912 {
913 if ( empty($event_id) )
914 {
915 ?>
916 <div class="error"><p><strong>Error:</strong> Good Lord you gave me nothing to delete, nothing I tell you!</p></div>
917 <?php
918 }
919 else
920 {
921 $sql = "DELETE FROM " . WP_CALENDAR_TABLE . " WHERE event_id='" . mysql_escape_string($event_id) . "'";
922 $wpdb->get_results($sql);
923
924 $sql = "SELECT event_id FROM " . WP_CALENDAR_TABLE . " WHERE event_id='" . mysql_escape_string($event_id) . "'";
925 $result = $wpdb->get_results($sql);
926
927 if ( empty($result) || empty($result[0]->event_id) )
928 {
929 ?>
930 <div class="updated"><p>Event deleted successfully</p></div>
931 <?php
932 }
933 else
934 {
935 ?>
936 <div class="error"><p><strong>Error:</strong> For some bizare reason the event could not be deleted. Why not try again?</p></div>
937 <?php
938
939 }
940 }
941 }
942
943 // Now follows a little bit of code that pulls in the main
944 // components of this page; the edit form and the list of events
945 ?>
946
947 <div class="wrap">
948 <?php
949 if ( $action == 'edit' )
950 {
951 ?>
952 <h2><?php _e('Edit Event'); ?></h2>
953 <?php
954 if ( empty($event_id) )
955 {
956 echo "<div class=\"error\"><p>Good lord you didn't provide an event id to edit, what were you thinking?</p></div>";
957 }
958 else
959 {
960 wp_events_edit_form('edit_save', $event_id);
961 }
962 }
963 else
964 {
965 ?>
966 <h2><?php _e('Add Event'); ?></h2>
967 <?php wp_events_edit_form(); ?>
968
969 <h2><?php _e('Manage Events'); ?></h2>
970 <?php
971 wp_events_display_list();
972 }
973 ?>
974 </div>
975
976 <?php
977
978 }
979
980 // Display the admin configuration page
981 function edit_calendar_config()
982 {
983 global $wpdb, $initial_style;
984
985 // We can't use this page unless Calendar is installed/upgraded
986 check_calendar();
987
988 if (isset($_POST['permissions']) && isset($_POST['style']))
989 {
990 if ($_POST['permissions'] == 'subscriber') { $new_perms = 'read'; }
991 else if ($_POST['permissions'] == 'contributor') { $new_perms = 'edit_posts'; }
992 else if ($_POST['permissions'] == 'author') { $new_perms = 'publish_posts'; }
993 else if ($_POST['permissions'] == 'editor') { $new_perms = 'moderate_comments'; }
994 else if ($_POST['permissions'] == 'admin') { $new_perms = 'manage_options'; }
995 else { $new_perms = 'manage_options'; }
996
997 $calendar_style = mysql_escape_string($_POST['style']);
998 $display_upcoming_days = mysql_escape_string($_POST['display_upcoming_days']);
999
1000 if (mysql_escape_string($_POST['display_author']) == 'on')
1001 {
1002 $disp_author = 'true';
1003 }
1004 else
1005 {
1006 $disp_author = 'false';
1007 }
1008
1009 if (mysql_escape_string($_POST['display_jump']) == 'on')
1010 {
1011 $disp_jump = 'true';
1012 }
1013 else
1014 {
1015 $disp_jump = 'false';
1016 }
1017
1018 if (mysql_escape_string($_POST['display_todays']) == 'on')
1019 {
1020 $disp_todays = 'true';
1021 }
1022 else
1023 {
1024 $disp_todays = 'false';
1025 }
1026
1027 if (mysql_escape_string($_POST['display_upcoming']) == 'on')
1028 {
1029 $disp_upcoming = 'true';
1030 }
1031 else
1032 {
1033 $disp_upcoming = 'false';
1034 }
1035
1036 if (mysql_escape_string($_POST['enable_categories']) == 'on')
1037 {
1038 $enable_categories = 'true';
1039 }
1040 else
1041 {
1042 $enable_categories = 'false';
1043 }
1044
1045 $wpdb->get_results("UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value = '".$new_perms."' WHERE config_item='can_manage_events'");
1046 $wpdb->get_results("UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value = '".$calendar_style."' WHERE config_item='calendar_style'");
1047 $wpdb->get_results("UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value = '".$disp_author."' WHERE config_item='display_author'");
1048 $wpdb->get_results("UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value = '".$disp_jump."' WHERE config_item='display_jump'");
1049 $wpdb->get_results("UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value = '".$disp_todays."' WHERE config_item='display_todays'");
1050 $wpdb->get_results("UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value = '".$disp_upcoming."' WHERE config_item='display_upcoming'");
1051 $wpdb->get_results("UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value = '".$display_upcoming_days."' WHERE config_item='display_upcoming_days'");
1052 $wpdb->get_results("UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value = '".$enable_categories."' WHERE config_item='enable_categories'");
1053
1054 // Check to see if we are replacing the original style
1055 if (mysql_escape_string($_POST['reset_styles']) == 'on')
1056 {
1057 $wpdb->get_results("UPDATE " . WP_CALENDAR_CONFIG_TABLE . " SET config_value = '".$initial_style."' WHERE config_item='calendar_style'");
1058 }
1059
1060 echo "<div class=\"updated\"><p><strong>Settings saved.</strong></p></div>";
1061 }
1062
1063 // Pull the values out of the database that we need for the form
1064 $configs = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='can_manage_events'");
1065 if (!empty($configs))
1066 {
1067 foreach ($configs as $config)
1068 {
1069 $allowed_group = $config->config_value;
1070 }
1071 }
1072
1073 $configs = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='calendar_style'");
1074 if (!empty($configs))
1075 {
1076 foreach ($configs as $config)
1077 {
1078 $calendar_style = $config->config_value;
1079 }
1080 }
1081 $configs = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='display_author'");
1082 if (!empty($configs))
1083 {
1084 foreach ($configs as $config)
1085 {
1086 if ($config->config_value == 'true')
1087 {
1088 $yes_disp_author = 'selected="selected"';
1089 }
1090 else
1091 {
1092 $no_disp_author = 'selected="selected"';
1093 }
1094 }
1095 }
1096 $configs = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='display_jump'");
1097 if (!empty($configs))
1098 {
1099 foreach ($configs as $config)
1100 {
1101 if ($config->config_value == 'true')
1102 {
1103 $yes_disp_jump = 'selected="selected"';
1104 }
1105 else
1106 {
1107 $no_disp_jump = 'selected="selected"';
1108 }
1109 }
1110 }
1111 $configs = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='display_todays'");
1112 if (!empty($configs))
1113 {
1114 foreach ($configs as $config)
1115 {
1116 if ($config->config_value == 'true')
1117 {
1118 $yes_disp_todays = 'selected="selected"';
1119 }
1120 else
1121 {
1122 $no_disp_todays = 'selected="selected"';
1123 }
1124 }
1125 }
1126 $configs = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='display_upcoming'");
1127 if (!empty($configs))
1128 {
1129 foreach ($configs as $config)
1130 {
1131 if ($config->config_value == 'true')
1132 {
1133 $yes_disp_upcoming = 'selected="selected"';
1134 }
1135 else
1136 {
1137 $no_disp_upcoming = 'selected="selected"';
1138 }
1139 }
1140 }
1141 $configs = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='display_upcoming_days'");
1142 if (!empty($configs))
1143 {
1144 foreach ($configs as $config)
1145 {
1146 $upcoming_days = $config->config_value;
1147 }
1148 }
1149 $configs = $wpdb->get_results("SELECT config_value FROM " . WP_CALENDAR_CONFIG_TABLE . " WHERE config_item='enable_categories'");
1150 if (!empty($configs))
1151 {
1152 foreach ($configs as $config)
1153 {
1154 if ($config->config_value == 'true')
1155 {
1156 $yes_enable_categories = 'selected="selected"';
1157 }
1158 else
1159 {
1160 $no_enable_categories = 'selected="selected"';
1161 }
1162 }
1163 }
1164 if ($allowed_group == 'read') { $subscriber_selected='selected="selected"';}
1165 else if ($allowed_group == 'edit_posts') { $contributor_selected='selected="selected"';}
1166 else if ($allowed_group == 'publish_posts') { $author_selected='selected="selected"';}
1167 else if ($allowed_group == 'moderate_comments') { $editor_selected='selected="selected"';}
1168 else if ($allowed_group == 'manage_options') { $admin_selected='selected="selected"';}
1169
1170 // Now we render the form
1171 ?>
1172 <style type="text/css">
1173 <!--
1174 .error {
1175 background: lightcoral;
1176 border: 1px solid #e64f69;
1177 margin: 1em 5% 10px;
1178 padding: 0 1em 0 1em;
1179 }
1180
1181 .center {
1182 text-align: center;
1183 }
1184 .right {
1185 text-align: right;
1186 }
1187 .left {
1188 text-align: left;
1189 }
1190 .top {
1191 vertical-align: top;
1192 }
1193 .bold {
1194 font-weight: bold;
1195 }
1196 .private {
1197 color: #e64f69;
1198 }
1199 //-->
1200 </style>
1201
1202 <div class="wrap">
1203 <h2><?php _e('Calendar Options'); ?></h2>
1204 <form name="quoteform" id="quoteform" class="wrap" method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
1205 <div id="item_manager">
1206 <div style="float: left; width: 98%; clear: both;" class="top">
1207 <fieldset class="small"><legend><?php _e('Choose the lowest user group that may manage events'); ?></legend>
1208 <select name="permissions">
1209 <option value="subscriber"<?php echo $subscriber_seletced ?>><?php _e('Subscriber')?></option>
1210 <option value="contributor" <?php echo $contributor_selected ?>><?php _e('Contributor')?></option>
1211 <option value="author" <?php echo $author_selected ?>><?php _e('Author')?></option>
1212 <option value="editor" <?php echo $editor_selected ?>><?php _e('Editor')?></option>
1213 <option value="admin" <?php echo $admin_selected ?>><?php _e('Administrator')?></option>
1214 </select>
1215 </fieldset>
1216 <fieldset class="small"><legend><?php _e('Do you want to display the author name on events?'); ?></legend>
1217 <select name="display_author">
1218 <option value="on" <?php echo $yes_disp_author ?>><?php _e('Yes') ?></option>
1219 <option value="off" <?php echo $no_disp_author ?>><?php _e('No') ?></option>
1220 </select>
1221 </fieldset>
1222 <fieldset class="small"><legend><?php _e('Display a jumpbox for changing month and year quickly?'); ?></legend>
1223 <select name="display_jump">
1224 <option value="on" <?php echo $yes_disp_jump ?>><?php _e('Yes') ?></option>
1225 <option value="off" <?php echo $no_disp_jump ?>><?php _e('No') ?></option>
1226 </select>
1227 </fieldset>
1228 <fieldset class="small"><legend><?php _e('Display todays events?'); ?></legend>
1229 <select name="display_todays">
1230 <option value="on" <?php echo $yes_disp_todays ?>><?php _e('Yes') ?></option>
1231 <option value="off" <?php echo $no_disp_todays ?>><?php _e('No') ?></option>
1232 </select>
1233 </fieldset>
1234 <fieldset class="small"><legend><?php _e('Display upcoming events? If yes, state for how many days into the future'); ?></legend>
1235 <select name="display_upcoming">
1236 <option value="on" <?php echo $yes_disp_upcoming ?>><?php _e('Yes') ?></option>
1237 <option value="off" <?php echo $no_disp_upcoming ?>><?php _e('No') ?></option>
1238 </select>
1239 for <input type="text" name="display_upcoming_days" value="<?php echo $upcoming_days ?>" size="1" maxlength="2" /> days into the future
1240 </fieldset>
1241
1242 <fieldset class="small"><legend><?php _e('Enable event categories?'); ?></legend>
1243 <select name="enable_categories">
1244 <option value="on" <?php echo $yes_enable_categories ?>><?php _e('Yes') ?></option>
1245 <option value="off" <?php echo $no_enable_categories ?>><?php _e('No') ?></option>
1246 </select>
1247 </fieldset>
1248
1249 <fieldset class="small"><legend><?php _e('Configure the stylesheet for Calendar'); ?></legend>
1250 <textarea name="style" rows="10" cols="60" tabindex="2"><?php echo $calendar_style; ?></textarea>
1251 </fieldset>
1252 <fieldset class="small"><legend><?php _e('Reset Styles'); ?></legend>
1253 <input type="checkbox" name="reset_styles" /> <?php _e('Tick this box if you wish to reset the Calendar style to default'); ?>
1254 </fieldset>
1255 <br />
1256 <input type="submit" name="save" class="button bold" value="Save &raquo;" />
1257 </div>
1258 <div style="clear:both; height:1px;">&nbsp;</div>
1259 </div>
1260 </form>
1261 </div>
1262 <?php
1263
1264
1265 }
1266
1267 // Function to handle the management of categories
1268 function manage_categories()
1269 {
1270 global $wpdb;
1271
1272 // Calendar must be installed and upgraded before this will work
1273 check_calendar();
1274
1275 ?>
1276 <style type="text/css">
1277 <!--
1278 .error {
1279 background: lightcoral;
1280 border: 1px solid #e64f69;
1281 margin: 1em 5% 10px;
1282 padding: 0 1em 0 1em;
1283 }
1284
1285 .center {
1286 text-align: center;
1287 }
1288 .right {
1289 text-align: right;
1290 }
1291 .left {
1292 text-align: left;
1293 }
1294 .top {
1295 vertical-align: top;
1296 }
1297 .bold {
1298 font-weight: bold;
1299 }
1300 .private {
1301 color: #e64f69;
1302 }
1303 //-->
1304 </style>
1305 <?php
1306 // We do some checking to see what we're doing
1307 if (isset($_POST['mode']) && $_POST['mode'] == 'add')
1308 {
1309 $sql = "INSERT INTO " . WP_CALENDAR_CATEGORIES_TABLE . " SET category_name='".mysql_escape_string($_POST['category_name'])."', category_colour='".mysql_escape_string($_POST['category_colour'])."'";
1310 $wpdb->get_results($sql);
1311 echo "<div class=\"updated\"><p><strong>Category added successfully</strong></p></div>";
1312 }
1313 else if (isset($_GET['mode']) && isset($_GET['category_id']) && $_GET['mode'] == 'delete')
1314 {
1315 $sql = "DELETE FROM " . WP_CALENDAR_CATEGORIES_TABLE . " WHERE category_id=".mysql_escape_string($_GET['category_id']);
1316 $wpdb->get_results($sql);
1317 $sql = "UPDATE " . WP_CALENDAR_TABLE . " SET event_category=1 WHERE event_category=".mysql_escape_string($_GET['category_id']);
1318 $wpdb->get_results($sql);
1319 echo "<div class=\"updated\"><p><strong>Category deleted successfully</strong></p></div>";
1320 }
1321 else if (isset($_GET['mode']) && isset($_GET['category_id']) && $_GET['mode'] == 'edit' && !isset($_POST['mode']))
1322 {
1323 $sql = "SELECT * FROM " . WP_CALENDAR_CATEGORIES_TABLE . " WHERE category_id=".mysql_escape_string($_GET['category_id']);
1324 $cur_cat = $wpdb->get_row($sql);
1325 ?>
1326 <div class="wrap">
1327 <h2><?php _e('Edit Category'); ?></h2>
1328 <form name="catform" id="catform" class="wrap" method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
1329 <input type="hidden" name="mode" value="edit" />
1330 <input type="hidden" name="category_id" value="<?php echo $cur_cat->category_id ?>" />
1331 <div id="item_manager">
1332 <div style="float: left; width: 98%; clear: both;" class="top">
1333 <fieldset class="small"><legend><?php _e('Category Name:'); ?></legend>
1334 <input type="text" name="category_name" class="input" size="30" maxlength="30" value="<?php echo $cur_cat->category_name ?>" />
1335 </fieldset>
1336 <fieldset class="small"><legend><?php _e('Category Colour (Hex format):'); ?></legend>
1337 <input type="text" name="category_colour" class="input" size="10" maxlength="7" value="<?php echo $cur_cat->category_colour ?>" />
1338 </fieldset>
1339 <br />
1340 <input type="submit" name="save" class="button bold" value="Save &raquo;" />
1341 </div>
1342 <div style="clear:both; height:1px;">&nbsp;</div>
1343 </div>
1344 </form>
1345 </div>
1346 <?php
1347 }
1348 else if (isset($_POST['mode']) && isset($_POST['category_id']) && isset($_POST['category_name']) && isset($_POST['category_colour']) && $_POST['mode'] == 'edit')
1349 {
1350 $sql = "UPDATE " . WP_CALENDAR_CATEGORIES_TABLE . " SET category_name='".mysql_escape_string($_POST['category_name'])."', category_colour='".mysql_escape_string($_POST['category_colour'])."' WHERE category_id=".mysql_escape_string($_POST['category_id']);
1351 $wpdb->get_results($sql);
1352 echo "<div class=\"updated\"><p><strong>Category edited successfully</strong></p></div>";
1353 }
1354
1355 if ($_GET['mode'] != 'edit' || $_POST['mode'] == 'edit')
1356 {
1357 ?>
1358
1359 <div class="wrap">
1360 <h2><?php _e('Add Category'); ?></h2>
1361 <form name="catform" id="catform" class="wrap" method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
1362 <input type="hidden" name="mode" value="add" />
1363 <input type="hidden" name="category_id" value="">
1364 <div id="item_manager">
1365 <div style="float: left; width: 98%; clear: both;" class="top">
1366 <fieldset class="small"><legend><?php _e('Category Name:'); ?></legend>
1367 <input type="text" name="category_name" class="input" size="30" maxlength="30" value="" />
1368 </fieldset>
1369 <fieldset class="small"><legend><?php _e('Category Colour (Hex format):'); ?></legend>
1370 <input type="text" name="category_colour" class="input" size="10" maxlength="7" value="" />
1371 </fieldset>
1372 <br />
1373 <input type="submit" name="save" class="button bold" value="Save &raquo;" />
1374 </div>
1375 <div style="clear:both; height:1px;">&nbsp;</div>
1376 </div>
1377 </form>
1378 <h2><?php _e('Manage Categories'); ?></h2>
1379 <?php
1380
1381 // We pull the categories from the database
1382 $categories = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_CATEGORIES_TABLE . " ORDER BY category_id ASC");
1383
1384 if ( !empty($categories) )
1385 {
1386 ?>
1387 <table width="50%" cellpadding="3" cellspacing="3">
1388 <tr>
1389 <th scope="col"><?php _e('ID') ?></th>
1390 <th scope="col"><?php _e('Category Name') ?></th>
1391 <th scope="col"><?php _e('Category Colour') ?></th>
1392 <th scope="col"><?php _e('Edit') ?></th>
1393 <th scope="col"><?php _e('Delete') ?></th>
1394 </tr>
1395 <?php
1396 $class = '';
1397 foreach ( $categories as $category )
1398 {
1399 $class = ($class == 'alternate') ? '' : 'alternate';
1400 ?>
1401 <tr class="<?php echo $class; ?>">
1402 <th scope="row"><?php echo $category->category_id; ?></th>
1403 <td><?php echo $category->category_name; ?></td>
1404 <td style="background-color:<?php echo $category->category_colour; ?>;">&nbsp;</td>
1405 <td><a href="<?php echo $_SERVER['REQUEST_URI'] ?>&amp;mode=edit&amp;category_id=<?php echo $category->category_id;?>" class='edit'><?php echo __('Edit'); ?></a></td>
1406 <?php
1407 if ($category->category_id == 1)
1408 {
1409 ?>
1410 <td>N/A</td>
1411 <?php
1412 }
1413 else
1414 {
1415 ?>
1416 <td><a href="<?php echo $_SERVER['REQUEST_URI'] ?>&amp;mode=delete&amp;category_id=<?php echo $category->category_id;?>" class="delete" onclick="return confirm('Are you sure you want to delete this category?')"><?php echo __('Delete'); ?></a></td>
1417 <?php
1418 }
1419 ?>
1420 </tr>
1421 <?php
1422 }
1423 ?>
1424 </table>
1425 <?php
1426 }
1427 else
1428 {
1429 ?>
1430 <p><?php _e("There are no categories in the database - something has gone wrong!") ?></p>
1431 <?php
1432 }
1433
1434 ?>
1435 </div>
1436
1437 <?php
1438 }
1439 }
1440
1441 // Function to return a prefix which will allow the correct
1442 // placement of arguments into the query string.
1443 function permalink_prefix()
1444 {
1445 // Get the permalink structure from WordPress
1446 $p_link = get_permalink();
1447
1448 // Work out what the real URL we are viewing is
1449 $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
1450 $protocol = substr(strtolower($_SERVER["SERVER_PROTOCOL"]), 0, strpos(strtolower($_SERVER["SERVER_PROTOCOL"]), "/")).$s;
1451 $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
1452 $real_link = $protocol.'://'.$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];
1453
1454 // Now use all of that to get the correctly craft the Calendar link prefix
1455 if (strstr($p_link, '?') && $p_link == $real_link)
1456 {
1457 $link_part = $p_link.'&';
1458 }
1459 else if ($p_link == $real_link)
1460 {
1461 $link_part = $p_link.'?';
1462 }
1463 else if (strstr($real_link, '?'))
1464 {
1465 if (isset($_GET['month']) && isset($_GET['yr']))
1466 {
1467 $new_tail = split("&", $real_link);
1468 foreach ($new_tail as $item)
1469 {
1470 if (!strstr($item, 'month') && !strstr($item, 'yr'))
1471 {
1472 $link_part .= $item.'&';
1473 }
1474 }
1475 if (!strstr($link_part, '?'))
1476 {
1477 $new_tail = split("month", $link_part);
1478 $link_part = $new_tail[0].'?'.$new_tail[1];
1479 }
1480 }
1481 else
1482 {
1483 $link_part = $real_link.'&';
1484 }
1485 }
1486 else
1487 {
1488 $link_part = $real_link.'?';
1489 }
1490
1491 return $link_part;
1492 }
1493
1494 // Configure the "Next" link in the calendar
1495 function next_link($cur_year,$cur_month)
1496 {
1497 $mod_rewrite_months = array(1=>'jan','feb','mar','apr','may','jun','jul','aug','sept','oct','nov','dec');
1498 $next_year = $cur_year + 1;
1499
1500 if ($cur_month == 12)
1501 {
1502 return '<a href="' . permalink_prefix() . 'month=jan&yr=' . $next_year . '">Next &raquo;</a>';
1503 }
1504 else
1505 {
1506 $next_month = $cur_month + 1;
1507 $month = $mod_rewrite_months[$next_month];
1508 return '<a href="' . permalink_prefix() . 'month='.$month.'&yr=' . $cur_year . '">Next &raquo;</a>';
1509 }
1510 }
1511
1512 // Configure the "Previous" link in the calendar
1513 function prev_link($cur_year,$cur_month)
1514 {
1515 $mod_rewrite_months = array(1=>'jan','feb','mar','apr','may','jun','jul','aug','sept','oct','nov','dec');
1516 $last_year = $cur_year - 1;
1517
1518 if ($cur_month == 1)
1519 {
1520 return '<a href="' . permalink_prefix() . 'month=dec&yr='. $last_year .'">&laquo; Prev</a>';
1521 }
1522 else
1523 {
1524 $next_month = $cur_month - 1;
1525 $month = $mod_rewrite_months[$next_month];
1526 return '<a href="' . permalink_prefix() . 'month='.$month.'&yr=' . $cur_year . '">&laquo; Prev</a>';
1527 }
1528 }
1529
1530 // Print upcoming events
1531 function upcoming_events()
1532 {
1533 global $wpdb;
1534
1535 // This function cannot be called unless calendar is up to date
1536 check_calendar();
1537
1538 // Find out if we should be displaying upcoming events
1539 $display = $wpdb->get_var("SELECT config_value FROM ".WP_CALENDAR_CONFIG_TABLE." WHERE config_item='display_upcoming'",0,0);
1540
1541 if ($display == 'true')
1542 {
1543 // Get number of days we should go into the future
1544 $future_days = $wpdb->get_var("SELECT config_value FROM ".WP_CALENDAR_CONFIG_TABLE." WHERE config_item='display_upcoming_days'",0,0);
1545 $day_count = 1;
1546
1547 while ($day_count < $future_days+1)
1548 {
1549 list($y,$m,$d) = split("-",date("Y-m-d",mktime($day_count*24,0,0,date("m"),date("d"),date("Y"))));
1550 $events = grab_events($y,$m,$d);
1551 usort($events, "time_cmp");
1552 if (count($events) != 0) {
1553 $output .= '<li>'.date(get_option('date_format'),mktime($day_count*24,0,0,date("m"),date("d"),date("Y"))).'<ul>';
1554 }
1555 foreach($events as $event)
1556 {
1557 if ($event->event_time == '00:00:00') {
1558 $time_string = ' all day';
1559 }
1560 else {
1561 $time_string = ' at '.date(get_option('time_format'), strtotime($event->event_time));
1562 }
1563 $output .= '<li>'.draw_widget_event($event).$time_string.'</li>';
1564 }
1565 if (count($events) != 0) {
1566 $output .= '</ul></li>';
1567 }
1568 $day_count = $day_count+1;
1569 }
1570
1571 if ($output != '')
1572 {
1573 $visual = '<li class="upcoming-events"><h2>Upcoming Events</h2><ul>';
1574 $visual .= $output;
1575 $visual .= '</ul></li>';
1576 return $visual;
1577 }
1578 }
1579 }
1580
1581 // Print todays events
1582 function todays_events()
1583 {
1584 global $wpdb;
1585
1586 // This function cannot be called unless calendar is up to date
1587 check_calendar();
1588
1589 // Find out if we should be displaying todays events
1590 $display = $wpdb->get_var("SELECT config_value FROM ".WP_CALENDAR_CONFIG_TABLE." WHERE config_item='display_todays'",0,0);
1591
1592 if ($display == 'true')
1593 {
1594 $output = '<li class="todays-events"><h2>Todays Events</h2><ul>';
1595 $events = grab_events(date("Y"),date("m"),date("d"));
1596 usort($events, "time_cmp");
1597 foreach($events as $event)
1598 {
1599 if ($event->event_time == '00:00:00') {
1600 $time_string = ' all day';
1601 }
1602 else {
1603 $time_string = ' at '.date(get_option('time_format'), strtotime($event->event_time));
1604 }
1605 $output .= '<li>'.draw_widget_event($event).$time_string.'</li>';
1606 }
1607 $output .= '</ul></li>';
1608 if (count($events) != 0)
1609 {
1610 return $output;
1611 }
1612 }
1613 }
1614
1615 // Function to compare time in event objects
1616 function time_cmp($a, $b)
1617 {
1618 if ($a->event_time == $b->event_time) {
1619 return 0;
1620 }
1621 return ($a->event_time < $b->event_time) ? -1 : 1;
1622 }
1623
1624 // Used to draw multiple events
1625 function draw_events($events)
1626 {
1627 // We need to sort arrays of objects by time
1628 usort($events, "time_cmp");
1629
1630 // Now process the events
1631 foreach($events as $event)
1632 {
1633 $output .= draw_event($event);
1634 }
1635 return $output;
1636 }
1637
1638
1639 // The widget to show todays events in the sidebar
1640 function widget_init_calendar_today() {
1641 // Check for required functions
1642 if (!function_exists('register_sidebar_widget'))
1643 return;
1644
1645 function widget_calendar_today($args) {
1646 extract($args);
1647 ?>
1648 <?php echo todays_events(); ?>
1649 <?php
1650 }
1651
1652 register_sidebar_widget('Todays Events','widget_calendar_today');
1653 }
1654
1655 // The widget to show todays events in the sidebar
1656 function widget_init_calendar_upcoming() {
1657 // Check for required functions
1658 if (!function_exists('register_sidebar_widget'))
1659 return;
1660
1661 function widget_calendar_upcoming($args) {
1662 extract($args);
1663 ?>
1664 <?php echo upcoming_events(); ?>
1665 <?php
1666 }
1667
1668 register_sidebar_widget('Upcoming Events','widget_calendar_upcoming');
1669 }
1670
1671
1672 // Used to draw an event to the screen
1673 function draw_event($event)
1674 {
1675 global $wpdb;
1676
1677 // Calendar must be updated to run this function
1678 check_calendar();
1679
1680 // Before we do anything we want to know if we
1681 // should display the author and/or show categories.
1682 // We check for this later
1683 $display_author = $wpdb->get_var("SELECT config_value FROM ".WP_CALENDAR_CONFIG_TABLE." WHERE config_item='display_author'",0,0);
1684 $show_cat = $wpdb->get_var("SELECT config_value FROM ".WP_CALENDAR_CONFIG_TABLE." WHERE config_item='enable_categories'",0,0);
1685
1686 if ($show_cat == 'true')
1687 {
1688 $sql = "SELECT * FROM " . WP_CALENDAR_CATEGORIES_TABLE . " WHERE category_id=".$event->event_category;
1689 $cat_details = $wpdb->get_row($sql);
1690 $style = "background-color:".$cat_details->category_colour.";";
1691 }
1692
1693 $header_details .= '<div class="event-title">'.$event->event_title.'</div><div class="event-title-break"></div>';
1694 if ($event->event_time != "00:00:00")
1695 {
1696 $header_details .= '<strong>Time:</strong> ' . date(get_option('time_format'), strtotime($event->event_time)) . '<br />';
1697 }
1698 if ($display_author == 'true')
1699 {
1700 $e = get_userdata($event->event_author);
1701 $header_details .= '<strong>Posted by:</strong> '.$e->display_name.'<br />';
1702 }
1703 if ($display_author == 'true' || $event->event_time != "00:00:00")
1704 {
1705 $header_details .= '<div class="event-content-break"></div>';
1706 }
1707 if ($event->event_link != '') { $linky = $event->event_link; }
1708 else { $linky = '#'; }
1709
1710 $details = '<br />
1711 * <span class="calnk" nowrap="nowrap"><a href="'.$linky.'" style="'.$style.'">' . $event->event_title . '<span style="'.$style.'">' . $header_details . '' . $event->event_desc . '</span></a></span>';
1712
1713 return $details;
1714 }
1715
1716 // Draw an event but customise the HTML for use in the widget
1717 function draw_widget_event($event)
1718 {
1719 global $wpdb;
1720
1721 // Calendar must be updated to run this function
1722 check_calendar();
1723
1724 // Before we do anything we want to know if we
1725 // should display the author and/or show categories.
1726 // We check for this later
1727 $display_author = $wpdb->get_var("SELECT config_value FROM ".WP_CALENDAR_CONFIG_TABLE." WHERE config_item='display_author'",0,0);
1728 $show_cat = $wpdb->get_var("SELECT config_value FROM ".WP_CALENDAR_CONFIG_TABLE." WHERE config_item='enable_categories'",0,0);
1729
1730 if ($show_cat == 'true')
1731 {
1732 $sql = "SELECT * FROM " . WP_CALENDAR_CATEGORIES_TABLE . " WHERE category_id=".$event->event_category;
1733 $cat_details = $wpdb->get_row($sql);
1734 $style = "background-color:".$cat_details->category_colour.";";
1735 }
1736
1737 $header_details .= '<div class="event-title">'.$event->event_title.'</div><div class="event-title-break"></div>';
1738 if ($event->event_time != "00:00:00")
1739 {
1740 $header_details .= '<strong>Time:</strong> ' . date(get_option('time_format'), strtotime($event->event_time)) . '<br />';
1741 }
1742 if ($display_author == 'true')
1743 {
1744 $e = get_userdata($event->event_author);
1745 $header_details .= '<strong>Posted by:</strong> '.$e->display_name.'<br />';
1746 }
1747 if ($display_author == 'true' || $event->event_time != "00:00:00")
1748 {
1749 $header_details .= '<div class="event-content-break"></div>';
1750 }
1751 if ($event->event_link != '') { $linky = $event->event_link; }
1752 else { $linky = '#'; }
1753
1754 $details = '<span class="calnk" nowrap="nowrap"><a href="'.$linky.'">' . $event->event_title . '<span style="'.$style.'">' . $header_details . '' . $event->event_desc . '</span></a></span>';
1755
1756 return $details;
1757 }
1758
1759 // Grab all events for the requested date from calendar
1760 function grab_events($y,$m,$d)
1761 {
1762 global $wpdb;
1763
1764 $arr_events = array();
1765
1766 // Get the date format right
1767 $date = $y . '-' . $m . '-' . $d;
1768
1769 // Firstly we check for conventional events. These will form the first instance of a recurring event
1770 // or the only instance of a one-off event
1771 $events = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_TABLE . " WHERE event_begin <= '$date' AND event_end >= '$date' AND event_recur = 'S' ORDER BY event_id");
1772 if (!empty($events))
1773 {
1774 foreach($events as $event)
1775 {
1776 array_push($arr_events, $event);
1777 }
1778 }
1779
1780 // Even if there were results for that query, we may still have events recurring
1781 // from the past on this day. We now methodically check the for these events
1782
1783 /*
1784 The yearly code - easy because the day and month will be the same, so we return all yearly
1785 events that match the date part. Out of these we show those with a repeat of 0, and fast-foward
1786 a number of years for those with a value more than 0. Those that land in the future are displayed.
1787 */
1788
1789
1790 // Deal with forever recurring year events
1791 $events = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_TABLE . " WHERE event_recur = 'Y' AND EXTRACT(YEAR FROM '$date') >= EXTRACT(YEAR FROM event_begin) AND event_repeats = 0 ORDER BY event_id");
1792
1793 if (!empty($events))
1794 {
1795 foreach($events as $event)
1796 {
1797 // This is going to get complex so lets setup what we would place in for
1798 // an event so we can drop it in with ease
1799
1800 // Technically we don't care about the years, but we need to find out if the
1801 // event spans the turn of a year so we can deal with it appropriately.
1802 $year_begin = date('Y',strtotime($event->event_begin));
1803 $year_end = date('Y',strtotime($event->event_end));
1804
1805 if ($year_begin == $year_end)
1806 {
1807 if (date('m-d',strtotime($event->event_begin)) <= date('m-d',strtotime($date)) &&
1808 date('m-d',strtotime($event->event_end)) >= date('m-d',strtotime($date)))
1809 {
1810 array_push($arr_events, $event);
1811 }
1812 }
1813 else if ($year_begin < $year_end)
1814 {
1815 if (date('m-d',strtotime($event->event_begin)) <= date('m-d',strtotime($date)) ||
1816 date('m-d',strtotime($event->event_end)) >= date('m-d',strtotime($date)))
1817 {
1818 array_push($arr_events, $event);
1819 }
1820 }
1821 }
1822 }
1823
1824 // Now the ones that happen a finite number of times
1825 $events = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_TABLE . " WHERE event_recur = 'Y' AND EXTRACT(YEAR FROM '$date') >= EXTRACT(YEAR FROM event_begin) AND event_repeats != 0 AND (EXTRACT(YEAR FROM '$date')-EXTRACT(YEAR FROM event_begin)) <= event_repeats ORDER BY event_id");
1826 if (!empty($events))
1827 {
1828 foreach($events as $event)
1829 {
1830 // This is going to get complex so lets setup what we would place in for
1831 // an event so we can drop it in with ease
1832
1833 // Technically we don't care about the years, but we need to find out if the
1834 // event spans the turn of a year so we can deal with it appropriately.
1835 $year_begin = date('Y',strtotime($event->event_begin));
1836 $year_end = date('Y',strtotime($event->event_end));
1837
1838 if ($year_begin == $year_end)
1839 {
1840 if (date('m-d',strtotime($event->event_begin)) <= date('m-d',strtotime($date)) &&
1841 date('m-d',strtotime($event->event_end)) >= date('m-d',strtotime($date)))
1842 {
1843 array_push($arr_events, $event);
1844 }
1845 }
1846 else if ($year_begin < $year_end)
1847 {
1848 if (date('m-d',strtotime($event->event_begin)) <= date('m-d',strtotime($date)) ||
1849 date('m-d',strtotime($event->event_end)) >= date('m-d',strtotime($date)))
1850 {
1851 array_push($arr_events, $event);
1852 }
1853 }
1854 }
1855 }
1856
1857 /*
1858 The monthly code - just as easy because as long as the day of the month is correct, then we
1859 show the event
1860 */
1861
1862 // The monthly events that never stop recurring
1863 $events = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_TABLE . " WHERE event_recur = 'M' AND EXTRACT(YEAR FROM '$date') >= EXTRACT(YEAR FROM event_begin) AND event_repeats = 0 ORDER BY event_id");
1864 if (!empty($events))
1865 {
1866 foreach($events as $event)
1867 {
1868 // This is going to get complex so lets setup what we would place in for
1869 // an event so we can drop it in with ease
1870
1871 // Technically we don't care about the years or months, but we need to find out if the
1872 // event spans the turn of a year or month so we can deal with it appropriately.
1873 $month_begin = date('m',strtotime($event->event_begin));
1874 $month_end = date('m',strtotime($event->event_end));
1875
1876 if ($month_begin == $month_end)
1877 {
1878 if (date('d',strtotime($event->event_begin)) <= date('d',strtotime($date)) &&
1879 date('d',strtotime($event->event_end)) >= date('d',strtotime($date)))
1880 {
1881 array_push($arr_events, $event);
1882 }
1883 }
1884 else if ($month_begin < $month_end)
1885 {
1886 if ( ($event->event_begin <= date('Y-m-d',strtotime($date))) && (date('d',strtotime($event->event_begin)) <= date('d',strtotime($date)) ||
1887 date('d',strtotime($event->event_end)) >= date('d',strtotime($date))) )
1888 {
1889 array_push($arr_events, $event);
1890 }
1891 }
1892 }
1893 }
1894
1895
1896 // Now the ones that happen a finite number of times
1897 $events = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_TABLE . " WHERE event_recur = 'M' AND EXTRACT(YEAR FROM '$date') >= EXTRACT(YEAR FROM event_begin) AND event_repeats != 0 AND (PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM '$date'),EXTRACT(YEAR_MONTH FROM event_begin))) <= event_repeats ORDER BY event_id");
1898 if (!empty($events))
1899 {
1900 foreach($events as $event)
1901 {
1902 // This is going to get complex so lets setup what we would place in for
1903 // an event so we can drop it in with ease
1904
1905 // Technically we don't care about the years or months, but we need to find out if the
1906 // event spans the turn of a year or month so we can deal with it appropriately.
1907 $month_begin = date('m',strtotime($event->event_begin));
1908 $month_end = date('m',strtotime($event->event_end));
1909
1910 if ($month_begin == $month_end)
1911 {
1912 if (date('d',strtotime($event->event_begin)) <= date('d',strtotime($date)) &&
1913 date('d',strtotime($event->event_end)) >= date('d',strtotime($date)))
1914 {
1915 array_push($arr_events, $event);
1916 }
1917 }
1918 else if ($month_begin < $month_end)
1919 {
1920 if ( ($event->event_begin <= date('Y-m-d',strtotime($date))) && (date('d',strtotime($event->event_begin)) <= date('d',strtotime($date)) ||
1921 date('d',strtotime($event->event_end)) >= date('d',strtotime($date))) )
1922 {
1923 array_push($arr_events, $event);
1924 }
1925 }
1926 }
1927 }
1928
1929
1930 /*
1931 Weekly - well isn't this fun! We need to scan all weekly events, find what day they fell on
1932 and see if that matches the current day. If it does, we check to see if the repeats are 0.
1933 If they are, display the event, if not, we fast forward from the original day in week blocks
1934 until the number is exhausted. If the date we arrive at is in the future, display the event.
1935 */
1936
1937 // The weekly events that never stop recurring
1938 $events = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_TABLE . " WHERE event_recur = 'W' AND '$date' >= event_begin AND event_repeats = 0 ORDER BY event_id");
1939 if (!empty($events))
1940 {
1941 foreach($events as $event)
1942 {
1943 // This is going to get complex so lets setup what we would place in for
1944 // an event so we can drop it in with ease
1945
1946 // Now we are going to check to see what day the original event
1947 // fell on and see if the current date is both after it and on
1948 // the correct day. If it is, display the event!
1949 $day_start_event = date('D',strtotime($event->event_begin));
1950 $day_end_event = date('D',strtotime($event->event_end));
1951 $current_day = date('D',strtotime($date));
1952
1953 $plan = array();
1954 $plan['Mon'] = 1;
1955 $plan['Tue'] = 2;
1956 $plan['Wed'] = 3;
1957 $plan['Thu'] = 4;
1958 $plan['Fri'] = 5;
1959 $plan['Sat'] = 6;
1960 $plan['Sun'] = 7;
1961
1962 if ($plan[$day_start_event] > $plan[$day_end_event])
1963 {
1964 if (($plan[$day_start_event] <= $plan[$current_day]) || ($plan[$current_day] <= $plan[$day_end_event]))
1965 {
1966 array_push($arr_events, $event);
1967 }
1968 }
1969 else if (($plan[$day_start_event] < $plan[$day_end_event]) || ($plan[$day_start_event]== $plan[$day_end_event]))
1970 {
1971 if (($plan[$day_start_event] <= $plan[$current_day]) && ($plan[$current_day] <= $plan[$day_end_event]))
1972 {
1973 array_push($arr_events, $event);
1974 }
1975 }
1976
1977 }
1978 }
1979
1980 // The weekly events that have a limit on how many times they occur
1981 $events = $wpdb->get_results("SELECT * FROM " . WP_CALENDAR_TABLE . " WHERE event_recur = 'W' AND '$date' >= event_begin AND event_repeats != 0 AND (event_repeats*7) >= (TO_DAYS('$date') - TO_DAYS(event_end)) ORDER BY event_id");
1982 if (!empty($events))
1983 {
1984 foreach($events as $event)
1985 {
1986 // This is going to get complex so lets setup what we would place in for
1987 // an event so we can drop it in with ease
1988
1989 // Now we are going to check to see what day the original event
1990 // fell on and see if the current date is both after it and on
1991 // the correct day. If it is, display the event!
1992 $day_start_event = date('D',strtotime($event->event_begin));
1993 $day_end_event = date('D',strtotime($event->event_end));
1994 $current_day = date('D',strtotime($date));
1995
1996 $plan = array();
1997 $plan['Mon'] = 1;
1998 $plan['Tue'] = 2;
1999 $plan['Wed'] = 3;
2000 $plan['Thu'] = 4;
2001 $plan['Fri'] = 5;
2002 $plan['Sat'] = 6;
2003 $plan['Sun'] = 7;
2004
2005 if ($plan[$day_start_event] > $plan[$day_end_event])
2006 {
2007 if (($plan[$day_start_event] <= $plan[$current_day]) || ($plan[$current_day] <= $plan[$day_end_event]))
2008 {
2009 array_push($arr_events, $event);
2010 }
2011 }
2012 else if (($plan[$day_start_event] < $plan[$day_end_event]) || ($plan[$day_start_event]== $plan[$day_end_event]))
2013 {
2014 if (($plan[$day_start_event] <= $plan[$current_day]) && ($plan[$current_day] <= $plan[$day_end_event]))
2015 {
2016 array_push($arr_events, $event);
2017 }
2018 }
2019
2020 }
2021 }
2022
2023 return $arr_events;
2024 }
2025
2026
2027 // Actually do the printing of the calendar
2028 // Compared to searching for and displaying events
2029 // this bit is really rather easy!
2030 function calendar()
2031 {
2032 global $wpdb;
2033
2034 // First things first, make sure calendar is up to date
2035 check_calendar();
2036
2037 // Deal with the week not starting on a monday
2038 if (get_option('start_of_week') == 0)
2039 {
2040 $name_days = array(1=>'Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
2041 }
2042 // Choose Monday if anything other than Sunday is set
2043 else
2044 {
2045 $name_days = array(1=>'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday');
2046 }
2047
2048 // Carry on with the script
2049 $name_months = array(1=>'January','February','March','April','May','June','July','August','September','October','November','December');
2050
2051 // If we don't pass arguments we want a calendar that is relevant to today
2052 if (empty($_GET['month']) || empty($_GET['yr']))
2053 {
2054 $c_year = date("Y");
2055 $c_month = date("m");
2056 $c_day = date("d");
2057 }
2058
2059 // Years get funny if we exceed 3000, so we use this check
2060 if ($_GET['yr'] <= 3000 && $_GET['yr'] >= 0)
2061 {
2062 // This is just plain nasty and all because of permalinks
2063 // which are no longer used, this will be cleaned up soon
2064 if ($_GET['month'] == 'jan' || $_GET['month'] == 'feb' || $_GET['month'] == 'mar' || $_GET['month'] == 'apr' || $_GET['month'] == 'may' || $_GET['month'] == 'jun' || $_GET['month'] == 'jul' || $_GET['month'] == 'aug' || $_GET['month'] == 'sept' || $_GET['month'] == 'oct' || $_GET['month'] == 'nov' || $_GET['month'] == 'dec')
2065 {
2066
2067 // Again nasty code to map permalinks into something
2068 // databases can understand. This will be cleaned up
2069 $c_year = mysql_escape_string($_GET['yr']);
2070 if ($_GET['month'] == 'jan') { $t_month = 1; }
2071 else if ($_GET['month'] == 'feb') { $t_month = 2; }
2072 else if ($_GET['month'] == 'mar') { $t_month = 3; }
2073 else if ($_GET['month'] == 'apr') { $t_month = 4; }
2074 else if ($_GET['month'] == 'may') { $t_month = 5; }
2075 else if ($_GET['month'] == 'jun') { $t_month = 6; }
2076 else if ($_GET['month'] == 'jul') { $t_month = 7; }
2077 else if ($_GET['month'] == 'aug') { $t_month = 8; }
2078 else if ($_GET['month'] == 'sept') { $t_month = 9; }
2079 else if ($_GET['month'] == 'oct') { $t_month = 10; }
2080 else if ($_GET['month'] == 'nov') { $t_month = 11; }
2081 else if ($_GET['month'] == 'dec') { $t_month = 12; }
2082 $c_month = $t_month;
2083 $c_day = date("d");
2084 }
2085 // No valid month causes the calendar to default to today
2086 else
2087 {
2088 $c_year = date("Y");
2089 $c_month = date("m");
2090 $c_day = date("d");
2091 }
2092 }
2093 // No valid year causes the calendar to default to today
2094 else
2095 {
2096 $c_year = date("Y");
2097 $c_month = date("m");
2098 $c_day = date("d");
2099 }
2100
2101 // Fix the days of the week if week start is not on a monday
2102 if (get_option('start_of_week') == 0)
2103 {
2104 $first_weekday = date("w",mktime(0,0,0,$c_month,1,$c_year));
2105 $first_weekday = ($first_weekday==0?1:$first_weekday+1);
2106 }
2107 // Otherwise assume the week starts on a Monday. Anything other
2108 // than Sunday or Monday is just plain odd
2109 else
2110 {
2111 $first_weekday = date("w",mktime(0,0,0,$c_month,1,$c_year));
2112 $first_weekday = ($first_weekday==0?7:$first_weekday);
2113 }
2114
2115 $days_in_month = date("t", mktime (0,0,0,$c_month,1,$c_year));
2116
2117 // Start the table and add the header and naviagtion
2118 $calendar_body .= '
2119 <table cellspacing="1" cellpadding="0" class="calendar-table">
2120 ';
2121
2122 // We want to know if we should display the date switcher
2123 $date_switcher = $wpdb->get_var("SELECT config_value FROM ".WP_CALENDAR_CONFIG_TABLE." WHERE config_item='display_jump'",0,0);
2124
2125 if ($date_switcher == 'true')
2126 {
2127 $calendar_body .= '<tr>
2128 <td colspan="7" class="calendar-date-switcher">
2129 <form method="GET" action="'.$_SERVER['REQUEST_URI'].'">
2130 ';
2131 $qsa = array();
2132 parse_str($_SERVER['QUERY_STRING'],$qsa);
2133 foreach ($qsa as $name => $argument)
2134 {
2135 if ($name != 'month' && $name != 'yr')
2136 {
2137 $calendar_body .= '<input type="hidden" name="'.$name.'" value="'.$argument.'" />
2138 ';
2139 }
2140 }
2141 function month_comparison($month)
2142 {
2143 $current_month = strtolower(date("M", time()));
2144 if (isset($_GET['yr']) && isset($_GET['month']))
2145 {
2146 if ($month == $_GET['month'])
2147 {
2148 return ' selected="selected"';
2149 }
2150 }
2151 elseif ($month == $current_month)
2152 {
2153 return ' selected="selected"';
2154 }
2155 }
2156 // We build the months in the switcher
2157 $calendar_body .= '
2158 Month: <select name="month" style="width:100px;">
2159 <option value="jan"'.month_comparison('jan').'>January</option>
2160 <option value="feb"'.month_comparison('feb').'>February</option>
2161 <option value="mar"'.month_comparison('mar').'>March</option>
2162 <option value="apr"'.month_comparison('apr').'>April</option>
2163 <option value="may"'.month_comparison('may').'>May</option>
2164 <option value="jun"'.month_comparison('jun').'>June</option>
2165 <option value="jul"'.month_comparison('jul').'>July</option>
2166 <option value="aug"'.month_comparison('aug').'>August</option>
2167 <option value="sept"'.month_comparison('sept').'>September</option>
2168 <option value="oct"'.month_comparison('oct').'>October</option>
2169 <option value="nov"'.month_comparison('nov').'>November</option>
2170 <option value="dec"'.month_comparison('dec').'>December</option>
2171 </select>
2172 Year: <select name="yr" style="width:60px;">
2173 ';
2174
2175 // The year builder is string mania. If you can make sense of this,
2176 // you know your PHP!
2177 function year_comparison($year)
2178 {
2179 $current_year = strtolower(date("Y", time()));
2180 if (isset($_GET['yr']) && isset($_GET['month']))
2181 {
2182 if ($year == $_GET['yr'])
2183 {
2184 return ' selected="selected"';
2185 }
2186 }
2187 else if ($year == $current_year)
2188 {
2189 return ' selected="selected"';
2190 }
2191 }
2192
2193 $past = 30;
2194 $future = 30;
2195 $fut = 1;
2196 while ($past > 0)
2197 {
2198 $p .= ' <option value="';
2199 $p .= date("Y",time())-$past;
2200 $p .= '"'.year_comparison(date("Y",time())-$past).'>';
2201 $p .= date("Y",time())-$past.'</option>
2202 ';
2203 $past = $past - 1;
2204 }
2205 while ($fut < $future)
2206 {
2207 $f .= ' <option value="';
2208 $f .= date("Y",time())+$fut;
2209 $f .= '"'.year_comparison(date("Y",time())+$fut).'>';
2210 $f .= date("Y",time())+$fut.'</option>
2211 ';
2212 $fut = $fut + 1;
2213 }
2214 $calendar_body .= $p;
2215 $calendar_body .= ' <option value="'.date("Y",time()).'"'.year_comparison(date("Y",time())).'>'.date("Y",time()).'</option>
2216 ';
2217 $calendar_body .= $f;
2218 $calendar_body .= '</select>
2219 <input type="submit" value="Go" />
2220 </form>
2221 </td>
2222 </tr>
2223 ';
2224 }
2225
2226 // The header of the calendar table and the links. Note calls to link functions
2227 $calendar_body .= '<tr>
2228 <td colspan="7" class="calendar-heading">
2229 <table border="0" cellpadding="0" cellspacing="0" width="100%">
2230 <tr>
2231 <td class="calendar-prev">' . prev_link($c_year,$c_month) . '</td>
2232 <td class="calendar-month">'.$name_months[(int)$c_month].' '.$c_year.'</td>
2233 <td class="calendar-next">' . next_link($c_year,$c_month) . '</td>
2234 </tr>
2235 </table>
2236 </td>
2237 </tr>
2238 ';
2239
2240 // Print the headings of the days of the week
2241 $calendar_body .= '<tr>
2242 ';
2243 for ($i=1; $i<=7; $i++)
2244 {
2245 // Colours need to be different if the starting day of the week is different
2246 if (get_option('start_of_week') == 0)
2247 {
2248 $calendar_body .= ' <td class="'.($i<7&&$i>1?'normal-day-heading':'weekend-heading').'">'.$name_days[$i].'</td>
2249 ';
2250 }
2251 else
2252 {
2253 $calendar_body .= ' <td class="'.($i<6?'normal-day-heading':'weekend-heading').'">'.$name_days[$i].'</td>
2254 ';
2255 }
2256 }
2257 $calendar_body .= '</tr>
2258 ';
2259
2260 for ($i=1; $i<=$days_in_month;)
2261 {
2262 $calendar_body .= '<tr>
2263 ';
2264 for ($ii=1; $ii<=7; $ii++)
2265 {
2266 if ($ii==$first_weekday && $i==1)
2267 {
2268 $go = TRUE;
2269 }
2270 elseif ($i > $days_in_month )
2271 {
2272 $go = FALSE;
2273 }
2274
2275 if ($go)
2276 {
2277 // Colours again, this time for the day numbers
2278 if (get_option('start_of_week') == 0)
2279 {
2280 // This bit of code is for styles believe it or not.
2281 $grabbed_events = grab_events($c_year,$c_month,$i);
2282 $no_events_class = '';
2283 if (!count($grabbed_events))
2284 {
2285 $no_events_class = ' no-events';
2286 }
2287 $calendar_body .= ' <td class="'.(date("Ymd", mktime (0,0,0,$c_month,$i,$c_year))==date("Ymd")?'current-day':'day-with-date').$no_events_class.'"><span '.($ii<7&&$ii>1?'':'class="weekend"').'>'.$i++.'</span><span class="event">' . draw_events($grabbed_events) . '</span></td>
2288 ';
2289 }
2290 else
2291 {
2292 $grabbed_events = grab_events($c_year,$c_month,$i);
2293 $no_events_class = '';
2294 if (!count($grabbed_events))
2295 {
2296 $no_events_class = ' no-events';
2297 }
2298 $calendar_body .= ' <td class="'.(date("Ymd", mktime (0,0,0,$c_month,$i,$c_year))==date("Ymd")?'current-day':'day-with-date').$no_events_class.'"><span '.($ii<6?'':'class="weekend"').'>'.$i++.'</span><span class="event">' . draw_events($grabbed_events) . '</span></td>
2299 ';
2300 }
2301 }
2302 else
2303 {
2304 $calendar_body .= ' <td class="day-without-date">&nbsp;</td>
2305 ';
2306 }
2307 }
2308 $calendar_body .= '</tr>
2309 ';
2310 }
2311 $show_cat = $wpdb->get_var("SELECT config_value FROM ".WP_CALENDAR_CONFIG_TABLE." WHERE config_item='enable_categories'",0,0);
2312
2313 if ($show_cat == 'true')
2314 {
2315 $sql = "SELECT * FROM " . WP_CALENDAR_CATEGORIES_TABLE . " ORDER BY category_name ASC";
2316 $cat_details = $wpdb->get_results($sql);
2317 $calendar_body .= '<tr><td colspan="7">
2318 <table class="cat-key">
2319 <tr><td colspan="2"><strong>Category Key</strong></td></tr>
2320 ';
2321 foreach($cat_details as $cat_detail)
2322 {
2323 $calendar_body .= '<tr><td style="background-color:'.$cat_detail->category_colour.'; width:20px; height:20px;"></td><td>'.$cat_detail->category_name.'</td></tr>';
2324 }
2325 $calendar_body .= '</table>
2326 </td></tr>
2327 ';
2328 }
2329 $calendar_body .= '</table>
2330 ';
2331
2332 // A little link to yours truely. See the README if you wish to remove this
2333 $calendar_body .= '<div class="kjo-link"><p>Web development and hosting from <a href="http://www.kjowebservices.co.uk">KJO Web Services</a></p></div>
2334 ';
2335
2336 // Phew! After that bit of string building, spit it all out.
2337 // The actual printing is done by the calling function.
2338 return $calendar_body;
2339 }
2340
2341 ?>
2342