示例#1
0
/**
* Formats a date string in the format 'YYYY-MM-DD H:i:s' format or even
 * relative strings like 'today' into a specified format.
 *
 * @uses eo_format_datetime()
 * @since 1.2.0
 * @link https://php.net/manual/en/function.date.php PHP Date
 *
 * @param string $dateString The date as a string
 * @param string $format How to format the date. DATETIMEOBJ for datetime object.
 * @return string|dateTime The formatted date
*/
function eo_format_date($dateString = '', $format = 'd-m-Y')
{
    if ($format != '' && $dateString != '') {
        $datetime = new DateTime($dateString, eo_get_blog_timezone());
        $formated = eo_format_datetime($datetime, $format);
        return $formated;
    }
    return false;
}
示例#2
0
/**
 * Ajax response for the admin full calendar. 
 *
 * This gets events and generates summaries for events to be displayed.
 * in the admin 'calendar view'. 
 * Applies 'eventorganiser_admin_cal_summary' to event summary
 * Applies eventorganiser_admin_calendar to the event array
 *
 *@since 1.0
 *@access private
 *@ignore
*/
function eventorganiser_admin_calendar()
{
    //request
    $request = array('event_end_after' => $_GET['start'], 'event_start_before' => $_GET['end']);
    //Presets
    $presets = array('posts_per_page' => -1, 'post_type' => 'event', 'group_events_by' => '', 'perm' => 'readable');
    $calendar = get_transient('eo_full_calendar_admin');
    $key = $_GET['start'] . '--' . $_GET['end'] . 'u=' . get_current_user_id();
    if ((!defined('WP_DEBUG') || !WP_DEBUG) && $calendar && is_array($calendar) && isset($calendar[$key])) {
        echo json_encode($calendar[$key]);
        exit;
    }
    //Create query
    $query_array = array_merge($presets, $request);
    $query = new WP_Query($query_array);
    //Retrieve events
    $query->get_posts();
    $eventsarray = array();
    //Blog timezone
    $tz = eo_get_blog_timezone();
    //Loop through events
    global $post;
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $event = array();
            $colour = '';
            //Get title, append status if applicable
            $title = get_the_title();
            if (!empty($post->post_password)) {
                $title .= ' - ' . __('Protected');
            } elseif ($post->post_status == 'private') {
                $title .= ' - ' . __('Private');
            } elseif ($post->post_status == 'draft') {
                $title .= ' - ' . __('Draft');
            }
            $event['title'] = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
            $event['event_id'] = $post->ID;
            $event['occurrence_id'] = $post->occurrence_id;
            $schedule = eo_get_event_schedule($post->ID);
            //Check if all day, set format accordingly
            if ($schedule['all_day']) {
                $event['allDay'] = true;
                $format = get_option('date_format');
            } else {
                $event['allDay'] = false;
                $format = get_option('date_format') . '  ' . get_option('time_format');
            }
            //Get author (or organiser)
            $organiser = get_userdata($post->post_author)->display_name;
            //Get Event Start and End date, set timezone to the blog's timzone
            $event_start = new DateTime($post->StartDate . ' ' . $post->StartTime, $tz);
            $event_end = new DateTime($post->EndDate . ' ' . $post->FinishTime, $tz);
            $event['start'] = $event_start->format('Y-m-d\\TH:i:s\\Z');
            $event['end'] = $event_end->format('Y-m-d\\TH:i:s\\Z');
            //Produce summary of event
            $summary = "<table class='form-table' >" . "<tr><th> " . __('Start', 'eventorganiser') . ": </th><td> " . eo_format_datetime($event_start, $format) . "</td></tr>" . "<tr><th> " . __('End', 'eventorganiser') . ": </th><td> " . eo_format_datetime($event_end, $format) . "</td></tr>";
            if (eo_is_multi_event_organiser()) {
                $summary .= "<tr><th> " . __('Organiser', 'eventorganiser') . ": </th><td>" . $organiser . "</td></tr>";
            }
            $event['className'] = array('event');
            $now = new DateTime(null, $tz);
            if ($event_start <= $now) {
                $event['className'][] = 'past-event';
            }
            //Include venue if this is set
            $venue = eo_get_venue($post->ID);
            if ($venue && !is_wp_error($venue)) {
                $summary .= "<tr><th>" . __('Where', 'eventorganiser') . ": </th><td>" . eo_get_venue_name($venue) . "</td></tr>";
                $event['className'][] = 'venue-' . eo_get_venue_slug($post->ID);
                $event['venue'] = $venue;
            }
            /**
             * Filters the summary of the event as it appears in the admin 
             * calendar's modal.
             *
             * **Note:** As the calendar is cached, changes made using this filter
             * will not take effect immediately. You can clear the cache by
             * updating an event.
             *
             * @package admin-calendar
             * @param string  $summary       The event (admin) summary,
             * @param int     $event_id      The event's post ID.
             * @param int     $occurrence_id The event's occurrence ID.
             * @param WP_Post $post          The event (post) object.
             */
            $summary = apply_filters('eventorganiser_admin_cal_summary', $summary, $post->ID, $post->occurrence_id, $post);
            $summary .= "</table><p>";
            //Include schedule summary if event reoccurrs
            if ($schedule['schedule'] != 'once') {
                $summary .= '<em>' . __('This event reoccurs', 'eventorganiser') . ' ' . eo_get_schedule_summary() . '</em>';
            }
            $summary .= '</p>';
            //Include edit link in summary if user has permission
            if (current_user_can('edit_event', $post->ID)) {
                $edit_link = get_edit_post_link($post->ID, '');
                $summary .= "<span class='edit'><a title='Edit this item' href='" . $edit_link . "'> " . __('Edit Event', 'eventorganiser') . "</a></span>";
                $event['url'] = $edit_link;
            }
            //Include a delete occurrence link in summary if user has permission
            if (current_user_can('delete_event', $post->ID)) {
                $admin_url = admin_url('edit.php');
                $delete_url = add_query_arg(array('post_type' => 'event', 'page' => 'calendar', 'series' => $post->ID, 'event' => $post->occurrence_id, 'action' => 'delete_occurrence'), $admin_url);
                $delete_url = wp_nonce_url($delete_url, 'eventorganiser_delete_occurrence_' . $post->occurrence_id);
                $summary .= sprintf('<span class="delete"><a class="submitdelete" style="color:red;float:right" title="%1$s" href="%2$s">%1$s</a></span>', esc_attr__('Delete this occurrence', 'eventorganiser'), $delete_url);
                if ($schedule['schedule'] != 'once') {
                    $break_url = add_query_arg(array('post_type' => 'event', 'page' => 'calendar', 'series' => $post->ID, 'event' => $post->occurrence_id, 'action' => 'break_series'), $admin_url);
                    $break_url = wp_nonce_url($break_url, 'eventorganiser_break_series_' . $post->occurrence_id);
                    $summary .= sprintf('<span class="break"><a class="submitbreak" style="color:red;float:right;padding-right:2em;" title="%1$s" href="%2$s">%1$s</a></span>', esc_attr__('Break this series', 'eventorganiser'), $break_url);
                }
            }
            //Event categories
            $terms = get_the_terms($post->ID, 'event-category');
            $event['category'] = array();
            if ($terms) {
                foreach ($terms as $term) {
                    $event['category'][] = $term->slug;
                    $event['className'][] = 'category-' . $term->slug;
                }
            }
            //Event colour
            $event['textColor'] = '#ffffff';
            //default text colour
            if (eo_get_event_color()) {
                $event['color'] = eo_get_event_color();
                $event['textColor'] = eo_get_event_textcolor($event['color']) ? eo_get_event_textcolor($event['color']) : '#ffffff';
            }
            //Event summary
            $event['summary'] = '<div id="eo-cal-meta">' . $summary . '</div>';
            //Filter the event array
            /**
             * @ignore
             */
            $event = apply_filters('eventorganiser_admin_calendar', $event, $post);
            /**
             * Filters the event before its sent to the admin calendar.
             *
             * **Note:** As the calendar is cached, changes made using this filter
             * will not take effect immediately. You can clear the cache by
             * updating an event.
             * 
             * @package admin-calendar
             * @param array $event         The event array.
             * @param int   $event_id      The event's post ID.
             * @param int   $occurrence_id The event's occurrence ID.
             */
            $event = apply_filters('eventorganiser_admin_fullcalendar_event', $event, $post->ID, $post->occurrence_id);
            //Add event to array
            $eventsarray[] = $event;
        }
    }
    if (!$calendar || !is_array($calendar)) {
        $calendar = array();
    }
    $calendar[$key] = $eventsarray;
    set_transient('eo_full_calendar_admin', $calendar, 60 * 60 * 24);
    //Echo result and exit
    echo json_encode($eventsarray);
    exit;
}
示例#3
0
/**
* Sets up the event data metabox
* This allows user to enter date / time, reoccurrence and venue data for the event
* @ignore
* @since 1.0.0
*/
function _eventorganiser_details_metabox($post)
{
    global $wp_locale;
    //Sets the format as php understands it, and textual.
    $phpFormat = eventorganiser_get_option('dateformat');
    if ('d-m-Y' == $phpFormat) {
        $format = 'dd-mm-yyyy';
        //Human form
    } elseif ('Y-m-d' == $phpFormat) {
        $format = 'yyyy-mm-dd';
        //Human form
    } else {
        $format = 'mm-dd-yyyy';
        //Human form
    }
    $is24 = eventorganiser_blog_is_24();
    $time_format = $is24 ? 'H:i' : 'g:ia';
    //Get the starting day of the week
    $start_day = intval(get_option('start_of_week'));
    $ical_days = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA');
    //Retrieve event details
    extract(eo_get_event_schedule($post->ID));
    $venues = eo_get_venues();
    $venue_id = (int) eo_get_venue($post->ID);
    //$sche_once is used to disable date editing unless the user specifically requests it.
    //But a new event might be recurring (via filter), and we don't want to 'lock' new events.
    //See https://wordpress.org/support/topic/wrong-default-in-input-element
    $sche_once = $schedule == 'once' || !empty(get_current_screen()->action);
    if (!$sche_once) {
        $notices = '<strong>' . __('This is a reoccurring event', 'eventorganiser') . '</strong>. ' . __('Check to edit this event and its reoccurrences', 'eventorganiser') . ' <input type="checkbox" id="HWSEvent_rec" name="eo_input[AlterRe]" value="yes">';
    } else {
        $notices = '';
    }
    //Start of meta box
    /**
     * Filters the notice at the top of the event details metabox.
     * 
     * @param string  $notices The message text.
     * @param WP_Post $post    The corresponding event (post).
     */
    $notices = apply_filters('eventorganiser_event_metabox_notice', $notices, $post);
    if ($notices) {
        echo '<div class="updated below-h2"><p>' . $notices . '</p></div>';
    }
    ?>
	<div class="<?php 
    echo $sche_once ? 'onetime' : 'reoccurence';
    ?>
">
		<p>
		<?php 
    if ($is24) {
        printf(__('Ensure dates are entered in %1$s format and times in 24 hour format', 'eventorganiser'), '<strong>' . $format . '</strong>');
    } else {
        printf(__('Ensure dates are entered in %1$s format and times in 12 hour format', 'eventorganiser'), '<strong>' . $format . '</strong>');
    }
    ?>
 		</p>

		<table id="eventorganiser_event_detail" class="form-table">
				<tr valign="top" class="event-date">
					<td class="eo-label"><?php 
    echo __('Start Date/Time', 'eventorganiser') . ':';
    ?>
 </td>
					<td> 
						<input class="ui-widget-content ui-corner-all" name="eo_input[StartDate]" size="10" maxlength="10" id="from_date" <?php 
    disabled(!$sche_once);
    ?>
 value="<?php 
    echo $start->format($phpFormat);
    ?>
"/>
						<?php 
    printf('<input name="eo_input[StartTime]" class="eo_time ui-widget-content ui-corner-all" size="6" maxlength="8" id="HWSEvent_time" %s value="%s"/>', disabled(!$sche_once || $all_day, true, false), eo_format_datetime($start, $time_format));
    ?>
						

					</td>
				</tr>

				<tr valign="top" class="event-date">
					<td class="eo-label"><?php 
    echo __('End Date/Time', 'eventorganiser') . ':';
    ?>
 </td>
					<td> 
						<input class="ui-widget-content ui-corner-all" name="eo_input[EndDate]" size="10" maxlength="10" id="to_date" <?php 
    disabled(!$sche_once);
    ?>
  value="<?php 
    echo $end->format($phpFormat);
    ?>
"/>
					
						<?php 
    printf('<input name="eo_input[FinishTime]" class="eo_time ui-widget-content ui-corner-all" size="6" maxlength="8" id="HWSEvent_time2" %s value="%s"/>', disabled(!$sche_once || $all_day, true, false), eo_format_datetime($end, $time_format));
    ?>
	

					<label>
					<input type="checkbox" id="eo_allday"  <?php 
    checked($all_day);
    ?>
 name="eo_input[allday]"  <?php 
    disabled(!$sche_once);
    ?>
 value="1"/>
						<?php 
    _e('All day', 'eventorganiser');
    ?>
					 </label>
			
					</td>
				</tr>

				<tr class="event-date">
					<td class="eo-label"><?php 
    _e('Reoccurence:', 'eventorganiser');
    ?>
 </td>
					<td> 
					<?php 
    $reoccurrence_schedules = array('once' => __('once', 'eventorganiser'), 'daily' => __('daily', 'eventorganiser'), 'weekly' => __('weekly', 'eventorganiser'), 'monthly' => __('monthly', 'eventorganiser'), 'yearly' => __('yearly', 'eventorganiser'), 'custom' => __('custom', 'eventorganiser'));
    ?>

					<select id="HWSEventInput_Req" name="eo_input[schedule]">
						<?php 
    foreach ($reoccurrence_schedules as $index => $val) {
        ?>
							<option value="<?php 
        echo $index;
        ?>
" <?php 
        selected($schedule, $index);
        ?>
><?php 
        echo $val;
        ?>
</option>
						<?php 
    }
    //End foreach $allowed_reoccurs
    ?>
					</select>
					</td>
				</tr>

				<tr valign="top"  class="event-date reocurrence_row">
					<td></td>
					<td>
						<p><?php 
    _e('Repeat every', 'eventorganiser');
    ?>
 
						<input <?php 
    disabled(!$sche_once || $all_day);
    ?>
 class="ui-widget-content ui-corner-all" name="eo_input[event_frequency]" id="HWSEvent_freq" type="number" min="1" max="365" maxlength="4" size="4" disabled="disabled" value="<?php 
    echo $frequency;
    ?>
" /> 
						<span id="recpan" >  </span>				
						</p>

						<p id="dayofweekrepeat">
						<?php 
    _e('on', 'eventorganiser');
    ?>
	
						<?php 
    for ($i = 0; $i <= 6; $i++) {
        $d = ($start_day + $i) % 7;
        $ical_d = $ical_days[$d];
        $day = $wp_locale->weekday_abbrev[$wp_locale->weekday[$d]];
        $schedule_days = is_array($schedule_meta) ? $schedule_meta : array();
        ?>
							<input type="checkbox" id="day-<?php 
        echo $day;
        ?>
"  <?php 
        checked(in_array($ical_d, $schedule_days), true);
        ?>
  value="<?php 
        echo esc_attr($ical_d);
        ?>
" class="daysofweek" name="eo_input[days][]" disabled="disabled" />
							<label for="day-<?php 
        echo $day;
        ?>
" > <?php 
        echo $day;
        ?>
</label>
						<?php 
    }
    ?>
						</p>

						<p id="dayofmonthrepeat">
						<label for="bymonthday" >	
							<input type="radio" id="bymonthday" disabled="disabled" name="eo_input[schedule_meta]" <?php 
    checked($occurs_by, 'BYMONTHDAY');
    ?>
 value="BYMONTHDAY=" /> 
							<?php 
    _e('day of month', 'eventorganiser');
    ?>
						</label>
						<label for="byday" >
							<input type="radio" id="byday" disabled="disabled" name="eo_input[schedule_meta]"  <?php 
    checked($occurs_by != 'BYMONTHDAY', true);
    ?>
 value="BYDAY=" /> 
							<?php 
    _e('day of week', 'eventorganiser');
    ?>
						</label>
						</p>

						<p class="reoccurrence_label">
						<?php 
    _e('until', 'eventorganiser');
    ?>
 
						<input <?php 
    disabled(!$sche_once || $all_day);
    ?>
 class="ui-widget-content ui-corner-all" name="eo_input[schedule_end]" id="recend" size="10" maxlength="10" disabled="disabled" value="<?php 
    echo $until->format($phpFormat);
    ?>
"/>
						</p>

						<p id="event_summary"> </p>
					</td>
				</tr>

				<tr valign="top" id="eo_occurrence_picker_row" class="event-date">
					<td class="eo-label">	
						<?php 
    esc_html_e('Include/Exclude occurrences', 'eventorganiser');
    ?>
					</td>
					<td>
						<?php 
    submit_button(__('Show dates', 'eventorganiser'), 'hide-if-no-js eo_occurrence_toggle button small', 'eo_date_toggle', false);
    ?>
						
						<div id="eo_occurrence_datepicker"></div>
						<?php 
    //var_dump($include);
    if (!empty($include)) {
        $include_str = array_map('eo_format_datetime', $include, array_fill(0, count($include), 'Y-m-d'));
        $include_str = esc_textarea(sanitize_text_field(implode(',', $include_str)));
    } else {
        $include_str = '';
    }
    ?>
						<textarea style="display:none;" name="eo_input[include]" id="eo_occurrence_includes"><?php 
    echo $include_str;
    ?>
</textarea>

						<?php 
    if (!empty($exclude)) {
        $exclude_str = array_map('eo_format_datetime', $exclude, array_fill(0, count($exclude), 'Y-m-d'));
        $exclude_str = esc_textarea(sanitize_text_field(implode(',', $exclude_str)));
    } else {
        $exclude_str = '';
    }
    ?>
						<textarea style="display:none;" name="eo_input[exclude]" id="eo_occurrence_excludes"><?php 
    echo $exclude_str;
    ?>
</textarea>

					</td>
				</tr>
				<?php 
    $tax = get_taxonomy('event-venue');
    if (taxonomy_exists('event-venue')) {
        ?>
		
					
						<tr valign="top" class="eo-venue-combobox-select">
							<td class="eo-label"> <?php 
        echo esc_html($tax->labels->singular_name_colon);
        ?>
 </td>
							<td> 	
								<select size="50" id="venue_select" name="eo_input[event-venue]">
									<option><?php 
        _e('Select a venue', 'eventorganiser');
        ?>
</option>
									<?php 
        foreach ($venues as $venue) {
            ?>
										<option <?php 
            selected($venue->term_id, $venue_id);
            ?>
 value="<?php 
            echo intval($venue->term_id);
            ?>
"><?php 
            echo esc_html($venue->name);
            ?>
</option>
									<?php 
        }
        ?>
								</select>
							</td>
						</tr>
		
						<!-- Add New Venue --> 
						<tr valign="top" class="eo-add-new-venue">
							<td class="eo-label"><label><?php 
        _e('Venue Name', 'eventorganiser');
        ?>
:</label></td>
							<td><input type="text" name="eo_venue[name]" id="eo_venue_name"  value=""/></td>
						</tr>
						<?php 
        $address_fields = _eventorganiser_get_venue_address_fields();
        foreach ($address_fields as $key => $label) {
            printf('<tr valign="top" class="eo-add-new-venue">
									<td class="eo-label"><label>%1$s:</label></td>
									<td><input type="text" name="eo_venue[%2$s]" class="eo_addressInput" id="eo_venue_add"  value=""/></td>
								</tr>', $label, esc_attr(trim($key, '_')));
        }
        ?>
						<tr valign="top" class="eo-add-new-venue" >
							<td class="eo-label"></td>
							<td>
								<a class="button eo-add-new-venue-cancel" href="#"><?php 
        esc_html_e('Cancel', 'eventorganiser');
        ?>
 </a>
							</td>
						</tr>

						<!-- Venue Map --> 
						<tr valign="top"  class="venue_row <?php 
        if (!$venue_id) {
            echo 'novenue';
        }
        ?>
" >
							<td class="eo-label"></td>
							<td>
								<div id="eventorganiser_venue_meta" style="display:none;">
									<input type="hidden" id="eo_venue_Lat" name="eo_venue[latitude]" value="<?php 
        eo_venue_lat($venue_id);
        ?>
" />
									<input type="hidden" id="eo_venue_Lng" name="eo_venue[longtitude]" value="<?php 
        eo_venue_lng($venue_id);
        ?>
" />
								</div>
								<div id="venuemap" class="ui-widget-content ui-corner-all gmap3"></div>
								<div class="clear"></div>
							</td>
						</tr>
				<?php 
    }
    //endif venue's supported
    ?>
			</table>
		</div>
	<?php 
    // create a custom nonce for submit verification later
    wp_nonce_field('eventorganiser_event_update_' . get_the_ID() . '_' . get_current_blog_id(), '_eononce');
}
 /**
  * Generates widget / shortcode calendar html
  *
  * @param $month - DateTime object for first day of the month (in blog timezone)
  */
 static function generate_output($month, $args = array())
 {
     //Translations
     global $wp_locale;
     $today = new DateTime('now', eo_get_blog_timezone());
     $key = $month->format('YM') . serialize($args) . get_locale() . $today->format('Y-m-d');
     $calendar = get_transient('eo_widget_calendar');
     if ((!defined('WP_DEBUG') || !WP_DEBUG) && $calendar && is_array($calendar) && isset($calendar[$key])) {
         return $calendar[$key];
     }
     //Parse defaults
     $args['show-long'] = isset($args['show-long']) ? $args['show-long'] : false;
     $args['link-to-single'] = isset($args['link-to-single']) ? $args['link-to-single'] : false;
     //Month details
     $first_day_of_month = intval($month->format('N'));
     //0=sun,...,6=sat
     $days_in_month = intval($month->format('t'));
     // 28-31
     $last_month = clone $month;
     $last_month->modify('last month');
     $next_month = clone $month;
     $next_month->modify('next month');
     //Retrieve the start day of the week from the options.
     $start_day = intval(get_option('start_of_week'));
     //0=sun,...,6=sat
     //How many blank cells before inserting dates
     $offset = ($first_day_of_month - $start_day + 7) % 7;
     //Number of weeks to show in Calendar
     $totalweeks = ceil(($offset + $days_in_month) / 7);
     //Get events for this month
     $start = $month->format('Y-m-d');
     $end = $month->format('Y-m-t');
     //Query events
     $required = array('numberposts' => -1, 'showrepeats' => 1);
     if ($args['show-long']) {
         $args['event_start_before'] = $end;
         $args['event_end_after'] = $start;
     } else {
         $args['event_start_before'] = $end;
         $args['event_start_after'] = $start;
     }
     $events = eo_get_events(array_merge($args, $required));
     //Populate events array
     $calendar_events = array();
     foreach ($events as $event) {
         if ($args['show-long']) {
             $start = eo_get_the_start(DATETIMEOBJ, $event->ID, null, $event->occurrence_id);
             $end = eo_get_the_end(DATETIMEOBJ, $event->ID, null, $event->occurrence_id);
             $pointer = clone $start;
             while ($pointer <= $end) {
                 $date = eo_format_datetime($pointer, 'Y-m-d');
                 $calendar_events[$date][] = $event;
                 $pointer->modify('+1 day');
             }
         } else {
             $date = eo_get_the_start('Y-m-d', $event->ID, null, $event->occurrence_id);
             $calendar_events[$date][] = $event;
         }
     }
     $before = "<table id='wp-calendar'>";
     $title = sprintf("<caption> %s </caption>", esc_html(eo_format_datetime($month, 'F Y')));
     $head = "<thead><tr>";
     for ($d = 0; $d <= 6; $d++) {
         $day = $wp_locale->get_weekday(($d + $start_day) % 7);
         $day_abbrev = $wp_locale->get_weekday_initial($day);
         $head .= sprintf("<th title='%s' scope='col'>%s</th>", esc_attr($day), esc_html($day_abbrev));
     }
     $head .= "</tr></thead>";
     $foot = sprintf("<tfoot><tr>\n\t\t\t\t\t<td id='eo-widget-prev-month' colspan='3'><a title='%s' href='%s'>&laquo; %s</a></td>\n\t\t\t\t\t<td class='pad'>&nbsp;</td>\n\t\t\t\t\t<td id='eo-widget-next-month' colspan='3'><a title='%s' href='%s'> %s &raquo; </a></td>\n\t\t\t\t</tr></tfoot>", esc_html__('Previous month', 'eventorganiser'), add_query_arg('eo_month', $last_month->format('Y-m')), esc_html(eo_format_datetime($last_month, 'M')), esc_html__('Next month', 'eventorganiser'), add_query_arg('eo_month', $next_month->format('Y-m')), esc_html(eo_format_datetime($next_month, 'M')));
     $body = "<tbody>";
     $current_date = clone $month;
     //Foreach week in calendar
     for ($w = 0; $w <= $totalweeks - 1; $w++) {
         $body .= "<tr>";
         //For each cell in this week
         for ($cell = $w * 7 + 1; $cell <= ($w + 1) * 7; $cell++) {
             $formated_date = $current_date->format('Y-m-d');
             $data = "data-eo-wc-date='{$formated_date}'";
             if ($cell <= $offset) {
                 $body .= "<td class='pad eo-before-month' colspan='1'>&nbsp;</td>";
             } elseif ($cell - $offset > $days_in_month) {
                 $body .= "<td class='pad eo-after-month' colspan='1'>&nbsp;</td>";
             } else {
                 $class = array();
                 if ($formated_date < $today->format('Y-m-d')) {
                     $class[] = 'eo-past-date';
                 } elseif ($formated_date == $today->format('Y-m-d')) {
                     $class[] = 'today';
                 } else {
                     $class[] = 'eo-future-date';
                 }
                 //Does the date have any events
                 if (isset($calendar_events[$formated_date])) {
                     $class[] = 'event';
                     $events = $calendar_events[$formated_date];
                     if ($events && count($events) == 1 && $args['link-to-single']) {
                         $only_event = $events[0];
                         $link = get_permalink($only_event->ID);
                     } else {
                         $link = eo_get_event_archive_link($current_date->format('Y'), $current_date->format('m'), $current_date->format('d'));
                     }
                     $link = esc_url($link);
                     /**
                      * Filters the the link of a date on the events widget calendar
                      * @param string $link The link
                      * @param datetime $current_date The date being filtered
                      * @param array $events Array of events starting on this day
                      */
                     $link = apply_filters('eventorganiser_widget_calendar_date_link', $link, $current_date, $events);
                     foreach ($events as $event) {
                         $class = array_merge($class, eo_get_event_classes($event->ID, $event->occurrence_id));
                     }
                     $class = array_unique(array_filter($class));
                     $classes = implode(' ', $class);
                     $titles = implode(', ', wp_list_pluck($events, 'post_title'));
                     $body .= sprintf("<td {$data} class='%s'> <a title='%s' href='%s'> %s </a></td>", esc_attr($classes), esc_attr($titles), $link, $cell - $offset);
                 } else {
                     $classes = implode(' ', $class);
                     $body .= sprintf("<td {$data} class='%s'> %s </td>", esc_attr($classes), $cell - $offset);
                 }
                 //Proceed to next day
                 $current_date->modify('+1 day');
             }
         }
         //Endfor each day in week
         $body .= "</tr>";
     }
     //End for each week
     $body .= "</tbody>";
     $after = "</table>";
     if (!$calendar || !is_array($calendar)) {
         $calendar = array();
     }
     $calendar[$key] = $before . $title . $head . $foot . $body . $after;
     set_transient('eo_widget_calendar', $calendar, 60 * 60 * 24);
     return $calendar[$key];
 }
/**
 * Returns formatted date of an event archive.
 *
 * Returns the formatted ate of an event archive. E.g. for date archives, returns that date, 
 * for year archives returns 1st January of that year, for month archives 1st of that month.
 * The date is formatted according to `$format` via {@see `eo_format_datetime()`}
 *
 * <code>
 * 	<?php
 *	 if( eo_is_event_archive('day') )
 *      //Viewing date archive: "Events: 3rd June 2013"
 *      echo __('Events: ','eventorganiser').' '.eo_get_event_archive_date('jS F Y');
 *	 elseif( eo_is_event_archive('month') )
 *      //Viewing month archive: "Events: June 2013"
 *      echo __('Events: ','eventorganiser').' '.eo_get_event_archive_date('F Y');
 *   elseif( eo_is_event_archive('year') )
 *      //Viewing year archive: "Events: 2013"
 *      echo __('Events: ','eventorganiser').' '.eo_get_event_archive_date('Y');
 *   else
 *      _e('Events','eventorganiser');
 *   ?>
 * </code>
 * @since 1.7
 * @uses is_post_type_archive()
 * @uses eo_format_datetime()
 * @link https://php.net/manual/en/function.date.php Formatting dates
 * @param string|constant $format How to format the date, see https://php.net/manual/en/function.date.php  or DATETIMEOBJ constant to return the datetime object.
 * @return string|dateTime The formatted date
*/
function eo_get_event_archive_date($format = DATETIMEOBJ)
{
    if (!is_post_type_archive('event')) {
        return false;
    }
    $ondate = str_replace('/', '-', get_query_var('ondate'));
    if (empty($ondate)) {
        return false;
    }
    $parts = count(explode('-', $ondate));
    if ($parts == 1 && is_numeric($ondate)) {
        //Numeric - interpret as year
        $ondate .= '-01-01';
    } elseif ($parts == 2) {
        // 2012-01 format: interpret as month
        $ondate .= '-01';
    }
    $ondate = eo_check_datetime('Y-m-d', $ondate);
    return eo_format_datetime($ondate, $format);
}
/**
* Returns a summary of the events schedule.
* @since 1.0.0
* @ignore
*
* @param int $post_id The event (post) ID. Uses current event if empty.
* @return string A summary of the events schedule.
*/
function eo_get_schedule_summary($post_id = 0)
{
    global $post, $wp_locale;
    $ical2day = array('SU' => $wp_locale->weekday[0], 'MO' => $wp_locale->weekday[1], 'TU' => $wp_locale->weekday[2], 'WE' => $wp_locale->weekday[3], 'TH' => $wp_locale->weekday[4], 'FR' => $wp_locale->weekday[5], 'SA' => $wp_locale->weekday[6]);
    $nth = array(__('last', 'eventorganiser'), '', __('first', 'eventorganiser'), __('second', 'eventorganiser'), __('third', 'eventorganiser'), __('fourth', 'eventorganiser'));
    $reoccur = eo_get_event_schedule($post_id);
    if (empty($reoccur)) {
        return false;
    }
    $return = '';
    if ($reoccur['schedule'] == 'once') {
        $return = __('one time only', 'eventorganiser');
    } elseif ($reoccur['schedule'] == 'custom') {
        $return = __('custom reoccurrence', 'eventorganiser');
    } else {
        switch ($reoccur['schedule']) {
            case 'daily':
                if ($reoccur['frequency'] == 1) {
                    $return .= __('every day', 'eventorganiser');
                } else {
                    $return .= sprintf(__('every %d days', 'eventorganiser'), $reoccur['frequency']);
                }
                break;
            case 'weekly':
                if ($reoccur['frequency'] == 1) {
                    $return .= __('every week on', 'eventorganiser');
                } else {
                    $return .= sprintf(__('every %d weeks on', 'eventorganiser'), $reoccur['frequency']);
                }
                foreach ($reoccur['schedule_meta'] as $ical_day) {
                    $days[] = $ical2day[$ical_day];
                }
                $return .= ' ' . implode(', ', $days);
                break;
            case 'monthly':
                if ($reoccur['frequency'] == 1) {
                    $return .= __('every month on the', 'eventorganiser');
                } else {
                    $return .= sprintf(__('every %d months on the', 'eventorganiser'), $reoccur['frequency']);
                }
                $return .= ' ';
                $bymonthday = preg_match('/^BYMONTHDAY=(\\d{1,2})/', $reoccur['schedule_meta'], $matches);
                if ($bymonthday) {
                    $d = intval($matches[1]);
                    $m = intval($reoccur['schedule_start']->format('n'));
                    $y = intval($reoccur['schedule_start']->format('Y'));
                    $reoccur['start']->setDate($y, $m, $d);
                    $return .= $reoccur['schedule_start']->format('jS');
                } elseif ($reoccur['schedule_meta'] == 'date') {
                    $return .= $reoccur['schedule_start']->format('jS');
                } else {
                    $byday = preg_match('/^BYDAY=(-?\\d{1,2})([a-zA-Z]{2})/', $reoccur['schedule_meta'], $matches);
                    if ($byday) {
                        $n = intval($matches[1]) + 1;
                        $return .= $nth[$n] . ' ' . $ical2day[$matches[2]];
                    } else {
                        $bydayOLD = preg_match('/^(-?\\d{1,2})([a-zA-Z]{2})/', $reoccur['schedule_meta'], $matchesOLD);
                        $n = intval($matchesOLD[1]) + 1;
                        $return .= $nth[$n] . ' ' . $ical2day[$matchesOLD[2]];
                    }
                }
                break;
            case 'yearly':
                if ($reoccur['frequency'] == 1) {
                    $return .= __('every year', 'eventorganiser');
                } else {
                    $return .= sprintf(__('every %d years', 'eventorganiser'), $reoccur['frequency']);
                }
                break;
        }
        $return .= ' ' . __('until', 'eventorganiser') . ' ' . eo_format_datetime($reoccur['schedule_last'], 'M, jS Y');
    }
    return $return;
}
function eventorganiser_admin_calendar()
{
    //request
    $request = array('event_end_after' => $_GET['start'], 'event_start_before' => $_GET['end']);
    //Presets
    $presets = array('posts_per_page' => -1, 'post_type' => 'event', 'group_events_by' => '', 'perm' => 'readable');
    //Create query
    $query_array = array_merge($presets, $request);
    $query = new WP_Query($query_array);
    //Retrieve events
    $query->get_posts();
    $eventsarray = array();
    //Blog timezone
    $tz = eo_get_blog_timezone();
    //Loop through events
    global $post;
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $event = array();
            $colour = '';
            //Get title, append status if applicable
            $title = get_the_title();
            if (!empty($post->post_password)) {
                $title .= ' - ' . __('Protected');
            } elseif ($post->post_status == 'private') {
                $title .= ' - ' . __('Private');
            } elseif ($post->post_status == 'draft') {
                $title .= ' - ' . __('Draft');
            }
            $event['title'] = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
            //Check if all day, set format accordingly
            if (eo_is_all_day()) {
                $event['allDay'] = true;
                $format = get_option('date_format');
            } else {
                $event['allDay'] = false;
                $format = get_option('date_format') . '  ' . get_option('time_format');
            }
            //Get author (or organiser)
            $organiser = get_userdata($post->post_author)->display_name;
            //Get Event Start and End date, set timezone to the blog's timzone
            $event_start = new DateTime($post->StartDate . ' ' . $post->StartTime, $tz);
            $event_end = new DateTime($post->EndDate . ' ' . $post->FinishTime, $tz);
            $event['start'] = $event_start->format('Y-m-d\\TH:i:s\\Z');
            $event['end'] = $event_end->format('Y-m-d\\TH:i:s\\Z');
            //Produce summary of event
            $summary = "<table>" . "<tr><th> " . __('Start', 'eventorganiser') . ": </th><td> " . eo_format_datetime($event_start, $format) . "</td></tr>" . "<tr><th> " . __('End', 'eventorganiser') . ": </th><td> " . eo_format_datetime($event_end, $format) . "</td></tr>" . "<tr><th> " . __('Organiser', 'eventorganiser') . ": </th><td>" . $organiser . "</td></tr>";
            $event['className'] = array('event');
            $now = new DateTIme(null, $tz);
            if ($event_start <= $now) {
                $event['className'][] = 'past-event';
            }
            //Include venue if this is set
            $venue = eo_get_venue($post->ID);
            if ($venue && !is_wp_error($venue)) {
                $summary .= "<tr><th>" . __('Where', 'eventorganiser') . ": </th><td>" . eo_get_venue_name($venue) . "</td></tr>";
                $event['className'][] = 'venue-' . eo_get_venue_slug($post->ID);
                $event['venue'] = $venue;
            }
            $summary = apply_filters('eventorganiser_admin_cal_summary', $summary, $post->ID, $post->event_id, $post);
            $summary .= "</table><p>";
            //Include schedule summary if event reoccurrs
            if ($post->event_schedule != 'once') {
                $summary .= '<em>' . __('This event reoccurs', 'eventorganiser') . ' ' . eo_get_schedule_summary() . '</em>';
            }
            $summary .= '</p>';
            //Include edit link in summary if user has permission
            if (current_user_can('edit_event', $post->ID)) {
                $edit_link = get_edit_post_link($post->ID, '');
                $summary .= "<span class='edit'><a title='Edit this item' href='" . $edit_link . "'> " . __('Edit Event', 'eventorganiser') . "</a></span>";
                $event['url'] = $edit_link;
            }
            //Include a delete occurrence link in summary if user has permission
            if (current_user_can('delete_event', $post->ID)) {
                $admin_url = admin_url('edit.php');
                $delete_url = add_query_arg(array('post_type' => 'event', 'page' => 'calendar', 'series' => $post->ID, 'event' => $post->event_id, 'action' => 'delete_occurrence'), $admin_url);
                $delete_url = wp_nonce_url($delete_url, 'eventorganiser_delete_occurrence_' . $post->event_id);
                $summary .= "<span class='delete'>\n\t\t\t\t\t<a class='submitdelete' style='color:red;float:right' title='" . __('Delete this occurrence', 'eventorganiser') . "' href='" . $delete_url . "'> " . __('Delete this occurrence', 'eventorganiser') . "</a>\n\t\t\t\t\t</span>";
                if ($post->event_schedule != 'once') {
                    $break_url = add_query_arg(array('post_type' => 'event', 'page' => 'calendar', 'series' => $post->ID, 'event' => $post->event_id, 'action' => 'break_series'), $admin_url);
                    $break_url = wp_nonce_url($break_url, 'eventorganiser_break_series_' . $post->event_id);
                    $summary .= "<span class='break'>\n\t\t\t\t\t\t<a class='submitbreak' style='color:red;float:right;padding-right: 2em;' title='" . __('Break this series', 'eventorganiser') . "' href='" . $break_url . "'> " . __('Break this series', 'eventorganiser') . "</a>\n\t\t\t\t\t\t</span>";
                }
            }
            $terms = get_the_terms($post->ID, 'event-category');
            $event['category'] = array();
            if ($terms) {
                foreach ($terms as $term) {
                    $event['category'][] = $term->slug;
                    if (empty($event['color'])) {
                        $event['color'] = isset($term->color) ? $term->color : '';
                    }
                    $event['className'][] = 'category-' . $term->slug;
                }
            }
            $event['summary'] = $summary;
            //Add event to array
            $eventsarray[] = $event;
        }
    }
    //Echo result and exit
    echo json_encode($eventsarray);
    exit;
}