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;
}
}