예제 #1
0
function ShowMyCalendar()
{
    global $sourcedir, $options, $modSettings, $scripturl, $txt, $context, $settings, $boardurl, $smcFunc, $adkFolder;
    //My Own Require
    require_once $sourcedir . '/Subs-Calendar.php';
    $today = getTodayInfo();
    $curPage = array('day' => $today['day'], 'month' => $today['month'], 'year' => $today['year']);
    $calendarOptions = array('start_day' => !empty($options['calendar_start_day']) ? $options['calendar_start_day'] : 0, 'show_birthdays' => in_array($modSettings['cal_showbdays'], array(1, 2)), 'show_events' => true, 'show_holidays' => true, 'show_week_num' => true, 'short_day_titles' => true, 'show_next_prev' => true, 'show_week_links' => false, 'size' => 'small');
    $my_array = array();
    $context['calendar_grid_main'] = getCalendarGrid($curPage['month'], $curPage['year'], $calendarOptions);
    $calendar_data =& $context['calendar_grid_main'];
    $colspan = !empty($calendar_data['show_week_links']) ? 8 : 7;
    if (empty($calendar_data['disable_title'])) {
        echo '
				<div class="adk_padding_5" align="center">';
        if (empty($calendar_data['previous_calendar']['disabled']) && $calendar_data['show_next_prev']) {
            echo '
					<span class="floatleft"><a href="' . $calendar_data['previous_calendar']['href'] . '">&#171;</a></span>';
        }
        if (empty($calendar_data['next_calendar']['disabled']) && $calendar_data['show_next_prev']) {
            echo '
					<span class="floatright"><a href="' . $calendar_data['next_calendar']['href'] . '">&#187;</a></span>';
        }
        if ($calendar_data['show_next_prev']) {
            echo '
					' . $txt['months_titles'][$calendar_data['current_month']] . ' ' . $calendar_data['current_year'];
        } else {
            echo '
					' . $txt['months_titles'][$calendar_data['current_month']] . ' ' . $calendar_data['current_year'] . '';
        }
        echo '<hr />
				</div>';
    }
    echo '
				<table align="center" class="calendar_table" style="table-layout:fixed;width:100%;">';
    // Show each day of the week.
    if (empty($calendar_data['disable_day_titles'])) {
        echo '
					<tr>';
        if (!empty($calendar_data['show_week_links'])) {
            echo '
						<td class="">&nbsp;</td>';
        }
        foreach ($calendar_data['week_days'] as $day) {
            echo '
						<th class=" days" scope="col" ' . ($calendar_data['size'] == 'small' ? 'style="font-size: x-small;"' : '') . '>' . (!empty($calendar_data['short_day_titles']) ? $smcFunc['substr']($txt['days_short'][$day], 0, 1) : $txt['days'][$day]) . '</th>';
        }
        echo '
					</tr>';
    }
    foreach ($calendar_data['weeks'] as $week) {
        echo '
					<tr>';
        if (!empty($calendar_data['show_week_links'])) {
            echo '
						<td align="center">
							<a href="' . $scripturl . '?action=calendar;viewweek;year=' . $calendar_data['current_year'] . ';month=' . $calendar_data['current_month'] . ';day=' . $week['days'][0]['day'] . '">&#187;</a>
						</td>';
        }
        foreach ($week['days'] as $day) {
            echo '
						<td align="center" style="height: ' . ($calendar_data['size'] == 'small' ? '20' : '100') . 'px; padding: 2px;' . ($calendar_data['size'] == 'small' ? 'font-size: x-small;' : '') . '" class="' . ($day['is_today'] ? 'windowbg' : '') . ' days">';
            if (!empty($day['day'])) {
                if (!empty($day['holidays']) || !empty($day['birthdays']) || !empty($day['events'])) {
                    $my_array[$day['day']]['day'] = $day['day'];
                    echo '
					<a href="javascript:ShowAdkCalendar(\'day_' . $day['day'] . '\')" class="birthday" style="color: #920ac4; font-weight: bold;">';
                }
                echo $day['day'];
                if (!empty($day['holidays']) || !empty($day['birthdays']) || !empty($day['events'])) {
                    echo '
				</a>';
                }
                if (!empty($day['holidays'])) {
                    $my_array[$day['day']]['event'][] = '<img style="vertical-align: middle;" src="' . $adkFolder['images'] . '/calendar.png" alt="" />&nbsp;<span class="holiday smalltext">' . $txt['calendar_prompt'] . ' ' . implode(', ', $day['holidays']) . '</span>';
                }
                if (!empty($day['birthdays'])) {
                    foreach ($day['birthdays'] as $member) {
                        $my_array[$day['day']]['event'][] = '
					<img style="vertical-align: middle;" src="' . $adkFolder['images'] . '/cake.png" alt="" />&nbsp;
					<a class="smalltext" href="' . $scripturl . '?action=profile;u=' . $member['id'] . '">' . $member['name'] . (isset($member['age']) ? ' (' . $member['age'] . ')' : '') . '</a>';
                    }
                }
                if (!empty($day['events'])) {
                    foreach ($day['events'] as $event) {
                        $my_array[$day['day']]['event'][] = '<img style="vertical-align: middle;" src="' . $adkFolder['images'] . '/calendar.png" alt="" />&nbsp;
						' . $event['link'];
                    }
                }
            }
            echo '
						</td>';
        }
        echo '
					</tr>';
    }
    echo '
				</table>';
    if (!empty($my_array)) {
        echo '
		<script type="text/javascript">
			function ShowAdkCalendar(id) {
			if(document.getElementById(id).style.display == "none"){
				document.getElementById(id).style.display = "block";
			}
			else{
				document.getElementById(id).style.display = "none";
			}
		}
		</script>
		<hr />';
        $true_days = array();
        foreach ($my_array as $event) {
            echo '
			
			<div id="day_' . $event['day'] . '" style="display: none;">
			<strong class="smalltext">' . $txt['calendar_day'] . ' ' . $event['day'] . '</strong>';
            foreach ($event['event'] as $num => $e) {
                echo '<br />' . $e;
            }
            echo '
			</div>';
        }
    }
    echo '
	<div class="adk_height_1"></div>';
}
예제 #2
0
function CalendarMain()
{
    global $txt, $context, $modSettings, $scripturl, $options, $sourcedir;
    // Permissions, permissions, permissions.
    isAllowedTo('calendar_view');
    // Doing something other than calendar viewing?
    $subActions = array('ical' => 'iCalDownload', 'post' => 'CalendarPost');
    if (isset($_GET['sa']) && isset($subActions[$_GET['sa']]) && !WIRELESS) {
        return $subActions[$_GET['sa']]();
    }
    // This is gonna be needed...
    loadTemplate('Calendar');
    // You can't do anything if the calendar is off.
    if (empty($modSettings['cal_enabled'])) {
        fatal_lang_error('calendar_off', false);
    }
    // Set the page title to mention the calendar ;).
    $context['page_title'] = $txt['calendar'];
    // Is this a week view?
    $context['view_week'] = isset($_GET['viewweek']);
    // Don't let search engines index weekly calendar pages.
    if ($context['view_week']) {
        $context['robot_no_index'] = true;
    }
    // Get the current day of month...
    require_once $sourcedir . '/Subs-Calendar.php';
    $today = getTodayInfo();
    // If the month and year are not passed in, use today's date as a starting point.
    $curPage = array('day' => isset($_REQUEST['day']) ? (int) $_REQUEST['day'] : $today['day'], 'month' => isset($_REQUEST['month']) ? (int) $_REQUEST['month'] : $today['month'], 'year' => isset($_REQUEST['year']) ? (int) $_REQUEST['year'] : $today['year']);
    // Make sure the year and month are in valid ranges.
    if ($curPage['month'] < 1 || $curPage['month'] > 12) {
        fatal_lang_error('invalid_month', false);
    }
    if ($curPage['year'] < $modSettings['cal_minyear'] || $curPage['year'] > $modSettings['cal_maxyear']) {
        fatal_lang_error('invalid_year', false);
    }
    // If we have a day clean that too.
    if ($context['view_week']) {
        // Note $isValid is -1 < PHP 5.1
        $isValid = mktime(0, 0, 0, $curPage['month'], $curPage['day'], $curPage['year']);
        if ($curPage['day'] > 31 || !$isValid || $isValid == -1) {
            fatal_lang_error('invalid_day', false);
        }
    }
    // Load all the context information needed to show the calendar grid.
    $calendarOptions = array('start_day' => !empty($options['calendar_start_day']) ? $options['calendar_start_day'] : 0, 'show_birthdays' => in_array($modSettings['cal_showbdays'], array(1, 2)), 'show_events' => in_array($modSettings['cal_showevents'], array(1, 2)), 'show_holidays' => in_array($modSettings['cal_showholidays'], array(1, 2)), 'show_week_num' => true, 'short_day_titles' => false, 'show_next_prev' => true, 'show_week_links' => true, 'size' => 'large');
    // Load up the main view.
    if ($context['view_week']) {
        $context['calendar_grid_main'] = getCalendarWeek($curPage['month'], $curPage['year'], $curPage['day'], $calendarOptions);
    } else {
        $context['calendar_grid_main'] = getCalendarGrid($curPage['month'], $curPage['year'], $calendarOptions);
    }
    // Load up the previous and next months.
    $calendarOptions['show_birthdays'] = $calendarOptions['show_events'] = $calendarOptions['show_holidays'] = false;
    $calendarOptions['short_day_titles'] = true;
    $calendarOptions['show_next_prev'] = false;
    $calendarOptions['show_week_links'] = false;
    $calendarOptions['size'] = 'small';
    $context['calendar_grid_current'] = getCalendarGrid($curPage['month'], $curPage['year'], $calendarOptions);
    // Only show previous month if it isn't pre-January of the min-year
    if ($context['calendar_grid_current']['previous_calendar']['year'] > $modSettings['cal_minyear'] || $curPage['month'] != 1) {
        $context['calendar_grid_prev'] = getCalendarGrid($context['calendar_grid_current']['previous_calendar']['month'], $context['calendar_grid_current']['previous_calendar']['year'], $calendarOptions);
    }
    // Only show next month if it isn't post-December of the max-year
    if ($context['calendar_grid_current']['next_calendar']['year'] < $modSettings['cal_maxyear'] || $curPage['month'] != 12) {
        $context['calendar_grid_next'] = getCalendarGrid($context['calendar_grid_current']['next_calendar']['month'], $context['calendar_grid_current']['next_calendar']['year'], $calendarOptions);
    }
    // Basic template stuff.
    $context['can_post'] = allowedTo('calendar_post');
    $context['current_day'] = $curPage['day'];
    $context['current_month'] = $curPage['month'];
    $context['current_year'] = $curPage['year'];
    $context['show_all_birthdays'] = isset($_GET['showbd']);
    // Set the page title to mention the month or week, too
    $context['page_title'] .= ' - ' . ($context['view_week'] ? sprintf($txt['calendar_week_title'], $context['calendar_grid_main']['week_number'], $context['calendar_grid_main']['week_number'] == 53 ? $context['current_year'] - 1 : $context['current_year']) : $txt['months'][$context['current_month']] . ' ' . $context['current_year']);
    // Load up the linktree!
    $context['linktree'][] = array('url' => $scripturl . '?action=calendar', 'name' => $txt['calendar']);
    // Add the current month to the linktree.
    $context['linktree'][] = array('url' => $scripturl . '?action=calendar;year=' . $context['current_year'] . ';month=' . $context['current_month'], 'name' => $txt['months'][$context['current_month']] . ' ' . $context['current_year']);
    // If applicable, add the current week to the linktree.
    if ($context['view_week']) {
        $context['linktree'][] = array('url' => $scripturl . '?action=calendar;viewweek;year=' . $context['current_year'] . ';month=' . $context['current_month'] . ';day=' . $context['current_day'], 'name' => $txt['calendar_week'] . ' ' . $context['calendar_grid_main']['week_number']);
    }
}
function sp_calendar($parameters, $id, $return_parameters = false)
{
    global $context, $sourcedir, $modSettings, $options, $scripturl, $txt;
    $block_parameters = array('events' => 'check', 'birthdays' => 'check', 'holidays' => 'check');
    if ($return_parameters) {
        return $block_parameters;
    }
    require_once $sourcedir . '/Subs-Calendar.php';
    $today = getTodayInfo();
    $curPage = array('day' => $today['day'], 'month' => $today['month'], 'year' => $today['year']);
    $calendarOptions = array('start_day' => !empty($options['calendar_start_day']) ? $options['calendar_start_day'] : 0, 'show_week_num' => false, 'show_events' => !empty($parameters['events']), 'show_birthdays' => !empty($parameters['birthdays']), 'show_holidays' => !empty($parameters['holidays']));
    $calendar_data = getCalendarGrid($curPage['month'], $curPage['year'], $calendarOptions);
    echo '
								<table class="sp_acalendar smalltext">
									<tr>
										<td class="sp_center" colspan="7">
											', !empty($modSettings['cal_enabled']) ? '<a href="' . $scripturl . '?action=calendar;year=' . $calendar_data['current_year'] . ';month=' . $calendar_data['current_month'] . '">' . $txt['months_titles'][$calendar_data['current_month']] . ' ' . $calendar_data['current_year'] . '</a>' : $txt['months_titles'][$calendar_data['current_month']] . ' ' . $calendar_data['current_year'], '
										</td>
									</tr><tr>';
    foreach ($calendar_data['week_days'] as $day) {
        echo '
										<td class="sp_center">', $txt['days_short'][$day], '</td>';
    }
    echo '
									</tr>';
    foreach ($calendar_data['weeks'] as $week_key => $week) {
        echo '<tr>';
        foreach ($week['days'] as $day_key => $day) {
            echo '
										<td class="sp_acalendar_day">';
            if (empty($day['day'])) {
                unset($calendar_data['weeks'][$week_key]['days'][$day_key]);
            } else {
                if (!empty($day['holidays']) || !empty($day['birthdays']) || !empty($day['events'])) {
                    echo '<a href="#day" onclick="return sp_collapseCalendar(\'', $day['day'], '\');"><strong>', $day['is_today'] ? '[' : '', $day['day'], $day['is_today'] ? ']' : '', '</strong></a>';
                } else {
                    echo '<a href="#day" onclick="return sp_collapseCalendar(\'0\');">', $day['is_today'] ? '[' : '', $day['day'], $day['is_today'] ? ']' : '', '</a>';
                }
            }
            echo '</td>';
        }
        echo '
									</tr>';
    }
    echo '
								</table>
								<hr class="sp_acalendar_divider" />';
    foreach ($calendar_data['weeks'] as $week) {
        foreach ($week['days'] as $day) {
            if (empty($day['holidays']) && empty($day['birthdays']) && empty($day['events']) && !$day['is_today']) {
                continue;
            } elseif (empty($day['holidays']) && empty($day['birthdays']) && empty($day['events'])) {
                echo '
								<div class="sp_center smalltext" id="sp_calendar_', $day['day'], '">', $txt['error_sp_no_items_day'], '</div>';
                continue;
            }
            echo '
								<ul class="sp_list smalltext" id="sp_calendar_', $day['day'], '" ', !$day['is_today'] ? ' style="display: none;"' : '', '>';
            if (!empty($day['holidays'])) {
                echo '
									<li class="sp_center"><strong>- ', $txt['sp_calendar_holidays'], ' -</strong></li>';
                foreach ($day['holidays'] as $key => $holiday) {
                    echo '
									<li class="sp_list_indent">', sp_embed_image('holiday'), ' ', $holiday, '</li>';
                }
            }
            if (!empty($day['birthdays'])) {
                echo '
									<li class="sp_center"><strong>- ', $txt['sp_calendar_birthdays'], ' -</strong></li>';
                foreach ($day['birthdays'] as $member) {
                    echo '
									<li class="sp_list_indent">', sp_embed_image('birthday'), ' <a href="', $scripturl, '?action=profile;u=', $member['id'], '">', $member['name'], isset($member['age']) ? ' (' . $member['age'] . ')' : '', '</a></li>';
                }
            }
            if (!empty($day['events'])) {
                echo '
									<li class="sp_center"><strong>- ', $txt['sp_calendar_events'], ' -</strong></li>';
                foreach ($day['events'] as $event) {
                    echo '
									<li class="sp_list_indent">', sp_embed_image('event'), ' ', $event['link'], '</li>';
                }
            }
            echo '
								</ul>';
        }
    }
    echo '
								<div class="sp_center smalltext" id="sp_calendar_0" style="display: none;">', $txt['error_sp_no_items_day'], '</div>
								<script language="JavaScript" type="text/javascript"><!-- // --><![CDATA[
									var current_day = "sp_calendar_', $curPage['day'], '";
									function sp_collapseCalendar(id)
									{
										new_day = "sp_calendar_" + id;
										if (new_day == current_day)
											return false;
										document.getElementById(current_day).style.display = "none";
										document.getElementById(new_day).style.display = "";
										current_day = new_day;
									}
									// ]]></script>';
}
예제 #4
0
/**
 * cache callback function used to retrieve the upcoming birthdays, holidays, and events
 * within the given period, taking into account the users time offset.
 *
 * - Called from the BoardIndex to display the current day's events on the board index
 * - used by the board index and SSI to show the upcoming events.
 *
 * @package Calendar
 * @param mixed[] $eventOptions
 * @return array
 */
function cache_getRecentEvents($eventOptions)
{
    // With the 'static' cached data we can calculate the user-specific data.
    $cached_data = cache_quick_get('calendar_index', 'subs/Calendar.subs.php', 'cache_getOffsetIndependentEvents', array($eventOptions['num_days_shown']));
    // Get the information about today (from user perspective).
    $today = getTodayInfo();
    $return_data = array('calendar_holidays' => array(), 'calendar_birthdays' => array(), 'calendar_events' => array());
    // Set the event span to be shown in seconds.
    $days_for_index = $eventOptions['num_days_shown'] * 86400;
    // Get the current member time/date.
    $now = forum_time();
    // Holidays between now and now + days.
    for ($i = $now; $i < $now + $days_for_index; $i += 86400) {
        if (isset($cached_data['holidays'][strftime('%Y-%m-%d', $i)])) {
            $return_data['calendar_holidays'] = array_merge($return_data['calendar_holidays'], $cached_data['holidays'][strftime('%Y-%m-%d', $i)]);
        }
    }
    // Happy Birthday, guys and gals!
    for ($i = $now; $i < $now + $days_for_index; $i += 86400) {
        $loop_date = strftime('%Y-%m-%d', $i);
        if (isset($cached_data['birthdays'][$loop_date])) {
            foreach ($cached_data['birthdays'][$loop_date] as $index => $dummy) {
                $cached_data['birthdays'][strftime('%Y-%m-%d', $i)][$index]['is_today'] = $loop_date === $today['date'];
            }
            $return_data['calendar_birthdays'] = array_merge($return_data['calendar_birthdays'], $cached_data['birthdays'][$loop_date]);
        }
    }
    $duplicates = array();
    for ($i = $now; $i < $now + $days_for_index; $i += 86400) {
        // Determine the date of the current loop step.
        $loop_date = strftime('%Y-%m-%d', $i);
        // No events today? Check the next day.
        if (empty($cached_data['events'][$loop_date])) {
            continue;
        }
        // Loop through all events to add a few last-minute values.
        foreach ($cached_data['events'][$loop_date] as $ev => $event) {
            // Create a shortcut variable for easier access.
            $this_event =& $cached_data['events'][$loop_date][$ev];
            // Skip duplicates.
            if (isset($duplicates[$this_event['topic'] . $this_event['title']])) {
                unset($cached_data['events'][$loop_date][$ev]);
                continue;
            } else {
                $duplicates[$this_event['topic'] . $this_event['title']] = true;
            }
            // Might be set to true afterwards, depending on the permissions.
            $this_event['can_edit'] = false;
            $this_event['is_today'] = $loop_date === $today['date'];
            $this_event['date'] = $loop_date;
        }
        if (!empty($cached_data['events'][$loop_date])) {
            $return_data['calendar_events'] = array_merge($return_data['calendar_events'], $cached_data['events'][$loop_date]);
        }
    }
    // Mark the last item so that a list separator can be used in the template.
    for ($i = 0, $n = count($return_data['calendar_birthdays']); $i < $n; $i++) {
        $return_data['calendar_birthdays'][$i]['is_last'] = !isset($return_data['calendar_birthdays'][$i + 1]);
    }
    for ($i = 0, $n = count($return_data['calendar_events']); $i < $n; $i++) {
        $return_data['calendar_events'][$i]['is_last'] = !isset($return_data['calendar_events'][$i + 1]);
    }
    return array('data' => $return_data, 'expires' => time() + 3600, 'refresh_eval' => 'return \'' . strftime('%Y%m%d', forum_time(false)) . '\' != strftime(\'%Y%m%d\', forum_time(false)) || (!empty($modSettings[\'calendar_updated\']) && ' . time() . ' < $modSettings[\'calendar_updated\']);', 'post_retri_eval' => '
			global $context, $scripturl, $user_info;

			foreach ($cache_block[\'data\'][\'calendar_events\'] as $k => $event)
			{
				// Remove events that the user may not see or wants to ignore.
				if ((count(array_intersect($user_info[\'groups\'], $event[\'allowed_groups\'])) === 0 && !allowedTo(\'admin_forum\') && !empty($event[\'id_board\'])) || in_array($event[\'id_board\'], $user_info[\'ignoreboards\']))
					unset($cache_block[\'data\'][\'calendar_events\'][$k]);
				else
				{
					// Whether the event can be edited depends on the permissions.
					$cache_block[\'data\'][\'calendar_events\'][$k][\'can_edit\'] = allowedTo(\'calendar_edit_any\') || ($event[\'poster\'] == $user_info[\'id\'] && allowedTo(\'calendar_edit_own\'));

					// The added session code makes this URL not cachable.
					$cache_block[\'data\'][\'calendar_events\'][$k][\'modify_href\'] = $scripturl . \'?action=\' . ($event[\'topic\'] == 0 ? \'calendar;sa=post;\' : \'post;msg=\' . $event[\'msg\'] . \';topic=\' . $event[\'topic\'] . \'.0;calendar;\') . \'eventid=\' . $event[\'id\'] . \';\' . $context[\'session_var\'] . \'=\' . $context[\'session_id\'];
				}
			}

			if (empty($params[0][\'include_holidays\']))
				$cache_block[\'data\'][\'calendar_holidays\'] = array();
			if (empty($params[0][\'include_birthdays\']))
				$cache_block[\'data\'][\'calendar_birthdays\'] = array();
			if (empty($params[0][\'include_events\']))
				$cache_block[\'data\'][\'calendar_events\'] = array();

			$cache_block[\'data\'][\'show_calendar\'] = !empty($cache_block[\'data\'][\'calendar_holidays\']) || !empty($cache_block[\'data\'][\'calendar_birthdays\']) || !empty($cache_block[\'data\'][\'calendar_events\']);');
}
/**
 * Calendar Block, Displays a full calendar block
 *
 * @param mixed[] $parameters
 *		'events' => show events
 *		'birthdays' => show birthdays
 *		'holidays' => show holidays
 * @param int $id - not used in this block
 * @param boolean $return_parameters if true returns the configuration options for the block
 */
function sp_calendar($parameters, $id, $return_parameters = false)
{
    global $modSettings, $options, $scripturl, $txt;
    $block_parameters = array('events' => 'check', 'birthdays' => 'check', 'holidays' => 'check');
    if ($return_parameters) {
        return $block_parameters;
    }
    require_once SUBSDIR . '/Calendar.subs.php';
    $today = getTodayInfo();
    $curPage = array('day' => $today['day'], 'month' => $today['month'], 'year' => $today['year']);
    $calendarOptions = array('start_day' => !empty($options['calendar_start_day']) ? $options['calendar_start_day'] : 0, 'show_week_num' => false, 'show_events' => !empty($parameters['events']), 'show_birthdays' => !empty($parameters['birthdays']), 'show_holidays' => !empty($parameters['holidays']));
    // Check cache or fetch
    if (($calendar_data = cache_get_data('sp_calendar_data', 360)) === null) {
        $calendar_data = getCalendarGrid($curPage['month'], $curPage['year'], $calendarOptions);
        cache_put_data('sp_calendar_data', $calendar_data, 360);
    }
    // Output the calendar block
    echo '
								<table class="sp_acalendar smalltext">
									<tr>
										<td class="centertext" colspan="7">
											', !empty($modSettings['cal_enabled']) ? '<a href="' . $scripturl . '?action=calendar;year=' . $calendar_data['current_year'] . ';month=' . $calendar_data['current_month'] . '">' . $txt['months_titles'][$calendar_data['current_month']] . ' ' . $calendar_data['current_year'] . '</a>' : $txt['months_titles'][$calendar_data['current_month']] . ' ' . $calendar_data['current_year'], '
										</td>
									</tr><tr>';
    foreach ($calendar_data['week_days'] as $day) {
        echo '
										<td class="centertext">', $txt['days_short'][$day], '</td>';
    }
    echo '
									</tr>';
    foreach ($calendar_data['weeks'] as $week_key => $week) {
        echo '<tr>';
        foreach ($week['days'] as $day_key => $day) {
            echo '
										<td class="sp_acalendar_day">';
            if (empty($day['day'])) {
                unset($calendar_data['weeks'][$week_key]['days'][$day_key]);
            } else {
                if (!empty($day['holidays']) || !empty($day['birthdays']) || !empty($day['events'])) {
                    echo '<a href="#day" onclick="return sp_collapseCalendar(\'', $day['day'], '\');"><strong>', $day['is_today'] ? '[' : '', $day['day'], $day['is_today'] ? ']' : '', '</strong></a>';
                } else {
                    echo '<a href="#day" onclick="return sp_collapseCalendar(\'0\');">', $day['is_today'] ? '[' : '', $day['day'], $day['is_today'] ? ']' : '', '</a>';
                }
            }
            echo '</td>';
        }
        echo '
									</tr>';
    }
    echo '
								</table>
								<hr class="sp_acalendar_divider" />';
    foreach ($calendar_data['weeks'] as $week) {
        foreach ($week['days'] as $day) {
            if (empty($day['holidays']) && empty($day['birthdays']) && empty($day['events']) && !$day['is_today']) {
                continue;
            } elseif (empty($day['holidays']) && empty($day['birthdays']) && empty($day['events'])) {
                echo '
								<div class="centertext smalltext" id="sp_calendar_', $day['day'], '">', $txt['error_sp_no_items_day'], '</div>';
                continue;
            }
            echo '
								<ul class="sp_list smalltext" id="sp_calendar_', $day['day'], '" ', !$day['is_today'] ? ' style="display: none;"' : '', '>';
            if (!empty($day['holidays'])) {
                echo '
									<li class="centertext"><strong>- ', $txt['sp_calendar_holidays'], ' -</strong></li>';
                foreach ($day['holidays'] as $key => $holiday) {
                    echo '
									<li ', sp_embed_class('holiday', '', 'sp_list_indent'), '>', $holiday, '</li>';
                }
            }
            if (!empty($day['birthdays'])) {
                echo '
									<li class="centertext"><strong>- ', $txt['sp_calendar_birthdays'], ' -</strong></li>';
                foreach ($day['birthdays'] as $member) {
                    echo '
									<li ', sp_embed_class('birthday', '', 'sp_list_indent'), '>
										<a href="', $scripturl, '?action=profile;u=', $member['id'], '">', $member['name'], isset($member['age']) ? ' (' . $member['age'] . ')' : '', '</a>
									</li>';
                }
            }
            if (!empty($day['events'])) {
                echo '
									<li class="centertext"><strong>- ', $txt['sp_calendar_events'], ' -</strong></li>';
                foreach ($day['events'] as $event) {
                    echo '
									<li ', sp_embed_class('event', '', 'sp_list_indent'), '>', $event['link'], '</li>';
                }
            }
            echo '
								</ul>';
        }
    }
    echo '
								<div class="centertext smalltext" id="sp_calendar_0" style="display: none;">', $txt['error_sp_no_items_day'], '</div>';
    addInlineJavascript('var current_day = "sp_calendar_' . $curPage['day'] . '";', true);
}