function my_event_email($details, $event, $type, $time)
{
    if (my_calendar_date_xcomp($event->occur_end, date('Y-m-d', current_time('timestamp')))) {
        $data = mc_create_tags($event);
        // this is just a sample template; you'd want to customize it.
        $details = jd_draw_template($data, '<h2>{title}</h2>{image}');
    }
    return $details;
}
예제 #2
0
function my_calendar_ical()
{
    $p = isset($_GET['span']) ? 'year' : false;
    $y = isset($_GET['yr']) ? $_GET['yr'] : date('Y');
    $m = isset($_GET['month']) ? $_GET['month'] : date('n');
    $ny = isset($_GET['nyr']) ? $_GET['nyr'] : $y;
    $nm = isset($_GET['nmonth']) ? $_GET['nmonth'] : $m;
    if ($p) {
        $from = "{$y}-1-1";
        $to = "{$y}-12-31";
    } else {
        $d = date('t', mktime(0, 0, 0, $m, 1, $y));
        $from = "{$y}-{$m}-1";
        $to = "{$ny}-{$nm}-{$d}";
    }
    $from = apply_filters('mc_ical_download_from', $from, $p);
    $to = apply_filters('mc_ical_download_to', $to, $p);
    $atts = array('category' => null, 'ltype' => '', 'lvalue' => '', 'source' => 'calendar', 'author' => null, 'host' => null);
    $atts = apply_filters('mc_ical_attributes', $atts);
    extract($atts);
    global $mc_version;
    // establish template
    $template = "BEGIN:VEVENT\nUID:{dateid}-{id}\nLOCATION:{ical_location}\nSUMMARY:{title}\nDTSTAMP:{ical_start}\nORGANIZER;CN={host}:MAILTO:{host_email}\nDTSTART:{ical_start}\nDTEND:{ical_end}\nURL;VALUE=URI:{link}\nDESCRIPTION:{ical_desc}\nCATEGORIES:{category}\nEND:VEVENT";
    // add ICAL headers
    $output = 'BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
PRODID:-//Accessible Web Design//My Calendar//http://www.joedolson.com//v' . $mc_version . '//EN';
    // to do : add support for other arguments
    $events = my_calendar_grab_events($from, $to);
    if (is_array($events) && !empty($events)) {
        foreach (array_keys($events) as $key) {
            $event =& $events[$key];
            if (is_object($event)) {
                if (!($event->category_private == 1 && !is_user_logged_in())) {
                    $array = mc_create_tags($event);
                    $output .= "\n" . jd_draw_template($array, $template, 'ical');
                }
            }
        }
    }
    $output .= "\nEND:VCALENDAR";
    $output = html_entity_decode(preg_replace("~(?<!\r)\n~", "\r\n", $output));
    if (!(isset($_GET['sync']) && $_GET['sync'] == 'true')) {
        header("Content-Type: text/calendar; charset=" . get_bloginfo('charset'));
        header("Pragma: no-cache");
        header("Expires: 0");
        header("Content-Disposition: inline; filename=my-calendar.ics");
    }
    echo $output;
}
예제 #3
0
function mc_format_rss($events)
{
    $template = "\n<item>\n\t\t<title>{rss_title}</title>\n\t\t<link>{details_link}</link>\n\t\t<pubDate>{rssdate}</pubDate>\n\t\t<dc:creator>{author}</dc:creator>  \t\n\t\t<description><![CDATA[{rss_description}]]></description>\n\t\t<date>{dtstart}</date>\n\t\t<dateSubmitted>{rssdate}</dateSubmitted>\n\t\t<content:encoded><![CDATA[<div class='vevent'>\n\t\t<h1 class='summary'>{rss_title}</h1>\n\t\t<div class='description'>{rss_description}</div>\n\t\t<p class='dtstart' title='{ical_start}'>Begins: {time} on {date}</p>\n\t\t<p class='dtend' title='{ical_end}'>Ends: {endtime} on {enddate}</p>\t\n\t\t<p>Recurrance: {recurs}</p>\n\t\t<p>Repetition: {repeats} times</p>\n\t\t<div class='location'>{rss_hcard}</div>\n\t\t{rss_link_title}\n\t\t</div>]]></content:encoded>\n\t\t<dc:format xmlns:dc='http://purl.org/dc/elements/1.1/'>text/html</dc:format>\n\t\t<dc:source xmlns:dc='http://purl.org/dc/elements/1.1/'>" . home_url() . "</dc:source>\t\n\t\t{guid}\n\t  </item>\n";
    $charset = get_bloginfo('charset');
    $output = '<?xml version="1.0" encoding="' . $charset . '"?>
	<rss version="2.0"
		xmlns:content="http://purl.org/rss/1.0/modules/content/"
		xmlns:dc="http://purl.org/dc/elements/1.1/"
		xmlns:atom="http://www.w3.org/2005/Atom"
		xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		>
	<channel>
	  <title>' . get_bloginfo('name') . ' Calendar</title>
	  <link>' . home_url() . '</link>
	  <description>' . get_bloginfo('description') . ': My Calendar Events</description>
	  <language>' . get_bloginfo('language') . '</language>
	  <managingEditor>' . get_bloginfo('admin_email') . ' (' . get_bloginfo('name') . ' Admin)</managingEditor>
	  <generator>My Calendar WordPress Plugin http://www.joedolson.com/articles/my-calendar/</generator>
	  <lastBuildDate>' . mysql2date('D, d M Y H:i:s +0000', current_time('timestamp')) . '</lastBuildDate>
	  <atom:link href="' . htmlentities(add_query_arg($_GET, mc_get_current_url())) . '" rel="self" type="application/rss+xml" />';
    foreach ($events as $date) {
        foreach (array_keys($date) as $key) {
            $event =& $date[$key];
            $array = mc_create_tags($event);
            $output .= jd_draw_template($array, $template, 'rss');
        }
    }
    $output .= '</channel>
	</rss>';
    return mc_strip_to_xml($output);
}
예제 #4
0
function my_calendar_send_email($event)
{
    $details = mc_create_tags($event);
    // shift to boolean
    $send_email_option = get_option('mc_event_mail') == 'true' ? true : false;
    $send_email = apply_filters('mc_send_notification', $send_email_option, $details);
    if ($send_email == true) {
        add_filter('wp_mail_content_type', create_function('', 'return "text/html";'));
    }
    if (get_option('mc_event_mail') == 'true') {
        $to = apply_filters('mc_event_mail_to', get_option('mc_event_mail_to'), $details);
        $from = get_option('mc_event_mail_from') == '' ? get_bloginfo('admin_email') : get_option('mc_event_mail_from');
        $from = apply_filters('mc_event_mail_from', $from, $details);
        $from = "From: " . __('Event Notifications', 'my-calendar') . " <{$from}>";
        $subject = jd_draw_template($details, get_option('mc_event_mail_subject'));
        $message = jd_draw_template($details, get_option('mc_event_mail_message'));
        $mail = wp_mail($to, $subject, $message, $from);
    }
    if (get_option('mc_html_email') == 'true') {
        remove_filter('wp_mail_content_type', create_function('', 'return "text/html";'));
    }
}
예제 #5
0
function my_calendar_draw_event($event, $type = "calendar", $process_date, $time, $template = '')
{
    // if event is not approved, return without processing
    if (get_option('mc_event_approve') == 'true' && (int) $event->event_approved !== 1) {
        return;
    }
    // if event ends at midnight today (e.g., very first thing of the day), exit without re-drawing
    if ($event->event_endtime == '00:00:00' && date('Y-m-d', strtotime($event->occur_end)) == $process_date && date('Y-m-d', strtotime($event->occur_begin)) != $process_date) {
        return;
    }
    global $wpdb;
    $url = plugin_dir_url(__FILE__);
    $mcdb = $wpdb;
    if (get_option('mc_remote') == 'true' && function_exists('mc_remote_db')) {
        $mcdb = mc_remote_db();
    }
    if ($event->category_private == 1 && !is_user_logged_in()) {
        return;
    }
    // assign empty values to template sections
    $header = $address = $more = $author = $list_title = $title = $output = $container = $short = $description = $link = $vcal = $gcal = '';
    $date_format = get_option('mc_date_format') != '' ? get_option('mc_date_format') : get_option('date_format');
    $data = mc_create_tags($event);
    $details = apply_filters('mc_custom_template', false, $data, $event, $type, $process_date, $time, $template);
    $templates = get_option('mc_templates');
    if ($details === false) {
        if ($template != '' && mc_file_exists(sanitize_file_name($template))) {
            $template = @file_get_contents(mc_get_file(sanitize_file_name($template)));
            $details = jd_draw_template($data, $template);
        } else {
            switch ($type) {
                case 'mini':
                    $template = $templates['mini'];
                    if (get_option('mc_use_mini_template') == 1) {
                        $details = jd_draw_template($data, $template);
                    }
                    break;
                case 'list':
                    $template = $templates['list'];
                    if (get_option('mc_use_list_template') == 1) {
                        $details = jd_draw_template($data, $template);
                    }
                    break;
                case 'single':
                    $template = $templates['details'];
                    if (get_option('mc_use_details_template') == 1) {
                        $details = jd_draw_template($data, $template);
                    }
                    break;
                case 'calendar':
                default:
                    $template = $templates['grid'];
                    if (get_option('mc_use_grid_template') == 1) {
                        $details = jd_draw_template($data, $template);
                    }
            }
        }
    }
    $mc_display_author = get_option('mc_display_author');
    $display_map = get_option('mc_show_map');
    $display_address = get_option('mc_show_address');
    $display_details = get_option('mc_details');
    $uid = 'mc_' . $event->occur_id;
    $day_id = date('d', strtotime($process_date));
    $mc_id = $event->occur_id;
    $this_category = $event->event_category;
    $image = mc_category_icon($event);
    $header .= "<div id='{$uid}-{$day_id}-{$type}' class='{$type}-event " . "mc_" . sanitize_title($event->category_name) . " vevent'>\n";
    $title_template = $templates['title'] == '' ? '{title}' : $templates['title'];
    $event_title = jd_draw_template($data, $title_template);
    $event_title = $event_title == '' ? jd_draw_template($data, '{title}') : $event_title;
    //prevent empty titles
    if (strpos($event_title, 'http') === false && $type != 'mini' && $type != 'list') {
        if (get_option('mc_open_uri') == 'true') {
            $details_link = mc_get_details_link($event);
            $wrap = "<a href='{$details_link}'>";
            $balance = "</a>";
        } else {
            $wrap = "<a href='#{$uid}-{$day_id}-{$type}-details'>";
            $balance = "</a>";
        }
    } else {
        $wrap = $balance = '';
    }
    $current_date = date_i18n(apply_filters('mc_date_format', $date_format, 'details'), strtotime($process_date));
    $group_class = $event->event_span == 1 ? ' multidate group' . $event->event_group_id : '';
    $heading_level = apply_filters('mc_heading_level_table', 'h3', $type, $time, $template);
    $header .= $type != 'single' && $type != 'list' ? "<{$heading_level} class='event-title summary{$group_class}'>{$wrap}{$image}{$event_title}{$balance}</{$heading_level}>\n" : '';
    $event_title = $type == 'single' ? apply_filters('mc_single_event_title', $event_title, $event) : $event_title;
    $title = $type == 'single' && !is_singular('mc-events') ? "<h2 class='event-title summary'>{$image} {$event_title}</h2>\n" : '';
    $title = apply_filters('mc_event_title', $title, $event, $event_title, $image);
    $header .= $title;
    if ($details === false) {
        $custom = false;
        // put together address information as vcard
        if ($display_address == 'true' || $display_map == 'true') {
            $address = mc_hcard($event, $display_address, $display_map);
        }
        // end vcard
        $close = $type == 'calendar' || $type == 'mini' ? "<a href=\"#{$uid}-{$day_id}-{$type}\" class='mc-toggle mc-close close'><img src=\"" . plugin_dir_url(__FILE__) . "images/event-close.png\" alt='" . __('Close', 'my-calendar') . "' /></a>" : '';
        $time = mc_time_html($event, $type, $current_date);
        if ($type == "list") {
            $heading_level = apply_filters('mc_heading_level_list', 'h3', $type, $time, $template);
            $list_title = "<{$heading_level} class='event-title summary'>{$image}" . $event_title . "</{$heading_level}>\n";
        }
        if ($mc_display_author == 'true') {
            if ($event->event_author != 0) {
                $e = get_userdata($event->event_author);
                $author = '<p class="event-author">' . __('Posted by', 'my-calendar') . ' <span class="author-name">' . $e->display_name . "</span></p>\n";
            }
        }
        if ($display_details == 'true' && !isset($_GET['mc_id'])) {
            $details_label = mc_get_details_label($event, $data);
            $details_link = mc_get_details_link($event);
            $more = get_option('mc_uri') != '' ? "<p class='mc_details'><a href='{$details_link}'>{$details_label}</a></p>\n" : '';
        }
        // handle link expiration
        $event_link = mc_event_link($event);
        if (function_exists('mc_google_cal') && get_option('mc_show_gcal') == 'true') {
            $gcal_link = "<p class='gcal'>" . jd_draw_template($data, '{gcal_link}') . "</p>";
            $gcal = $gcal_link;
        }
        if (function_exists('my_calendar_generate_vcal') && get_option('mc_show_event_vcal') == 'true') {
            $nonce = wp_create_nonce('my-calendar-nonce');
            $vcal_link = "<p class='ical'><a rel='nofollow' href='" . home_url() . "?vcal={$uid}" . "'>" . __('iCal', 'my-calendar') . "</a></p>\n";
            $vcal = $vcal_link;
        }
        $default_size = apply_filters('mc_default_image_size', 'medium');
        if (is_numeric($event->event_post) && $event->event_post != 0 && (isset($data[$default_size]) && $data[$default_size] != '')) {
            $atts = apply_filters('mc_post_thumbnail_atts', array('class' => 'mc-image'));
            $image = get_the_post_thumbnail($event->event_post, $default_size, $atts);
        } else {
            $image = $event->event_image != '' ? "<img src='{$event->event_image}' alt='' class='mc-image' />" : '';
        }
        if (get_option('mc_desc') == 'true' || $type == 'single') {
            $description = get_option('mc_process_shortcodes') == 'true' ? apply_filters('the_content', stripcslashes($event->event_desc)) : wpautop(stripcslashes($event->event_desc), 1);
            $description = "<div class='longdesc'>{$description}</div>";
        }
        if (get_option('mc_short') == 'true' && $type != 'single') {
            $short = get_option('mc_process_shortcodes') == 'true' ? apply_filters('the_content', stripcslashes($event->event_short)) : wpautop(stripcslashes($event->event_short), 1);
            $short = "<div class='shortdesc'>{$short}</div>";
        }
        if (get_option('mc_event_registration') == 'true') {
            switch ($event->event_open) {
                case '0':
                    $status = get_option('mc_event_closed');
                    break;
                case '1':
                    $status = get_option('mc_event_open');
                    break;
                case '2':
                    $status = '';
                    break;
                default:
                    $status = '';
            }
        } else {
            $status = '';
        }
        // JCD TODO - this is really wonky. What was I thinking?
        // if the event is a member of a group of events, but not the first, note that.
        if ($event->event_group == 1) {
            $info = array();
            $info[] = $event->event_id;
            update_option('mc_event_groups', $info);
        }
        if (is_array(get_option('mc_event_groups'))) {
            if (in_array($event->event_id, get_option('mc_event_groups'))) {
                if ($process_date != $event->event_begin) {
                    $status = __("This event is in a series. Register for the first event in this series to attend.", 'my-calendar');
                }
            }
        }
        $status = $status != '' ? "<p>{$status}</p>" : '';
        $status = apply_filters('mc_registration_state', $status, $event);
        $return = $type == 'single' ? "<p><a href='" . get_option('mc_uri') . "'>" . __('View full calendar', 'my-calendar') . "</a></p>" : '';
        if ($type == 'calendar' && get_option('mc_open_uri') == 'true' && $time != 'day') {
            $description = $short = $status = '';
        }
        if (get_option('mc_gmap') == 'true') {
            $map = is_singular('mc-event') || $type == 'single' ? mc_generate_map($event) : '';
        } else {
            $map = '';
        }
        if ($event_link != '' && get_option('mc_event_link') != 'false') {
            $is_external = mc_external_link($event_link);
            $external_class = $is_external ? "class='{$type}-link external'" : "class='{$type}-link'";
            $link_template = isset($templates['link']) ? $templates['link'] : '{title}';
            $link_text = jd_draw_template($data, $link_template);
            $link = "<p><a href='{$event_link}' {$is_external}>" . $link_text . "</a></p>";
        }
        $details = "\n" . $close . $time . $list_title . $image . "<div class='location'>" . $map . $address . "</div>" . $description . $short . $link . $status . $author . "<div class='sharing'>" . $vcal . $gcal . $more . "</div>" . $return;
    } else {
        $custom = true;
        // if a custom template is in use
        $toggle = $type == 'calendar' || $type == 'mini' ? "<a href=\"#{$uid}-{$day_id}-{$type}\" class='mc-toggle mc-close close'><img src=\"" . plugin_dir_url(__FILE__) . "images/event-close.png\" alt='" . __('Close', 'my-calendar') . "' /></a>" : '';
        $details = $toggle . $details . "\n";
    }
    $container = "<div id='{$uid}-{$day_id}-{$type}-details' class='details'>\n";
    $container = apply_filters('mc_before_event', $container, $event, $type, $time);
    $details = $header . $container . $details;
    $details .= apply_filters('mc_after_event', '', $event, $type, $time);
    $details .= "</div><!--ends .details--></div>";
    $details = apply_filters('mc_event_content', $details, $event, $type, $time);
    return $details;
}
function my_calendar_events_now($category = 'default', $template = '<strong>{link_title}</strong> {timerange}')
{
    global $wpdb;
    $mcdb = $wpdb;
    if (get_option('mc_remote') == 'true' && function_exists('mc_remote_db')) {
        $mcdb = mc_remote_db();
    }
    $arr_events = array();
    $limit_string = "event_flagged <> 1 AND event_approved = 1";
    $select_category = $category != 'default' ? mc_select_category($category) : '';
    // may add support for location/author/host later.
    $select_location = $select_author = $select_host = '';
    $now = date('Y-m-d H:i:s', current_time('timestamp'));
    $event_query = "SELECT *, UNIX_TIMESTAMP(occur_begin) AS ts_occur_begin, UNIX_TIMESTAMP(occur_end) AS ts_occur_end\n\t\t\t\t\tFROM " . MY_CALENDAR_EVENTS_TABLE . " AS e \n\t\t\t\t\tJOIN " . MY_CALENDAR_TABLE . " AS t \n\t\t\t\t\tON (event_id=occur_event_id) \t\t\t\t\t\n\t\t\t\t\tJOIN " . MY_CALENDAR_CATEGORIES_TABLE . " AS c \n\t\t\t\t\tON (event_category=category_id) \n\t\t\t\t\tWHERE {$select_category} {$select_location} {$select_author} {$select_host} {$limit_string}  \n\t\t\t\t\tAND ( CAST('{$now}' AS DATETIME) BETWEEN occur_begin AND occur_end ) \n\t\t\t\t\t\tORDER BY " . apply_filters('mc_primary_sort', 'occur_begin') . ", " . apply_filters('mc_secondary_sort', 'event_title ASC');
    $events = $mcdb->get_results($event_query);
    if (!empty($events)) {
        foreach (array_keys($events) as $key) {
            $event =& $events[$key];
            $arr_events[] = $event;
        }
    }
    if (!empty($arr_events)) {
        $event = mc_create_tags($arr_events[0]);
        $output = jd_draw_template($event, apply_filters('mc_happening_now_template', $template, $event));
        return get_option('mc_process_shortcodes') == 'true' ? do_shortcode($output) : $output;
    } else {
        return '';
    }
}
function mc_instance_list($id, $occur = false, $template = '<h3>{title}</h3>{description}', $list = '<li>{date}, {time}</li>', $before = "<ul>", $after = "</ul>", $instance = false)
{
    global $wpdb;
    $id = (int) $id;
    $output = '';
    if ($instance == true) {
        $sql = "SELECT * FROM " . my_calendar_event_table() . " WHERE occur_id={$id}";
    } else {
        $sql = "SELECT * FROM " . my_calendar_event_table() . " WHERE occur_event_id={$id}";
    }
    $results = $wpdb->get_results($sql);
    if (is_array($results) && is_admin()) {
        foreach ($results as $result) {
            $begin = "<span id='occur_date_{$result->occur_id}'>" . date_i18n(get_option('mc_date_format'), strtotime($result->occur_begin)) . ', ' . date(get_option('mc_time_format'), strtotime($result->occur_begin)) . "</span>";
            if ($result->occur_id == $occur) {
                $form_control = '';
                $edit = "<em>" . __('Editing Now', 'my-calendar') . "</em>";
            } else {
                $form_control = "{$begin}: <button class='delete_occurrence' type='button' data-value='{$result->occur_id}' aria-describedby='occur_date_{$result->occur_id}' />" . __('Delete', 'my-calendar') . "</button> ";
                $edit = "<a href='" . admin_url('admin.php?page=my-calendar') . "&amp;mode=edit&amp;event_id={$id}&amp;date={$result->occur_id}' aria-describedby='occur_date_{$result->occur_id}'>" . __('Edit', 'my-calendar') . "</a>";
            }
            $output .= "<li>{$form_control}{$edit}</li>";
        }
    } else {
        $details = '';
        foreach ($results as $result) {
            $event_id = $result->occur_id;
            $event = mc_get_event($event_id);
            $array = mc_create_tags($event);
            if (in_array($template, array('details', 'grid', 'list', 'mini')) || mc_key_exists($template)) {
                if (get_option('mc_use_' . $template . '_template') == 1) {
                    $template = mc_get_template($template);
                } else {
                    if (mc_key_exists($template)) {
                        $template = mc_get_custom_template($template);
                    } else {
                        $details = my_calendar_draw_event($event, $type = "single", $event->event_begin, $event->event_time, '');
                    }
                }
            }
            $item = $list != '' ? jd_draw_template($array, $list) : '';
            if ($details == '') {
                $details = $template != '' ? jd_draw_template($array, $template) : '';
            }
            $output .= $item;
            if ($list == '') {
                break;
            }
        }
        $output = $details . $before . $output . $after;
    }
    return get_option('mc_process_shortcodes') == 'true' ? do_shortcode($output) : $output;
}
예제 #8
0
function my_calendar_send_email($event)
{
    $details = mc_create_tags($event);
    $headers = array();
    // shift to boolean
    $send_email_option = get_option('mc_event_mail') == 'true' ? true : false;
    $send_email = apply_filters('mc_send_notification', $send_email_option, $details);
    if ($send_email == true) {
        add_filter('wp_mail_content_type', create_function('', 'return "text/html";'));
    }
    if (get_option('mc_event_mail') == 'true') {
        $to = apply_filters('mc_event_mail_to', get_option('mc_event_mail_to'), $details);
        $from = get_option('mc_event_mail_from') == '' ? get_bloginfo('admin_email') : get_option('mc_event_mail_from');
        $from = apply_filters('mc_event_mail_from', $from, $details);
        $headers[] = "From: " . __('Event Notifications', 'my-calendar') . " <{$from}>";
        $bcc = apply_filters('mc_event_mail_bcc', get_option('mc_event_mail_bcc'), $details);
        if ($bcc) {
            $bcc = explode(PHP_EOL, $bcc);
            foreach ($bcc as $b) {
                $b = trim($b);
                if (is_email($b)) {
                    $headers[] = "Bcc: {$b}";
                }
            }
        }
        $headers = apply_filters('mc_customize_email_headers', $headers, $event);
        $subject = jd_draw_template($details, get_option('mc_event_mail_subject'));
        $message = jd_draw_template($details, get_option('mc_event_mail_message'));
        wp_mail($to, $subject, $message, $headers);
    }
    if (get_option('mc_html_email') == 'true') {
        remove_filter('wp_mail_content_type', create_function('', 'return "text/html";'));
    }
}
function mc_event_filter($title, $sep = ' | ', $seplocation = 'right')
{
    if (isset($_GET['mc_id'])) {
        $id = (int) $_GET['mc_id'];
        $event = mc_get_event($id);
        $array = mc_create_tags($event);
        $left_sep = $seplocation != 'right' ? ' ' . $sep . ' ' : '';
        $right_sep = $seplocation != 'right' ? '' : ' ' . $sep . ' ';
        $template = get_option('mc_event_title_template') != '' ? stripslashes(get_option('mc_event_title_template')) : "{$left_sep} {title} {$sep} {date} {$right_sep} ";
        return strip_tags(jd_draw_template($array, $template));
    } else {
        return $title;
    }
}
function my_calendar_todays_events($category = 'default', $template = 'default', $substitute = '', $author = 'all', $host = 'all')
{
    $caching = apply_filters('mc_cache_enabled', false);
    $todays_cache = $caching ? get_transient('mc_todays_cache') : '';
    if ($caching && is_array($todays_cache) && @$todays_cache[$category]) {
        return @$todays_cache[$category];
    }
    global $default_template;
    $output = '';
    $defaults = get_option('mc_widget_defaults');
    $template = $template == 'default' ? $defaults['today']['template'] : $template;
    if ($template == '') {
        $template = "{$default_template}";
    }
    $category = $category == 'default' ? $defaults['today']['category'] : $category;
    $no_event_text = $substitute == '' ? $defaults['today']['text'] : $substitute;
    $from = $to = date('Y-m-d', current_time('timestamp'));
    $events = my_calendar_events($from, $to, $category, '', '', 'upcoming', $author, $host);
    $today = isset($events[$from]) ? $events[$from] : false;
    $header = "<ul id='todays-events'>";
    $footer = "</ul>";
    $groups = $todays_events = array();
    // quick loop through all events today to check for holidays
    if (is_array($today)) {
        foreach ($today as $e) {
            if ($e->category_private == 1 && !is_user_logged_in()) {
            } else {
                if (!in_array($e->event_group_id, $groups)) {
                    $event_details = mc_create_tags($e);
                    $ts = $e->ts_occur_begin;
                    if (get_option('mc_event_approve') == 'true') {
                        if ($e->event_approved != 0) {
                            $todays_events[$ts][] = "<li>" . jd_draw_template($event_details, $template) . "</li>";
                        }
                    } else {
                        $todays_events[$ts][] = "<li>" . jd_draw_template($event_details, $template) . "</li>";
                    }
                }
            }
        }
        $todays_events = apply_filters('mc_event_today', $todays_events, $events);
        foreach ($todays_events as $k => $t) {
            foreach ($t as $now) {
                $output .= $now;
            }
        }
        if (count($events) != 0) {
            $return = $header . $output . $footer;
        } else {
            $return = stripcslashes($no_event_text);
        }
        $time = strtotime(date('Y-m-d H:m:s', current_time('timestamp'))) - strtotime(date('Y-m-d', current_time('timestamp')));
        $time_remaining = 24 * 60 * 60 - $time;
        $todays_cache[$category] = $caching ? $return : '';
        if ($caching) {
            set_transient('mc_todays_cache', $todays_cache, $time_remaining);
        }
    } else {
        $return = stripcslashes($no_event_text);
    }
    return $return;
}
function my_event_post($action, $data, $new_event)
{
    if (!get_option('mcs_create_post') == 'true') {
        return;
    }
    // if the event save was successful.
    $options = get_option('mcs_event_post');
    switch ($options['content']) {
        case 'event':
            $content = "[my_calendar_event event='{$new_event}' template='details' list='']";
            break;
        case 'custom':
            $content = isset($_POST['mcs_custom_content']) ? $_POST['mcs_custom_content'] : '';
            break;
        default:
            $content = $data['event_desc'];
            break;
    }
    if ($options['content'] == 'custom') {
        $event = mc_get_first_event($new_event);
        $details = mc_create_tags($event);
        $content = jd_draw_template($details, apply_filters('mcs_new_post_template', $content, $event));
    }
    switch ($options['title']) {
        case 'custom':
            $title = sprintf($options['custom_title'], $data['event_title']);
            break;
        default:
            $title = $data['event_title'];
    }
    switch ($options['author']) {
        case 'host':
            $auth = $data['event_host'];
            break;
        default:
            $auth = $data['event_author'];
    }
    switch ($options['excerpt']) {
        case 'event_short':
            $excerpt = $data['event_short'];
            break;
        case 'auto':
            $excerpt = wp_trim_words($data['event_desc']);
            break;
        case 'custom':
            $excerpt = isset($_POST['mcs_custom_content']) ? $_POST['mcs_custom_content'] : '';
            break;
        default:
            $excerpt = $data['event_short'];
    }
    if ($options['excerpt'] == 'custom') {
        $event = mc_get_first_event($new_event);
        $details = mc_create_tags($event);
        $excerpt = jd_draw_template($details, apply_filters('mcs_new_post_template', $excerpt, $event));
    }
    $status = isset($options['status']) ? $options['status'] : 'publish';
    switch ($options['timestamp']) {
        case 'event':
            $date = strtotime($data['event_begin'] . ' ' . $data['event_time']);
            break;
        case 'custom':
            if ($options['custom_time'] < 0) {
                $date = strtotime($data['event_begin'] . ' ' . $data['event_time']) - intval($options['custom_time']);
            } else {
                $date = current_time('timestamp') + intval($options['custom_time']);
            }
            break;
        default:
            $date = current_time('timestamp');
    }
    $type = isset($options['post_type']) ? $options['post_type'] : 'post';
    if ($action == 'add' && !(isset($_POST['event_source']) && $_POST['event_source'] == 'post')) {
        $my_post = array('post_title' => $title, 'post_content' => $content, 'post_excerpt' => $excerpt, 'post_status' => $status, 'post_author' => $auth, 'post_name' => sanitize_title($title), 'post_date' => date('Y-m-d H:i:s', $date), 'post_type' => $type);
        $post_id = wp_insert_post($my_post);
        $attachment_id = isset($_POST['event_image_id']) && is_numeric($_POST['event_image_id']) ? $_POST['event_image_id'] : false;
        if ($attachment_id) {
            set_post_thumbnail($post_id, $attachment_id);
        }
        $category = mc_get_category_detail($data['event_category'], 'category_name');
        $taxonomy = 'category';
        wp_set_post_tags($post_id, $category);
        wp_set_post_terms($post_id, $category, $taxonomy);
        add_post_meta($post_id, '_mc_event_id', $new_event);
        $event = mc_get_first_event($new_event);
        $event_id = $event->event_post;
        add_post_meta($event_id, '_mc_related_post', $post_id);
        do_action('mcp_post_published', $post_id, $event);
        wp_publish_post($post_id);
    }
}
function my_calendar_todays_events($category = 'default', $template = 'default', $substitute = '', $author = 'all', $host = 'all', $date = false, $site = false)
{
    if ($site) {
        $site = $site == 'global' ? BLOG_ID_CURRENT_SITE : $site;
        switch_to_blog($site);
    }
    $caching = apply_filters('mc_cache_enabled', false);
    $todays_cache = $caching ? get_transient('mc_todays_cache') : '';
    if ($caching && is_array($todays_cache) && @$todays_cache[$category]) {
        return @$todays_cache[$category];
    }
    $args = array('category' => $category, 'template' => $template, 'substitute' => $substitute, 'author' => $author, 'host' => $host, 'date' => $date);
    $hash = md5(implode(',', $args));
    global $default_template;
    $output = '';
    // allow reference by file to external template.
    if ($template != '' && mc_file_exists(sanitize_file_name($template))) {
        $template = @file_get_contents(mc_get_file(sanitize_file_name($template)));
    }
    $defaults = get_option('mc_widget_defaults');
    $template = $template == 'default' ? $defaults['today']['template'] : $template;
    $template = $template == '' ? $default_template : $template;
    if (mc_key_exists($template)) {
        $template = mc_get_custom_template($template);
    }
    $category = $category == 'default' ? $defaults['today']['category'] : $category;
    $no_event_text = $substitute == '' ? $defaults['today']['text'] : $substitute;
    if ($date) {
        $from = $to = date('Y-m-d', strtotime($date));
    } else {
        $from = $to = date('Y-m-d', current_time('timestamp'));
    }
    $events = my_calendar_events($from, $to, $category, '', '', 'upcoming', $author, $host, '', $site);
    $today = isset($events[$from]) ? $events[$from] : false;
    $header = "<ul id='todays-events-{$hash}' class='todays-events'>";
    $footer = "</ul>";
    $groups = $todays_events = array();
    // quick loop through all events today to check for holidays
    if (is_array($today)) {
        foreach ($today as $e) {
            if ($e->category_private == 1 && !is_user_logged_in()) {
            } else {
                if (!in_array($e->event_group_id, $groups)) {
                    $event_details = mc_create_tags($e);
                    $ts = $e->ts_occur_begin;
                    $end = $e->ts_occur_end;
                    $now = current_time('timestamp');
                    $category = 'mc_' . sanitize_title($e->category_name);
                    if ($ts < $now && $end > $now) {
                        $class = 'on-now';
                    } else {
                        if ($now < $ts) {
                            $class = 'future-event';
                        } else {
                            if ($now > $ts) {
                                $class = 'past-event';
                            }
                        }
                    }
                    $prepend = apply_filters('mc_todays_events_before', "<li class='{$class} {$category}'>", $class, $category);
                    $append = apply_filters('mc_todays_events_after', "</li>");
                    if (get_option('mc_event_approve') == 'true') {
                        if ($e->event_approved != 0) {
                            $todays_events[$ts][] = $prepend . jd_draw_template($event_details, $template) . $append;
                        }
                    } else {
                        $todays_events[$ts][] = $prepend . jd_draw_template($event_details, $template) . $append;
                    }
                }
            }
        }
        $todays_events = apply_filters('mc_event_today', $todays_events, $events);
        foreach ($todays_events as $k => $t) {
            foreach ($t as $now) {
                $output .= $now;
            }
        }
        if (count($events) != 0) {
            $return = apply_filters('mc_todays_events_header', $header) . $output . apply_filters('mc_todays_events_footer', $footer);
        } else {
            $return = stripcslashes($no_event_text);
        }
        $time = strtotime(date('Y-m-d H:m:s', current_time('timestamp'))) - strtotime(date('Y-m-d', current_time('timestamp')));
        $time_remaining = 24 * 60 * 60 - $time;
        $todays_cache[$category] = $caching ? $return : '';
        if ($caching) {
            set_transient('mc_todays_cache', $todays_cache, $time_remaining);
        }
    } else {
        $return = stripcslashes($no_event_text);
    }
    if ($site) {
        restore_current_blog();
    }
    return get_option('mc_process_shortcodes') == 'true' ? do_shortcode($return) : $return;
}
function my_calendar_draw_event($event, $type = "calendar", $process_date, $time, $template = '')
{
    // if event is not approved, return without processing
    if (get_option('mc_event_approve') == 'true' && (int) $event->event_approved !== 1) {
        return '';
    }
    // if event ends at midnight today (e.g., very first thing of the day), exit without re-drawing
    // or if event started yesterday & has event_hide_end checked.
    $ends_at_midnight = $event->event_endtime == '00:00:00' && date('Y-m-d', strtotime($event->occur_end)) == $process_date && date('Y-m-d', strtotime($event->occur_begin)) != $process_date ? true : false;
    // hides events if hiding end time & not first day.
    $hide_day_two = apply_filters('mc_hide_additional_days', false, $event) && date('Y-m-d', strtotime($event->occur_begin)) != date('Y-m-d', strtotime($process_date)) ? true : false;
    if ($ends_at_midnight || $hide_day_two) {
        return '';
    }
    if ($event->category_private == 1 && !is_user_logged_in()) {
        return '';
    }
    // assign empty values to template sections
    $header = $address = $more = $author = $list_title = $title = $output = $container = $short = $description = $link = $vcal = $gcal = '';
    $date_format = get_option('mc_date_format') != '' ? get_option('mc_date_format') : get_option('date_format');
    $data = mc_create_tags($event);
    $details = '';
    if (mc_show_details($time, $type)) {
        $details = apply_filters('mc_custom_template', false, $data, $event, $type, $process_date, $time, $template);
        $template = apply_filters('mc_use_custom_template', $template, $data, $event, $type, $process_date, $time);
        if ($details === false) {
            if ($template != '' && mc_file_exists(sanitize_file_name($template))) {
                $template = @file_get_contents(mc_get_file(sanitize_file_name($template)));
                $details = jd_draw_template($data, $template);
            } else {
                if ($template != '' && mc_key_exists($template)) {
                    $template = mc_get_custom_template($template);
                    $details = jd_draw_template($data, $template);
                } else {
                    switch ($type) {
                        case 'mini':
                            $template = mc_get_template('mini');
                            if (get_option('mc_use_mini_template') == 1) {
                                $details = jd_draw_template($data, $template);
                            }
                            break;
                        case 'list':
                            $template = mc_get_template('list');
                            if (get_option('mc_use_list_template') == 1) {
                                $details = jd_draw_template($data, $template);
                            }
                            break;
                        case 'single':
                            $template = mc_get_template('details');
                            if (get_option('mc_use_details_template') == 1) {
                                $details = jd_draw_template($data, $template);
                            }
                            break;
                        case 'calendar':
                        default:
                            $template = mc_get_template('grid');
                            if (get_option('mc_use_grid_template') == 1) {
                                $details = jd_draw_template($data, $template);
                            }
                    }
                }
            }
        }
    }
    $mc_display_author = get_option('mc_display_author');
    $display_map = get_option('mc_show_map');
    $display_address = get_option('mc_show_address');
    $mc_display_more = get_option('mc_display_more');
    $uid = 'mc_' . $event->occur_id;
    $day_id = date('d', strtotime($process_date));
    $image = mc_category_icon($event);
    $has_image = $image != '' ? ' has-image' : '';
    $event_classes = mc_event_classes($event, $day_id, $type);
    $header .= "<div id='{$uid}-{$day_id}-{$type}' class='{$event_classes}'>\n";
    switch ($type) {
        case 'calendar':
            $title_template = mc_get_template('title') == '' ? '{title}' : mc_get_template('title');
            break;
        case 'list':
            $title_template = mc_get_template('title_list') == '' ? '{title}' : mc_get_template('title_list');
            break;
        case 'single':
            $title_template = mc_get_template('title_solo') == '' ? '{title}' : mc_get_template('title_solo');
            break;
        default:
            $title_template = mc_get_template('title') == '' ? '{title}' : mc_get_template('title');
    }
    $event_title = jd_draw_template($data, $title_template);
    $event_title = $event_title == '' ? jd_draw_template($data, '{title}') : mc_kses_post($event_title);
    //prevent empty titles
    if (strpos($event_title, 'href') === false && $type != 'mini' && $type != 'list') {
        if (get_option('mc_open_uri') == 'true') {
            $details_link = esc_url(mc_get_details_link($event));
            $wrap = "<a href='{$details_link}' class='url summary{$has_image}'>";
            $balance = "</a>";
        } else {
            $wrap = "<a href='#{$uid}-{$day_id}-{$type}-details' class='url summary{$has_image}'>";
            $balance = "</a>";
        }
    } else {
        $wrap = $balance = '';
    }
    $current_date = date_i18n(apply_filters('mc_date_format', $date_format, 'details'), strtotime($process_date));
    $group_class = $event->event_span == 1 ? ' multidate group' . $event->event_group_id : '';
    $heading_level = apply_filters('mc_heading_level_table', 'h3', $type, $time, $template);
    $inner_heading = apply_filters('mc_heading_inner_title', $wrap . $image . trim($event_title) . $balance, $event_title, $event);
    $header .= $type != 'single' && $type != 'list' ? "<{$heading_level} class='event-title summary{$group_class}' id='{$uid}-{$day_id}-{$type}-title'>{$inner_heading}</{$heading_level}>\n" : '';
    $event_title = $type == 'single' ? apply_filters('mc_single_event_title', $event_title, $event) : $event_title;
    $title = $type == 'single' && !is_singular('mc-events') ? "<h2 class='event-title summary'>{$image} {$event_title}</h2>\n" : '<span class="summary screen-reader-text">' . $event_title . '</span>';
    $title = apply_filters('mc_event_title', $title, $event, $event_title, $image);
    $header .= '<span class="summary">' . $title . '</span>';
    $close_image = apply_filters('mc_close_button', "<img src=\"" . plugin_dir_url(__FILE__) . "images/event-close.png\" alt='" . __('Close', 'my-calendar') . "' />");
    $close_button = "<button type='button' aria-controls='{$uid}-{$day_id}-{$type}-details' class='mc-toggle close'>{$close_image}</button>";
    if (mc_show_details($time, $type)) {
        $close = $type == 'calendar' || $type == 'mini' ? $close_button : '';
        if ($details === false) {
            // put together address information as vcard
            if ($display_address == 'true' || $display_map == 'true') {
                $address = mc_hcard($event, $display_address, $display_map);
            }
            // end vcard
            $time_html = mc_time_html($event, $type, $current_date);
            if ($type == "list") {
                $heading_level = apply_filters('mc_heading_level_list', 'h3', $type, $time, $template);
                $list_title = "<{$heading_level} class='event-title summary' id='{$uid}-{$day_id}-{$type}-title'>{$image}" . $event_title . "</{$heading_level}>\n";
            }
            if ($mc_display_author == 'true') {
                if ($event->event_author != 0) {
                    $e = get_userdata($event->event_author);
                    $author = '<p class="event-author">' . __('Posted by', 'my-calendar') . ' <span class="author-name">' . $e->display_name . "</span></p>\n";
                }
            }
            if ($mc_display_more != 'false' && !isset($_GET['mc_id'])) {
                $details_label = mc_get_details_label($event, $data);
                $details_link = mc_get_details_link($event);
                if (_mc_is_url($details_link)) {
                    $more = "<p class='mc_details'><a href='" . esc_url($details_link) . "'>{$details_label}</a></p>\n";
                } else {
                    $more = '';
                }
            }
            $more = apply_filters('mc_details_grid_link', $more, $event);
            // handle link expiration
            $event_link = mc_event_link($event);
            if (function_exists('mc_google_cal') && get_option('mc_show_gcal') == 'true') {
                $gcal_link = "<p class='gcal'>" . jd_draw_template($data, '{gcal_link}') . "</p>";
                $gcal = $gcal_link;
            }
            if (function_exists('my_calendar_generate_vcal') && get_option('mc_show_event_vcal') == 'true') {
                $url = add_query_arg('vcal', $uid, home_url());
                $vcal_link = "<p class='ical'><a rel='nofollow' href='" . esc_url($url) . "'>" . __('iCal', 'my-calendar') . "</a></p>\n";
                $vcal = $vcal_link;
            }
            $sizes = get_intermediate_image_sizes();
            if (in_array('medium', $sizes)) {
                $default_size = 'medium';
            } else {
                $default_size = 'thumbnail';
            }
            $default_size = apply_filters('mc_default_image_size', $default_size);
            if (is_numeric($event->event_post) && $event->event_post != 0 && (isset($data[$default_size]) && $data[$default_size] != '')) {
                $atts = apply_filters('mc_post_thumbnail_atts', array('class' => 'mc-image photo'));
                $image = get_the_post_thumbnail($event->event_post, $default_size, $atts);
            } else {
                $image = $event->event_image != '' ? "<img src='{$event->event_image}' alt='' class='mc-image photo' />" : '';
            }
            if (get_option('mc_desc') == 'true' || $type == 'single') {
                $description = wpautop(stripcslashes(mc_kses_post($event->event_desc)), 1);
                $description = "<div class='longdesc description'>{$description}</div>";
            }
            if (get_option('mc_short') == 'true' && $type != 'single') {
                $short = wpautop(stripcslashes(mc_kses_post($event->event_short)), 1);
                $short = "<div class='shortdesc'>{$short}</div>";
            }
            if (get_option('mc_event_registration') == 'true') {
                switch ($event->event_open) {
                    case '0':
                        $status = mc_kses_post(get_option('mc_event_closed'));
                        break;
                    case '1':
                        $status = mc_kses_post(get_option('mc_event_open'));
                        break;
                    case '2':
                        $status = '';
                        break;
                    default:
                        $status = '';
                }
            } else {
                $status = '';
            }
            $status = $status != '' ? "<p>{$status}</p>" : '';
            $status = apply_filters('mc_registration_state', $status, $event);
            $return_url = apply_filters('mc_return_uri', get_option('mc_uri'));
            $return = $type == 'single' ? "<p class='view-full'><a href='{$return_url}'>" . __('View full calendar', 'my-calendar') . "</a></p>" : '';
            if (!mc_show_details($time, $type)) {
                $description = $short = $status = '';
            }
            if (get_option('mc_gmap') == 'true') {
                $map = is_singular('mc-events') || $type == 'single' ? mc_generate_map($event) : '';
            } else {
                $map = '';
            }
            if ($event_link != '' && get_option('mc_event_link') != 'false') {
                $is_external = mc_external_link($event_link);
                $external_class = $is_external ? "class='{$type}-link external url'" : "class='{$type}-link url'";
                $link_template = mc_get_template('link') != '' ? mc_get_template('link') : '{title}';
                $link_text = jd_draw_template($data, $link_template);
                $link = "<p><a href='" . esc_url($event_link) . "' {$external_class}>" . $link_text . "</a></p>";
            }
            $details = "\n" . $close . $time_html . $list_title . $image . "<div class='location'>" . $map . $address . "</div>" . $description . $short . $link . $status . $author . "<div class='sharing'>" . $vcal . $gcal . $more . "</div>" . $return;
        } else {
            // if a custom template is in use
            $toggle = $type == 'calendar' || $type == 'mini' ? $close_button : '';
            $details = $toggle . $details . "\n";
        }
        $img_class = $image != '' ? ' has-image' : ' no-image';
        $container = "<div id='{$uid}-{$day_id}-{$type}-details' class='details{$img_class}' role='alert' aria-labelledby='{$uid}-{$day_id}-{$type}-title'>\n";
        $container = apply_filters('mc_before_event', $container, $event, $type, $time);
        $details = $header . $container . apply_filters('mc_inner_content', $details, $event, $type, $time);
        $details .= apply_filters('mc_after_event', '', $event, $type, $time);
        $details .= $close;
        // second close button
        $details .= "</div><!--ends .details--></div>";
        $details = apply_filters('mc_event_content', $details, $event, $type, $time);
    } else {
        $details = apply_filters('mc_before_event_no_details', $container, $event, $type, $time) . $header . apply_filters('mc_after_event_no_details', '', $event, $type, $time) . "</div>";
    }
    return $details;
}
function mc_instance_list($id, $occur = false, $template = '<h3>{title}</h3>{description}', $list = '<li>{date}, {time}</li>', $before = "<ul>", $after = "</ul>")
{
    global $wpdb;
    $id = (int) $id;
    $output = '';
    $sql = "SELECT * FROM " . my_calendar_event_table() . " WHERE occur_event_id={$id}";
    $results = $wpdb->get_results($sql);
    if (is_array($results) && is_admin()) {
        foreach ($results as $result) {
            if ($result->occur_id == $occur) {
                $form_control = '';
                $current = "<em>" . __('Editing: ', 'my-calendar') . "</em>";
                $end = '';
            } else {
                $form_control = "<input type='checkbox' name='delete_occurrences[]' id='delete_{$result->occur_id}' value='{$result->occur_id}' aria-labelledby='occur_label occur_date' /> <label id='occur_label' for='delete_{$result->occur_id}'>Delete</label> ";
                $current = "<a href='" . admin_url('admin.php?page=my-calendar') . "&amp;mode=edit&amp;event_id={$id}&amp;date={$result->occur_id}'>";
                $end = "</a>";
            }
            $begin = "<span id='occur_date'>" . date_i18n(get_option('mc_date_format'), strtotime($result->occur_begin)) . ', ' . date(get_option('mc_time_format'), strtotime($result->occur_begin)) . "</span>";
            $output .= "<li>{$form_control}{$current}{$begin}{$end}</li>";
        }
    } else {
        $details = '';
        foreach ($results as $result) {
            $event_id = $result->occur_id;
            $event = mc_get_event($event_id);
            $array = mc_create_tags($event);
            if (in_array($template, array('details', 'grid', 'list', 'mini'))) {
                if (get_option('mc_use_' . $template . '_template') == 1) {
                    $template = mc_get_template($template);
                } else {
                    $template = false;
                    $details = my_calendar_draw_event($event, $type = "single", $event->event_begin, $event->event_time, '');
                }
            }
            $item = $list != '' ? jd_draw_template($array, $list) : '';
            if ($details == '') {
                $details = $template != '' ? jd_draw_template($array, $template) : '';
            }
            $output .= $item;
        }
        $output = $details . $before . $output . $after;
    }
    return $output;
}