<?php
|
|
|
|
/**
|
|
* @package tikiwiki
|
|
*/
|
|
|
|
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
|
|
//
|
|
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
|
|
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
|
|
// $Id$
|
|
|
|
$section = 'calendar';
|
|
require_once('tiki-setup.php');
|
|
|
|
$calendarlib = TikiLib::lib('calendar');
|
|
$categlib = TikiLib::lib('categ');
|
|
include_once('lib/newsletters/nllib.php');
|
|
|
|
$headerlib->add_cssfile('themes/base_files/feature_css/calendar.css', 20);
|
|
# perms are
|
|
# $tiki_p_view_calendar
|
|
# $tiki_p_admin_calendar
|
|
# $tiki_p_change_events
|
|
# $tiki_p_add_events
|
|
$access->check_feature('feature_calendar');
|
|
|
|
$auto_query_args = [
|
|
'viewmode',
|
|
'calIds',
|
|
'find',
|
|
'mode',
|
|
'sort_mode',
|
|
];
|
|
|
|
$maxSimultaneousWeekViewEvents = 3;
|
|
|
|
$myurl = $prefs['feature_sefurl'] === 'y' ? 'calendar' : 'tiki-calendar.php';
|
|
$exportUrl = 'tiki-calendar_export_ical.php';
|
|
$iCalAdvParamsUrl = 'tiki-calendar_params_ical.php';
|
|
$bufid = [];
|
|
$bufdata = [];
|
|
$modifiable = [];
|
|
if (! isset($cookietab)) {
|
|
$cookietab = '1';
|
|
}
|
|
$rawcals = $calendarlib->list_calendars();
|
|
$rawcals['data'] = Perms::filter([ 'type' => 'calendar' ], 'object', $rawcals['data'], [ 'object' => 'calendarId' ], 'view_calendar');
|
|
$viewOneCal = $tiki_p_view_calendar;
|
|
$modifTab = 0;
|
|
|
|
$minHourOfDay = 12;
|
|
$maxHourOfDay = 12;
|
|
$manyEvents = [];
|
|
|
|
foreach ($rawcals["data"] as $cal_data) {
|
|
$cal_id = $cal_data['calendarId'];
|
|
$minHourOfDay = min($minHourOfDay, (int)($cal_data['startday'] / 3600));
|
|
$maxHourOfDay = max($maxHourOfDay, (int)(($cal_data['endday'] + 1) / 3600));
|
|
if ($tiki_p_admin == 'y') {
|
|
$cal_data["tiki_p_view_calendar"] = 'y';
|
|
$cal_data["tiki_p_view_events"] = 'y';
|
|
$cal_data["tiki_p_add_events"] = 'y';
|
|
$cal_data["tiki_p_change_events"] = 'y';
|
|
} elseif ($cal_data["personal"] == "y") {
|
|
if ($user) {
|
|
$cal_data["tiki_p_view_calendar"] = 'y';
|
|
$cal_data["tiki_p_view_events"] = 'y';
|
|
$cal_data["tiki_p_add_events"] = 'y';
|
|
$cal_data["tiki_p_change_events"] = 'y';
|
|
} else {
|
|
$cal_data["tiki_p_view_calendar"] = 'n';
|
|
$cal_data["tiki_p_view_events"] = 'y';
|
|
$cal_data["tiki_p_add_events"] = 'n';
|
|
$cal_data["tiki_p_change_events"] = 'n';
|
|
}
|
|
} else {
|
|
$calperms = Perms::get([ 'type' => 'calendar', 'object' => $cal_id ]);
|
|
$cal_data["tiki_p_view_calendar"] = $calperms->view_calendar ? 'y' : 'n';
|
|
$cal_data["tiki_p_view_events"] = $calperms->view_events ? 'y' : 'n';
|
|
$cal_data["tiki_p_add_events"] = $calperms->add_events ? 'y' : 'n';
|
|
$cal_data["tiki_p_change_events"] = $calperms->change_events ? 'y' : 'n';
|
|
}
|
|
if ($cal_data["tiki_p_view_calendar"] == 'y') {
|
|
$viewOneCal = 'y';
|
|
$bufid[] = $cal_id;
|
|
$bufdata["$cal_id"] = $cal_data;
|
|
}
|
|
if ($cal_data["tiki_p_view_events"] == 'y') {
|
|
$visible[] = $cal_id;
|
|
}
|
|
if ($cal_data["tiki_p_add_events"] == 'y') {
|
|
$modifTab = 1;
|
|
}
|
|
if ($cal_data["tiki_p_change_events"] == 'y') {
|
|
$modifTab = 1;
|
|
$modifiable[] = $cal_id;
|
|
$visible[] = $cal_id;
|
|
}
|
|
}
|
|
|
|
if ($viewOneCal != 'y') {
|
|
$smarty->assign('errortype', 401);
|
|
$smarty->assign('msg', tra("You do not have permission to view the calendar"));
|
|
$smarty->display("error.tpl");
|
|
die;
|
|
}
|
|
|
|
$listcals = $bufid;
|
|
$infocals["data"] = $bufdata;
|
|
$smarty->assign('infocals', $infocals["data"]);
|
|
$smarty->assign('listcals', $listcals);
|
|
$smarty->assign('modifTab', $modifTab);
|
|
$smarty->assign('now', $tikilib->now);
|
|
|
|
// set up list of groups
|
|
$use_default_calendars = false;
|
|
if (isset($_REQUEST["calIds"]) and is_array($_REQUEST["calIds"]) and count($_REQUEST["calIds"])) {
|
|
$_SESSION['CalendarViewGroups'] = array_intersect($_REQUEST["calIds"], $listcals);
|
|
if (! empty($user)) {
|
|
$tikilib->set_user_preference($user, 'default_calendars', serialize($_SESSION['CalendarViewGroups']));
|
|
}
|
|
} elseif (isset($_REQUEST["calIds"]) and ! is_array($_REQUEST["calIds"])) {
|
|
$_SESSION['CalendarViewGroups'] = array_intersect([$_REQUEST["calIds"]], $listcals);
|
|
if (! empty($user)) {
|
|
$tikilib->set_user_preference($user, 'default_calendars', serialize($_SESSION['CalendarViewGroups']));
|
|
}
|
|
} elseif (! empty($_REQUEST['allCals'])) {
|
|
$_SESSION['CalendarViewGroups'] = $listcals;
|
|
if (! empty($user)) {
|
|
$tikilib->set_user_preference($user, 'default_calendars', serialize($_SESSION['CalendarViewGroups']));
|
|
}
|
|
} elseif (! isset($_SESSION['CalendarViewGroups']) || ! empty($_REQUEST['allCals'])) {
|
|
$use_default_calendars = true;
|
|
} elseif (isset($_REQUEST["refresh"]) and ! isset($_REQUEST["calIds"])) {
|
|
$_SESSION['CalendarViewGroups'] = [];
|
|
} elseif (! empty($user) || ! isset($_SESSION['CalendarViewGroups'])) {
|
|
$use_default_calendars = true;
|
|
}
|
|
|
|
if ($use_default_calendars) {
|
|
if ($prefs['feature_default_calendars'] == 'y') {
|
|
$_SESSION['CalendarViewGroups'] = array_intersect(is_array($prefs['default_calendars']) ? $prefs['default_calendars'] : unserialize($prefs['default_calendars']), $listcals);
|
|
} elseif (! empty($user)) {
|
|
$user_default_calendars = $tikilib->get_user_preference($user, 'default_calendars', $listcals);
|
|
if (is_string($user_default_calendars)) {
|
|
$user_default_calendars = unserialize($user_default_calendars);
|
|
}
|
|
$_SESSION['CalendarViewGroups'] = $user_default_calendars;
|
|
} else {
|
|
$_SESSION['CalendarViewGroups'] = $listcals;
|
|
}
|
|
}
|
|
|
|
$smarty->assign('displayedcals', $_SESSION['CalendarViewGroups']);
|
|
$thiscal = [];
|
|
$checkedCals = [];
|
|
|
|
foreach ($listcals as $thatid) {
|
|
if (is_array($_SESSION['CalendarViewGroups']) && (in_array("$thatid", $_SESSION['CalendarViewGroups']))) {
|
|
$thiscal["$thatid"] = 1;
|
|
$checkedCals[] = $thatid;
|
|
} else {
|
|
$thiscal["$thatid"] = 0;
|
|
}
|
|
}
|
|
$smarty->assign('thiscal', $thiscal);
|
|
$smarty->assign_by_ref('checkedCals', $checkedCals);
|
|
|
|
if (isset($_REQUEST["find"])) {
|
|
$find = $_REQUEST["find"];
|
|
} else {
|
|
$find = '';
|
|
}
|
|
$smarty->assign('find', $find);
|
|
|
|
if (isset($_REQUEST['mon']) && ! empty($_REQUEST['mon'])) {
|
|
$request_month = $_REQUEST['mon'];
|
|
}
|
|
if (isset($_REQUEST['day']) && ! empty($_REQUEST['day'])) {
|
|
$request_day = $_REQUEST['day'];
|
|
}
|
|
if (isset($_REQUEST['year']) && ! empty($_REQUEST['year'])) {
|
|
$request_year = $_REQUEST['year'];
|
|
}
|
|
|
|
include_once("tiki-calendar_setup.php");
|
|
|
|
// Calculate all the displayed days for the selected calendars
|
|
$viewdays = [];
|
|
foreach ($_SESSION['CalendarViewGroups'] as $calendar) {
|
|
$info = $calendarlib->get_calendar($calendar);
|
|
if (is_array($info['viewdays'])) {
|
|
$viewdays = array_merge($info['viewdays'], $viewdays);
|
|
}
|
|
}
|
|
if (empty($viewdays)) {
|
|
$viewdays = [0,1,2,3,4,5,6];
|
|
}
|
|
sort($viewdays, SORT_NUMERIC);
|
|
$viewdays = array_map("correct_start_day", array_unique($viewdays));
|
|
$viewdays2 = array_values($viewdays);
|
|
|
|
if (isset($_REQUEST['sort_mode'])) {
|
|
$sort_mode = $_REQUEST['sort_mode'];
|
|
}
|
|
|
|
if ($_SESSION['CalendarViewGroups']) {
|
|
if (array_key_exists('CalendarViewList', $_SESSION) && $_SESSION['CalendarViewList'] == "list") {
|
|
if (! isset($sort_mode)) {
|
|
$sort_mode = "start_asc";
|
|
}
|
|
$smarty->assign_by_ref('sort_mode', $sort_mode);
|
|
$listevents = $calendarlib->list_raw_items($_SESSION['CalendarViewGroups'], $user, $viewstart, $viewend, 0, -1, $sort_mode);
|
|
for ($i = count($listevents) - 1; $i >= 0; --$i) {
|
|
$listevents[$i]['modifiable'] = in_array($listevents[$i]['calendarId'], $modifiable) ? "y" : "n";
|
|
}
|
|
} else {
|
|
$listevents = $calendarlib->list_items($_SESSION['CalendarViewGroups'], $user, $viewstart, $viewend, 0, -1);
|
|
}
|
|
$smarty->assign_by_ref('listevents', $listevents);
|
|
} else {
|
|
$listevents = [];
|
|
}
|
|
|
|
$mloop = TikiLib::date_format("%m", $viewstart);
|
|
$dloop = TikiLib::date_format("%d", $viewstart);
|
|
$yloop = TikiLib::date_format("%Y", $viewstart);
|
|
|
|
$curtikidate = new TikiDate();
|
|
$display_tz = $tikilib->get_display_timezone();
|
|
if ($display_tz == '') {
|
|
$display_tz = 'UTC';
|
|
}
|
|
$curtikidate->setTZbyID($display_tz);
|
|
$curtikidate->setLocalTime($dloop, $mloop, $yloop, 0, 0, 0, 0);
|
|
|
|
$smarty->assign('display_tz', $display_tz);
|
|
|
|
$smarty->assign('day', $daystart);
|
|
|
|
$firstDay = false;
|
|
|
|
for ($i = 0; $i <= $numberofweeks; $i++) {
|
|
$weeks[] = $weekNumbers[] = $curtikidate->getWeekOfYear();
|
|
require_once('lib/smarty_tiki/modifier.userlink.php');
|
|
|
|
$registeredIndexes = [];
|
|
foreach ($weekdays as $w) {
|
|
$leday = [];
|
|
if ($calendarViewMode['casedefault'] == 'day') {
|
|
$dday = $daystart;
|
|
} else {
|
|
$dday = $curtikidate->getTime();
|
|
$curtikidate->addDays(1);
|
|
}
|
|
|
|
// skip events that are not to be displayed
|
|
if (! in_array($w, $viewdays)) {
|
|
continue;
|
|
}
|
|
|
|
$cell[$i][$w]['day'] = $dday;
|
|
|
|
if ($calendarViewMode['casedefault'] == 'day' or ($dday >= $daystart && $dday <= $dayend)) {
|
|
if (! $firstDay) {
|
|
$firstDay = true;
|
|
$smarty->assign('currMonth', $dday);
|
|
$cell[$i][$w]['firstDay'] = true;
|
|
} else {
|
|
$cell[$i][$w]['firstDay'] = false;
|
|
}
|
|
$cell[$i][$w]['focus'] = true;
|
|
} else {
|
|
$cell[$i][$w]['firstDay'] = false;
|
|
$cell[$i][$w]['focus'] = false;
|
|
}
|
|
if (isset($listevents["$dday"])) {
|
|
$e = 0;
|
|
|
|
foreach ($listevents["$dday"] as $le) {
|
|
$nbDaysLeftThisWeek = min(ceil(($le['endTimeStamp'] - $dday) / 86400), (7 - $w));
|
|
if ($calendarViewMode['casedefault'] == 'month') {
|
|
$endOfCurrentMonth = $tikilib->make_time(23, 59, 59, TikiLib::date_format('%m', $dday) + 1, 0, TikiLib::date_format2('Y', $dday));
|
|
$nbDaysLeftThisWeek = min(ceil(($endOfCurrentMonth - $dday) / 86400), $nbDaysLeftThisWeek);
|
|
} elseif ($calendarViewMode['casedefault'] == 'year') {
|
|
$endOfCurrentYear = $tikilib->make_time(23, 59, 59, 12, 31, TikiLib::date_format2('Y', $dday));
|
|
$nbDaysLeftThisWeek = min(ceil(($endOfCurrentYear - $dday) / 86400), $nbDaysLeftThisWeek);
|
|
}
|
|
if (! array_key_exists('nbDaysLeftThisWeek', $le)) {
|
|
$le['nbDaysLeftThisWeek'] = $nbDaysLeftThisWeek;
|
|
}
|
|
$le['modifiable'] = in_array($le['calendarId'], $modifiable) ? "y" : "n";
|
|
$le['visible'] = in_array($le['calendarId'], $visible) ? "y" : "n";
|
|
$lec = $infocals['data']["{$le['calendarId']}"];
|
|
$leday["{$le['time']}$e"] = $le;
|
|
$smarty->assign('allday', $le["result"]["allday"]);
|
|
$smarty->assign('cellcalendarId', $le["calendarId"]);
|
|
$smarty->assign('cellhead', $le["head"]);
|
|
$smarty->assign('cellprio', $le["prio"]);
|
|
$smarty->assign('cellcalname', $le["calname"]);
|
|
$smarty->assign('celllocation', $le["location"]);
|
|
$smarty->assign('cellcategory', $le["category"]);
|
|
$smarty->assign('cellstatus', $le["status"]);
|
|
$smarty->assign('celluser', $le['user']);
|
|
$smarty->assign('cellname', $le["name"]);
|
|
$smarty->assign('cellurl', $le["web"]);
|
|
$smarty->assign('cellid', $le["calitemId"]);
|
|
$smarty->assign('celldescription', TikiLib::lib('parser')->parse_data($le["description"], ['is_html' => $prefs['calendar_description_is_html'] === 'y']));
|
|
$smarty->assign('cellmodif', $le['modifiable']);
|
|
$smarty->assign('cellvisible', $le['visible']);
|
|
$smarty->assign('cellstatus', $le['status']);
|
|
$smarty->assign('cellstart', $le["startTimeStamp"]);
|
|
$smarty->assign('cellend', $le["endTimeStamp"]);
|
|
|
|
$organizers = $le['result']['organizers'];
|
|
$cellorganizers = '';
|
|
foreach ($organizers as $org) {
|
|
if ($org == '') {
|
|
continue;
|
|
}
|
|
if ($cellorganizers != '') {
|
|
$cellorganizers .= ', ';
|
|
}
|
|
$cellorganizers .= smarty_modifier_userlink(trim($org), 'link', 'not_set', '', 0, 'n');
|
|
}
|
|
$smarty->assign('cellorganizers', $cellorganizers);
|
|
|
|
$cellparticipants = '';
|
|
foreach ($le['result']['participants'] as $parti) {
|
|
if (empty($parti) || $parti['name'] == '') {
|
|
continue;
|
|
}
|
|
if ($cellparticipants != '') {
|
|
$cellparticipants .= ', ';
|
|
}
|
|
$cellparticipants .= smarty_modifier_userlink(trim($parti['name']), 'link', 'not_set', '', 0, 'n');
|
|
}
|
|
$smarty->assign('cellparticipants', $cellparticipants);
|
|
|
|
$smarty->assign('calendar_type', 'calendar');
|
|
$smarty->assign('show_calname', $lec['show_calname']);
|
|
$smarty->assign('show_description', $lec['show_description']);
|
|
$smarty->assign('show_location', $lec['show_location']);
|
|
$smarty->assign('show_category', $lec['show_category']);
|
|
$smarty->assign('show_language', $lec['show_language']);
|
|
$smarty->assign('show_participants', $lec['show_participants']);
|
|
$smarty->assign('show_url', $lec['show_url']);
|
|
$smarty->assign('show_status', $lec['show_status']);
|
|
$leday["{$le['time']}$e"]["over"] = $smarty->fetch("tiki-calendar_box.tpl");
|
|
$e++;
|
|
}
|
|
}
|
|
if (is_array($leday)) {
|
|
ksort($leday);
|
|
$toBeIndexed = array_values($leday);
|
|
$tmp = [];
|
|
foreach ($toBeIndexed as $index => $anEvent) {
|
|
// first place the events that started before the day.
|
|
if (array_key_exists($anEvent['calitemId'], $registeredIndexes)) {
|
|
$cell[$i][$w]['items'][$registeredIndexes[$anEvent['calitemId']]] = $anEvent;
|
|
} else {
|
|
$tmp[] = $anEvent;
|
|
}
|
|
}
|
|
$cpt = 0;
|
|
$currIndex = 0;
|
|
if (is_array($cell[$i][$w]) && array_key_exists('items', $cell[$i][$w])) {
|
|
ksort($cell[$i][$w]['items']);
|
|
}
|
|
while ($cpt < count($tmp)) {
|
|
if (! array_key_exists('items', $cell[$i][$w])) {
|
|
$cell[$i][$w]['items'][$currIndex] = $tmp[$cpt];
|
|
$cpt++;
|
|
} else {
|
|
if (! array_key_exists($currIndex, $cell[$i][$w]['items']) || ! is_array($cell[$i][$w]['items'][$currIndex])) {
|
|
$cell[$i][$w]['items'][$currIndex] = $tmp[$cpt];
|
|
$cpt++;
|
|
} else {
|
|
$currIndex++;
|
|
}
|
|
}
|
|
}
|
|
|
|
$tmp = (is_array($cell[$i][$w]) && array_key_exists('items', $cell[$i][$w])) ? array_keys($cell[$i][$w]['items']) : [];
|
|
arsort($tmp);
|
|
$tmp = array_values($tmp);
|
|
$cell[$i][$w]['max'] = count($tmp) > 0 ? $tmp[0] : -1;
|
|
for ($tr = 0; $tr < $cell[$i][$w]['max']; $tr++) {
|
|
if (! array_key_exists($tr, $cell[$i][$w]['items'])) {
|
|
$cell[$i][$w]['items'][$tr] = 0;
|
|
}
|
|
}
|
|
}
|
|
$registeredIndexes = [];
|
|
if (is_array($cell[$i][$w]) && array_key_exists('items', $cell[$i][$w])) {
|
|
foreach ($cell[$i][$w]['items'] as $cpt => $anEvent) {
|
|
if ($cell[$i][$w]['day'] + 86400 - $anEvent['result']['end'] < 0) { // event ends after the current day
|
|
$registeredIndexes[$anEvent['calitemId']] = $cpt;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$smarty->assign('calendarViewMode', $calendarViewMode['casedefault']);
|
|
|
|
$verticalOffset = [];
|
|
foreach ($cell as $w => $weeks) {
|
|
$verticalOffset[$w] = [];
|
|
foreach ($weeks as $d => $days) {
|
|
$cpt = 0;
|
|
if (is_array($days) && array_key_exists('items', $days) && is_array($days['items'])) {
|
|
foreach ($days['items'] as $index => $item) {
|
|
if (is_array($verticalOffset) && array_key_exists($w, $verticalOffset) && is_array($verticalOffset[$w]) && array_key_exists($d, $verticalOffset[$w])) {
|
|
while (array_key_exists($cpt, $verticalOffset[$w][$d])) {
|
|
$cpt++;
|
|
}
|
|
$alreadyExists = 0;
|
|
foreach ($verticalOffset[$w][$d] as $elt) {
|
|
if ($elt == $item['calitemId']) {
|
|
$alreadyExists++;
|
|
}
|
|
}
|
|
if ($alreadyExists == 0) {
|
|
$verticalOffset[$w][$d][$cpt] = $item['calitemId'];
|
|
}
|
|
if ($item['nbDaysLeftThisWeek'] > 1) {
|
|
if (! array_key_exists($d + 1, $verticalOffset[$w]) || ! is_array($verticalOffset[$w][$d + 1])) {
|
|
$verticalOffset[$w][$d + 1] = [];
|
|
}
|
|
$tmp = array_flip($verticalOffset[$w][$d]);
|
|
$verticalOffset[$w][$d + 1][$tmp[$item['calitemId']]] = $item['calitemId'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach ($cell as $w => $weeks) {
|
|
foreach ($weeks as $d => $days) {
|
|
$dayOffset = 0;
|
|
if (is_array($days) && array_key_exists('items', $days) && is_array($days['items'])) {
|
|
foreach ($days['items'] as $index => $item) {
|
|
if (is_array($verticalOffset) && array_key_exists($w, $verticalOffset) && is_array($verticalOffset[$w]) && array_key_exists($d, $verticalOffset[$w])) {
|
|
$tmp = array_flip($verticalOffset[$w][$d]);
|
|
$cell[$w][$d]['items'][$index]['top'] = 14 * $tmp[$item['calitemId']];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//Use 12- or 24-hour clock for times listed in day or week view based on admin and user preferences
|
|
$userprefslib = TikiLib::lib('userprefs');
|
|
$user_24hr_clock = $userprefslib->get_user_clock_pref($user);
|
|
|
|
$hrows = [];
|
|
$hours = [];
|
|
$concurrencies = [];
|
|
$arows = [];
|
|
if ($calendarViewMode['casedefault'] == 'day') {
|
|
$hours = range($minHourOfDay, $maxHourOfDay);
|
|
$hr_display = $hours;
|
|
if ($user_24hr_clock) {
|
|
for ($i = 0, $for_max = count($hr_display); $i < $for_max; $i++) {
|
|
$hr_display[$i] = [0 => $hr_display[$i]];
|
|
$hr_display[$i][] = sprintf('%02d', $hr_display[$i][0]) . ':00';
|
|
}
|
|
} else {
|
|
for ($i = 0, $for_max = count($hr_display); $i < $for_max; $i++) {
|
|
$hr_display[$i] = [0 => $hr_display[$i]];
|
|
$hr_display[$i][] = date("g:i a", strtotime($hr_display[$i][0] . ':00'));
|
|
}
|
|
}
|
|
$eventHoraires = [];
|
|
if (! empty($cell[0]["{$weekdays[0]}"]['items'])) {
|
|
foreach ($cell[0]["{$weekdays[0]}"]['items'] as $dayitems) {
|
|
$dayitems['time'] = ($dayitems['startTimeStamp'] > $cell[0]["{$weekdays[0]}"]['day'])
|
|
? $dayitems['time']
|
|
: str_pad($minHourOfDay, 2, '0', STR_PAD_LEFT) . "00";
|
|
$dayitems['end'] = ($dayitems['endTimeStamp'] < ($cell[0]["{$weekdays[0]}"]['day'] + 86399))
|
|
? $dayitems['end']
|
|
: str_pad($maxHourOfDay, 2, '0', STR_PAD_LEFT) . "59";
|
|
$rawhour = (int)substr($dayitems['time'], 0, 2);
|
|
$dayitems['mins'] = substr($dayitems['time'], 2);
|
|
$dayitems['top'] = (($rawhour - $minHourOfDay) + $dayitems['mins'] / 60) * 24 + 35;
|
|
$hrows["$rawhour"][] = $dayitems;
|
|
|
|
$currIndex = count($eventHoraires);
|
|
$eventHoraires[$currIndex]['id'] = $dayitems['calitemId'];
|
|
$eventHoraires[$currIndex]['start'] = $dayitems['time'];
|
|
$eventHoraires[$currIndex]['end'] = $dayitems['end'];
|
|
$eventHoraires[$currIndex]['duree'] = max(1, number_format(($tikilib->make_time(substr($dayitems['end'], 0, 2), substr($dayitems['end'], 2) + 1, 0, 1, 1, 2000) - $tikilib->make_time(substr($dayitems['time'], 0, 2), substr($dayitems['time'], 2), 0, 1, 1, 2000)) / 3600, 2));
|
|
}
|
|
}
|
|
$orderedEventHoraires = [];
|
|
$eventIndexes = [];
|
|
while (count($eventHoraires) > 0) {
|
|
$indexEarlierEvent = 0;
|
|
$currEarlierEventStart = 2400;
|
|
foreach ($eventHoraires as $index => $event) {
|
|
if ($event['start'] < $currEarlierEventStart) {
|
|
$currEarlierEventStart = $event['start'];
|
|
$indexEarlierEvent = $index;
|
|
}
|
|
}
|
|
$orderedEventHoraires[] = $eventHoraires[$indexEarlierEvent];
|
|
$eventIndexes[$eventHoraires[$indexEarlierEvent]['id']] = count($eventIndexes);
|
|
unset($eventHoraires[$indexEarlierEvent]);
|
|
}
|
|
$eventHoraires = $orderedEventHoraires;
|
|
unset($orderedEventHoraires);
|
|
|
|
$tmpRes = [];
|
|
for ($h = 0; $h < 24; $h++) {
|
|
for ($m = 0; $m < 60; $m += 5) {
|
|
$tmp = [];
|
|
foreach ($eventHoraires as $evtId => $event) {
|
|
$currTime = 100 * $h + $m;
|
|
if ($currTime >= $event['start'] && $currTime <= $event['end']) {
|
|
$tmp[] = $event['id'];
|
|
}
|
|
}
|
|
if (! in_array($tmp, $tmpRes) && count($tmp) > 0) {
|
|
$tmpRes[] = $tmp;
|
|
}
|
|
}
|
|
}
|
|
$tmp2 = [];
|
|
foreach ($tmpRes as $val) {
|
|
foreach ($val as $index => $evtId) {
|
|
if (array_key_exists($evtId, $tmp2)) {
|
|
if (count($val) > count($tmp2[$evtId])) {
|
|
$tmp2[$evtId] = $val;
|
|
}
|
|
} else {
|
|
$tmp2[$evtId] = $val;
|
|
}
|
|
}
|
|
}
|
|
$tmpVals = [];
|
|
foreach ($tmp2 as $elt => $maxSim) {
|
|
foreach ($maxSim as $index => $evtId) {
|
|
if (! array_key_exists($evtId, $tmpVals)) {
|
|
$offset = 0;
|
|
$width = 0;
|
|
if ($index == 0) {
|
|
$offset = 0;
|
|
$width = 100 / count($tmp2[$elt]);
|
|
} else {
|
|
for ($i = 0; $i < $index; $i++) {
|
|
$offset = max($offset, $tmpVals[$tmp2[$elt][$i]]['offset'] + $tmpVals[$tmp2[$elt][$i]]['width']);
|
|
$width += $tmpVals[$tmp2[$elt][$i]]['width'];
|
|
}
|
|
$width = (100 - $width) / (count($tmp2[$elt]) - $index);
|
|
}
|
|
$tmpVals[$evtId]['offset'] = $offset;
|
|
$tmpVals[$evtId]['width'] = round($width, 1);
|
|
}
|
|
}
|
|
}
|
|
$max = 0;
|
|
foreach ($tmpVals as $evtId => $values) {
|
|
$max = max($max, $values['offset'] + $values['width']);
|
|
}
|
|
|
|
if ($max > 100) {
|
|
foreach (array_keys($tmpVals) as $evtId) {
|
|
$tmpVals[$evtId]['offset'] = round(100 * $tmpVals[$evtId]['offset'] / $max + .5);
|
|
$tmpVals[$evtId]['width'] = round(100 * $tmpVals[$evtId]['width'] / $max - 2, 5);
|
|
}
|
|
}
|
|
|
|
foreach ($concurrencies as $key => $value) {
|
|
$concurrencies[$key]['offset'] = $value['offset'] * 100 / $value['value'];
|
|
}
|
|
|
|
foreach (array_keys($hrows) as $anHour) {
|
|
for ($i = 0, $tmp_count = count($hrows[$anHour]); $i < $tmp_count; $i++) {
|
|
// setting number of simulaneous events foreach event, so that we can figure out its width without overwriting
|
|
$hrows[$anHour][$i]['concurrences'] = isset($concurrencies[$hrows[$anHour][$i]['calitemId']]['value']) ?
|
|
$concurrencies[$hrows[$anHour][$i]['calitemId']]['value'] : null;
|
|
// setting duration of the event within the day
|
|
$hrows[$anHour][$i]['duree'] = $eventHoraires[$eventIndexes[$hrows[$anHour][$i]['calitemId']]]['duree'] * 24;
|
|
$hrows[$anHour][$i]['left'] = .9 * $tmpVals[$hrows[$anHour][$i]['calitemId']]['offset'] + 10;
|
|
$hrows[$anHour][$i]['width'] = .9 * $tmpVals[$hrows[$anHour][$i]['calitemId']]['width'] - .4;
|
|
}
|
|
}
|
|
} elseif ($calendarViewMode['casedefault'] == 'week') {
|
|
$viewWeekDays = [];
|
|
for ($i = 0; $i < 7; $i++) {
|
|
$viewWeekDays[$i] = $viewstart + 86400 * $i;
|
|
}
|
|
$hours = range($minHourOfDay, $maxHourOfDay);
|
|
$hr_display = $hours;
|
|
if ($user_24hr_clock) {
|
|
for ($i = 0, $for_max = count($hr_display); $i < $for_max; $i++) {
|
|
$hr_display[$i] = [0 => $hr_display[$i]];
|
|
$hr_display[$i][] = sprintf('%02d', $hr_display[$i][0]) . ':00';
|
|
}
|
|
} else {
|
|
for ($i = 0, $for_max = count($hr_display); $i < $for_max; $i++) {
|
|
$hr_display[$i] = [0 => $hr_display[$i]];
|
|
$hr_display[$i][] = date("g:i a", strtotime($hr_display[$i][0] . ':00'));
|
|
}
|
|
}
|
|
$eventHoraires = [];
|
|
$concurrencies = [];
|
|
$tmpRes = [];
|
|
// The zoom factor is calculated to compensate missing days
|
|
$zoom = 100 / ( 9 + 13 * count($viewdays2) );
|
|
foreach ($weekdays as $wd) {
|
|
// If the day is not shown skip it
|
|
if (! in_array($wd, $viewdays)) {
|
|
continue;
|
|
}
|
|
if (isset($cell[0][$wd]['items']) && is_array($cell[0][$wd]['items'])) {
|
|
foreach ($cell[0][$wd]['items'] as $dayitems) {
|
|
$dayitems['time'] = ($dayitems['startTimeStamp'] >= $cell[0][$wd]['day'])
|
|
? $dayitems['time']
|
|
: str_pad($minHourOfDay, 2, '0', STR_PAD_LEFT) . "01";
|
|
$dayitems['end'] = ($dayitems['endTimeStamp'] < ($cell[0][$wd]['day'] + 86400))
|
|
? $dayitems['end']
|
|
: str_pad($maxHourOfDay, 2, '0', STR_PAD_LEFT) . "59";
|
|
$rawhour = (int)substr($dayitems['time'], 0, 2);
|
|
if ($rawhour < $minHourOfDay) {
|
|
$rawhour = $minHourOfDay;
|
|
}
|
|
|
|
$dayitems['mins'] = substr($dayitems['time'], 2);
|
|
$dayitems['top'] = 24 * (($rawhour - $minHourOfDay) + $dayitems['mins'] / 60) + 35;
|
|
$dayitems['left'] = $zoom * ( 9 + 13 * $wd) ; // [BUG FIX] hollmeer 2012-11-01: a bug here in original with searcing for day's index; original code was: " $zoom * ( 9 + 13 * array_search($wd,$viewdays2) ); " which does not fuction properly if week starting on monday; just take direct $wd index here in all cases as this is just setting the day-columns directly from left to right in all cases
|
|
$dayitems['width'] = 12 * $zoom;
|
|
$hrows[$wd]["$rawhour"][] = $dayitems;
|
|
$eventHoraires[$wd][$dayitems['calitemId']]['start'] = ($dayitems['time'] < $minHourOfDay . "00") ? str_pad($minHourOfDay . "00", 4, '0', STR_PAD_LEFT) : $dayitems['time'];
|
|
$eventHoraires[$wd][$dayitems['calitemId']]['end'] = ($dayitems['end'] > ($maxHourOfDay + 1) . "00") ? str_pad(($maxHourOfDay + 1) . "00", 4, '0', STR_PAD_LEFT) : $dayitems['end'];
|
|
$eventHoraires[$wd][$dayitems['calitemId']]['duree'] = max(1, ($tikilib->make_time(substr($eventHoraires[$wd][$dayitems['calitemId']]['end'], 0, 2), substr($eventHoraires[$wd][$dayitems['calitemId']]['end'], 2), 0, 1, 1, 2000) - $tikilib->make_time(substr($eventHoraires[$wd][$dayitems['calitemId']]['start'], 0, 2), substr($eventHoraires[$wd][$dayitems['calitemId']]['start'], 2), 0, 1, 1, 2000)) / 3600);
|
|
|
|
$tmpRes = [];
|
|
for ($h = 0; $h < 24; $h++) {
|
|
for ($m = 0; $m < 60; $m += 5) {
|
|
$tmp = [];
|
|
foreach (array_keys($eventHoraires[$wd]) as $evtId) {
|
|
$currTime = 100 * $h + $m;
|
|
if ($currTime >= $eventHoraires[$wd][$evtId]['start'] && $currTime <= $eventHoraires[$wd][$evtId]['end']) {
|
|
if ($eventHoraires[$wd][$evtId]['end'] - $eventHoraires[$wd][$evtId]['start'] >= 0) {
|
|
$tmp[] = $evtId;
|
|
}
|
|
}
|
|
}
|
|
if (! in_array($tmp, $tmpRes)) {
|
|
$tmpRes[] = $tmp;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$slots = [];
|
|
$maxConcurrency = 0;
|
|
foreach ($tmpRes as $val) {
|
|
$maxConcurrency = max($maxConcurrency, count($val));
|
|
}
|
|
$slots = array_fill(0, max(1, min($maxSimultaneousWeekViewEvents, $maxConcurrency)), -1);
|
|
foreach ($tmpRes as $val) {
|
|
foreach ($val as $index => $evtId) {
|
|
$concurrencies[$wd][$evtId]['value'] = $maxConcurrency;
|
|
$startNew = isset($eventHoraires[$wd]) ? $eventHoraires[$wd][$evtId]['start'] : null;
|
|
foreach ($slots as $index => $oldEvtId) {
|
|
if ($oldEvtId != $evtId) {
|
|
if ($oldEvtId > 0) {
|
|
if ($startNew > $eventHoraires[$wd][$oldEvtId]['end']) {
|
|
$slots[$index] = -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach ($slots as $index => $oldEvtId) {
|
|
if (in_array($evtId, $slots)) {
|
|
break;
|
|
}
|
|
if ($oldEvtId == -1) {
|
|
$slots[$index] = $evtId;
|
|
$concurrencies[$wd][$evtId]['offset'] = $index;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach (array_keys($concurrencies) as $wd) {
|
|
foreach (array_keys($concurrencies[$wd]) as $key) {
|
|
$concurrencies[$wd][$key]['offset'] = $zoom * 13 * ($concurrencies[$wd][$key]['offset'] / $concurrencies[$wd][$key]['value']);
|
|
}
|
|
}
|
|
foreach (array_keys($hrows) as $aDay) {
|
|
foreach (array_keys($hrows[$aDay]) as $anHour) {
|
|
for ($i = 0, $tmp_count = count($hrows[$aDay][$anHour]); $i < $tmp_count; $i++) {
|
|
if (empty($manyEvents[$aDay]['tooMany']) && $concurrencies[$aDay][$hrows[$aDay][$anHour][$i]['calitemId']]['value'] <= $maxSimultaneousWeekViewEvents) {
|
|
$hrows[$aDay][$anHour][$i]['concurrences'] = $concurrencies[$aDay][$hrows[$aDay][$anHour][$i]['calitemId']]['value'];
|
|
$hrows[$aDay][$anHour][$i]['duree'] = $eventHoraires[$aDay][$hrows[$aDay][$anHour][$i]['calitemId']]['duree'] * 24;
|
|
$hrows[$aDay][$anHour][$i]['left'] = $hrows[$aDay][$anHour][$i]['left'] + $concurrencies[$aDay][$hrows[$aDay][$anHour][$i]['calitemId']]['offset'];
|
|
|
|
if (
|
|
$concurrencies[$aDay][$hrows[$aDay][$anHour][$i]['calitemId']]['value'] != 1
|
|
&& $hrows[$aDay][$anHour][$i]['width'] > 0
|
|
&& $concurrencies[$aDay][$hrows[$aDay][$anHour][$i]['calitemId']]['value'] > 0
|
|
) {
|
|
$hrows[$aDay][$anHour][$i]['width'] = $hrows[$aDay][$anHour][$i]['width'] / $concurrencies[$aDay][$hrows[$aDay][$anHour][$i]['calitemId']]['value'];
|
|
} else {
|
|
$hrows[$aDay][$anHour][$i]['width'] = $zoom * 12.8;
|
|
}
|
|
|
|
$manyEvents[$aDay]['tooMany'] = false;
|
|
} else {
|
|
$manyEvents[$aDay]['tooMany'] = true;
|
|
$tmpTop = 99999999;
|
|
$tmpBottom = 0;
|
|
foreach ($hrows[$aDay] as $hour => $events) {
|
|
foreach ($hrows[$aDay][$hour] as $event) {
|
|
$tmpTop = min($tmpTop, $event['time']);
|
|
$tmpBottom = max($tmpBottom, $event['end']);
|
|
}
|
|
}
|
|
if ($tmpTop < 100 * $minHourOfDay) {
|
|
$tmpTop = str_pad(100 * $minHourOfDay, 4, '0', STR_PAD_LEFT);
|
|
}
|
|
if ($tmpBottom > 100 * (1 + $maxHourOfDay)) {
|
|
$tmpBottom = str_pad(100 * (1 + $maxHourOfDay), 4, '0', STR_PAD_LEFT);
|
|
}
|
|
$top = 36 + 24 * (((int)substr($tmpTop, 0, 2) + (int)substr($tmpTop, 2) / 60) - $minHourOfDay);
|
|
$duree = max(23.9, 23.9 * (($tikilib->make_time(substr($tmpBottom, 0, 2), substr($tmpBottom, 2), 0, 1, 1, 2000) - $tikilib->make_time(substr($tmpTop, 0, 2), substr($tmpTop, 2), 0, 1, 1, 2000)) / 3600));
|
|
$manyEvents[$aDay]['top'] = $top;
|
|
$manyEvents[$aDay]['left'] = $zoom * ( 9 + ($aDay * 13) );
|
|
$manyEvents[$aDay]['width'] = $zoom * 12.8;
|
|
$manyEvents[$aDay]['duree'] = $duree;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach ($hrows as $aDay => $dayEvents) {
|
|
if ($manyEvents[$aDay]['tooMany']) {
|
|
// sorting events by start date ASC
|
|
$tmp = [];
|
|
foreach ($hrows[$aDay] as $hourEvents) {
|
|
foreach ($hourEvents as $event) {
|
|
$tmp[] = $event;
|
|
}
|
|
}
|
|
|
|
$theEvents = [];
|
|
while (count($tmp) > 0) {
|
|
$indexEarlierEvent = 0;
|
|
$currEarlierEventStart = 999999999999999;
|
|
foreach ($tmp as $index => $event) {
|
|
if ($event['startTimeStamp'] < $currEarlierEventStart) {
|
|
$currEarlierEventStart = $event['startTimeStamp'];
|
|
$indexEarlierEvent = $index;
|
|
}
|
|
}
|
|
$theEvents[] = $tmp[$indexEarlierEvent];
|
|
unset($tmp[$indexEarlierEvent]);
|
|
}
|
|
$smarty->assign('currDay', $manyEvents[$aDay]);
|
|
$smarty->assign('currHrows', $theEvents);
|
|
$manyEvents[$aDay]['overMany'] = $smarty->fetch("tiki-calendar_box_multiple.tpl");
|
|
}
|
|
}
|
|
$smarty->assign('viewWeekDays', $viewWeekDays);
|
|
}
|
|
|
|
$smarty->assign('hrows', $hrows);
|
|
$smarty->assign('manyEvents', $manyEvents);
|
|
$smarty->assign('hours', $hours);
|
|
$smarty->assign('hr_display', ! empty($hr_display) ? $hr_display : []);
|
|
$smarty->assign('arows', $arows);
|
|
$smarty->assign('mrows', [0 => "00", 5 => "05", 10 => "10", 15 => "15", 20 => "20", 25 => "25", 30 => "30", 35 => "35", 40 => "40", 45 => "45", 50 => "50", 55 => "55"]);
|
|
|
|
$smarty->assign('trunc', $trunc);
|
|
$smarty->assign('daformat', $tikilib->get_long_date_format() . " " . tra("at") . " %H:%M");
|
|
$smarty->assign('daformat2', $tikilib->get_long_date_format());
|
|
$smarty->assign('currentweek', $currentweek);
|
|
$smarty->assign('firstweek', $firstweek);
|
|
$smarty->assign('lastweek', $lastweek);
|
|
$smarty->assign('weekdays', $weekdays);
|
|
$smarty->assign('viewdays', $viewdays);
|
|
$smarty->assign('weeks', $weeks);
|
|
$smarty->assign_by_ref('weekNumbers', $weekNumbers);
|
|
$smarty->assign('daysnames', $daysnames);
|
|
$smarty->assign('daysnames_abr', $daysnames_abr);
|
|
foreach ($cell as $a => $x) {
|
|
foreach ($x as $b => $y) {
|
|
if (! array_key_exists('items', $y) || ! is_array($y['items'])) {
|
|
$cell[$a][$b]['items'] = [];
|
|
}
|
|
}
|
|
}
|
|
$smarty->assign('cell', $cell);
|
|
$smarty->assign('var', '');
|
|
$smarty->assign('myurl', $myurl);
|
|
$smarty->assign('exportUrl', $exportUrl);
|
|
$smarty->assign('iCalAdvParamsUrl', $iCalAdvParamsUrl);
|
|
|
|
if ($prefs['feature_user_watches'] == 'y' && $user && count($_SESSION['CalendarViewGroups']) == 1) {
|
|
$calId = $_SESSION['CalendarViewGroups'][0];
|
|
if (isset($_REQUEST['watch_event']) && isset($_REQUEST['watch_action'])) {
|
|
check_ticket('calendar');
|
|
if ($_REQUEST['watch_action'] == 'add') {
|
|
$tikilib->add_user_watch($user, $_REQUEST['watch_event'], $calId, 'calendar', $infocals['data'][$calId]['name'], "tiki-calendar.php?calIds[]=$calId");
|
|
} else {
|
|
$tikilib->remove_user_watch($user, $_REQUEST['watch_event'], $calId, 'calendar');
|
|
}
|
|
}
|
|
if ($tikilib->user_watches($user, 'calendar_changed', $calId, 'calendar')) {
|
|
$smarty->assign('user_watching', 'y');
|
|
} else {
|
|
$smarty->assign('user_watching', 'n');
|
|
}
|
|
|
|
// Check, if a user is watching this calendar.
|
|
if ($prefs['feature_categories'] == 'y') {
|
|
$watching_categories_temp = $categlib->get_watching_categories($calId, 'calendar', $user);
|
|
$smarty->assign('category_watched', 'n');
|
|
if (count($watching_categories_temp) > 0) {
|
|
$smarty->assign('category_watched', 'y');
|
|
$watching_categories = [];
|
|
foreach ($watching_categories_temp as $wct) {
|
|
$watching_categories[] = ["categId" => $wct, "name" => $categlib->get_category_name($wct)];
|
|
}
|
|
$smarty->assign('watching_categories', $watching_categories);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($prefs['feature_theme_control'] == 'y' and isset($_REQUEST['calIds'])) {
|
|
$cat_type = "calendar";
|
|
$cat_objid = $_REQUEST['calIds'][0];
|
|
}
|
|
include_once('tiki-section_options.php');
|
|
|
|
ask_ticket('calendar');
|
|
|
|
$headerlib->add_cssfile('vendor_bundled/vendor/npm-asset/fullcalendar/main.css');
|
|
$headerlib->add_cssfile('vendor_bundled/vendor/twbs/bootstrap-icons/font/bootstrap-icons.css');
|
|
// Disable fullcalendar's force events to be one-line tall
|
|
$headerlib->add_css('.fc-day-grid-event > .fc-content { white-space: normal; }');
|
|
$headerlib->add_jsfile('vendor_bundled/vendor/moment/moment/min/moment.min.js', true);
|
|
$headerlib->add_jsfile('vendor_bundled/vendor/npm-asset/fullcalendar/main.js', true);
|
|
|
|
$smarty->assign('minHourOfDay', $minHourOfDay . ':00:00');
|
|
$smarty->assign('maxHourOfDay', $maxHourOfDay . ':00:00');
|
|
if ($prefs['feature_wysiwyg'] == 'y' && $prefs['wysiwyg_default'] == 'y') {
|
|
TikiLib::lib('wysiwyg')->setUpEditor(false, 'editwiki'); // init ckeditor if default editor
|
|
}
|
|
|
|
if (isset($_REQUEST['editmode']) && ($_REQUEST['editmode'] == 'add' || $_REQUEST['editmode'] == 'edit')) {
|
|
$smarty->assign('mid', 'tiki-calendar_add_event.tpl');
|
|
} else {
|
|
// Detect if we have a PDF export mod installed
|
|
$smarty->assign('pdf_export', ($prefs['print_pdf_from_url'] != 'none') ? 'y' : 'n');
|
|
$smarty->assign('pdf_warning', 'n');
|
|
//checking if mPDF package is available
|
|
|
|
if ($prefs['print_pdf_from_url'] == "mpdf" && ! class_exists('\\Mpdf\\Mpdf')) {
|
|
$smarty->assign('pdf_warning', 'y');
|
|
}
|
|
$smarty->assign('mid', 'tiki-calendar.tpl');
|
|
}
|
|
|
|
// disallow robots to index page:
|
|
$smarty->assign('metatag_robots', 'NOINDEX, NOFOLLOW');
|
|
$smarty->display("tiki.tpl");
|