summaryrefslogtreecommitdiffstats
path: root/apps/calendar/ajax/getcal.php
blob: 3d43677075f7da0871ab635d9a266f3aa26f1d0d (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
<?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");
if(!OC_USER::isLoggedIn()) {
	die("<script type=\"text/javascript\">document.location = oc_webroot;</script>");
}
OC_JSON::checkAppEnabled('calendar');

$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1);
$events = array();
$return = array('calendars'=>array());
foreach($calendars as $calendar) {
	$tmp = OC_Calendar_Object::all($calendar['id']);
	$events = array_merge($events, $tmp);
	$return['calendars'][$calendar['id']] = array(
		'displayname' => $calendar['displayname'],
		'color'       => '#'.$calendar['calendarcolor']
	);
}

$select_year = $_GET["year"];
$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London");
foreach($events as $event)
{
	if($select_year != substr($event['startdate'], 0, 4) && $event["repeating"] == false)
		continue;
	if($select_year == substr($event['startdate'], 0, 4) && $event["repeating"] == false){
		$object = Sabre_VObject_Reader::read($event['calendardata']);
		$vevent = $object->VEVENT;
		$dtstart = $vevent->DTSTART;
		$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
		$start_dt = $dtstart->getDateTime();
		$start_dt->setTimezone(new DateTimeZone($user_timezone));
		$end_dt = $dtend->getDateTime();
		$end_dt->setTimezone(new DateTimeZone($user_timezone));
		$year  = $start_dt->format('Y');
		$month = $start_dt->format('n') - 1; // return is 0 based
		$day   = $start_dt->format('j');
		$hour  = $start_dt->format('G');
		if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
			$hour = 'allday';
		}

		$return_event = array();
		foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop)
		{
			$return_event[$prop] = $event[$prop];
		}
		$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
		$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
		$return_event['description'] = $event['summary'];
		if ($hour == 'allday')
		{
			$return_event['allday'] = true;
		}
		if (isset($return[$year][$month][$day][$hour]))
		{
			$return[$year][$month][$day][$hour][] = $return_event;
		}
		else
		{
			$return[$year][$month][$day][$hour] = array(1 => $return_event);
		}
	}
	if($event["repeating"] == 1){
		$object = Sabre_VObject_Reader::read($event['calendardata']);
		$vevent = $object->VEVENT;
		//echo substr_count($event["calendardata"], "EXDATE");
		$numofelements = substr_count($vevent->RRULE, ";");
		$properties = array("FREQ"=>"false", "UNTIL"=>"false", "COUNT"=>"false", "INTERVAL"=>"false", "BYDAY"=>"false", "BYMONTHDAY"=>"false", "BYWEEKNO"=>"false", "BYMONTH"=>"false", "BYYEARDAY"=>"false", "BYSETPOS"=>"false");
		$exruleproperties = array("FREQ"=>"false", "UNTIL"=>"false", "COUNT"=>"false", "INTERVAL"=>"false", "BYDAY"=>"false", "BYMONTHDAY"=>"false", "BYWEEKNO"=>"false", "BYMONTH"=>"false", "BYYEARDAY"=>"false", "BYSETPOS"=>"false");
		$byday = array("MO"=>"false", "TU"=>"false", "WE"=>"false", "TH"=>"false", "FR"=>"false", "SA"=>"false", "SU"=>"false");
		if($numofelements !=  0){
			$rrule = explode(";", $vevent->RRULE);
			for($i = 0;$i <= $numofelements;$i++){
				$rule = explode("=", $rrule[$i]);
				$property = $rule[0];
				$value = $rule[1];
				$properties[$property] = $value;
			}
			if($properties["BYDAY"] != "false"){
				$numofdays = substr_count($properties["BYDAY"], ",");
				if($numofdays == 0){
					if(strlen($properties["BYDAY"]) != 2){
						$lenght = strlen($properties["BYDAY"]);
						switch($lenght){
							case "3":
								$properties["BYSETPOS"] = substr($properties["BYDAY"],0,1);
								$properties["BYDAY"] = substr($properties["BYDAY"],1,2);
								break;
							case "4":
								$properties["BYSETPOS"] = substr($properties["BYDAY"],0,2);
								$properties["BYDAY"] = substr($properties["BYDAY"],2,2);
								break;
							case "5":
								$properties["BYSETPOS"] = substr($properties["BYDAY"],0,3);
								$properties["BYDAY"] = substr($properties["BYDAY"],3,2);
								break;
							case "6":
								$properties["BYSETPOS"] = substr($properties["BYDAY"],0,4);
								$properties["BYDAY"] = substr($properties["BYDAY"],4,2);
								break;
						}
					}
					$byday[$properties["BYDAY"]] = true;
					
				}else{
					$days = explode(",", $properties["BYDAY"]);
					for($i = 0;$i <= $numofdays;$i++){
						$day = $days[$i];
						$byday[$day] = true;
					}
				}
			}
		}else{
			$rule = explode("=", $vevent->RRULE);
			$properties[$rule[0]] = $rule[1];
		}
		if($properties["INTERVAL"] == "false"){
				$properties["INTERVAL"] = 1;
		}
		$count = 0; //counts all loops
		$countedoutputs = 0; //counts only the outputs
		$countchecker = true;
		$dtstart = $vevent->DTSTART;
		$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent);
		$start_dt = $dtstart->getDateTime();
		$start_dt->setTimezone(new DateTimeZone($user_timezone));
		$end_dt = $dtend->getDateTime();
		$end_dt->setTimezone(new DateTimeZone($user_timezone));
		$firststart_year  = $start_dt->format('Y');
		$firststart_month = $start_dt->format('n');
		$firststart_day   = $start_dt->format('j');
		$hour  = $start_dt->format('G');
		$interval = 0;
		if($properties["UNTIL"] != "false"){
			$until = $properties["UNTIL"];
			$until_year = substr($until, 0, 4);
			$until_month = substr($until, 4, 2);
			$until_day = substr($until, 6, 2);
		}
		//print_r($properties);
		//print_r($byday);
		if($properties["FREQ"] == "DAILY"){
			if($properties["BYDAY"] == "false"){
				$byday = array("MO"=>"1", "TU"=>"1", "WE"=>"1", "TH"=>"1", "FR"=>"1", "SA"=>"1", "SU"=>"1");
			}
			while(date("Y", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval)) <= $select_year && $countchecker == true){
				if($byday[strtoupper(substr(date("D", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval)), 0, 2))] == "1"){
					$newunixtime = mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval);
					$year  = date("Y", $newunixtime);
					$month = date("n", $newunixtime) - 1; // return is 0 based
					$day   = date("j", $newunixtime);
					if($properties["UNTIL"] != "false"){
						if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
							break;
						}
					}
					if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
						$hour = 'allday';
					}
					$return_event = array();
					foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
						$return_event[$prop] = $event[$prop];
					}
					$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
					$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
					$return_event['description'] = $event['summary'];
					$interval = $properties["INTERVAL"];
					$countedoutputs++;
					if($properties["COUNT"] != "false"){
						if($countedoutputs == $properties["COUNT"]){
							$countchecker = false;
						}
					}
					if ($hour == 'allday'){
						$return_event['allday'] = true;
					}
					if (isset($return[$year][$month][$day][$hour])){
						$return[$year][$month][$day][$hour][] = $return_event;
					}else{
						$return[$year][$month][$day][$hour] = array(1 => $return_event);
					}
				}
				$count++;
			}
		}
		if($properties["FREQ"] == "WEEKLY"){
			if($properties["BYDAY"] == "false"){
				$byday[strtoupper(substr(date("D", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year)), 0, 2))] = "1";
			}
			while(date("Y", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval)) <= $select_year && $countchecker == true){
				if($byday[strtoupper(substr(date("D", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval)), 0, 2))] == "1"){
					$newunixtime = mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year) + ($count * 1 * 86400 * $interval);
					$year  = date("Y", $newunixtime);
					$month = date("n", $newunixtime) - 1; // return is 0 based
					$day   = date("j", $newunixtime);
					if($properties["UNTIL"] != "false"){
						if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
							break;
						}
					}
					if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
						$hour = 'allday';
					}
					$return_event = array();
					foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
						$return_event[$prop] = $event[$prop];
					}
					$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
					$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
					$return_event['description'] = $event['summary'];
					$interval = $properties["INTERVAL"];
					$countedoutputs++;
					if($properties["COUNT"] != "false"){
						if($countedoutputs == $properties["COUNT"]){
							$countchecker = false;
						}
					}
					if ($hour == 'allday'){
						$return_event['allday'] = true;
					}
					if (isset($return[$year][$month][$day][$hour])){
						$return[$year][$month][$day][$hour][] = $return_event;
					}else{
						$return[$year][$month][$day][$hour] = array(1 => $return_event);
					}
				}
				$count++;
			}
		}
		if($properties["FREQ"] == "MONTHLY"){
			if(substr_count($properties["BYMONTHDAY"], ",") != 0){
				$numofBYMONTHDAY = substr_count($properties["BYMONTHDAY"], ",");
				if($numofBYMONTHDAY == 0){
					$BYMONTHDAY = array();
					$BYMONTHDAY[0] = $properties["BYMONTHDAY"];
				}else{
					$BYMONTHDAY = explode(",", $properties["BYMONTHDAY"]);
				}
				while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $properties["BYMONTHDAY"], $firststart_year)) <= $select_year && $countchecker == true){
					for($i = 0;$i <= $numofBYMONTHDAY;$i++){
						$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $BYMONTHDAY[$i], $firststart_year);
						$year  = date("Y", $newunixtime);
						$month = date("n", $newunixtime) - 1; // return is 0 based
						$day   = date("j", $newunixtime);
						if($properties["UNTIL"] != "false"){
							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
								break;
							}
						}
						if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
							$hour = 'allday';
						}
						$return_event = array();
						foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
							$return_event[$prop] = $event[$prop];
						}
						$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
						$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
						$return_event['description'] = $event['summary'];
						$interval = $properties["INTERVAL"];
						$countedoutputs++;
						if($properties["COUNT"] != "false"){
							if($countedoutputs == $properties["COUNT"]){
								$countchecker = false;
							}
						}
						if ($hour == 'allday'){
							$return_event['allday'] = true;
						}
						if (isset($return[$year][$month][$day][$hour])){
							$return[$year][$month][$day][$hour][] = $return_event;
						}else{
							$return[$year][$month][$day][$hour] = array(1 => $return_event);
						}
					}
					$count++;
				}
			}
			//if($properties["BYMONTHDAY"] != "false"){
				if($properties["BYSETPOS"] == "false"){
					while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $properties["BYMONTHDAY"], $firststart_year)) <= $select_year && $countchecker == true){
						$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $properties["BYMONTHDAY"], $firststart_year);
						$year  = date("Y", $newunixtime);
						$month = date("n", $newunixtime) - 1; // return is 0 based
						$day   = date("j", $newunixtime);
						if($properties["UNTIL"] != "false"){
							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
								break;
							}
						}
						if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
							$hour = 'allday';
						}
						$return_event = array();
						foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
							$return_event[$prop] = $event[$prop];
						}
						$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
						$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
						$return_event['description'] = $event['summary'];
						$interval = $properties["INTERVAL"];
						$countedoutputs++;
						if($properties["COUNT"] != "false"){
							if($countedoutputs == $properties["COUNT"]){
								$countchecker = false;
							}
						}
						if ($hour == 'allday'){
							$return_event['allday'] = true;
						}
						if (isset($return[$year][$month][$day][$hour])){
							$return[$year][$month][$day][$hour][] = $return_event;
						}else{
							$return[$year][$month][$day][$hour] = array(1 => $return_event);
						}
						$count++;
					}
				}else{
					if(!is_nan($properties["BYSETPOS"]) && $properties["BYSETPOS"] >= 1){
						while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year)) <= $select_year && $countchecker == true){
							$lastdayofmonth = date("t", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year));
							$matches = 0;
							$matchedday = "";
							for($i = 1;$i <= $lastdayofmonth;$i++){
								$thisday = date("j", mktime(0,0,0, $firststart_month + ($count * $interval), $i, $firststart_year));
								$thisdayname = strtoupper(substr(date("D", mktime(0,0,0, $firststart_month + ($count * $interval), $i, $firststart_year)),0,2));
								//echo $thisdayname . " " . $thisday . "\n"; 
								if($byday[$thisdayname] == 1){
									$matches++;
								}
								if($matches == $properties["BYSETPOS"]){
									$matchedday = $thisday;
									$i = 32;
								}
							}
							$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year);
							$year  = date("Y", $newunixtime);
							$month = date("n", $newunixtime) - 1; // return is 0 based
							$day   = $matchedday;
							if($properties["UNTIL"] != "false"){
								if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
									break;
								}
							}
							if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
								$hour = 'allday';
							}
							$return_event = array();
							foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
								$return_event[$prop] = $event[$prop];
							}
							$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
							$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
							$return_event['description'] = $event['summary'];
							$interval = $properties["INTERVAL"];
							$countedoutputs++;
							if($properties["COUNT"] != "false"){
								if($countedoutputs == $properties["COUNT"]){
									$countchecker = false;
								}
							}
							if ($hour == 'allday'){
								$return_event['allday'] = true;
							}
							if (isset($return[$year][$month][$day][$hour])){
								$return[$year][$month][$day][$hour][] = $return_event;
							}else{
								$return[$year][$month][$day][$hour] = array(1 => $return_event);
							}
							$count++;
						}
					}elseif(!is_nan($properties["BYSETPOS"]) && $properties["BYSETPOS"] <= -1){
						while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year)) <= $select_year && $countchecker == true){
							$lastdayofmonth = date("t", mktime(0,0,0, $firststart_month + ($count * $interval), 1, $firststart_year));
							$matches = 0;
							$matchedday = "";
							for($i = $lastdayofmonth;$i >= 1;$i--){
								$thisday = date("j", mktime(0,0,0, $firststart_month + ($count * $interval), $i, $firststart_year));
								$thisdayname = strtoupper(substr(date("D", mktime(0,0,0, $firststart_month + ($count * $interval), $i, $firststart_year)),0,2));
								//echo $thisdayname . " " . $thisday . "\n"; 
								if($byday[$thisdayname] == 1){
									$matches++;
								}
								if($matches == $properties["BYSETPOS"]){
									$matchedday = $thisday;
									$i = 0;
								}
							}
							$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year);
							$year  = date("Y", $newunixtime);
							$month = date("n", $newunixtime) - 1; // return is 0 based
							$day   = $matchedday;
							if($properties["UNTIL"] != "false"){
								if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
									break;
								}
							}
							if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
								$hour = 'allday';
							}
							$return_event = array();
							foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
								$return_event[$prop] = $event[$prop];
							}
							$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
							$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
							$return_event['description'] = $event['summary'];
							$interval = $properties["INTERVAL"];
							$countedoutputs++;
							if($properties["COUNT"] != "false"){
								if($countedoutputs == $properties["COUNT"]){
									$countchecker = false;
								}
							}
							if ($hour == 'allday'){
								$return_event['allday'] = true;
							}
							if (isset($return[$year][$month][$day][$hour])){
								$return[$year][$month][$day][$hour][] = $return_event;
							}else{
								$return[$year][$month][$day][$hour] = array(1 => $return_event);
							}
							$count++;
						}
					//}
				}
			}
			if(strlen($properties["BYDAY"]) == 2){
				while(date("Y", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year)) <= $select_year && $countchecker == true){
					if($byday[strtoupper(substr(date("D", mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year)), 0, 2))] == "1"){
						$newunixtime = mktime(0,0,0, $firststart_month + ($count * $interval), $firststart_day, $firststart_year);
						$year  = date("Y", $newunixtime);
						$month = date("n", $newunixtime) - 1; // return is 0 based
						$day   = date("j", $newunixtime);
						if($properties["UNTIL"] != "false"){
							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
								break;
							}
						}
						if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
							$hour = 'allday';
						}
						$return_event = array();
						foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
							$return_event[$prop] = $event[$prop];
						}
						$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
						$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
						$return_event['description'] = $event['summary'];
						$interval = $properties["INTERVAL"];
						$countedoutputs++;
						if($properties["COUNT"] != "false"){
							if($countedoutputs == $properties["COUNT"]){
								$countchecker = false;
							}
						}
						if ($hour == 'allday'){
							$return_event['allday'] = true;
						}
						if (isset($return[$year][$month][$day][$hour])){
							$return[$year][$month][$day][$hour][] = $return_event;
						}else{
							$return[$year][$month][$day][$hour] = array(1 => $return_event);
						}
					}
					$count++;
				}
			}else{
				while(date("Y", mktime(0,0,0, 0, 0, $firststart_year + ($count * $interval))) <= $select_year && $countchecker == true){
					$newunixtime = mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval));
					$year  = date("Y", $newunixtime);
					$month = $month - 1; // return is 0 based
					$day   = $dateofweekone;
					if($properties["UNTIL"] != "false"){
						if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
							break;
						}
					}
					if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
						$hour = 'allday';
					}
					$return_event = array();
					foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
						$return_event[$prop] = $event[$prop];
					}
					$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
					$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
					$return_event['description'] = $event['summary'];
					$interval = $properties["INTERVAL"];
					$countedoutputs++;
					if($properties["COUNT"] != "false"){
						if($countedoutputs == $properties["COUNT"]){
							$countchecker = false;
						}
					}
					if ($hour == 'allday'){
						$return_event['allday'] = true;
					}
					if (isset($return[$year][$month][$day][$hour])){
						$return[$year][$month][$day][$hour][] = $return_event;
					}else{
						$return[$year][$month][$day][$hour] = array(1 => $return_event);
					}
					$count++;
				}
			}
		}
		if($properties["FREQ"] == "YEARLY"){
			if($properties["BYMONTH"] != "false"){
				if($properties["BYMONTHDAY"] == false){
					$properties["BYMONTHDAY"] = date("j", mktime(0,0,0, $firststart_month, $firststart_day, $firststart_year));
				}
				if($properties["BYDAY"] == "false"){
					while(date("Y", mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval))) <= $select_year && $countchecker == true){
						$newunixtime = mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval));
						$year  = date("Y", $newunixtime);
						$month = date("n", $newunixtime) - 1; // return is 0 based
						$day   = date("j", $newunixtime);
						if($properties["UNTIL"] != "false"){
							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
								break;
							}
						}
						if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
							$hour = 'allday';
						}
						$return_event = array();
						foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
							$return_event[$prop] = $event[$prop];
						}
						$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
						$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
						$return_event['description'] = $event['summary'];
						$interval = $properties["INTERVAL"];
						$countedoutputs++;
						if($properties["COUNT"] != "false"){
							if($countedoutputs == $properties["COUNT"]){
								$countchecker = false;
							}
						}
						if ($hour == 'allday'){
							$return_event['allday'] = true;
						}
						if (isset($return[$year][$month][$day][$hour])){
							$return[$year][$month][$day][$hour][] = $return_event;
						}else{
							$return[$year][$month][$day][$hour] = array(1 => $return_event);
						}
						$count++;
					}
				}
				if(strlen($properties["BYDAY"]) == 2){
					while(date("Y", mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval))) <= $select_year && $countchecker == true){
						$newunixtime = mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval));
						$year  = date("Y", $newunixtime);
						$month = date("n", $newunixtime) - 1; // return is 0 based
						$day   = date("j", $newunixtime);
						if($properties["UNTIL"] != "false"){
							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
								break;
							}
						}
						if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
							$hour = 'allday';
						}
						$return_event = array();
						foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
							$return_event[$prop] = $event[$prop];
						}
						$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
						$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
						$return_event['description'] = $event['summary'];
						$interval = $properties["INTERVAL"];
						$countedoutputs++;
						if($properties["COUNT"] != "false"){
							if($countedoutputs == $properties["COUNT"]){
								$countchecker = false;
							}
						}
						if ($hour == 'allday'){
							$return_event['allday'] = true;
						}
						if (isset($return[$year][$month][$day][$hour])){
							$return[$year][$month][$day][$hour][] = $return_event;
						}else{
							$return[$year][$month][$day][$hour] = array(1 => $return_event);
						}
						$count++;
					}
				}else{
					$number = substr($properties["BYDAY"],0,1);
					$weekday = substr($properties["BYDAY"],1,2);
					$month = $properties["BYMONTH"];
					$dateofweekone = "";
					for($i = 0; $i <= 7;$i++){
						if(strtoupper(substr(date("D", mktime(0,0,0, $properties["BYMONTH"], $i, $select_year)), 0, 2)) == $weekday){
							$dateofweekone = date("j", mktime(0,0,0, $properties["BYMONTH"], $i, $select_year));
							$i = 8;
						}
					}
					if($number != 1){
						$dateofweekone = $dateofweekone + (7 * ($number - 1));
					}
					while(date("Y", mktime(0,0,0, 0, 0, $firststart_year + ($count * $interval))) <= $select_year && $countchecker == true){
						$newunixtime = mktime(0,0,0, $properties["BYMONTH"], $properties["BYMONTHDAY"], $firststart_year + ($count * $interval));
						$year  = date("Y", $newunixtime);
						$month = $month - 1; // return is 0 based
						$day   = $dateofweekone;
						if($properties["UNTIL"] != "false"){
							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
								break;
							}
						}
						if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
							$hour = 'allday';
						}
						$return_event = array();
						foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
							$return_event[$prop] = $event[$prop];
						}
						$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
						$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
						$return_event['description'] = $event['summary'];
						$interval = $properties["INTERVAL"];
						$countedoutputs++;
						if($properties["COUNT"] != "false"){
							if($countedoutputs == $properties["COUNT"]){
								$countchecker = false;
							}
						}
						if ($hour == 'allday'){
							$return_event['allday'] = true;
						}
						if (isset($return[$year][$month][$day][$hour])){
							$return[$year][$month][$day][$hour][] = $return_event;
						}else{
							$return[$year][$month][$day][$hour] = array(1 => $return_event);
						}
						$count++;
					}
				}
			}elseif($properties["BYYEARDAY"] != false){
				$numofyeardays = substr_count($properties["BYYEARDAY"], ",");
				if($numofyeardays == 0){
					$yeardays = array();
					$yeardays[0] = $properties["BYYEARDAY"];
				}else{
					$yeardays = explode(",", $properties["BYYEARDAY"]);
				}
				while(date("Y", mktime(0,0,0, 0, 0, $firststart_year + ($count * $interval)) + ($yeardays[$numofyeardays]-1) * 86400) <= $select_year && $countchecker == true){
					for($i = 0;$i <= $numofyeardays;$i++){
						$newunixtime = mktime(0,0,0, 1, 1, $firststart_year + ($count * $interval)) + ($yeardays[$i] -1) * 86400;
						$year  = date("Y", $newunixtime);
						$month = date("n", $newunixtime) - 1; // return is 0 based
						$day   = date("j", $newunixtime);
						if($properties["UNTIL"] != "false"){
							if($year >= $until_year && $month + 1 >= $until_month && $day > $until_day){
								break;
							}
						}
						if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
							$hour = 'allday';
						}
						$return_event = array();
						foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop){
							$return_event[$prop] = $event[$prop];
						}
						$return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i'));
						$return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i'));
						$return_event['description'] = $event['summary'];
						$interval = $properties["INTERVAL"];
						$countedoutputs++;
						if($properties["COUNT"] != "false"){
							if($countedoutputs == $properties["COUNT"]){
								$countchecker = false;
							}
						}
						if ($hour == 'allday'){
							$return_event['allday'] = true;
						}
						if (isset($return[$year][$month][$day][$hour])){
							$return[$year][$month][$day][$hour][] = $return_event;
						}else{
							$return[$year][$month][$day][$hour] = array(1 => $return_event);
						}
					}
					$count++;
				}
			}
		}
	}
}
OC_JSON::encodedPrint($return);