summaryrefslogtreecommitdiffstats
path: root/apps/calendar/ajax/events.php
blob: d053df2e4c11e0e719c1e748a8fc1c51bb360c7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php
/**
 * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de>
 * This file is licensed under the Affero General Public License version 3 or
 * later.
 * See the COPYING-README file.
 */

require_once ('../../../lib/base.php');
require_once('when/When.php');
$l = OC_L10N::get('calendar');
$unnamed = $l->t('unnamed');
function create_return_event($event, $vevent){
	$return_event = array();
	global $unnamed;
	$return_event['id'] = (int)$event['id'];
	$return_event['title'] = htmlspecialchars(($event['summary']!=NULL || $event['summary'] != '')?$event['summary']: $unnamed);
	$return_event['description'] = isset($vevent->DESCRIPTION)?htmlspecialchars($vevent->DESCRIPTION->value):'';
	$last_modified = $vevent->__get('LAST-MODIFIED');
	if ($last_modified){
		$lastmodified = $last_modified->getDateTime()->format('U');
	}else{
		$lastmodified = 0;
	}
	$return_event['lastmodified'] = (int)$lastmodified;
	return $return_event;
}

OC_JSON::checkLoggedIn();
OC_JSON::checkAppEnabled('calendar');

if(version_compare(PHP_VERSION, '5.3.0', '>=')){
	$start = DateTime::createFromFormat('U', $_GET['start']);
	$end = DateTime::createFromFormat('U', $_GET['end']);
}else{
	$start = new DateTime('@' . $_GET['start']);
	$end = new DateTime('@' . $_GET['end']);
}

$calendar_id = $_GET['calendar_id'];
if (is_numeric($calendar_id)) {
	$calendar = OC_Calendar_App::getCalendar($calendar_id);
	OC_Response::enableCaching(0);
	OC_Response::setETagHeader($calendar['ctag']);
	$events = OC_Calendar_Object::allInPeriod($calendar_id, $start, $end);
} else {
	$events = array();
	OC_Hook::emit('OC_Calendar', 'getEvents', array('calendar_id' => $calendar_id, 'events' => &$events));
}

$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone', date_default_timezone_get());
$return = array();
foreach($events as $event){
	if (isset($event['calendardata'])) {
		$object = OC_VObject::parse($event['calendardata']);
		$vevent = $object->VEVENT;
	} else {
		$vevent = $event['vevent'];
	}

	$return_event = create_return_event($event, $vevent);

	$dtstart = $vevent->DTSTART;
	$start_dt = $dtstart->getDateTime();
	$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
	$end_dt = $dtend->getDateTime();
	if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE){
		$return_event['allDay'] = true;
	}else{
		$return_event['allDay'] = false;
		$start_dt->setTimezone(new DateTimeZone($user_timezone));
		$end_dt->setTimezone(new DateTimeZone($user_timezone));
	}

	//Repeating Events
	if($event['repeating'] == 1){
		$duration = (double) $end_dt->format('U') - (double) $start_dt->format('U');
		$r = new When();
		$r->recur($start_dt)->rrule((string) $vevent->RRULE);
		while($result = $r->next()){
			if($result < $start){
				continue;
			}
			if($result > $end){
				break;
			}
			if($return_event['allDay'] == true){
				$return_event['start'] = $result->format('Y-m-d');
				$return_event['end'] = date('Y-m-d', $result->format('U') + --$duration);
			}else{
				$return_event['start'] = $result->format('Y-m-d H:i:s');
				$return_event['end'] = date('Y-m-d H:i:s', $result->format('U') + $duration);
			}
			$return[] = $return_event;
		}
	}else{
		if($return_event['allDay'] == true){
			$return_event['start'] = $start_dt->format('Y-m-d');
			$end_dt->modify('-1 sec');
			$return_event['end'] = $end_dt->format('Y-m-d');
		}else{
			$return_event['start'] = $start_dt->format('Y-m-d H:i:s');
			$return_event['end'] = $end_dt->format('Y-m-d H:i:s');
		}
		$return[] = $return_event;
	}
}
OC_JSON::encodedPrint($return);
?>