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='#'><< {$prev_text}</a>"; } else { $pagination_top .= "<a class='eme_nav_left' href='" . add_query_arg(array('eme_offset' => $backward), $this_page_url) . "'><< {$prev_text}</a>"; } $pagination_top .= "<a class='eme_nav_right' href='" . add_query_arg(array('eme_offset' => $forward), $this_page_url) . "'>{$next_text} >></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='#'><< {$prev_text}</a>"; } else { $pagination_top .= "<a class='eme_nav_left' href='" . add_query_arg(array('eme_offset' => $backward), $this_page_url) . "'><< {$prev_text}</a>"; } $pagination_top .= "<a class='eme_nav_right' {$nav_hidden_class} href='#'>{$next_text} >></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) . "'><< {$prev_text}</a>"; } else { $pagination_top .= "<a class='eme_nav_left' {$nav_hidden_class} href='#'><< {$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} >></a>"; } else { $pagination_top .= "<a class='eme_nav_right' {$nav_hidden_class} href='#'>{$next_text} >></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; } }
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=\"#\"><<</a>"; $next_link = "<a class='next-month' href=\"#\">>></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; } }