Example #1
0
function eme_get_events_list($limit, $scope = "future", $order = "ASC", $format = '', $format_header = '', $format_footer = '', $echo = 1, $category = '', $showperiod = '', $long_events = 0, $author = '', $contact_person = '', $paging = 0, $location_id = "", $user_registered_only = 0, $show_ongoing = 1, $link_showperiod = 0, $notcategory = '', $show_recurrent_events_once = 0, $template_id = 0, $template_id_header = 0, $template_id_footer = 0, $no_events_message = "", $show_single_event = 0)
{
    global $post, $eme_timezone;
    if ($limit === "") {
        $limit = get_option('eme_event_list_number_items');
    }
    if (strpos($limit, "=")) {
        // allows the use of arguments without breaking the legacy code
        $eme_event_list_number_events = get_option('eme_event_list_number_items');
        $defaults = array('limit' => $eme_event_list_number_events, 'scope' => 'future', 'order' => 'ASC', 'format' => '', 'echo' => 1, 'category' => '', 'showperiod' => '', $author => '', $contact_person => '', 'paging' => 0, 'long_events' => 0, 'location_id' => 0, 'show_ongoing' => 1, 'link_showperiod' => 0, 'notcategory' => '', 'show_recurrent_events_once' => 0, 'template_id' => 0, 'template_id_header' => 0, 'template_id_footer' => 0, 'no_events_message' => '');
        $r = wp_parse_args($limit, $defaults);
        extract($r);
        // for AND categories: the user enters "+" and this gets translated to " " by wp_parse_args
        // so we fix it again
        $category = preg_replace("/ /", "+", $category);
        $notcategory = preg_replace("/ /", "+", $notcategory);
    }
    $echo = $echo === "true" || $echo === "1" ? true : $echo;
    $long_events = $long_events === "true" || $long_events === "1" ? true : $long_events;
    $paging = $paging === "true" || $paging === "1" ? true : $paging;
    $show_ongoing = $show_ongoing === "true" || $show_ongoing === "1" ? true : $show_ongoing;
    $echo = $echo === "false" || $echo === "0" ? false : $echo;
    $long_events = $long_events === "false" || $long_events === "0" ? false : $long_events;
    $paging = $paging === "false" || $paging === "0" ? false : $paging;
    $show_ongoing = $show_ongoing === "false" || $show_ongoing === "0" ? false : $show_ongoing;
    if ($scope == "") {
        $scope = "future";
    }
    if ($order != "DESC") {
        $order = "ASC";
    }
    if ($template_id) {
        $format = eme_get_template_format($template_id);
    }
    if ($template_id_header) {
        $format_header = eme_get_template_format($template_id_header);
    }
    if ($template_id_footer) {
        $format_footer = eme_get_template_format($template_id_footer);
    }
    if (empty($format)) {
        $format = get_option('eme_event_list_item_format');
        if (empty($format_header)) {
            $format_header = get_option('eme_event_list_item_format_header');
            if (empty($format_header)) {
                $format_header = DEFAULT_EVENT_LIST_HEADER_FORMAT;
            }
        }
        if (empty($format_footer)) {
            $format_footer = get_option('eme_event_list_item_format_footer');
            if (empty($format_footer)) {
                $format_footer = DEFAULT_EVENT_LIST_FOOTER_FORMAT;
            }
        }
    }
    // for registered users: we'll add a list of event_id's for that user only
    $extra_conditions = "";
    if ($user_registered_only == 1 && is_user_logged_in()) {
        $current_userid = get_current_user_id();
        $person_id = eme_get_person_id_by_wp_id($current_userid);
        $list_of_event_ids = join(",", eme_get_event_ids_by_booker_id($person_id));
        if (!empty($list_of_event_ids)) {
            $extra_conditions = " (event_id in ({$list_of_event_ids}))";
        } else {
            // user has no registered events, then make sure none are shown
            $extra_conditions = " (event_id = 0)";
        }
    }
    $prev_text = "";
    $next_text = "";
    $limit_start = 0;
    $limit_end = 0;
    // for browsing: if limit=0,paging=1 and only for this_week,this_month or today
    if ($limit > 0 && $paging == 1 && isset($_GET['eme_offset'])) {
        $limit_offset = intval($_GET['eme_offset']);
    } else {
        $limit_offset = 0;
    }
    // if extra scope_filter is found (from the eme_filter shortcode), then no paging
    // since it won't work anyway
    if (isset($_REQUEST["eme_scope_filter"])) {
        $paging = 0;
    }
    if ($paging == 1 && $limit == 0) {
        $eme_date_obj = new ExpressiveDate(null, $eme_timezone);
        $scope_offset = 0;
        $scope_text = "";
        if (isset($_GET['eme_offset'])) {
            $scope_offset = $_GET['eme_offset'];
        }
        $prev_offset = $scope_offset - 1;
        $next_offset = $scope_offset + 1;
        if ($scope == "this_week") {
            $start_of_week = get_option('start_of_week');
            $eme_date_obj->setWeekStartDay($start_of_week);
            $eme_date_obj->modifyWeeks($scope_offset);
            $limit_start = $eme_date_obj->startOfWeek()->format('Y-m-d');
            $limit_end = $eme_date_obj->endOfWeek()->format('Y-m-d');
            $scope = "{$limit_start}--{$limit_end}";
            $scope_text = eme_localised_date($limit_start . " " . $eme_timezone) . " -- " . eme_localised_date($limit_end . " " . $eme_timezone);
            $prev_text = __('Previous week', 'eme');
            $next_text = __('Next week', 'eme');
        } elseif ($scope == "this_month") {
            $eme_date_obj->modifyMonths($scope_offset);
            $limit_start = $eme_date_obj->startOfMonth()->format('Y-m-d');
            $limit_end = $eme_date_obj->endOfMonth()->format('Y-m-d');
            $scope = "{$limit_start}--{$limit_end}";
            $scope_text = eme_localised_date($limit_start . " " . $eme_timezone, get_option('eme_show_period_monthly_dateformat'));
            $prev_text = __('Previous month', 'eme');
            $next_text = __('Next month', 'eme');
        } elseif ($scope == "this_year") {
            $eme_date_obj->modifyYears($scope_offset);
            $year = $eme_date_obj->getYear();
            $limit_start = "{$year}-01-01";
            $limit_end = "{$year}-12-31";
            $scope = "{$limit_start}--{$limit_end}";
            $scope_text = eme_localised_date($limit_start . " " . $eme_timezone, get_option('eme_show_period_yearly_dateformat'));
            $prev_text = __('Previous year', 'eme');
            $next_text = __('Next year', 'eme');
        } elseif ($scope == "today") {
            $scope = $eme_date_obj->modifyDays($scope_offset)->format('Y-m-d');
            $limit_start = $scope;
            $limit_end = $scope;
            $scope_text = eme_localised_date($limit_start . " " . $eme_timezone);
            $prev_text = __('Previous day', 'eme');
            $next_text = __('Next day', 'eme');
        } elseif ($scope == "tomorrow") {
            $scope_offset++;
            $scope = $eme_date_obj->modifyDays($scope_offset)->format('Y-m-d');
            $limit_start = $scope;
            $limit_end = $scope;
            $scope_text = eme_localised_date($limit_start . " " . $eme_timezone);
            $prev_text = __('Previous day', 'eme');
            $next_text = __('Next day', 'eme');
        }
    }
    // We request $limit+1 events, so we know if we need to show the pagination link or not.
    if ($limit == 0) {
        $events = eme_get_events(0, $scope, $order, $limit_offset, $location_id, $category, $author, $contact_person, $show_ongoing, $notcategory, $show_recurrent_events_once, $extra_conditions);
    } else {
        $events = eme_get_events($limit + 1, $scope, $order, $limit_offset, $location_id, $category, $author, $contact_person, $show_ongoing, $notcategory, $show_recurrent_events_once, $extra_conditions);
    }
    $events_count = count($events);
    if ($events_count == 1 && $show_single_event) {
        $event = $events[0];
        $output = eme_display_single_event($event['event_id']);
        return $output;
    }
    // get the paging output ready
    $pagination_top = "<div id='events-pagination-top'> ";
    $nav_hidden_class = "style='visibility:hidden;'";
    if ($paging == 1 && $limit > 0) {
        // for normal paging and there're no events, we go back to offset=0 and try again
        if ($events_count == 0) {
            $limit_offset = 0;
            $events = eme_get_events($limit + 1, $scope, $order, $limit_offset, $location_id, $category, $author, $contact_person, $show_ongoing, $notcategory, $show_recurrent_events_once, $extra_conditions);
            $events_count = count($events);
        }
        $prev_text = __('Previous page', 'eme');
        $next_text = __('Next page', 'eme');
        $page_number = floor($limit_offset / $limit) + 1;
        $this_page_url = get_permalink($post->ID);
        //$this_page_url=$_SERVER['REQUEST_URI'];
        // remove the offset info
        $this_page_url = remove_query_arg('eme_offset', $this_page_url);
        // we add possible fields from the filter section
        $eme_filters["eme_eventAction"] = 1;
        $eme_filters["eme_cat_filter"] = 1;
        $eme_filters["eme_loc_filter"] = 1;
        $eme_filters["eme_town_filter"] = 1;
        $eme_filters["eme_scope_filter"] = 1;
        foreach ($_REQUEST as $key => $item) {
            if (isset($eme_filters[$key])) {
                # if you selected multiple items, $item is an array, but rawurlencode needs a string
                if (is_array($item)) {
                    $item = join(',', eme_sanitize_request($item));
                }
                $this_page_url = add_query_arg(array($key => $item), $this_page_url);
            }
        }
        // we always provide the text, so everything stays in place (but we just hide it if needed, and change the link to empty
        // to prevent going on indefinitely and thus allowing search bots to go on for ever
        if ($events_count > $limit) {
            $forward = $limit_offset + $limit;
            $backward = $limit_offset - $limit;
            if ($backward < 0) {
                $pagination_top .= "<a class='eme_nav_left' {$nav_hidden_class} href='#'>&lt;&lt; {$prev_text}</a>";
            } else {
                $pagination_top .= "<a class='eme_nav_left' href='" . add_query_arg(array('eme_offset' => $backward), $this_page_url) . "'>&lt;&lt; {$prev_text}</a>";
            }
            $pagination_top .= "<a class='eme_nav_right' href='" . add_query_arg(array('eme_offset' => $forward), $this_page_url) . "'>{$next_text} &gt;&gt;</a>";
            $pagination_top .= "<span class='eme_nav_center'>" . __('Page ', 'eme') . $page_number . "</span>";
        }
        if ($events_count <= $limit && $limit_offset > 0) {
            $forward = 0;
            $backward = $limit_offset - $limit;
            if ($backward < 0) {
                $pagination_top .= "<a class='eme_nav_left' {$nav_hidden_class} href='#'>&lt;&lt; {$prev_text}</a>";
            } else {
                $pagination_top .= "<a class='eme_nav_left' href='" . add_query_arg(array('eme_offset' => $backward), $this_page_url) . "'>&lt;&lt; {$prev_text}</a>";
            }
            $pagination_top .= "<a class='eme_nav_right' {$nav_hidden_class} href='#'>{$next_text} &gt;&gt;</a>";
            $pagination_top .= "<span class='eme_nav_center'>" . __('Page ', 'eme') . $page_number . "</span>";
        }
    }
    if ($paging == 1 && $limit == 0) {
        $this_page_url = $_SERVER['REQUEST_URI'];
        // remove the offset info
        $this_page_url = remove_query_arg('eme_offset', $this_page_url);
        // we add possible fields from the filter section
        $eme_filters["eme_eventAction"] = 1;
        $eme_filters["eme_cat_filter"] = 1;
        $eme_filters["eme_loc_filter"] = 1;
        $eme_filters["eme_town_filter"] = 1;
        $eme_filters["eme_scope_filter"] = 1;
        foreach ($_REQUEST as $key => $item) {
            if (isset($eme_filters[$key])) {
                # if you selected multiple items, $item is an array, but rawurlencode needs a string
                if (is_array($item)) {
                    $item = join(',', eme_sanitize_request($item));
                }
                $this_page_url = add_query_arg(array($key => $item), $this_page_url);
            }
        }
        // to prevent going on indefinitely and thus allowing search bots to go on for ever,
        // we stop providing links if there are no more events left
        $older_events = eme_get_events(1, "--" . $limit_start, $order, 0, $location_id, $category, $author, $contact_person, $show_ongoing, $notcategory, $show_recurrent_events_once, $extra_conditions);
        $newer_events = eme_get_events(1, "++" . $limit_end, $order, 0, $location_id, $category, $author, $contact_person, $show_ongoing, $notcategory, $show_recurrent_events_once, $extra_conditions);
        if (count($older_events) > 0) {
            $pagination_top .= "<a class='eme_nav_left' href='" . add_query_arg(array('eme_offset' => $prev_offset), $this_page_url) . "'>&lt;&lt; {$prev_text}</a>";
        } else {
            $pagination_top .= "<a class='eme_nav_left' {$nav_hidden_class} href='#'>&lt;&lt; {$prev_text}</a>";
        }
        if (count($newer_events) > 0) {
            $pagination_top .= "<a class='eme_nav_right' href='" . add_query_arg(array('eme_offset' => $next_offset), $this_page_url) . "'>{$next_text} &gt;&gt;</a>";
        } else {
            $pagination_top .= "<a class='eme_nav_right' {$nav_hidden_class} href='#'>{$next_text} &gt;&gt;</a>";
        }
        $pagination_top .= "<span class='eme_nav_center'>{$scope_text}</span>";
    }
    $pagination_top .= "</div>";
    $pagination_bottom = str_replace("events-pagination-top", "events-pagination-bottom", $pagination_top);
    $output = "";
    if ($events_count > 0) {
        # if we want to show events per period, we first need to determine on which days events occur
        # this code is identical to that in eme_calendar.php for "long events"
        if (!empty($showperiod)) {
            $eventful_days = array();
            $i = 1;
            foreach ($events as $event) {
                // we requested $limit+1 events, so we need to break at the $limit, if reached
                if ($limit > 0 && $i > $limit) {
                    break;
                }
                $eme_date_obj_tmp = new ExpressiveDate($event['event_start_date'] . " " . $event['event_start_time'], $eme_timezone);
                $eme_date_obj_end = new ExpressiveDate($event['event_end_date'] . " " . $event['event_end_time'], $eme_timezone);
                if ($eme_date_obj_end->lessThan($eme_date_obj_tmp)) {
                    $eme_date_obj_end = $eme_date_obj_tmp->copy();
                }
                if ($long_events) {
                    //Show events on every day that they are still going on
                    while ($eme_date_obj_tmp->lessOrEqualTo($eme_date_obj_end)) {
                        $event_eventful_date = $eme_date_obj_tmp->getDate();
                        if (isset($eventful_days[$event_eventful_date]) && is_array($eventful_days[$event_eventful_date])) {
                            $eventful_days[$event_eventful_date][] = $event;
                        } else {
                            $eventful_days[$event_eventful_date] = array($event);
                        }
                        $eme_date_obj_tmp->addOneDay();
                    }
                } else {
                    //Only show events on the day that they start
                    if (isset($eventful_days[$event['event_start_date']]) && is_array($eventful_days[$event['event_start_date']])) {
                        $eventful_days[$event['event_start_date']][] = $event;
                    } else {
                        $eventful_days[$event['event_start_date']] = array($event);
                    }
                }
                $i++;
            }
            # now that we now the days on which events occur, loop through them
            $curyear = "";
            $curmonth = "";
            $curday = "";
            foreach ($eventful_days as $day_key => $day_events) {
                $eme_date_obj = new ExpressiveDate($day_key, $eme_timezone);
                list($theyear, $themonth, $theday) = explode('-', $eme_date_obj->getDate());
                if ($showperiod == "yearly" && $theyear != $curyear) {
                    $output .= "<li class='eme_period'>" . eme_localised_date($day_key . " " . $eme_timezone, get_option('eme_show_period_yearly_dateformat')) . "</li>";
                } elseif ($showperiod == "monthly" && "{$theyear}{$themonth}" != "{$curyear}{$curmonth}") {
                    $output .= "<li class='eme_period'>" . eme_localised_date($day_key . " " . $eme_timezone, get_option('eme_show_period_monthly_dateformat')) . "</li>";
                } elseif ($showperiod == "daily" && "{$theyear}{$themonth}{$theday}" != "{$curyear}{$curmonth}{$curday}") {
                    $output .= "<li class='eme_period'>";
                    if ($link_showperiod) {
                        $eme_link = eme_calendar_day_url($theyear . "-" . $themonth . "-" . $theday);
                        $output .= "<a href=\"{$eme_link}\">" . eme_localised_date($day_key . " " . $eme_timezone) . "</a>";
                    } else {
                        $output .= eme_localised_date($day_key . " " . $eme_timezone);
                    }
                    $output .= "</li>";
                }
                $curyear = $theyear;
                $curmonth = $themonth;
                $curday = $theday;
                foreach ($day_events as $event) {
                    $output .= eme_replace_placeholders($format, $event);
                }
            }
        } else {
            $i = 1;
            foreach ($events as $event) {
                // we requested $limit+1 events, so we need to break at the $limit, if reached
                if ($limit > 0 && $i > $limit) {
                    break;
                }
                $output .= eme_replace_placeholders($format, $event);
                $i++;
            }
        }
        // end if (! empty ( $showperiod )) {
        //Add headers and footers to output
        $empty_event = eme_new_event();
        $output = eme_replace_placeholders($format_header, $empty_event) . $output . eme_replace_placeholders($format_footer, $empty_event);
    } else {
        if (empty($no_events_message)) {
            $no_events_message = get_option('eme_no_events_message');
        }
        $output = "<div id='events-no-events'>" . $no_events_message . "</div>";
    }
    // add the pagination if needed
    if ($paging == 1 && $events_count > 0) {
        $output = $pagination_top . $output . $pagination_bottom;
    }
    // see how to return the output
    if ($echo) {
        echo $output;
    } else {
        return $output;
    }
}
Example #2
0
function eme_get_calendar($args = "")
{
    global $wp_locale;
    global $wpdb, $eme_timezone;
    // the calendar is being used, so we need the jquery for the calendar
    global $eme_need_calendar_js;
    $eme_need_calendar_js = 1;
    $defaults = array('category' => 0, 'notcategory' => 0, 'full' => 0, 'month' => '', 'year' => '', 'echo' => 1, 'long_events' => 0, 'author' => '', 'contact_person' => '', 'location_id' => '', 'template_id' => 0);
    $r = wp_parse_args($args, $defaults);
    extract($r);
    $echo = $echo === "true" || $echo === "1" ? true : $echo;
    $full = $full === "true" || $full === "1" ? true : $full;
    $long_events = $long_events === "true" || $long_events === "1" ? true : $long_events;
    $echo = $echo === "false" || $echo === "0" ? false : $echo;
    $full = $full === "false" || $full === "0" ? false : $full;
    $long_events = $long_events === "false" || $long_events === "0" ? false : $long_events;
    // this comes from global wordpress preferences
    $start_of_week = get_option('start_of_week');
    $eme_date_obj = new ExpressiveDate(null, $eme_timezone);
    if (get_option('eme_use_client_clock') && isset($_SESSION['eme_client_mday']) && isset($_SESSION['eme_client_month']) && isset($_SESSION['eme_client_fullyear'])) {
        // these come from client unless their clock is wrong
        $iNowDay = sprintf("%02d", $_SESSION['eme_client_mday']);
        $iNowMonth = sprintf("%02d", $_SESSION['eme_client_month']);
        $iNowYear = sprintf("%04d", $_SESSION['eme_client_fullyear']);
    } else {
        // Get current year, month and day
        list($iNowYear, $iNowMonth, $iNowDay) = explode('-', $eme_date_obj->getDate());
    }
    $iSelectedYear = $year;
    $iSelectedMonth = $month;
    if ($iSelectedMonth == '') {
        $iSelectedMonth = $iNowMonth;
    }
    if ($iSelectedYear == '') {
        $iSelectedYear = $iNowYear;
    }
    $iSelectedMonth = sprintf("%02d", $iSelectedMonth);
    // Get name and number of days of specified month
    $eme_date_obj->setDay(1);
    $eme_date_obj->setMonth($iSelectedMonth);
    $eme_date_obj->setYear($iSelectedYear);
    // Get friendly month name, but since DateTime::format doesn't respect the locale, we need eme_localised_date
    if ($full) {
        list($sMonthName, $iDaysInMonth) = explode('-', eme_localised_date($eme_date_obj->getDate(), 'F-t'));
    } else {
        list($sMonthName, $iDaysInMonth) = explode('-', eme_localised_date($eme_date_obj->getDate(), 'M-t'));
    }
    // take into account some locale info: some always best show full month name, some show month after year, some have a year suffix
    $locale_code = substr(get_locale(), 0, 2);
    $showMonthAfterYear = 0;
    $yearSuffix = "";
    switch ($locale_code) {
        case "hu":
            $showMonthAfterYear = 1;
            break;
        case "ja":
            $showMonthAfterYear = 1;
            $sMonthName = eme_localised_date($eme_date_obj->getDate(), 'F');
            $yearSuffix = "年";
            break;
        case "ko":
            $showMonthAfterYear = 1;
            $sMonthName = eme_localised_date($eme_date_obj->getDate(), 'F');
            $yearSuffix = "년";
            break;
        case "zh":
            $showMonthAfterYear = 1;
            $sMonthName = eme_localised_date($eme_date_obj->getDate(), 'F');
            $yearSuffix = "年";
            break;
    }
    if ($showMonthAfterYear) {
        $cal_datestring = "{$iSelectedYear}{$yearSuffix} {$sMonthName}";
    } else {
        $cal_datestring = "{$sMonthName} {$iSelectedYear}{$yearSuffix}";
    }
    // Get previous year and month
    $iPrevYear = $iSelectedYear;
    $iPrevMonth = $iSelectedMonth - 1;
    if ($iPrevMonth <= 0) {
        $iPrevYear--;
        $iPrevMonth = 12;
        // set to December
    }
    $iPrevMonth = sprintf("%02d", $iPrevMonth);
    // Get next year and month
    $iNextYear = $iSelectedYear;
    $iNextMonth = $iSelectedMonth + 1;
    if ($iNextMonth > 12) {
        $iNextYear++;
        $iNextMonth = 1;
    }
    $iNextMonth = sprintf("%02d", $iNextMonth);
    // Get number of days of previous month
    $eme_date_obj2 = new ExpressiveDate(null, $eme_timezone);
    $eme_date_obj2->setDay(1);
    $eme_date_obj2->setMonth($iPrevMonth);
    $eme_date_obj2->setYear($iPrevYear);
    $iPrevDaysInMonth = (int) $eme_date_obj2->getDaysInMonth();
    // Get numeric representation of the day of the week of the first day of specified (current) month
    // remember: first day of week is a Sunday
    // if you want the day of the week to begin on Monday: start_of_week=1, Tuesday: start_of_week=2, etc ...
    // So, if e.g. the month starts on a Sunday and start_of_week=1 (Monday), then $iFirstDayDow is 6
    $iFirstDayDow = (int) $eme_date_obj->getDayOfWeekAsNumeric() - $start_of_week;
    if ($iFirstDayDow < 0) {
        $iFirstDayDow += 7;
    }
    // On what day the previous month begins
    $iPrevShowFrom = $iPrevDaysInMonth - $iFirstDayDow + 1;
    // we'll look for events in the requested month and 7 days before and after
    $calbegin = "{$iPrevYear}-{$iPrevMonth}-{$iPrevShowFrom}";
    $calend = "{$iNextYear}-{$iNextMonth}-07";
    $events = eme_get_events(0, "{$calbegin}--{$calend}", "ASC", 0, $location_id, $category, $author, $contact_person, 1, $notcategory);
    $eventful_days = array();
    if ($events) {
        //Go through the events and slot them into the right d-m index
        foreach ($events as $event) {
            if ($event['event_status'] == STATUS_PRIVATE && !is_user_logged_in()) {
                continue;
            }
            $eme_date_obj_end = new ExpressiveDate($event['event_end_date'] . " " . $event['event_end_time'], $eme_timezone);
            $eme_date_obj_now = new ExpressiveDate(null, $eme_timezone);
            if (get_option('eme_cal_hide_past_events') && $eme_date_obj_end->lessThan($eme_date_obj_now)) {
                continue;
            }
            if ($long_events) {
                //If $long_events is set then show a date as eventful if there is an multi-day event which runs during that day
                $eme_date_obj_tmp = new ExpressiveDate($event['event_start_date'] . " " . $event['event_start_time'], $eme_timezone);
                if ($eme_date_obj_end->lessThan($eme_date_obj_tmp)) {
                    $eme_date_obj_end = $eme_date_obj_tmp->copy();
                }
                $day_count = 0;
                while ($eme_date_obj_tmp->lessOrEqualTo($eme_date_obj_end)) {
                    $event_eventful_date = $eme_date_obj_tmp->getDate();
                    //Only show events on the day that they start
                    if (isset($eventful_days[$event_eventful_date]) && is_array($eventful_days[$event_eventful_date])) {
                        $eventful_days[$event_eventful_date][] = $event;
                    } else {
                        $eventful_days[$event_eventful_date] = array($event);
                    }
                    $eme_date_obj_tmp->addOneDay();
                }
            } else {
                //Only show events on the day that they start
                if (isset($eventful_days[$event['event_start_date']]) && is_array($eventful_days[$event['event_start_date']])) {
                    $eventful_days[$event['event_start_date']][] = $event;
                } else {
                    $eventful_days[$event['event_start_date']] = array($event);
                }
            }
        }
    }
    // we found all the events for the wanted days, now get them in the correct format with a good link
    if ($template_id) {
        $event_format = eme_get_template_format($template_id);
    } else {
        $event_format = get_option('eme_full_calendar_event_format');
    }
    $event_title_format = get_option('eme_small_calendar_event_title_format');
    $event_title_separator_format = get_option('eme_small_calendar_event_title_separator');
    $cells = array();
    foreach ($eventful_days as $day_key => $events) {
        // Set the date into the key
        $events_titles = array();
        foreach ($events as $event) {
            $events_titles[] = eme_replace_placeholders($event_title_format, $event, "text");
        }
        $link_title = implode($event_title_separator_format, $events_titles);
        $cal_day_link = eme_calendar_day_url($day_key);
        // Let's add the possible options
        // template_id is not being used per event
        if (!empty($location_id)) {
            $cal_day_link = add_query_arg(array('location_id' => $location_id), $cal_day_link);
        }
        if (!empty($category)) {
            $cal_day_link = add_query_arg(array('category' => $category), $cal_day_link);
        }
        if (!empty($notcategory)) {
            $cal_day_link = add_query_arg(array('notcategory' => $scope), $cal_day_link);
        }
        if (!empty($author)) {
            $cal_day_link = add_query_arg(array('author' => $author), $cal_day_link);
        }
        if (!empty($contact_person)) {
            $cal_day_link = add_query_arg(array('contact_person' => $contact_person), $cal_day_link);
        }
        $event_date = explode('-', $day_key);
        $event_day = ltrim($event_date[2], '0');
        $cells[$day_key] = "<a title='{$link_title}' href='{$cal_day_link}'>{$event_day}</a>";
        if ($full) {
            $cells[$day_key] .= "<ul class='eme-calendar-day-event'>";
            foreach ($events as $event) {
                $cells[$day_key] .= eme_replace_placeholders($event_format, $event);
            }
            $cells[$day_key] .= "</ul>";
        }
    }
    // If previous month
    $isPreviousMonth = $iFirstDayDow > 0;
    // Initial day on the calendar
    $iCalendarDay = $isPreviousMonth ? $iPrevShowFrom : 1;
    $isNextMonth = false;
    $sCalTblRows = '';
    // Generate rows for the calendar
    for ($i = 0; $i < 6; $i++) {
        // 6-weeks range
        if ($isNextMonth) {
            continue;
        }
        $sCalTblRows .= "<tr>";
        for ($j = 0; $j < 7; $j++) {
            // 7 days a week
            // we need the calendar day with 2 digits for the planned events
            $iCalendarDay_padded = sprintf("%02d", $iCalendarDay);
            if ($isPreviousMonth) {
                $calstring = "{$iPrevYear}-{$iPrevMonth}-{$iCalendarDay_padded}";
            } elseif ($isNextMonth) {
                $calstring = "{$iNextYear}-{$iNextMonth}-{$iCalendarDay_padded}";
            } else {
                $calstring = "{$iSelectedYear}-{$iSelectedMonth}-{$iCalendarDay_padded}";
            }
            // each day in the calendar has the name of the day as a class by default
            $eme_date_obj = new ExpressiveDate($calstring, $eme_timezone);
            $sClass = $eme_date_obj->format('D');
            if (isset($cells[$calstring])) {
                if ($isPreviousMonth) {
                    $sClass .= " eventful-pre event-day-{$iCalendarDay}";
                } elseif ($isNextMonth) {
                    $sClass .= " eventful-post event-day-{$iCalendarDay}";
                } elseif ($calstring == "{$iNowYear}-{$iNowMonth}-{$iNowDay}") {
                    $sClass .= " eventful-today event-day-{$iCalendarDay}";
                } else {
                    $sClass .= " eventful event-day-{$iCalendarDay}";
                }
                $sCalTblRows .= '<td class="' . $sClass . '">' . $cells[$calstring] . "</td>\n";
            } else {
                if ($isPreviousMonth) {
                    $sClass .= " eventless-pre";
                } elseif ($isNextMonth) {
                    $sClass .= " eventless-post";
                } elseif ($calstring == "{$iNowYear}-{$iNowMonth}-{$iNowDay}") {
                    $sClass .= " eventless-today";
                } else {
                    $sClass .= " eventless";
                }
                $sCalTblRows .= '<td class="' . $sClass . '">' . $iCalendarDay . "</td>\n";
            }
            // Next day
            $iCalendarDay++;
            if ($isPreviousMonth && $iCalendarDay > $iPrevDaysInMonth) {
                $isPreviousMonth = false;
                $iCalendarDay = 1;
            }
            if (!$isPreviousMonth && !$isNextMonth && $iCalendarDay > $iDaysInMonth) {
                $isNextMonth = true;
                $iCalendarDay = 1;
            }
        }
        $sCalTblRows .= "</tr>\n";
    }
    $weekdays = array(__('Sunday'), __('Monday'), __('Tuesday'), __('Wednesday'), __('Thursday'), __('Friday'), __('Saturday'));
    $sCalDayNames = "";
    // respect the beginning of the week offset
    for ($i = $start_of_week; $i < $start_of_week + 7; $i++) {
        $j = $i;
        if ($j == 7) {
            $j -= 7;
        }
        if ($full) {
            $sCalDayNames .= "<td>" . $wp_locale->get_weekday_abbrev($weekdays[$j]) . "</td>";
        } else {
            $sCalDayNames .= "<td>" . $wp_locale->get_weekday_initial($weekdays[$j]) . "</td>";
        }
    }
    // the real links are created via jquery when clicking on the prev-month or next-month class-links
    $previous_link = "<a class='prev-month' href=\"#\">&lt;&lt;</a>";
    $next_link = "<a class='next-month' href=\"#\">&gt;&gt;</a>";
    $random = rand(100, 200);
    $full ? $class = 'eme-calendar-full' : ($class = 'eme-calendar');
    $calendar = "<div class='{$class}' id='eme-calendar-{$random}'>";
    if ($full) {
        $fullclass = 'fullcalendar';
        $head = "<td class='month_name' colspan='7'>{$previous_link} {$next_link} {$cal_datestring}</td>\n";
    } else {
        $fullclass = '';
        $head = "<td>{$previous_link}</td><td class='month_name' colspan='5'>{$cal_datestring}</td><td>{$next_link}</td>\n";
    }
    // Build the heading portion of the calendar table
    $calendar .= "<table class='eme-calendar-table {$fullclass}'>\n" . "<thead>\n<tr>\n" . $head . "</tr>\n</thead>\n" . "<tr class='days-names'>\n" . $sCalDayNames . "</tr>\n";
    $calendar .= $sCalTblRows;
    $calendar .= "</table>\n</div>";
    // we generate the onclick javascript per calendar div
    // this is important if more than one calendar exists on the page
    $calendar .= "<script type='text/javascript'>\n         jQuery('#eme-calendar-" . $random . " a.prev-month').click(function(e){\n            e.preventDefault();\n            tableDiv = jQuery('#eme-calendar-" . $random . "');\n            loadCalendar(tableDiv, '{$full}', '{$long_events}','{$iPrevMonth}','{$iPrevYear}','{$category}','{$author}','{$contact_person}','{$location_id}','{$notcategory}','{$template_id}');\n         } );\n         jQuery('#eme-calendar-" . $random . " a.next-month').click(function(e){\n            e.preventDefault();\n            tableDiv = jQuery('#eme-calendar-" . $random . "');\n            loadCalendar(tableDiv, '{$full}', '{$long_events}','{$iNextMonth}','{$iNextYear}','{$category}','{$author}','{$contact_person}','{$location_id}','{$notcategory}','{$template_id}');\n         } );\n         </script>";
    $output = $calendar;
    if ($echo) {
        echo $output;
    } else {
        return $output;
    }
}