public function shortcode($args = array(), $content = '')
 {
     $original_arguments = $args;
     $codec = new Eab_Codec_ArgumentsCodec();
     $args = $codec->parse_arguments($args, array('format' => 'H:i T l', 'class' => '', 'add' => 0, 'expired' => __('Closed', Eab_EventsHub::TEXT_DOMAIN), 'legacy' => false, 'category' => false, 'categories' => false));
     if (!empty($args['legacy'])) {
         return $this->_legacy_shortcode($original_arguments);
     }
     $class = !empty($args['class']) ? 'class="' . sanitize_html_class($args['class']) . '"' : '';
     $format = "<div {$class}>%s</div>";
     $output = '';
     $additional = 0;
     if (!empty($args['add']) && (int) $args['add']) {
         $additional = (int) $args['add'] * 60;
     }
     $query = $codec->get_query_args($args);
     $now = eab_current_time() + $additional;
     $events = Eab_CollectionFactory::get_upcoming_events($now, $query);
     $ret = array();
     foreach ($events as $event) {
         $ts = $event->get_start_timestamp();
         if ($ts < $now) {
             continue;
         }
         $ret[$ts] = $event;
     }
     ksort($ret);
     $next = reset($ret);
     if ($next) {
         $output = date_i18n($args['format'], $next->get_start_timestamp());
     } else {
         $output = !empty($args['expired']) ? esc_html($args['expired']) : $content;
     }
     return sprintf($format, $output);
 }
 protected function _preparse_arguments($raw, $accepted)
 {
     $_template = false;
     if (!empty($accepted['template']) && (defined('EAB_DISALLOW_SHORTCODE_TEMPLATES') && EAB_DISALLOW_SHORTCODE_TEMPLATES)) {
         $_template = $accepted['template'];
         unset($accepted['template']);
     }
     $args = wp_parse_args($raw, $accepted);
     if (isset($accepted['network'])) {
         $args['network'] = $this->_arg_to_bool($args['network']);
     }
     if (isset($accepted['relative_date']) && !empty($args['relative_date'])) {
         $pivot = !empty($args['date']) ? strtotime($args['date']) : eab_current_time();
         $relative_date = strtotime($args["relative_date"], $pivot);
         if ($relative_date) {
             $args['date'] = date("Y-m-d H:i:s", $relative_date);
         }
     }
     if (isset($accepted['date'])) {
         $args['date'] = $this->_arg_to_time($args['date']);
     }
     if (isset($accepted['lookahead'])) {
         $args['lookahead'] = $this->_arg_to_bool($args['lookahead']);
     }
     if (isset($accepted['weeks'])) {
         $args['weeks'] = $this->_arg_to_int($args['weeks']);
     }
     if (isset($accepted['limit'])) {
         $args['limit'] = $this->_arg_to_int($args['limit']);
     }
     if (isset($accepted['order'])) {
         $args['order'] = $args['order'] && in_array(strtoupper($args['order']), array('ASC', 'DESC')) ? strtoupper($args['order']) : false;
     }
     if (isset($accepted['category']) && $args['category']) {
         $args['category'] = $this->_arg_to_int($args['category']) ? array('type' => 'id', 'value' => $this->_arg_to_int($args['category'])) : array('type' => 'slug', 'value' => $args['category']);
     }
     if (isset($accepted['categories']) && !empty($args['categories'])) {
         $args['categories'] = $this->_arg_to_int_list($args['categories']) ? array('type' => 'id', 'value' => $this->_arg_to_int_list($args['categories'])) : false;
     }
     if (isset($accepted['paged'])) {
         $args['paged'] = $this->_arg_to_bool($args['paged']);
     }
     if (isset($accepted['page'])) {
         $args['page'] = $this->_arg_to_int($args['page']);
     }
     if (isset($accepted['navigation'])) {
         $args['navigation'] = $this->_arg_to_bool($args['navigation']);
     }
     if (isset($accepted['override_styles'])) {
         $args['override_styles'] = $this->_arg_to_bool($args['override_styles']);
     }
     if (isset($accepted['override_scripts'])) {
         $args['override_scripts'] = $this->_arg_to_bool($args['override_scripts']);
     }
     if ($_template && defined('EAB_DISALLOW_SHORTCODE_TEMPLATES') && EAB_DISALLOW_SHORTCODE_TEMPLATES) {
         $args['template'] = $_template;
     }
     return $args;
 }
 function expire_archived_events()
 {
     if (class_exists('Eab_Events_ExpirePastEvents')) {
         return false;
     }
     $args = array();
     $collection = new Eab_LastMonthArchivedCollection(eab_current_time(), $args);
     $events = $collection->to_collection();
     foreach ($events as $event) {
         $event->set_status(Eab_EventModel::STATUS_EXPIRED);
     }
 }
 function redirect()
 {
     global $post;
     if (!is_singular()) {
         return false;
     }
     if (!$post || !is_object($post) || !isset($post->post_type) || 'incsub_event' != $post->post_type) {
         return false;
     }
     $event = $post instanceof Eab_EventModel ? $post : new Eab_EventModel($post);
     if (!$event->is_recurring()) {
         return false;
     }
     if ($event->is_recurring_child()) {
         return false;
     }
     // Already an instance - no need to keep going.
     $collection = new Eab_AllUpcomingRecurringChildrenCollection($event, $time);
     $children = $collection->to_collection();
     if (!$children) {
         return false;
     }
     $now = eab_current_time();
     $redirect_to = $active = false;
     $fallback = array();
     foreach ($children as $key => $child) {
         if ($child->get_end_timestamp() < $now) {
             continue;
         }
         // Already passed, move on
         if ($child->get_start_timestamp() <= $now) {
             $active = $child;
             break;
             // Currently ongoing event
         } else {
             $fallback[$child->get_start_timestamp()] = $child;
         }
     }
     if (!empty($active)) {
         $redirect_to = $active;
     } else {
         if (!empty($fallback)) {
             sort($fallback);
             $redirect_to = reset($fallback);
         }
     }
     if (!$redirect_to) {
         return false;
     }
     wp_redirect(get_permalink($redirect_to->get_id()));
     die;
 }
 function widget($args, $instance)
 {
     global $wpdb, $current_site, $post, $wiki_tree;
     extract($args);
     $instance = apply_filters('eab-widgets-upcoming-instance_read', $instance, $this);
     $options = wp_parse_args((array) $instance, $this->_defaults);
     $title = apply_filters('widget_title', empty($instance['title']) ? __('Upcoming', $this->translation_domain) : $instance['title'], $instance, $this->id_base);
     $query_args = array('posts_per_page' => $options['limit']);
     if ($options['category']) {
         $query_args['tax_query'] = array(array('taxonomy' => 'eab_events_category', 'field' => 'id', 'terms' => (int) $options['category']));
     }
     if ($options['lookahead'] && is_numeric($options['lookahead'])) {
         $lookahead_func = create_function('', 'return ' . $options['lookahead'] . ';');
         add_filter('eab-collection-upcoming_weeks-week_number', $lookahead_func);
     }
     $_events = Eab_CollectionFactory::get_upcoming_weeks_events(eab_current_time(), $query_args);
     if (!empty($lookahead_func)) {
         remove_filter('eab-collection-upcoming_weeks-week_number', $lookahead_func);
     }
     if (is_array($_events) && count($_events) > 0) {
         echo $before_widget;
         echo $before_title . $title . $after_title;
         echo '<div id="event-popular"><ul>';
         foreach ($_events as $_event) {
             $thumbnail = $excerpt = false;
             if ($options['thumbnail']) {
                 $raw = wp_get_attachment_image_src(get_post_thumbnail_id($_event->get_id()));
                 $thumbnail = $raw ? @$raw[0] : false;
             }
             $excerpt = false;
             if (!empty($options['excerpt'])) {
                 $words = (int) $options['excerpt_words_limit'] ? (int) $options['excerpt_words_limit'] : false;
                 $excerpt = eab_call_template('util_words_limit', $_event->get_excerpt_or_fallback(), $words);
             }
             echo '<li>';
             echo '<a href="' . get_permalink($_event->get_id()) . '" class="' . ($_event->get_id() == $post->ID ? 'current' : '') . '" >' . ($options['thumbnail'] && $thumbnail ? '<img src="' . $thumbnail . '" /><br />' : '') . $_event->get_title() . '</a>';
             if (!empty($options['dates'])) {
                 echo '<div class="wpmudevevents-date">' . Eab_Template::get_event_dates($_event) . '</div>';
             }
             if (!empty($options['excerpt']) && !empty($excerpt)) {
                 echo '<p>' . $excerpt . '</p>';
             }
             do_action('eab-widgets-upcoming-after_event', $options, $_event, $this);
             echo '</li>';
         }
         echo '</ul></div>';
         echo $after_widget;
     } else {
         echo $before_widget . $before_title . $title . $after_title . '<p class="eab-widget-no_events">' . __('No upcoming events.', Eab_EventsHub::TEXT_DOMAIN) . '</p>' . $after_widget;
     }
 }
 /**
  * Sets status of old events to STATUS_ARCHIVED
  */
 function archive_old_events()
 {
     $time = eab_current_time();
     $events = Eab_CollectionFactory::get_old_events($time);
     foreach ($events as $event) {
         if ($event->get_last_end_timestamp() < $time) {
             if ($event->is_recurring()) {
                 continue;
             }
             $event->set_status(Eab_EventModel::STATUS_ARCHIVED);
             do_action('eab-scheduler-event_archived', $event);
         }
     }
 }
 private function _reset_expired_bookings($since)
 {
     //$rsvps = Eab_EventModel::get_bookings(Eab_EventModel::BOOKING_YES, $since);
     $rsvps = Eab_EventModel::get_bookings(Eab_EventModel::BOOKING_YES);
     // Just reset all the expired bookings.
     $now = eab_current_time();
     $cutoff_limit = $this->_data->get_option('rsvp_auto_reset-cutoff');
     $cutoff_limit = $cutoff_limit ? $cutoff_limit : 3600;
     $callback = (int) $this->_data->get_option('rsvp_auto_reset-remove_attendance') ? 'delete_attendance' : 'cancel_attendance';
     $events = array();
     // Events cache
     foreach ($rsvps as $rsvp) {
         // Check time difference
         $time_diff = $now - strtotime($rsvp->timestamp);
         if ($time_diff < $cutoff_limit) {
             continue;
         }
         // This one still has time to pay
         // Check event premium status
         if (empty($events[$rsvp->event_id])) {
             $events[$rsvp->event_id] = new Eab_EventModel(get_post($rsvp->event_id));
         }
         if (!$events[$rsvp->event_id]->is_premium()) {
             continue;
         }
         // Not a paid event, carry on
         // Check user payment
         if ($events[$rsvp->event_id]->user_paid($rsvp->user_id)) {
             continue;
         }
         // User paid for event, we're good here.
         // If we got here, we should reset the users RSVP
         if (is_callable(array($events[$rsvp->event_id], $callback))) {
             $events[$rsvp->event_id]->{$callback}($rsvp->user_id);
         }
     }
 }
 public function update_schedule()
 {
     return update_option($this->get_schedule_key(), eab_current_time());
 }
 private function _get_event_meta_boxes($event)
 {
     $ret = '<div id="eab-events-fpe-meta_info">';
     $ret .= '<div class="eab-events-fpe-col_wrapper">';
     // Date, time
     $ret .= '<div class="eab-events-fpe-meta_box" id="eab-events-fpe-date_time">';
     // Start date/time
     $start = $event->get_start_timestamp();
     $start = $start ? $start : eab_current_time();
     $ret .= '<div>';
     $ret .= '<label>' . __('Starts on', Eab_EventsHub::TEXT_DOMAIN) . '</label>';
     $ret .= ' <input type="text" name="" id="eab-events-fpe-start_date" value="' . date('Y-m-d', $start) . '" size="10" />';
     $ret .= ' <input type="text" name="" id="eab-events-fpe-start_time" value="' . date('H:i', $start) . '" size="3" />';
     $ret .= '</div>';
     // End date/time
     $end = $event->get_end_timestamp();
     $end = $end ? $end : eab_current_time() + 3600;
     $ret .= '<div>';
     $ret .= '<label>' . __('Ends on', Eab_EventsHub::TEXT_DOMAIN) . '</label>';
     $ret .= ' <input type="text" name="" id="eab-events-fpe-end_date" value="' . date('Y-m-d', $end) . '" size="10" />';
     $ret .= ' <input type="text" name="" id="eab-events-fpe-end_time" value="' . date('H:i', $end) . '" size="3" />';
     $ret .= '</div>';
     // End date, time, venue
     $ret .= '</div>';
     // Status, type, misc
     $ret .= '<div class="eab-events-fpe-meta_box" id="eab-events-fpe-status_type">';
     // Status
     $ret .= '<div>';
     $ret .= '<label>' . __('Event status', Eab_EventsHub::TEXT_DOMAIN) . '</label>';
     $ret .= '<select name="" id="eab-events-fpe-status">';
     $ret .= '	<option value="' . Eab_EventModel::STATUS_OPEN . '" ' . ($event->is_open() ? 'selected="selected"' : '') . ' >' . __('Open', Eab_EventsHub::TEXT_DOMAIN) . '</option>';
     $ret .= '	<option value="' . Eab_EventModel::STATUS_CLOSED . '" ' . ($event->is_closed() ? 'selected="selected"' : '') . ' >' . __('Closed', Eab_EventsHub::TEXT_DOMAIN) . '</option>';
     $ret .= '	<option value="' . Eab_EventModel::STATUS_EXPIRED . '" ' . ($event->is_expired() ? 'selected="selected"' : '') . ' >' . __('Expired', Eab_EventsHub::TEXT_DOMAIN) . '</option>';
     $ret .= '	<option value="' . Eab_EventModel::STATUS_ARCHIVED . '" ' . ($event->is_archived() ? 'selected="selected"' : '') . ' >' . __('Archived', Eab_EventsHub::TEXT_DOMAIN) . '</option>';
     $ret .= apply_filters('eab-events-fpe-event_meta-extra_event_status', '', $event);
     $ret .= '</select>';
     $ret .= apply_filters('eab-events-fpe-event_meta-after_event_status', '', $event);
     $ret .= '</div>';
     // Type
     if ($this->_data->get_option('accept_payments')) {
         $ret .= '<div>';
         $ret .= '<label>' . __('Is this a paid event?', Eab_EventsHub::TEXT_DOMAIN) . '</label>';
         $ret .= '<select name="" id="eab-events-fpe-is_premium">';
         $ret .= '	<option value="1" ' . ($event->is_premium() ? 'selected="selected"' : '') . '>' . __('Yes', Eab_EventsHub::TEXT_DOMAIN) . '</option>';
         $ret .= '	<option value="0" ' . ($event->is_premium() ? '' : 'selected="selected"') . '>' . __('No', Eab_EventsHub::TEXT_DOMAIN) . '</option>';
         $ret .= '</select>';
         $ret .= '<div id="eab-events-fpe-event_fee-wrapper">';
         $ret .= '<label for="eab-events-fpe-event_fee">' . __('Fee', Eab_EventsHub::TEXT_DOMAIN) . '</label>';
         $ret .= ' <input type="text" name="" id="eab-events-fpe-event_fee" size="6" value="' . esc_attr($event->get_price()) . '" />';
         $ret .= '</div>';
         // eab-events-fpe-event_fee-wrapper
         $ret .= '</div>';
     }
     // End status, type, misc
     $ret .= '</div>';
     $ret .= '</div>';
     // eab-events-fpe-col_wrapper
     $ret .= '<div class="eab-events-fpe-col_wrapper">';
     // Start Venue
     $ret .= '<div class="eab-events-fpe-meta_box" id="eab-events-fpe-meta_box-venue">';
     // Venue
     $ret .= '<div>';
     $ret .= '<label>' . __('Venue', Eab_EventsHub::TEXT_DOMAIN) . '</label>';
     $ret .= '<br /><input type="text" name="" id="eab-events-fpe-venue" value="' . esc_attr($event->get_venue_location()) . '" />';
     $ret .= '</div>';
     // End venue
     $ret .= '</div>';
     $ret .= '</div>';
     // eab-events-fpe-col_wrapper
     $ret .= '<div class="eab-events-fpe-col_wrapper">';
     // Start Categories
     $event_cat_ids = $event->get_category_ids();
     $event_cat_ids = $event_cat_ids ? $event_cat_ids : array();
     $all_cats = get_terms('eab_events_category', array('hide_empty' => false));
     $all_cats = $all_cats ? $all_cats : array();
     $ret .= '<div class="eab-events-fpe-meta_box" id="eab-events-fpe-meta_box-categories">';
     // Categories
     $ret .= '<div>';
     $ret .= '<label>' . __('Category', Eab_EventsHub::TEXT_DOMAIN) . '</label>';
     $ret .= '<br /><select id="eab-events-fpe-categories"><option value=""></option>';
     foreach ($all_cats as $cat) {
         $selected = in_array($cat->term_id, $event_cat_ids) ? "selected='selected'" : '';
         $ret .= "<option value='{$cat->term_id}' {$selected}>{$cat->name}</option>";
     }
     $ret .= "</select>";
     $ret .= '</div>';
     // End Categories
     $ret .= '</div>';
     $ret .= '</div>';
     // eab-events-fpe-col_wrapper
     $ret .= '<div class="eab-events-fpe-col_wrapper">';
     $addons = apply_filters('eab-events-fpe-add_meta', '', $event);
     if ($addons) {
         $ret .= '<div class="eab-events-fpe-col_wrapper">';
         $ret .= $addons;
         $ret .= '</div>';
         // eab-events-fpe-col_wrapper
     }
     $featured_image = $event->get_featured_image_url();
     $featured_image_id = (int) $event->get_featured_image_id();
     if (current_user_can('upload_files')) {
         /* Added by Ashok */
         $ret .= '<div class="eab-events-fpe-col_wrapper">';
         $ret .= '<label>' . __('Feature Image', Eab_EventsHub::TEXT_DOMAIN) . '</label>' . '<br />' . '<a href="#featured_image" class="eab-fpe-upload">' . '<input type="hidden" id="eab-fpe-attach_id" name="" value="' . $featured_image_id . '" />' . '<input type="hidden" name="featured" value="' . esc_attr($featured_image_id) . '" />' . '<img src="' . esc_url($featured_image) . '" id="eab-fpe-preview-upload" ' . (empty($featured_image) ? 'style="display:none"' : '') . ' />' . '<br />' . '<span>' . __('Change the featured image', Eab_EventsHub::TEXT_DOMAIN) . '</span>' . '</a>';
         $ret .= '</div>';
         /* End of adding by Ashok */
     } else {
         if (!empty($featured_image_id) && !empty($featured_image)) {
             $ret .= '<div class="eab-events-fpe-col_wrapper">';
             $ret .= '<label>' . __('Feature Image', Eab_EventsHub::TEXT_DOMAIN) . '</label>' . '<img src="' . esc_url($featured_image) . '" id="eab-fpe-preview-upload" />' . '<input type="hidden" id="eab-fpe-attach_id" name="featured" value="' . esc_attr($featured_image_id) . '" />' . '</div>';
         }
     }
     // OK/Cancel
     $ok_label = $event->get_id() ? __('Update', Eab_EventsHub::TEXT_DOMAIN) : __('Publish', Eab_EventsHub::TEXT_DOMAIN);
     $ret .= '<div id="eab-events-fpe-ok_cancel">';
     $ret .= '<input type="button" class="button button-primary" id="eab-events-fpe-ok" value="' . esc_attr($ok_label) . '" />';
     $ret .= '<input type="button" class="button" id="eab-events-fpe-cancel" value="' . esc_attr(__('Cancel', Eab_EventsHub::TEXT_DOMAIN)) . '" />';
     $ret .= '</div>';
     $ret .= '</div>';
     // eab-events-fpe-col_wrapper
     $ret .= '<div class="eab-events-fpe-col_wrapper">';
     // RSVPs
     $ret .= '<div class="eab-events-fpe-meta_box" id="eab-events-fpe-rsvps">';
     if ($event->has_bookings()) {
         $ret .= '<a href="#toggle_rsvps" id="eab-events-fpe-toggle_rsvps">' . __('Toggle RSVPs', Eab_EventsHub::TEXT_DOMAIN) . '</a>';
         $ret .= '<div id="eab-events-fpe-rsvps-wrapper" style="display:none">';
         $ret .= Eab_Template::get_admin_attendance_addition_form($event, Eab_Template::get_rsvp_status_list());
         $ret .= '<div>';
         $ret .= Eab_Template::get_admin_bookings(Eab_EventModel::BOOKING_YES, $event);
         $ret .= '</div>';
         $ret .= '<div>';
         $ret .= Eab_Template::get_admin_bookings(Eab_EventModel::BOOKING_MAYBE, $event);
         $ret .= '</div>';
         $ret .= '<div>';
         $ret .= Eab_Template::get_admin_bookings(Eab_EventModel::BOOKING_NO, $event);
         $ret .= '</div>';
         $ret .= '</div>';
         //eab-events-fpe-rsvps-wrapper
     } else {
         $ret .= Eab_Template::get_admin_attendance_addition_form($event, Eab_Template::get_rsvp_status_list());
     }
     // End RSVPs
     $ret .= '</div>';
     $ret .= '</div>';
     // eab-events-fpe-col_wrapper
     $ret .= '</div>';
     return $ret;
 }
 private function _get_requested_timestamp()
 {
     global $bp;
     if (!$bp->action_variables) {
         return eab_current_time();
     }
     $year = (int) (isset($bp->action_variables[0]) ? $bp->action_variables[0] : date('Y'));
     $year = $year ? $year : date('Y');
     $month = (int) (isset($bp->action_variables[1]) ? $bp->action_variables[1] : date('m'));
     $month = $month ? $month : date('m');
     return strtotime("{$year}-{$month}-01");
 }
 function handle_calendar_request()
 {
     $now = !empty($_POST['now']) ? (int) $_POST['now'] : false;
     $now = $now ? $now : eab_current_time();
     $unit = !empty($_POST["unit"]) && "year" == $_POST['unit'] ? "year" : "month";
     $operand = !empty($_POST['direction']) && "prev" == $_POST['direction'] ? "+1" : "-1";
     $widget_id = !empty($_POST['widget_id']) && (int) $_POST['widget_id'] ? (int) $_POST['widget_id'] : $this->number;
     $date = strtotime("{$operand} {$unit}", $now);
     $all_data = $this->get_settings();
     $instance = !empty($all_data[$widget_id]) ? $all_data[$widget_id] : array();
     $network = is_multisite() ? (int) $instance['network'] : false;
     $category = !empty($instance['category']) ? is_array($instance['category']) ? array_filter(array_map('esc_attr', $instance['category'])) : array_filter(array(esc_attr($instance['category']))) : array();
     echo $this->_render_calendar($date, $network, $category);
     die;
 }
    function show_settings()
    {
        $tips = new WpmuDev_HelpTooltips();
        $tips->set_icon_url(plugins_url('events-and-bookings/img/information.png'));
        $from = $this->_data->get_option('eab_cancelations-email-from');
        $from = $from ? $from : get_option('admin_email');
        $subject = trim($this->_data->get_option('eab_cancelations-email-subject'));
        $subject = !empty($subject) ? $subject : $this->_default_subject;
        $body = trim($this->_data->get_option('eab_cancelations-email-body'));
        $body = !empty($body) ? $body : $this->_default_message;
        $codec = new Eab_Macro_Codec();
        $macros = join('</code>, <code>', $codec->get_macros());
        $events = Eab_CollectionFactory::get_upcoming_events(eab_current_time(), array('posts_per_page' => 10));
        ?>
<div id="eab-settings-eab_cancelations" class="eab-metabox postbox">
	<h3 class="eab-hndle"><?php 
        _e('Event cancellation settings', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</h3>
	<div class="eab-inside">
		<div class="eab-settings-settings_item">
			<label for="eab_cancellations-hide_events"><?php 
        _e('Hide cancelled events', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<input type="hidden" name="eab_cancelations[hide_events]" value="" />
			<input type="checkbox" name="eab_cancelations[hide_events]" id="eab_cancellations-hide_events" value="1" <?php 
        checked(true, $this->_data->get_option('eab_cancelations-hide_events'));
        ?>
 />
		</div>
		<div class="eab-settings-settings_item">
			<label for="eab_cancellations-email_batch_limit"><?php 
        _e('Email batch limit', Eab_EventsHub::TEXT_DOMAIN);
        ?>
:</label>
			<span><?php 
        echo $tips->add_tip(__('This is the maximum number of emails that will be sent in one go. The rest will be scheduled for sending.', Eab_EventsHub::TEXT_DOMAIN));
        ?>
</span>
			<input type="text" name="eab_cancelations[email_batch_limit]" id="eab_cancellations-email_batch_limit" value="<?php 
        echo (int) $this->_get_email_batch_limit();
        ?>
" />
		</div>
		<div class="eab-note">
			<?php 
        _e('This is the email that will be sent to your attendees on event cancellation.', Eab_EventsHub::TEXT_DOMAIN);
        ?>
		</div>
		<div class="eab-settings-settings_item">
	    	<label for="eab_event-eab_cancelations-from"><?php 
        _e('From email address', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<span><?php 
        echo $tips->add_tip(__('This is the address the cancellation email will be sent from', Eab_EventsHub::TEXT_DOMAIN));
        ?>
</span>
			<input type="text" id="eab_event-eab_cancelations-from" name="eab_cancelations[email-from]" value="<?php 
        esc_attr_e($from);
        ?>
" />
	    </div>
	    <div class="eab-settings-settings_item">
	    	<label for="eab_event-eab_cancelations-subject"><?php 
        _e('Email subject', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<span><?php 
        echo $tips->add_tip(sprintf(__('This is your email subject. You can use these macros: <code>%s</code>', Eab_EventsHub::TEXT_DOMAIN), $macros));
        ?>
</span>
			<input type="text" class="widefat" id="eab_event-eab_cancelations-subject" name="eab_cancelations[email-subject]" value="<?php 
        esc_attr_e($subject);
        ?>
" />
	    </div>
	    <div class="eab-settings-settings_item">
	    	<label for="eab_event-eab_cancelations-body"><?php 
        _e('Email body', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<span><?php 
        echo $tips->add_tip(sprintf(__('This is your email body. You can use these macros: <code>%s</code>', Eab_EventsHub::TEXT_DOMAIN), $macros));
        ?>
</span>
			<?php 
        wp_editor($body, 'eab_cancelations-email-body', array('name' => 'eab_cancelations-email-body'));
        ?>
	    </div>
	    <div class="eab-settings-settings_item"><small><?php 
        printf(__('You can use these macros in your subject and body: <code>%s</code>', Eab_EventsHub::TEXT_DOMAIN), $macros);
        ?>
</small></div>
	<?php 
        if ($events) {
            ?>
	    <div class="eab-settings-settings_item">
	    	<input type="button" class="button" id="eab_event-eab_cancelations-preview" value="<?php 
            esc_attr_e(__('Preview', Eab_EventsHub::TEXT_DOMAIN));
            ?>
" />
	    	<?php 
            _e('using this event data:', Eab_EventsHub::TEXT_DOMAIN);
            ?>
	    	<select id="eab_event-eab_cancelations-events">
	    	<?php 
            foreach ($events as $event) {
                ?>
	    		<option value="<?php 
                esc_attr_e($event->get_id());
                ?>
"><?php 
                echo $event->get_title();
                ?>
</option>
	    	<?php 
            }
            ?>
	    	</select>
	    	<div id="eab_event-eab_cancelations-email_preview_container" style="line-height: 1.2em"></div>
	    </div>
	<?php 
        }
        ?>
	</div>
</div>
<script type="text/javascript">
(function ($) {
$(function () {
	var $container = $("#eab_event-eab_cancelations-email_preview_container"),
		$subject = $("#eab_event-eab_cancelations-subject"),
		$events = $("#eab_event-eab_cancelations-events")
	;
	$("#eab_event-eab_cancelations-preview").on("click", function () {
		var editor = tinyMCE.get("eab_cancelations-email-body")
			body_string = (tinyMCE && tinyMCE.activeEditor && tinyMCE.activeEditor.editorId == editor.editorId
			? tinyMCE.activeEditor.getContent()
			: $("#eab_cancelations-email-body").val()
		);
		$container.html('<?php 
        echo esc_js(__("Please, hold on... ", Eab_EventsHub::TEXT_DOMAIN));
        ?>
');
		$.post(ajaxurl, {
			"action": "eab_cancellation_email-preview_email",
			"subject": $subject.val(),
			"body": body_string,
			"event_id": $events.val()
		}, function (data) {
			$container.html(data);
		}, 'html');
	});
})
})(jQuery);
</script>
		<?php 
    }
    public function shortcode($args = array(), $content = '')
    {
        $original_arguments = $args;
        $codec = new Eab_Codec_ArgumentsCodec();
        $args = $codec->parse_arguments($args, array('id' => '', 'format' => 'dHMS', 'goto' => '', 'class' => '', 'type' => '', 'size' => 70, 'add' => 0, 'allow_scaling' => false, 'compact' => false, 'title' => false, 'footer_script' => false, 'expired' => __('Closed', Eab_EventsHub::TEXT_DOMAIN), 'legacy' => false, 'category' => false, 'categories' => false, 'weeks' => false));
        if (!empty($args['legacy'])) {
            return $this->_legacy_shortcode($original_arguments);
        }
        $class = !empty($args['class']) ? 'class="' . sanitize_html_class($args['class']) . '"' : '';
        $id = str_replace(array(" ", "'", '"'), "", $args['id']);
        // We cannot let spaces and quotes in id
        // Do not add quotes for page refresh
        if ($args['goto'] && $args['goto'] != "window.location.href") {
            $args['goto'] = "'" . str_replace(array("'", '"'), "", $args['goto']) . "'";
        }
        // Do not allow quotes which may break js
        $transform = false;
        if ($args['size'] < 70 && !empty($args['allow_scaling'])) {
            $transform = $args['size'] / 70;
        }
        switch ($args['size']) {
            case 70:
                $height = 72;
                break;
            case 82:
                $height = 84;
                break;
            case 127:
                $height = 130;
                break;
            case 254:
                $height = 260;
                break;
            default:
                $args['size'] = 70;
                $height = 72;
                break;
        }
        $sprite_file = plugins_url('/events-and-bookings/img/sprite_' . $args['size'] . 'x' . $height . '.png');
        $secs = -1;
        $additional = 0;
        if (!empty($args['add']) && (int) $args['add']) {
            $additional = (int) $args['add'] * 60;
        }
        $query = $codec->get_query_args($args);
        $now = eab_current_time() + $additional;
        //$events = Eab_CollectionFactory::get_upcoming_events($now, $query);
        $future_peeking_method = false;
        if (!empty($args['weeks']) && is_numeric($args['weeks'])) {
            $future_peeking_method = create_function('', 'return ' . (int) $args['weeks'] . ';');
        }
        if (!empty($future_peeking_method)) {
            add_filter('eab-collection-upcoming_weeks-week_number', $future_peeking_method);
        }
        $events = Eab_CollectionFactory::get_upcoming_weeks_events($now, $query);
        if (!empty($future_peeking_method)) {
            remove_filter('eab-collection-upcoming_weeks-week_number', $future_peeking_method);
        }
        $ret = array();
        foreach ($events as $event) {
            $ts = $event->get_start_timestamp();
            if ($ts < $now) {
                continue;
            }
            $ret[$ts] = $event;
        }
        ksort($ret);
        $next = reset($ret);
        if ($next) {
            $secs = $next->get_start_timestamp() - $now;
        } else {
            return $content;
        }
        $script = '';
        $script .= "<script type='text/javascript'>";
        $script .= "jQuery(document).ready(function(\$) {";
        $script .= "\$('#eab_next_event_countdown" . $id . "').countdown({\n\t\t\t\t\tformat: '" . $args['format'] . "',\n\t\t\t\t\texpiryText: '" . $args['expired'] . "',\n\t\t\t\t\tuntil: " . $secs . ",";
        if ($args['goto']) {
            $script .= "onExpiry: eab_next_event_refresh" . $id . ",";
        }
        if ($args['type'] == 'flip') {
            $script .= "onTick: function () { \$(document).trigger('eab-event_countdown-tick', [\$(this), '{$sprite_file}']);},";
        }
        $script .= "alwaysExpire: true});";
        if ($args['goto']) {
            $script .= "function eab_next_event_refresh" . $id . "() {window.location.href=" . $args['goto'] . ";}";
        }
        $script .= "});</script>";
        if ('flip' == $args['type']) {
            $script .= '<script type="text/javascript" src="' . plugins_url(basename(EAB_PLUGIN_DIR) . "/js/event_countdown_flip.js") . '"></script>';
        }
        // remove line breaks to prevent wpautop break the script
        $script = str_replace(array("\r", "\n", "\t", "<br>", "<br />"), "", preg_replace('/\\s+/m', ' ', $script));
        $this->add_countdown = true;
        $markup = '<div class="eab_next_event_countdown-wrapper">' . ($args['title'] ? '<h4><a href="' . get_permalink($next->get_id()) . '">' . $next->get_title() . '</a></h4>' : '') . "<div id='eab_next_event_countdown{$id}' {$class} data-height='{$height}' data-size='" . $args['size'] . "'></div>" . '</div>';
        if ($transform && !empty($args['allow_scaling'])) {
            $markup .= <<<EOStandardTransformCSS
<style type="text/css">
#eab_next_event_countdown{$id} .countdown_section {
\ttransform: scale({$transform},{$transform});
\t-ms-transform: scale({$transform},{$transform});
\t-webkit-transform: scale({$transform},{$transform});
}
</style>
EOStandardTransformCSS;
        }
        if (!empty($args['size']) && !empty($args['compact'])) {
            $base_size = $transform && !empty($args['allow_scaling']) ? $args['size'] * $transform : $args['size'];
            $max_width = $base_size * 8 + 20;
            $markup .= <<<EOStandardCompactCSS
<style type="text/css">
#eab_next_event_countdown{$id} {
\tmax-width: {$max_width}px;
}
</style>
EOStandardCompactCSS;
        }
        if ($args['footer_script'] && in_array($args['footer_script'], array('yes', 'true', '1'))) {
            self::add_script($script);
            add_action('wp_footer', array($this, 'inject_queued_scripts'), 99);
        } else {
            $markup .= $script;
        }
        return $markup;
    }
 function post_type_link($permalink, $post_obj, $leavename)
 {
     if (empty($permalink)) {
         return $permalink;
     }
     $post_id = $post = false;
     if (is_object($post_obj) && !empty($post_obj->ID)) {
         $post_id = $post_obj->ID;
         $post = $post_obj;
     } else {
         if (is_numeric($post_obj)) {
             $post_id = $post_obj;
             $post = get_post($post_id);
         }
     }
     $rewritecode = array('%incsub_event%', '%event_year%', '%event_monthnum%');
     if ($post && $post->post_type == 'incsub_event' && '' != $permalink) {
         $starts = get_post_meta($post_id, 'incsub_event_start');
         $start = isset($starts[0]) ? strtotime($starts[0]) : eab_current_time();
         $year = date('Y', $start);
         $month = date('m', $start);
         $rewritereplace = array($post->post_name == "" ? isset($post->ID) ? $post->ID : 0 : $post->post_name, $year, $month);
         $permalink = str_replace($rewritecode, $rewritereplace, $permalink);
     }
     return $permalink;
 }
    function show_settings()
    {
        $tips = new WpmuDev_HelpTooltips();
        $tips->set_icon_url(plugins_url('events-and-bookings/img/information.png'));
        $positive_rsvp = $this->_data->get_option('eab_rsvps-email_me-positive_rsvp') ? 'checked="checked"' : '';
        $paid_rsvp = $this->_data->get_option('eab_rsvps-email_me-paid_rsvp') ? 'checked="checked"' : '';
        $notify_admin = $this->_data->get_option('eab_rsvps-email_me-notify_admin') ? 'checked="checked"' : '';
        $notify_author = $this->_data->get_option('eab_rsvps-email_me-notify_author') ? 'checked="checked"' : '';
        $subject = $this->_data->get_option('eab_rsvps-email_me-subject');
        $body = $this->_data->get_option('eab_rsvps-email_me-body');
        $codec = new Eab_Events_RsvpEmailMe_Codec();
        $macros = join('</code>, <code>', $codec->get_macros());
        $events = Eab_CollectionFactory::get_upcoming_events(eab_current_time(), array('posts_per_page' => 10));
        ?>
<div id="eab-settings-eab_rsvps_me" class="eab-metabox postbox">
	<h3 class="eab-hndle"><?php 
        _e('RSVP Notification Email settings', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</h3>
	<div class="eab-inside">
		<div class="eab-settings-settings_item">
	    	<label><?php 
        _e('Send an update', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<br />
			<label for="eab_event-eab_rsvps-me-positive_rsvp" style="display:block; line-height:1.8em">
				<input type="hidden" name="eab_rsvps_me[email-positive_rsvp]" value="" />
				<input type="checkbox" id="eab_event-eab_rsvps-me-positive_rsvp" name="eab_rsvps_me[email-positive_rsvp]" value="1" <?php 
        echo $positive_rsvp;
        ?>
 />
				<?php 
        _e('On all positive RSVPs', Eab_EventsHub::TEXT_DOMAIN);
        ?>
			</label>
			<label for="eab_event-eab_rsvps-me-paid_rsvp" style="display:block; line-height:1.8em">
				<input type="hidden" name="eab_rsvps_me[email-paid_rsvp]" value="" />
				<input type="checkbox" id="eab_event-eab_rsvps-me-paid_rsvp" name="eab_rsvps_me[email-paid_rsvp]" value="1" <?php 
        echo $paid_rsvp;
        ?>
 />
				<?php 
        _e('When user pays for a paid event', Eab_EventsHub::TEXT_DOMAIN);
        ?>
			</label>
	    </div>
	    <div class="eab-settings-settings_item">
	    	<label><?php 
        _e('Notify', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<br />
			<label for="eab_event-eab_rsvps-me-notify_admin" style="display:block; line-height:1.8em">
				<input type="hidden" name="eab_rsvps_me[email-notify_admin]" value="" />
				<input type="checkbox" id="eab_event-eab_rsvps-me-notify_admin" name="eab_rsvps_me[email-notify_admin]" value="1" <?php 
        echo $notify_admin;
        ?>
 />
				<?php 
        _e('Site administrator', Eab_EventsHub::TEXT_DOMAIN);
        ?>
			</label>
			<label for="eab_event-eab_rsvps-me-notify_author" style="display:block; line-height:1.8em">
				<input type="hidden" name="eab_rsvps_me[email-notify_author]" value="" />
				<input type="checkbox" id="eab_event-eab_rsvps-me-notify_author" name="eab_rsvps_me[email-notify_author]" value="1" <?php 
        echo $notify_author;
        ?>
 />
				<?php 
        _e('Event author', Eab_EventsHub::TEXT_DOMAIN);
        ?>
			</label>
	    </div>
	    <div class="eab-settings-settings_item">
	    	<label for="eab_event-eab_rsvps-me-subject"><?php 
        _e('Email subject', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<span><?php 
        echo $tips->add_tip(sprintf(__('This is your email subject. You can use these macros: <code>%s</code>', Eab_EventsHub::TEXT_DOMAIN), $macros));
        ?>
</span>
			<input type="text" class="widefat" id="eab_event-eab_rsvps-me-subject" name="eab_rsvps_me[email-subject]" value="<?php 
        esc_attr_e($subject);
        ?>
" />
	    </div>
	    <div class="eab-settings-settings_item">
	    	<label for="eab_event-eab_rsvps-me-body"><?php 
        _e('Email body', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<span><?php 
        echo $tips->add_tip(sprintf(__('This is your email body. You can use these macros: <code>%s</code>', Eab_EventsHub::TEXT_DOMAIN), $macros));
        ?>
</span>
			<?php 
        wp_editor($body, 'eab_rsvps-email_me-body', array('name' => 'eab_rsvps_me-email_me-body'));
        ?>
	    </div>
	    <div class="eab-settings-settings_item"><small><?php 
        printf(__('You can use these macros in your subject and body: <code>%s</code>', Eab_EventsHub::TEXT_DOMAIN), $macros);
        ?>
</small></div>
	<?php 
        if ($events) {
            ?>
	    <div class="eab-settings-settings_item">
	    	<input type="button" class="button" id="eab_event-eab_rsvps-me-preview" value="<?php 
            esc_attr_e(__('Preview', Eab_EventsHub::TEXT_DOMAIN));
            ?>
" />
	    	<?php 
            _e('using this event data:', Eab_EventsHub::TEXT_DOMAIN);
            ?>
	    	<select id="eab_event-eab_rsvps-me-events">
	    	<?php 
            foreach ($events as $event) {
                ?>
	    		<option value="<?php 
                esc_attr_e($event->get_id());
                ?>
"><?php 
                echo $event->get_title();
                ?>
</option>
	    	<?php 
            }
            ?>
	    	</select>
	    	<div id="eab_event-eab_rsvp_me-email_preview_container" style="line-height: 1.2em"></div>
	    </div>
	<?php 
        }
        ?>
	</div>
</div>
<script type="text/javascript">
(function ($) {
$(function () {
	var $container = $("#eab_event-eab_rsvp_me-email_preview_container"),
		$subject = $("#eab_event-eab_rsvps-me-subject"),
		$events = $("#eab_event-eab_rsvps-me-events")
	;
	$("#eab_event-eab_rsvps-me-preview").on("click", function () {
		var body_string = (tinyMCE && tinyMCE.activeEditor
			? tinyMCE.activeEditor.getContent()
			: $("#eab_rsvps_me-email_me-body").val()
		);
		$container.html('<?php 
        echo esc_js(__("Please, hold on... ", Eab_EventsHub::TEXT_DOMAIN));
        ?>
');
		$.post(ajaxurl, {
			"action": "eab_rsvp_email_me-preview_email",
			"subject": $subject.val(),
			"body": body_string,
			"event_id": $events.val()
		}, function (data) {
			$container.html(data);
		}, 'html');
	});
})
})(jQuery);
</script>
		<?php 
    }
 public function spawn_recurring_instances($start, $end, $interval, $time_parts)
 {
     $old_post_ids = false;
     if ($this->is_recurring()) {
         $old_post_ids = $this->_get_recurring_children_ids();
         $this->delete_recurring_instances();
         do_action('eab-events-recurring_instances-deleted', $this->get_id(), $this);
     }
     // Do this first, so we can short out on draft
     update_post_meta($this->get_id(), 'eab_event_recurring', $interval);
     update_post_meta($this->get_id(), 'eab_event_recurrence_parts', $time_parts);
     update_post_meta($this->get_id(), 'eab_event_recurrence_starts', $start);
     update_post_meta($this->get_id(), 'eab_event_recurrence_ends', $end);
     if ('draft' === $this->_event->post_status) {
         return false;
     }
     // Draft recurring events do not spawn instances
     $check_start = $start && checkdate((int) date('n', $start), (int) date('j', $start), (int) date('Y', $start));
     if (!$check_start) {
         do_action('eab-debug-log_error', sprintf(__('Invalid interval start boundary timestamp: [%s]', Eab_EventsHub::TEXT_DOMAIN), $check_start));
     }
     $check_end = $end && checkdate((int) date('n', $end), (int) date('j', $end), (int) date('Y', $end));
     if (!$check_end) {
         do_action('eab-debug-log_error', sprintf(__('Invalid interval end boundary timestamp: [%s]', Eab_EventsHub::TEXT_DOMAIN), $check_end));
     }
     if ($end < $start) {
         do_action('eab-debug-log_error', sprintf(__('Invalid end boundary after start: [%s] - [%s]', Eab_EventsHub::TEXT_DOMAIN), $start, $end));
     }
     $instances = $this->_get_recurring_instances_timestamps($start, $end, $interval, $time_parts);
     $duration = (double) @$time_parts['duration'];
     $duration = $duration ? $duration : 1;
     $venue = $this->get_venue();
     $creation_time = date("Y-m-d H:i:s", eab_current_time());
     foreach ($instances as $key => $instance) {
         $post = array('post_type' => self::POST_TYPE, 'post_status' => self::RECURRENCE_STATUS, 'post_parent' => $this->get_id(), 'post_name' => "{$this->_event->post_name}-{$key}", 'post_date' => $creation_time, 'post_modified' => $creation_time, 'post_title' => $this->get_title(), 'post_author' => $this->get_author(), 'post_excerpt' => $this->get_excerpt(), 'post_content' => $this->get_content(), 'to_ping' => '');
         // Also propagate discussion settings
         if (!empty($this->_event->comment_status)) {
             $post['comment_status'] = $this->_event->comment_status;
         }
         if (!empty($this->_event->ping_status)) {
             $post['ping_status'] = $this->_event->ping_status;
         }
         global $wpdb;
         if (false !== $wpdb->insert($wpdb->posts, $post)) {
             $post_id = $wpdb->insert_id;
             $featured_image_id = $this->has_featured_image() ? $this->get_featured_image_id() : false;
             $event_cats = $this->get_category_ids();
             if ($event_cats) {
                 wp_set_post_terms($post_id, $event_cats, 'eab_events_category', false);
                 do_action('eab-events-recurrent_event_child-assigned_taxonomies', $post_id, $event_cats);
             }
             update_post_meta($post_id, 'incsub_event_start', date("Y-m-d H:i:s", $instance));
             update_post_meta($post_id, 'incsub_event_end', date("Y-m-d H:i:s", $instance + $duration * 3600));
             update_post_meta($post_id, 'incsub_event_venue', $venue);
             update_post_meta($post_id, 'incsub_event_status', self::STATUS_OPEN);
             if ($this->is_premium()) {
                 update_post_meta($post_id, 'incsub_event_paid', 1);
                 update_post_meta($post_id, 'incsub_event_fee', $this->get_price());
             }
             if (!empty($featured_image_id)) {
                 update_post_meta($post_id, '_thumbnail_id', $featured_image_id);
             }
             do_action('eab-events-recurrent_event_child-save_meta', $post_id);
         }
     }
     if ($old_post_ids) {
         $new_post_ids = $this->_get_recurring_children_ids();
         $this->_remap_bookings($old_post_ids, $new_post_ids);
     }
 }
    function show_settings()
    {
        $tips = new WpmuDev_HelpTooltips();
        $tips->set_icon_url(plugins_url('events-and-bookings/img/information.png'));
        $from = $this->_data->get_option('eab_rsvps-email-from');
        $from = $from ? $from : get_option('admin_email');
        $subject = $this->_data->get_option('eab_rsvps-email-subject');
        $body = $this->_data->get_option('eab_rsvps-email-body');
        $codec = new Eab_Events_RsvpEmail_Codec();
        $macros = join('</code>, <code>', $codec->get_macros());
        $events = Eab_CollectionFactory::get_upcoming_events(eab_current_time(), array('posts_per_page' => 10));
        ?>
<div id="eab-settings-eab_rsvps_email" class="eab-metabox postbox">
	<h3 class="eab-hndle"><?php 
        _e('RSVP Email settings', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</h3>
	<div class="eab-inside">
		<div class="eab-settings-settings_item">
	    	<label for="eab_event-eab_rsvps-from"><?php 
        _e('From email address', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<span><?php 
        echo $tips->add_tip(__('This is the address the RSVP email will be sent from', Eab_EventsHub::TEXT_DOMAIN));
        ?>
</span>
			<input type="text" id="eab_event-eab_rsvps-from" name="eab_rsvps[email-from]" value="<?php 
        esc_attr_e($from);
        ?>
" />
	    </div>
	    <div class="eab-settings-settings_item">
	    	<label for="eab_event-eab_rsvps-subject"><?php 
        _e('Email subject', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<span><?php 
        echo $tips->add_tip(sprintf(__('This is your email subject. You can use these macros: <code>%s</code>', Eab_EventsHub::TEXT_DOMAIN), $macros));
        ?>
</span>
			<input type="text" class="widefat" id="eab_event-eab_rsvps-subject" name="eab_rsvps[email-subject]" value="<?php 
        esc_attr_e($subject);
        ?>
" />
	    </div>
	    <div class="eab-settings-settings_item">
	    	<label for="eab_event-eab_rsvps-body"><?php 
        _e('Email body', Eab_EventsHub::TEXT_DOMAIN);
        ?>
</label>
			<span><?php 
        echo $tips->add_tip(sprintf(__('This is your email body. You can use these macros: <code>%s</code>', Eab_EventsHub::TEXT_DOMAIN), $macros));
        ?>
</span>
			<?php 
        wp_editor($body, 'eab_rsvps-email-body', array('name' => 'eab_rsvps-email-body'));
        ?>
	    </div>
	    <div class="eab-settings-settings_item"><small><?php 
        printf(__('You can use these macros in your subject and body: <code>%s</code>', Eab_EventsHub::TEXT_DOMAIN), $macros);
        ?>
</small></div>
	<?php 
        if ($events) {
            ?>
	    <div class="eab-settings-settings_item">
	    	<input type="button" class="button" id="eab_event-eab_rsvps-preview" value="<?php 
            esc_attr_e(__('Preview', Eab_EventsHub::TEXT_DOMAIN));
            ?>
" />
	    	<?php 
            _e('using this event data:', Eab_EventsHub::TEXT_DOMAIN);
            ?>
	    	<select id="eab_event-eab_rsvps-events">
	    	<?php 
            foreach ($events as $event) {
                ?>
	    		<option value="<?php 
                esc_attr_e($event->get_id());
                ?>
"><?php 
                echo $event->get_title();
                ?>
</option>
	    	<?php 
            }
            ?>
	    	</select>
	    	<div id="eab_event-eab_rsvp-email_preview_container" style="line-height: 1.2em"></div>
	    </div>
	<?php 
        }
        ?>
	</div>
</div>
<script type="text/javascript">
(function ($) {
$(function () {
	var $container = $("#eab_event-eab_rsvp-email_preview_container"),
		$subject = $("#eab_event-eab_rsvps-subject"),
		$events = $("#eab_event-eab_rsvps-events")
	;
	$("#eab_event-eab_rsvps-preview").on("click", function () {
		var body_string = (tinyMCE && tinyMCE.activeEditor
			? tinyMCE.activeEditor.getContent()
			: $("#eab_rsvps-email-body").val()
		);
		$container.html('<?php 
        echo esc_js(__("Please, hold on... ", Eab_EventsHub::TEXT_DOMAIN));
        ?>
');
		$.post(ajaxurl, {
			"action": "eab_rsvp_email-preview_email",
			"subject": $subject.val(),
			"body": body_string,
			"event_id": $events.val()
		}, function (data) {
			$container.html(data);
		}, 'html');
	});
})
})(jQuery);
</script>
		<?php 
    }
 /**
  * NEVER NEVER EVER call this directly. Use Factory instead.
  */
 public function __construct($timestamp = false, $args = array())
 {
     $this->_timestamp = $timestamp ? $timestamp : eab_current_time();
     $query = $this->build_query_args($args);
     parent::__construct($query);
 }
 public static function get_event_dates($post)
 {
     $content = '';
     $event = $post instanceof Eab_EventModel ? $post : new Eab_EventModel($post);
     $start_dates = $event->get_start_dates();
     if (!$start_dates) {
         return $content;
     }
     foreach ($start_dates as $key => $start) {
         $start = $event->get_start_timestamp($key);
         $end = $event->get_end_timestamp($key);
         $end_date_str = date('Y-m-d', $start) != date('Y-m-d', $end) ? date_i18n(get_option('date_format'), $end) : '';
         $content .= $key ? __(' and ', Eab_EventsHub::TEXT_DOMAIN) : '';
         // Differentiate start/end date equality
         if ($end_date_str) {
             // Start and end day stamps differ
             $start_string = $event->has_no_start_time($key) ? sprintf(__('On <span class="wpmudevevents-date_format-start"><var class="eab-date_format-date">%s</var></span>', Eab_EventsHub::TEXT_DOMAIN), date_i18n(get_option('date_format'), $start)) : sprintf(__('On <var class="eab-date_format-date">%s</var> <span class="wpmudevevents-date_format-start">from <var class="eab-date_format-time">%s</var></span>', Eab_EventsHub::TEXT_DOMAIN), date_i18n(get_option('date_format'), $start), date_i18n(get_option('time_format'), $start));
             $end_string = $event->has_no_end_time($key) ? sprintf(__('<span class="wpmudevevents-date_format-end">to %s</span><br />', Eab_EventsHub::TEXT_DOMAIN), '<span class="wpmudevevents-date_format-end_date"><var class="eab-date_format-date">' . $end_date_str . '</var></span>') : sprintf(__('<span class="wpmudevevents-date_format-end">to %s</span><br />', Eab_EventsHub::TEXT_DOMAIN), '<span class="wpmudevevents-date_format-end_date"><var class="eab-date_format-date">' . $end_date_str . '</var></span> <span class="wpmudevevents-date_format-end_time"><var class="eab-date_format-time">' . date_i18n(get_option('time_format'), $end) . '</var></span>');
         } else {
             // The start and end day stamps do NOT differ
             if (eab_current_time() > $start) {
                 // In the past
                 $start_string = $event->has_no_start_time($key) ? sprintf(__('Took place on <span class="wpmudevevents-date_format-start"><var class="eab-date_format-date">%s</var></span>', Eab_EventsHub::TEXT_DOMAIN), date_i18n(get_option('date_format'), $start)) : sprintf(__('Took place on <var class="eab-date_format-date">%s</var> <span class="wpmudevevents-date_format-start">from <var class="eab-date_format-time">%s</var></span>', Eab_EventsHub::TEXT_DOMAIN), date_i18n(get_option('date_format'), $start), date_i18n(get_option('time_format'), $start));
             } else {
                 // Now, or in the future
                 $start_string = $event->has_no_start_time($key) ? sprintf(__('Takes place on <span class="wpmudevevents-date_format-start"><var class="eab-date_format-date">%s</var></span>', Eab_EventsHub::TEXT_DOMAIN), date_i18n(get_option('date_format'), $start)) : sprintf(__('Takes place on <var class="eab-date_format-date">%s</var> <span class="wpmudevevents-date_format-start">from <var class="eab-date_format-time">%s</var></span>', Eab_EventsHub::TEXT_DOMAIN), date_i18n(get_option('date_format'), $start), date_i18n(get_option('time_format'), $start));
             }
             $end_string = $event->has_no_end_time($key) ? '' : sprintf(__('<span class="wpmudevevents-date_format-end">to %s</span><br />', Eab_EventsHub::TEXT_DOMAIN), '<span class="wpmudevevents-date_format-end_date"><var class="eab-date_format-date">' . $end_date_str . '</var></span> <span class="wpmudevevents-date_format-end_time"><var class="eab-date_format-time">' . date_i18n(get_option('time_format'), $end) . '</var></span>');
         }
         // Why, thank you `date_i18n` for working so well with properly parsing 'O' argument when offsets are set in UTC values... >.<
         $gmt_offset = (double) get_option('gmt_offset');
         $hour_tz = sprintf('%02d', abs((int) $gmt_offset));
         $minute_offset = (abs($gmt_offset) - abs((int) $gmt_offset)) * 60;
         $min_tz = sprintf('%02d', $minute_offset);
         $timezone = ($gmt_offset > 0 ? '+' : '-') . $hour_tz . $min_tz;
         $time_date_start = esc_attr(date_i18n("Y-m-d\\TH:i:s", $start)) . $timezone;
         $time_date_end = esc_attr(date_i18n("Y-m-d\\TH:i:s", $end)) . $timezone;
         $content .= apply_filters('eab-events-event_date_string', "<time itemprop='startDate' datetime='{$time_date_start}'>{$start_string}</time> <time itemprop='endDate' datetime='{$time_date_end}'>{$end_string}</time>", $event->get_id(), $start, $end);
         /*
         $content .= apply_filters('eab-events-event_date_string', sprintf(
         	__('On %s <span class="wpmudevevents-date_format-start">from %s</span> <span class="wpmudevevents-date_format-end">to %s</span><br />', Eab_EventsHub::TEXT_DOMAIN),
         	'<span class="wpmudevevents-date_format-start_date">' . date_i18n(get_option('date_format'), $start) . '</span>',
         	'<span class="wpmudevevents-date_format-start_time">' . date_i18n(get_option('time_format'), $start) . '</span>',
         	'<span class="wpmudevevents-date_format-end_date">' . $end_date_str . '</span> <span class="wpmudevevents-date_format-end_time">' . date_i18n(get_option('time_format'), $end) . '</span>'
         ), $event->get_id(), $start, $end);
         */
     }
     return $content;
 }
 public function get_month_calendar($timestamp = false)
 {
     $date = $timestamp ? $timestamp : current_time('timestamp');
     $this->_current_timestamp = $date;
     $year = date('Y', $date);
     $month = date('m', $date);
     $time = strtotime("{$year}-{$month}-01");
     $days = (int) date('t', $time);
     $first = (int) date('w', strtotime(date('Y-m-01', $time)));
     $last = (int) date('w', strtotime(date('Y-m-' . $days, $time)));
     $post_info = array();
     if (is_array($this->_events)) {
         foreach ($this->_events as $event) {
             $post_info[] = $this->_get_item_data($event);
         }
     }
     $tbl_id = $this->get_calendar_id();
     $tbl_id = $tbl_id ? "id='{$tbl_id}'" : '';
     $tbl_class = $this->get_calendar_class();
     $tbl_class = $tbl_class ? "class='{$tbl_class}'" : '';
     $ret = '';
     $ret .= "<table width='100%' {$tbl_id} {$tbl_class}>";
     $ret .= $this->_get_table_meta_row('thead');
     $ret .= '<tbody>';
     $ret .= $this->_get_first_row();
     if ($first > $this->start_of_week) {
         $ret .= '<tr><td class="no-left-border" colspan="' . ($first - $this->start_of_week) . '">&nbsp;</td>';
     } else {
         if ($first < $this->start_of_week) {
             $ret .= '<tr><td class="no-left-border" colspan="' . (7 + $first - $this->start_of_week) . '">&nbsp;</td>';
         } else {
             $ret .= '<tr>';
         }
     }
     $today_timestamp = date('Y-m-d', eab_current_time());
     for ($i = 1; $i <= $days; $i++) {
         $date = date('Y-m-' . sprintf("%02d", $i), $time);
         $dow = (int) date('w', strtotime($date));
         $current_day_start = strtotime("{$date} 00:00");
         $current_day_end = strtotime("{$date} 23:59");
         if ($this->start_of_week == $dow) {
             $ret .= '</tr><tr>';
         }
         $this->reset_event_info_storage();
         foreach ($post_info as $ipost) {
             for ($k = 0; $k < count($ipost['event_starts']); $k++) {
                 $start = strtotime($ipost['event_starts'][$k]);
                 $end = strtotime($ipost['event_ends'][$k]);
                 if ($start < $current_day_end && $end > $current_day_start) {
                     $this->set_event_info(array('start' => $start, 'end' => $end), array('start' => $current_day_start, 'end' => $current_day_end), $ipost);
                 }
             }
         }
         $activity = $this->get_event_info_as_string($i);
         $class_names = array();
         if ($activity) {
             $class_names[] = 'eab-has_events';
         } else {
             $activity = "<p>{$i}</p>";
         }
         if ($date == $today_timestamp) {
             $class_names[] = 'today';
         }
         $class_attribute = !empty($class_names) ? 'class="' . esc_attr(join(' ', $class_names)) . '"' : '';
         $ret .= "<td {$class_attribute}>{$activity}</td>";
     }
     if ($last > $this->start_of_week) {
         $ret .= '<td class="no-right-border" colspan="' . (6 - $last + $this->start_of_week) . '">&nbsp;</td></tr>';
     } else {
         if ($last + 1 == $this->start_of_week) {
             $ret .= '</tr>';
         } else {
             $ret .= '<td class="no-right-border" colspan="' . (6 + $last - $this->start_of_week) . '">&nbsp;</td></tr>';
         }
     }
     $ret .= $this->_get_last_row();
     $ret .= '</tbody>';
     $ret .= $this->_get_table_meta_row('tfoot');
     $ret .= '</table>';
     return $ret;
 }