1<?php
2/**
3 * @package tikiwiki
4 */
5// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
6//
7// All Rights Reserved. See copyright.txt for details and a complete list of authors.
8// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
9// $Id$
10
11$section = 'calendar';
12require_once('tiki-setup.php');
13
14$calendarlib = TikiLib::lib('calendar');
15$categlib = TikiLib::lib('categ');
16include_once('lib/newsletters/nllib.php');
17
18$headerlib->add_cssfile('themes/base_files/feature_css/calendar.css', 20);
19# perms are
20# 	$tiki_p_view_calendar
21# 	$tiki_p_admin_calendar
22# 	$tiki_p_change_events
23# 	$tiki_p_add_events
24$access->check_feature('feature_calendar');
25
26$maxSimultaneousWeekViewEvents = 3;
27
28$myurl = 'tiki-calendar.php';
29$exportUrl = 'tiki-calendar_export_ical.php';
30$iCalAdvParamsUrl = 'tiki-calendar_params_ical.php';
31$bufid = [];
32$bufdata = [];
33$editable = [];
34if (! isset($cookietab)) {
35	$cookietab = '1';
36}
37$rawcals = $calendarlib->list_calendars();
38$cals_info = $rawcals;
39$rawcals['data'] = Perms::filter([ 'type' => 'calendar' ], 'object', $rawcals['data'], [ 'object' => 'calendarId' ], 'view_calendar');
40$viewOneCal = $tiki_p_view_calendar;
41$modifTab = 0;
42
43$minHourOfDay = 12;
44$maxHourOfDay = 12;
45$manyEvents = [];
46
47foreach ($rawcals["data"] as $cal_data) {
48	$cal_id = $cal_data['calendarId'];
49	$minHourOfDay = min($minHourOfDay, (int)($cal_data['startday'] / 3600));
50	$maxHourOfDay = max($maxHourOfDay, (int)(($cal_data['endday'] + 1) / 3600));
51	if ($tiki_p_admin == 'y') {
52		$cal_data["tiki_p_view_calendar"] = 'y';
53		$cal_data["tiki_p_view_events"] = 'y';
54		$cal_data["tiki_p_add_events"] = 'y';
55		$cal_data["tiki_p_change_events"] = 'y';
56	} elseif ($cal_data["personal"] == "y") {
57		if ($user) {
58			$cal_data["tiki_p_view_calendar"] = 'y';
59			$cal_data["tiki_p_view_events"] = 'y';
60			$cal_data["tiki_p_add_events"] = 'y';
61			$cal_data["tiki_p_change_events"] = 'y';
62		} else {
63			$cal_data["tiki_p_view_calendar"] = 'n';
64			$cal_data["tiki_p_view_events"] = 'y';
65			$cal_data["tiki_p_add_events"] = 'n';
66			$cal_data["tiki_p_change_events"] = 'n';
67		}
68	} else {
69		$calperms = Perms::get([ 'type' => 'calendar', 'object' => $cal_id ]);
70		$cal_data["tiki_p_view_calendar"] = $calperms->view_calendar ? 'y' : 'n';
71		$cal_data["tiki_p_view_events"] = $calperms->view_events ? 'y' : 'n';
72		$cal_data["tiki_p_add_events"] = $calperms->add_events ? 'y' : 'n';
73		$cal_data["tiki_p_change_events"] = $calperms->change_events ? 'y' : 'n';
74	}
75	if ($cal_data["tiki_p_view_calendar"] == 'y') {
76		$viewOneCal = 'y';
77		$bufid[] = $cal_id;
78		$bufdata["$cal_id"] = $cal_data;
79	}
80	if ($cal_data["tiki_p_view_events"] == 'y') {
81		$visible[] = $cal_id;
82	}
83	if ($cal_data["tiki_p_add_events"] == 'y') {
84		$modifTab = 1;
85	}
86	if ($cal_data["tiki_p_change_events"] == 'y') {
87		$modifTab = 1;
88		$editable[] = $cal_id;
89		$visible[] = $cal_id;
90	}
91}
92
93if ($viewOneCal != 'y') {
94	$smarty->assign('errortype', 401);
95	$smarty->assign('msg', tra("You do not have permission to view the calendar"));
96	$smarty->display("error.tpl");
97	die;
98}
99
100$listcals = $bufid;
101$infocals["data"] = $bufdata;
102
103// set up list of groups
104$use_default_calendars = false;
105if (isset($_REQUEST["calIds"])and is_array($_REQUEST["calIds"])and count($_REQUEST["calIds"])) {
106	$_SESSION['CalendarViewGroups'] = array_intersect($_REQUEST["calIds"], $listcals);
107	if (! empty($user)) {
108		$tikilib->set_user_preference($user, 'default_calendars', serialize($_SESSION['CalendarViewGroups']));
109	}
110} elseif (isset($_REQUEST["calIds"])and ! is_array($_REQUEST["calIds"])) {
111	$_SESSION['CalendarViewGroups'] = array_intersect([$_REQUEST["calIds"]], $listcals);
112	if (! empty($user)) {
113		$tikilib->set_user_preference($user, 'default_calendars', serialize($_SESSION['CalendarViewGroups']));
114	}
115} elseif (! empty($_REQUEST['allCals'])) {
116	$_SESSION['CalendarViewGroups'] = $listcals;
117} elseif (! isset($_SESSION['CalendarViewGroups']) || ! empty($_REQUEST['allCals'])) {
118	$use_default_calendars = true;
119} elseif (isset($_REQUEST["refresh"])and ! isset($_REQUEST["calIds"])) {
120	$_SESSION['CalendarViewGroups'] = [];
121} elseif (! empty($user) || ! isset($_SESSION['CalendarViewGroups'])) {
122	$use_default_calendars = true;
123}
124
125if ($use_default_calendars) {
126	if ($prefs['feature_default_calendars'] == 'y') {
127		$_SESSION['CalendarViewGroups'] = array_intersect(is_array($prefs['default_calendars']) ? $prefs['default_calendars'] : unserialize($prefs['default_calendars']), $listcals);
128	} elseif (! empty($user)) {
129		$user_default_calendars = $tikilib->get_user_preference($user, 'default_calendars', $listcals);
130		if (is_string($user_default_calendars)) {
131			$user_default_calendars = unserialize($user_default_calendars);
132		}
133		$_SESSION['CalendarViewGroups'] = $user_default_calendars;
134	} else {
135		$_SESSION['CalendarViewGroups'] = $listcals;
136	}
137}
138
139$thiscal = [];
140$checkedCals = [];
141
142foreach ($listcals as $thatid) {
143	if (is_array($_SESSION['CalendarViewGroups']) && (in_array("$thatid", $_SESSION['CalendarViewGroups']))) {
144		$thiscal["$thatid"] = 1;
145		$checkedCals[] = $thatid;
146	} else {
147		$thiscal["$thatid"] = 0;
148	}
149}
150
151//include_once("tiki-calendar_setup.php");
152
153// Calculate all the displayed days for the selected calendars
154/*
155$viewdays = array();
156foreach ($_SESSION['CalendarViewGroups'] as $calendar) {
157	$info = $calendarlib->get_calendar($calendar);
158	if (is_array($info['viewdays']))
159		$viewdays = array_merge($info['viewdays'],$viewdays);
160}
161if (empty($viewdays)) {
162		$viewdays = array(0,1,2,3,4,5,6);
163}
164sort($viewdays, SORT_NUMERIC);
165$viewdays = array_map("correct_start_day", array_unique($viewdays));
166$viewdays2 = array_values($viewdays);
167*/
168
169if (isset($_REQUEST['sort_mode'])) {
170	$sort_mode = $_REQUEST['sort_mode'];
171}
172
173$viewstart = $_REQUEST['start'];
174$viewend = $_REQUEST['end'];
175
176$viewstart = new DateTime($viewstart);
177$viewstart = $viewstart->getTimestamp();
178
179$viewend = new DateTime($viewend);
180$viewend = $viewend->getTimestamp();
181
182if ($_SESSION['CalendarViewGroups']) {
183	$listevents = $calendarlib->list_raw_items($_SESSION['CalendarViewGroups'], $user, $viewstart, $viewend, 0, -1);
184	for ($i = count($listevents) - 1; $i >= 0; --$i) {
185		$listevents[$i]['editable'] = in_array($listevents[$i]['calendarId'], $editable) ? "y" : "n";
186		$listevents[$i]['visible'] = in_array($listevents[$i]['calendarId'], $visible) ? "y" : "n";
187	}
188} else {
189	$listevents = [];
190}
191
192
193if ($prefs['feature_theme_control'] == 'y'	and isset($_REQUEST['calIds'])) {
194	$cat_type = "calendar";
195	$cat_objid = $_REQUEST['calIds'][0];
196}
197
198$events = [];
199foreach ($listevents as $event) {
200	if ($event['editable'] === 'y' and $cal_data["tiki_p_change_events"] == 'y') {
201		$url = 'tiki-calendar_edit_item.php?fullcalendar=y&calitemId=' . $event['calitemId'];
202	} else {
203		$url = 'tiki-calendar_edit_item.php?viewcalitemId=' . $event['calitemId']; // removed fullcalendar=y param to prevent display without tpl for anons in some setups
204	}
205	$events[] = [ 'id' => $event['calitemId'],
206											'title' => $event['name'],
207											'description' => ! empty($event["description"]) ? TikiLib::lib('parser')->parse_data($event["description"], ['is_html' => $prefs['calendar_description_is_html'] === 'y']) : "",
208											'url' => $url,
209											'allDay' => $event['allday'] != 0 ,
210											'start' => TikiLib::date_format("c", $event['date_start'], false, 5, false),
211											'end' => TikiLib::date_format("c", $event['date_end'], false, 5, false),
212											'editable' => $event['editable'] === 'y',
213											'color' => '#' . $cals_info['data'][$event['calendarId']]['custombgcolor'],
214											'textColor' => '#' . $cals_info['data'][$event['calendarId']]['customfgcolor']];
215}
216
217echo json_encode($events);
218