1 | <?php |
---|
2 | |
---|
3 | /**************************************************************************\ |
---|
4 | * eGroupWare - iCalendar Parser * |
---|
5 | * http://www.egroupware.org * |
---|
6 | * Written by Mark Peters <skeeter@phpgroupware.org> * |
---|
7 | * -------------------------------------------- * |
---|
8 | * This program is free software; you can redistribute it and/or modify it * |
---|
9 | * under the terms of the GNU General Public License as published by the * |
---|
10 | * Free Software Foundation; either version 2 of the License, or (at your * |
---|
11 | * option) any later version. * |
---|
12 | \**************************************************************************/ |
---|
13 | |
---|
14 | define('FOLD_LENGTH', 75); |
---|
15 | |
---|
16 | define('VEVENT', 1); |
---|
17 | define('VTODO', 2); |
---|
18 | |
---|
19 | define('NONE', 0); |
---|
20 | define('CHAIR', 1); |
---|
21 | define('REQ_PARTICIPANT', 2); |
---|
22 | define('OPT_PARTICIPANT', 3); |
---|
23 | define('NON_PARTICIPANT', 4); |
---|
24 | |
---|
25 | define('INDIVIDUAL', 1); |
---|
26 | define('GROUP', 2); |
---|
27 | define('RESOURCE', 4); |
---|
28 | define('ROOM', 8); |
---|
29 | define('UNKNOWN', 16); |
---|
30 | |
---|
31 | define('NEEDS_ACTION', 0); |
---|
32 | define('ACCEPTED', 1); |
---|
33 | define('DECLINED', 2); |
---|
34 | define('TENTATIVE', 3); |
---|
35 | define('DELEGATED', 4); |
---|
36 | define('COMPLETED', 5); |
---|
37 | define('IN_PROCESS', 6); |
---|
38 | |
---|
39 | /* |
---|
40 | * Class |
---|
41 | */ |
---|
42 | define('_PRIVATE', 0); |
---|
43 | define('_PUBLIC', 1); |
---|
44 | define('_CONFIDENTIAL', 3); |
---|
45 | |
---|
46 | /* |
---|
47 | * Transparency |
---|
48 | */ |
---|
49 | define('TRANSPARENT', 0); |
---|
50 | define('OPAQUE', 1); |
---|
51 | |
---|
52 | /* |
---|
53 | * Frequency |
---|
54 | */ |
---|
55 | define('SECONDLY', 1); |
---|
56 | define('MINUTELY', 2); |
---|
57 | define('HOURLY', 3); |
---|
58 | define('DAILY', 4); |
---|
59 | define('WEEKLY', 5); |
---|
60 | define('MONTHLY', 6); |
---|
61 | define('YEARLY', 7); |
---|
62 | |
---|
63 | define('FREE', 0); |
---|
64 | define('BUSY', 1); |
---|
65 | define('BUSY_UNAVAILABLE', 2); |
---|
66 | define('BUSY_TENTATIVE', 3); |
---|
67 | |
---|
68 | define('THISANDPRIOR', 0); |
---|
69 | define('THISANDFUTURE', 1); |
---|
70 | |
---|
71 | define('START', 0); |
---|
72 | define('END', 1); |
---|
73 | |
---|
74 | define('_8BIT', 0); |
---|
75 | define('_BASE64', 1); |
---|
76 | |
---|
77 | define('OTHER', 99); |
---|
78 | |
---|
79 | class boicalendar { |
---|
80 | var $public_functions = array ( |
---|
81 | 'import' => True, |
---|
82 | 'export' => True, |
---|
83 | 'freebusy' => True, |
---|
84 | ); |
---|
85 | |
---|
86 | var $ical; |
---|
87 | var $line = 0; |
---|
88 | var $event = Array (); |
---|
89 | var $todo = Array (); |
---|
90 | var $journal = Array (); |
---|
91 | var $freebusy = Array (); |
---|
92 | var $timezone = Array (); |
---|
93 | var $property = Array (); |
---|
94 | var $parameter = Array (); |
---|
95 | var $debug_str = False; |
---|
96 | var $api = True; |
---|
97 | var $chunk_split = True; |
---|
98 | |
---|
99 | /* |
---|
100 | * Base Functions |
---|
101 | */ |
---|
102 | |
---|
103 | function boicalendar() { |
---|
104 | $this->property = Array ( |
---|
105 | 'action' => Array ( |
---|
106 | 'type' => 'text', |
---|
107 | 'to_text' => True, |
---|
108 | 'valarm' => Array ( |
---|
109 | 'state' => 'required', |
---|
110 | 'multiples' => False |
---|
111 | ) |
---|
112 | ), |
---|
113 | 'attach' => Array ( |
---|
114 | 'type' => 'uri', |
---|
115 | 'to_text' => True, |
---|
116 | 'vevent' => Array ( |
---|
117 | 'state' => 'optional', |
---|
118 | 'multiples' => True |
---|
119 | ), |
---|
120 | 'vtodo' => Array ( |
---|
121 | 'state' => 'optional', |
---|
122 | 'multiples' => True |
---|
123 | ), |
---|
124 | 'vjournal' => Array ( |
---|
125 | 'state' => 'optional', |
---|
126 | 'multiples' => True |
---|
127 | ), |
---|
128 | 'valarm' => Array ( |
---|
129 | 'state' => 'optional', |
---|
130 | 'multiples' => True |
---|
131 | ) |
---|
132 | ), |
---|
133 | 'attendee' => Array ( |
---|
134 | 'type' => 'cal-address', |
---|
135 | 'to_text' => False, |
---|
136 | 'vevent' => Array ( |
---|
137 | 'state' => 'optional', |
---|
138 | 'multiples' => True |
---|
139 | ), |
---|
140 | 'vtodo' => Array ( |
---|
141 | 'state' => 'optional', |
---|
142 | 'multiples' => True |
---|
143 | ), |
---|
144 | 'vjournal' => Array ( |
---|
145 | 'state' => 'optional', |
---|
146 | 'multiples' => True |
---|
147 | ), |
---|
148 | 'valarm' => Array ( |
---|
149 | 'state' => 'optional', |
---|
150 | 'multiples' => True |
---|
151 | ), |
---|
152 | 'vfreebusy' => Array ( |
---|
153 | 'state' => 'optional', |
---|
154 | 'multiples' => True |
---|
155 | ) |
---|
156 | ), |
---|
157 | 'categories' => Array ( |
---|
158 | 'type' => 'text', |
---|
159 | 'to_text' => True, |
---|
160 | 'vevent' => Array ( |
---|
161 | 'state' => 'optional', |
---|
162 | 'multiples' => True |
---|
163 | ), |
---|
164 | 'vtodo' => Array ( |
---|
165 | 'state' => 'optional', |
---|
166 | 'multiples' => False |
---|
167 | ), |
---|
168 | 'vjournal' => Array ( |
---|
169 | 'state' => 'optional', |
---|
170 | 'multiples' => True |
---|
171 | ) |
---|
172 | ), |
---|
173 | 'class' => Array ( |
---|
174 | 'type' => 'text', |
---|
175 | 'to_text' => True, |
---|
176 | 'vevent' => Array ( |
---|
177 | 'state' => 'optional', |
---|
178 | 'multiples' => False |
---|
179 | ), |
---|
180 | 'vtodo' => Array ( |
---|
181 | 'state' => 'optional', |
---|
182 | 'multiples' => False |
---|
183 | ), |
---|
184 | 'vjournal' => Array ( |
---|
185 | 'state' => 'optional', |
---|
186 | 'multiples' => False |
---|
187 | ) |
---|
188 | ), |
---|
189 | 'comment' => Array ( |
---|
190 | 'type' => 'text', |
---|
191 | 'to_text' => True, |
---|
192 | 'daylight' => Array ( |
---|
193 | 'state' => 'optional', |
---|
194 | 'multiples' => True |
---|
195 | ), |
---|
196 | 'standard' => Array ( |
---|
197 | 'state' => 'optional', |
---|
198 | 'multiples' => True |
---|
199 | ), |
---|
200 | 'valarm' => Array ( |
---|
201 | 'state' => 'optional', |
---|
202 | 'multiples' => True |
---|
203 | ), |
---|
204 | 'vevent' => Array ( |
---|
205 | 'state' => 'optional', |
---|
206 | 'multiples' => True |
---|
207 | ), |
---|
208 | 'vfreebusy' => Array ( |
---|
209 | 'state' => 'optional', |
---|
210 | 'multiples' => True |
---|
211 | ), |
---|
212 | 'vjournal' => Array ( |
---|
213 | 'state' => 'optional', |
---|
214 | 'multiples' => True |
---|
215 | ), |
---|
216 | 'vtodo' => Array ( |
---|
217 | 'state' => 'optional', |
---|
218 | 'multiples' => True |
---|
219 | ) |
---|
220 | ), |
---|
221 | 'completed' => Array ( |
---|
222 | 'type' => 'date-time', |
---|
223 | 'to_text' => False, |
---|
224 | 'vtodo' => Array ( |
---|
225 | 'state' => 'optional', |
---|
226 | 'multiples' => False |
---|
227 | ) |
---|
228 | ), |
---|
229 | 'contact' => Array ( |
---|
230 | 'type' => 'text', |
---|
231 | 'to_text' => True, |
---|
232 | 'vevent' => Array ( |
---|
233 | 'state' => 'optional', |
---|
234 | 'multiples' => True |
---|
235 | ), |
---|
236 | 'vfreebusy' => Array ( |
---|
237 | 'state' => 'optional', |
---|
238 | 'multiples' => False |
---|
239 | ), |
---|
240 | 'vjournal' => Array ( |
---|
241 | 'state' => 'optional', |
---|
242 | 'multiples' => True |
---|
243 | ) |
---|
244 | ), |
---|
245 | 'created' => Array ( |
---|
246 | 'type' => 'date-time', |
---|
247 | 'to_text' => False, |
---|
248 | 'vevent' => Array ( |
---|
249 | 'state' => 'optional', |
---|
250 | 'multiples' => False |
---|
251 | ), |
---|
252 | 'vtodo' => Array ( |
---|
253 | 'state' => 'optional', |
---|
254 | 'multiples' => False |
---|
255 | ), |
---|
256 | 'vjournal' => Array ( |
---|
257 | 'state' => 'optional', |
---|
258 | 'multiples' => False |
---|
259 | ) |
---|
260 | ), |
---|
261 | 'description' => Array ( |
---|
262 | 'type' => 'text', |
---|
263 | 'to_text' => True, |
---|
264 | 'vevent' => Array ( |
---|
265 | 'state' => 'optional', |
---|
266 | 'multiples' => False |
---|
267 | ), |
---|
268 | 'vtodo' => Array ( |
---|
269 | 'state' => 'optional', |
---|
270 | 'multiples' => False |
---|
271 | ), |
---|
272 | 'vjournal' => Array ( |
---|
273 | 'state' => 'optional', |
---|
274 | 'multiples' => True |
---|
275 | ), |
---|
276 | 'valarm' => Array ( |
---|
277 | 'state' => 'optional', |
---|
278 | 'multiples' => False |
---|
279 | ) |
---|
280 | ), |
---|
281 | 'dtend' => Array ( |
---|
282 | 'type' => 'date-time', |
---|
283 | 'to_text' => False, |
---|
284 | 'vevent' => Array ( |
---|
285 | 'state' => 'optional', |
---|
286 | 'multiples' => False |
---|
287 | ), |
---|
288 | 'vfreebusy' => Array ( |
---|
289 | 'state' => 'optional', |
---|
290 | 'multiples' => False |
---|
291 | ) |
---|
292 | ), |
---|
293 | 'dtstamp' => Array ( |
---|
294 | 'type' => 'date-time', |
---|
295 | 'to_text' => False, |
---|
296 | 'vevent' => Array ( |
---|
297 | 'state' => 'optional', |
---|
298 | 'multiples' => False |
---|
299 | ), |
---|
300 | 'vtodo' => Array ( |
---|
301 | 'state' => 'optional', |
---|
302 | 'multiples' => False |
---|
303 | ), |
---|
304 | 'vjournal' => Array ( |
---|
305 | 'state' => 'optional', |
---|
306 | 'multiples' => True |
---|
307 | ), |
---|
308 | 'vfreebusy' => Array ( |
---|
309 | 'state' => 'optional', |
---|
310 | 'multiples' => False |
---|
311 | ) |
---|
312 | ), |
---|
313 | 'dtstart' => Array ( |
---|
314 | 'type' => 'date-time', |
---|
315 | 'to_text' => False, |
---|
316 | 'daylight' => Array ( |
---|
317 | 'state' => 'required', |
---|
318 | 'multiples' => False |
---|
319 | ), |
---|
320 | 'standard' => Array ( |
---|
321 | 'state' => 'required', |
---|
322 | 'multiples' => False |
---|
323 | ), |
---|
324 | 'vevent' => Array ( |
---|
325 | 'state' => 'optional', |
---|
326 | 'multiples' => False |
---|
327 | ), |
---|
328 | 'vfreebusy' => Array ( |
---|
329 | 'state' => 'optional', |
---|
330 | 'multiples' => False |
---|
331 | ), |
---|
332 | 'vjournal' => Array ( |
---|
333 | 'state' => 'optional', |
---|
334 | 'multiples' => False |
---|
335 | ), |
---|
336 | 'vtodo' => Array ( |
---|
337 | 'state' => 'optional', |
---|
338 | 'multiples' => False |
---|
339 | ) |
---|
340 | ), |
---|
341 | 'due' => Array ( |
---|
342 | 'type' => 'date-time', |
---|
343 | 'to_text' => False, |
---|
344 | 'vtodo' => Array ( |
---|
345 | 'state' => 'optional', |
---|
346 | 'multiples' => False |
---|
347 | ) |
---|
348 | ), |
---|
349 | 'duration' => Array ( |
---|
350 | 'type' => 'duration', |
---|
351 | 'to_text' => False, |
---|
352 | 'valarm' => Array ( |
---|
353 | 'state' => 'optional', |
---|
354 | 'multiples' => False |
---|
355 | ), |
---|
356 | 'vevent' => Array ( |
---|
357 | 'state' => 'optional', |
---|
358 | 'multiples' => False |
---|
359 | ), |
---|
360 | 'vfreebusy' => Array ( |
---|
361 | 'state' => 'optional', |
---|
362 | 'multiples' => False |
---|
363 | ), |
---|
364 | 'vtodo' => Array ( |
---|
365 | 'state' => 'optional', |
---|
366 | 'multiples' => False |
---|
367 | ) |
---|
368 | ), |
---|
369 | 'exdate' => Array ( |
---|
370 | 'type' => 'date-time', |
---|
371 | 'to_text' => False, |
---|
372 | 'vevent' => Array ( |
---|
373 | 'state' => 'optional', |
---|
374 | 'multiples' => True |
---|
375 | ), |
---|
376 | 'vjournal' => Array ( |
---|
377 | 'state' => 'optional', |
---|
378 | 'multiples' => True |
---|
379 | ), |
---|
380 | 'vtodo' => Array ( |
---|
381 | 'state' => 'optional', |
---|
382 | 'multiples' => True |
---|
383 | ) |
---|
384 | ), |
---|
385 | 'exrule' => Array ( |
---|
386 | 'type' => 'recur', |
---|
387 | 'to_text' => False, |
---|
388 | 'vevent' => Array ( |
---|
389 | 'state' => 'optional', |
---|
390 | 'multiples' => True |
---|
391 | ), |
---|
392 | 'vjournal' => Array ( |
---|
393 | 'state' => 'optional', |
---|
394 | 'multiples' => True |
---|
395 | ), |
---|
396 | 'vtodo' => Array ( |
---|
397 | 'state' => 'optional', |
---|
398 | 'multiples' => True |
---|
399 | ) |
---|
400 | ), |
---|
401 | 'freebusy' => Array ( |
---|
402 | 'type' => 'freebusy', |
---|
403 | 'to_text' => False, |
---|
404 | 'vfreebusy' => Array ( |
---|
405 | 'state' => 'optional', |
---|
406 | 'multiples' => True |
---|
407 | ) |
---|
408 | ), |
---|
409 | 'geo' => Array ( |
---|
410 | 'type' => 'float', |
---|
411 | 'to_text' => True, |
---|
412 | 'vevent' => Array ( |
---|
413 | 'state' => 'optional', |
---|
414 | 'multiples' => False |
---|
415 | ), |
---|
416 | 'vtodo' => Array ( |
---|
417 | 'state' => 'optional', |
---|
418 | 'multiples' => False |
---|
419 | ) |
---|
420 | ), |
---|
421 | 'last_modified' => Array ( |
---|
422 | 'type' => 'date-time', |
---|
423 | 'to_text' => False, |
---|
424 | 'vevent' => Array ( |
---|
425 | 'state' => 'optional', |
---|
426 | 'multiples' => False |
---|
427 | ), |
---|
428 | 'vtodo' => Array ( |
---|
429 | 'state' => 'optional', |
---|
430 | 'multiples' => False |
---|
431 | ), |
---|
432 | 'vjournal' => Array ( |
---|
433 | 'state' => 'optional', |
---|
434 | 'multiples' => False |
---|
435 | ), |
---|
436 | 'vtimezone' => Array ( |
---|
437 | 'state' => 'optional', |
---|
438 | 'multiples' => False |
---|
439 | ) |
---|
440 | ), |
---|
441 | 'location' => Array ( |
---|
442 | 'type' => 'text', |
---|
443 | 'to_text' => True, |
---|
444 | 'vevent' => Array ( |
---|
445 | 'state' => 'optional', |
---|
446 | 'multiples' => False |
---|
447 | ), |
---|
448 | 'vtodo' => Array ( |
---|
449 | 'state' => 'optional', |
---|
450 | 'multiples' => False |
---|
451 | ) |
---|
452 | ), |
---|
453 | 'method' => Array ( |
---|
454 | 'type' => 'text', |
---|
455 | 'to_text' => True, |
---|
456 | 'ical' => Array ( |
---|
457 | 'state' => 'required', |
---|
458 | 'multiples' => False |
---|
459 | ) |
---|
460 | ), |
---|
461 | 'organizer' => Array ( |
---|
462 | 'type' => 'cal-address', |
---|
463 | 'to_text' => False, |
---|
464 | 'vevent' => Array ( |
---|
465 | 'state' => 'optional', |
---|
466 | 'multiples' => False |
---|
467 | ), |
---|
468 | 'vtodo' => Array ( |
---|
469 | 'state' => 'optional', |
---|
470 | 'multiples' => False |
---|
471 | ), |
---|
472 | 'vjournal' => Array ( |
---|
473 | 'state' => 'optional', |
---|
474 | 'multiples' => False |
---|
475 | ), |
---|
476 | 'vfreebusy' => Array ( |
---|
477 | 'state' => 'optional', |
---|
478 | 'multiples' => False |
---|
479 | ) |
---|
480 | ), |
---|
481 | 'percent_complete' => Array ( |
---|
482 | 'type' => 'integer', |
---|
483 | 'to_text' => False, |
---|
484 | 'vtodo' => Array ( |
---|
485 | 'state' => 'optional', |
---|
486 | 'multiples' => False |
---|
487 | ) |
---|
488 | ), |
---|
489 | 'priority' => Array ( |
---|
490 | 'type' => 'integer', |
---|
491 | 'to_text' => True, |
---|
492 | 'vevent' => Array ( |
---|
493 | 'state' => 'optional', |
---|
494 | 'multiples' => False |
---|
495 | ), |
---|
496 | 'vtodo' => Array ( |
---|
497 | 'state' => 'optional', |
---|
498 | 'multiples' => False |
---|
499 | ) |
---|
500 | ), |
---|
501 | 'prodid' => Array ( |
---|
502 | 'type' => 'text', |
---|
503 | 'to_text' => True, |
---|
504 | 'ical' => Array ( |
---|
505 | 'state' => 'required', |
---|
506 | 'multiples' => False |
---|
507 | ) |
---|
508 | ), |
---|
509 | 'rdate' => Array ( |
---|
510 | 'type' => 'date-time', |
---|
511 | 'to_text' => False, |
---|
512 | 'daylight' => Array ( |
---|
513 | 'state' => 'optional', |
---|
514 | 'multiples' => True |
---|
515 | ), |
---|
516 | 'standard' => Array ( |
---|
517 | 'state' => 'optional', |
---|
518 | 'multiples' => True |
---|
519 | ), |
---|
520 | 'vevent' => Array ( |
---|
521 | 'state' => 'optional', |
---|
522 | 'multiples' => True |
---|
523 | ), |
---|
524 | 'vtodo' => Array ( |
---|
525 | 'state' => 'optional', |
---|
526 | 'multiples' => True |
---|
527 | ), |
---|
528 | 'vjournal' => Array ( |
---|
529 | 'state' => 'optional', |
---|
530 | 'multiples' => True |
---|
531 | ) |
---|
532 | ), |
---|
533 | 'recurrence_id' => Array ( |
---|
534 | 'type' => 'date-time', |
---|
535 | 'to_text' => False, |
---|
536 | 'vevent' => Array ( |
---|
537 | 'state' => 'optional', |
---|
538 | 'multiples' => False |
---|
539 | ), |
---|
540 | 'vjournal' => Array ( |
---|
541 | 'state' => 'optional', |
---|
542 | 'multiples' => False |
---|
543 | ), |
---|
544 | 'vtodo' => Array ( |
---|
545 | 'state' => 'optional', |
---|
546 | 'multiples' => False |
---|
547 | ) |
---|
548 | ), |
---|
549 | 'related_to' => Array ( |
---|
550 | 'type' => 'text', |
---|
551 | 'to_text' => False, |
---|
552 | 'vevent' => Array ( |
---|
553 | 'state' => 'optional', |
---|
554 | 'multiples' => False |
---|
555 | ), |
---|
556 | 'vjournal' => Array ( |
---|
557 | 'state' => 'optional', |
---|
558 | 'multiples' => True |
---|
559 | ), |
---|
560 | 'vtodo' => Array ( |
---|
561 | 'state' => 'optional', |
---|
562 | 'multiples' => True |
---|
563 | ) |
---|
564 | ), |
---|
565 | 'request_status' => Array ( |
---|
566 | 'type' => 'text', |
---|
567 | 'to_text' => True, |
---|
568 | 'vevent' => Array ( |
---|
569 | 'state' => 'optional', |
---|
570 | 'multiples' => False |
---|
571 | ), |
---|
572 | 'vtodo' => Array ( |
---|
573 | 'state' => 'optional', |
---|
574 | 'multiples' => False |
---|
575 | ), |
---|
576 | 'vjournal' => Array ( |
---|
577 | 'state' => 'optional', |
---|
578 | 'multiples' => True |
---|
579 | ), |
---|
580 | 'vfreebusy' => Array ( |
---|
581 | 'state' => 'optional', |
---|
582 | 'multiples' => True |
---|
583 | ) |
---|
584 | ), |
---|
585 | 'resources' => Array ( |
---|
586 | 'type' => 'text', |
---|
587 | 'to_text' => False, |
---|
588 | 'vevent' => Array ( |
---|
589 | 'state' => 'optional', |
---|
590 | 'multiples' => False |
---|
591 | ), |
---|
592 | 'vtodo' => Array ( |
---|
593 | 'state' => 'optional', |
---|
594 | 'multiples' => False |
---|
595 | ) |
---|
596 | ), |
---|
597 | 'rrule' => Array ( |
---|
598 | 'type' => 'recur', |
---|
599 | 'to_text' => False, |
---|
600 | 'daylight' => Array ( |
---|
601 | 'state' => 'optional', |
---|
602 | 'multiples' => True |
---|
603 | ), |
---|
604 | 'standard' => Array ( |
---|
605 | 'state' => 'optional', |
---|
606 | 'multiples' => True |
---|
607 | ), |
---|
608 | 'vevent' => Array ( |
---|
609 | 'state' => 'optional', |
---|
610 | 'multiples' => True |
---|
611 | ), |
---|
612 | 'vtodo' => Array ( |
---|
613 | 'state' => 'optional', |
---|
614 | 'multiples' => True |
---|
615 | ), |
---|
616 | 'vjournal' => Array ( |
---|
617 | 'state' => 'optional', |
---|
618 | 'multiples' => True |
---|
619 | ) |
---|
620 | ), |
---|
621 | 'sequence' => Array ( |
---|
622 | 'type' => 'integer', |
---|
623 | 'to_text' => True, |
---|
624 | 'vevent' => Array ( |
---|
625 | 'state' => 'optional', |
---|
626 | 'multiples' => False |
---|
627 | ), |
---|
628 | 'vjournal' => Array ( |
---|
629 | 'state' => 'optional', |
---|
630 | 'multiples' => False |
---|
631 | ), |
---|
632 | 'vtodo' => Array ( |
---|
633 | 'state' => 'optional', |
---|
634 | 'multiples' => False |
---|
635 | ) |
---|
636 | ), |
---|
637 | 'status' => Array ( |
---|
638 | 'type' => 'text', |
---|
639 | 'to_text' => True, |
---|
640 | 'vevent' => Array ( |
---|
641 | 'state' => 'optional', |
---|
642 | 'multiples' => False |
---|
643 | ), |
---|
644 | 'vjournal' => Array ( |
---|
645 | 'state' => 'optional', |
---|
646 | 'multiples' => False |
---|
647 | ), |
---|
648 | 'vtodo' => Array ( |
---|
649 | 'state' => 'optional', |
---|
650 | 'multiples' => False |
---|
651 | ) |
---|
652 | ), |
---|
653 | 'summary' => Array ( |
---|
654 | 'type' => 'text', |
---|
655 | 'to_text' => True, |
---|
656 | 'vevent' => Array ( |
---|
657 | 'state' => 'optional', |
---|
658 | 'multiples' => False |
---|
659 | ), |
---|
660 | 'vtodo' => Array ( |
---|
661 | 'state' => 'optional', |
---|
662 | 'multiples' => False |
---|
663 | ), |
---|
664 | 'vjournal' => Array ( |
---|
665 | 'state' => 'optional', |
---|
666 | 'multiples' => False |
---|
667 | ), |
---|
668 | 'valarm' => Array ( |
---|
669 | 'state' => 'optional', |
---|
670 | 'multiples' => False |
---|
671 | ) |
---|
672 | ), |
---|
673 | 'transp' => Array ( |
---|
674 | 'type' => 'text', |
---|
675 | 'to_text' => True, |
---|
676 | 'vevent' => Array ( |
---|
677 | 'state' => 'optional', |
---|
678 | 'multiples' => False |
---|
679 | ) |
---|
680 | ), |
---|
681 | 'trigger' => Array ( |
---|
682 | 'type' => 'text', |
---|
683 | 'to_text' => True, |
---|
684 | 'valarm' => Array ( |
---|
685 | 'state' => 'optional', |
---|
686 | 'multiples' => False |
---|
687 | ) |
---|
688 | ), |
---|
689 | 'tzid' => Array ( |
---|
690 | 'type' => 'text', |
---|
691 | 'to_text' => True, |
---|
692 | 'vtimezone' => Array ( |
---|
693 | 'state' => 'required', |
---|
694 | 'multiples' => False |
---|
695 | ) |
---|
696 | ), |
---|
697 | 'tzname' => Array ( |
---|
698 | 'type' => 'text', |
---|
699 | 'to_text' => True, |
---|
700 | 'daylight' => Array ( |
---|
701 | 'state' => 'optional', |
---|
702 | 'multiples' => True |
---|
703 | ), |
---|
704 | 'standard' => Array ( |
---|
705 | 'state' => 'optional', |
---|
706 | 'multiples' => True |
---|
707 | ) |
---|
708 | ), |
---|
709 | 'tzoffsetfrom' => Array ( |
---|
710 | 'type' => 'utc-offset', |
---|
711 | 'to_text' => True, |
---|
712 | 'daylight' => Array ( |
---|
713 | 'state' => 'required', |
---|
714 | 'multiples' => False |
---|
715 | ), |
---|
716 | 'standard' => Array ( |
---|
717 | 'state' => 'required', |
---|
718 | 'multiples' => False |
---|
719 | ) |
---|
720 | ), |
---|
721 | 'tzoffsetto' => Array ( |
---|
722 | 'type' => 'utc-offset', |
---|
723 | 'to_text' => True, |
---|
724 | 'daylight' => Array ( |
---|
725 | 'state' => 'required', |
---|
726 | 'multiples' => False |
---|
727 | ), |
---|
728 | 'standard' => Array ( |
---|
729 | 'state' => 'required', |
---|
730 | 'multiples' => False |
---|
731 | ) |
---|
732 | ), |
---|
733 | 'tzurl' => Array ( |
---|
734 | 'type' => 'uri', |
---|
735 | 'to_text' => True, |
---|
736 | 'vtimezone' => Array ( |
---|
737 | 'state' => 'optional', |
---|
738 | 'multiples' => False |
---|
739 | ) |
---|
740 | ), |
---|
741 | 'uid' => Array ( |
---|
742 | 'type' => 'text', |
---|
743 | 'to_text' => True, |
---|
744 | 'vevent' => Array ( |
---|
745 | 'state' => 'required', |
---|
746 | 'multiples' => False |
---|
747 | ), |
---|
748 | 'vfreebusy' => Array ( |
---|
749 | 'state' => 'required', |
---|
750 | 'multiples' => False |
---|
751 | ), |
---|
752 | 'vjournal' => Array ( |
---|
753 | 'state' => 'required', |
---|
754 | 'multiples' => False |
---|
755 | ), |
---|
756 | 'vtodo' => Array ( |
---|
757 | 'state' => 'required', |
---|
758 | 'multiples' => False |
---|
759 | ) |
---|
760 | ), |
---|
761 | 'url' => Array ( |
---|
762 | 'type' => 'text', |
---|
763 | 'to_text' => True, |
---|
764 | 'vevent' => Array ( |
---|
765 | 'state' => 'required', |
---|
766 | 'multiples' => False |
---|
767 | ), |
---|
768 | 'vfreebusy' => Array ( |
---|
769 | 'state' => 'required', |
---|
770 | 'multiples' => False |
---|
771 | ), |
---|
772 | 'vjournal' => Array ( |
---|
773 | 'state' => 'optional', |
---|
774 | 'multiples' => False |
---|
775 | ), |
---|
776 | 'vtodo' => Array ( |
---|
777 | 'state' => 'required', |
---|
778 | 'multiples' => False |
---|
779 | ) |
---|
780 | ), |
---|
781 | 'version' => Array ( |
---|
782 | 'type' => 'text', |
---|
783 | 'to_text' => True, |
---|
784 | 'ical' => Array ( |
---|
785 | 'state' => 'required', |
---|
786 | 'multiples' => False |
---|
787 | ) |
---|
788 | ) |
---|
789 | ); |
---|
790 | $this->parameter = Array ( |
---|
791 | 'altrep' => Array ( |
---|
792 | 'type' => 'uri', |
---|
793 | 'quoted' => True, |
---|
794 | 'to_text' => True, |
---|
795 | 'properties' => Array ( |
---|
796 | 'comment' => True, |
---|
797 | 'description' => True, |
---|
798 | 'location' => True, |
---|
799 | 'prodid' => True, |
---|
800 | 'resources' => True, |
---|
801 | 'summary' => True, |
---|
802 | 'contact' => True |
---|
803 | ) |
---|
804 | ), |
---|
805 | 'byday' => Array ( |
---|
806 | 'type' => 'text', |
---|
807 | 'quoted' => False, |
---|
808 | 'to_text' => False, |
---|
809 | 'properties' => Array ( |
---|
810 | 'rrule' => True |
---|
811 | ) |
---|
812 | ), |
---|
813 | 'byhour' => Array ( |
---|
814 | 'type' => 'text', |
---|
815 | 'quoted' => False, |
---|
816 | 'to_text' => False, |
---|
817 | 'properties' => Array ( |
---|
818 | 'rrule' => True |
---|
819 | ) |
---|
820 | ), |
---|
821 | 'byminute' => Array ( |
---|
822 | 'type' => 'text', |
---|
823 | 'quoted' => False, |
---|
824 | 'to_text' => False, |
---|
825 | 'properties' => Array ( |
---|
826 | 'rrule' => True |
---|
827 | ) |
---|
828 | ), |
---|
829 | 'bymonth' => Array ( |
---|
830 | 'type' => 'text', |
---|
831 | 'quoted' => False, |
---|
832 | 'to_text' => False, |
---|
833 | 'properties' => Array ( |
---|
834 | 'rrule' => True |
---|
835 | ) |
---|
836 | ), |
---|
837 | 'bymonthday' => Array ( |
---|
838 | 'type' => 'text', |
---|
839 | 'quoted' => False, |
---|
840 | 'to_text' => False, |
---|
841 | 'properties' => Array ( |
---|
842 | 'rrule' => True |
---|
843 | ) |
---|
844 | ), |
---|
845 | 'bysecond' => Array ( |
---|
846 | 'type' => 'text', |
---|
847 | 'quoted' => False, |
---|
848 | 'to_text' => False, |
---|
849 | 'properties' => Array ( |
---|
850 | 'rrule' => True |
---|
851 | ) |
---|
852 | ), |
---|
853 | 'bysetpos' => Array ( |
---|
854 | 'type' => 'text', |
---|
855 | 'quoted' => False, |
---|
856 | 'to_text' => False, |
---|
857 | 'properties' => Array ( |
---|
858 | 'rrule' => True |
---|
859 | ) |
---|
860 | ), |
---|
861 | 'byweekno' => Array ( |
---|
862 | 'type' => 'text', |
---|
863 | 'quoted' => False, |
---|
864 | 'to_text' => False, |
---|
865 | 'properties' => Array ( |
---|
866 | 'rrule' => True |
---|
867 | ) |
---|
868 | ), |
---|
869 | 'byyearday' => Array ( |
---|
870 | 'type' => 'text', |
---|
871 | 'quoted' => False, |
---|
872 | 'to_text' => False, |
---|
873 | 'properties' => Array ( |
---|
874 | 'rrule' => True |
---|
875 | ) |
---|
876 | ), |
---|
877 | 'class' => Array ( |
---|
878 | 'type' => 'function', |
---|
879 | 'function' => 'switch_class', |
---|
880 | 'quoted' => False, |
---|
881 | 'to_text' => False, |
---|
882 | 'properties' => Array ( |
---|
883 | 'class' => True |
---|
884 | ) |
---|
885 | ), |
---|
886 | 'cn' => Array ( |
---|
887 | 'type' => 'text', |
---|
888 | 'quoted' => True, |
---|
889 | 'to_text' => False, |
---|
890 | 'properties' => Array ( |
---|
891 | 'attendee' => True, |
---|
892 | 'organizer' => True |
---|
893 | ) |
---|
894 | ), |
---|
895 | 'count' => Array ( |
---|
896 | 'type' => 'integer', |
---|
897 | 'quoted' => False, |
---|
898 | 'to_text' => False, |
---|
899 | 'properties' => Array ( |
---|
900 | 'rrule' => True |
---|
901 | ) |
---|
902 | ), |
---|
903 | 'cu' => Array ( |
---|
904 | 'type' => 'function', |
---|
905 | 'function' => 'switch_cu', |
---|
906 | 'quoted' => False, |
---|
907 | 'to_text' => False, |
---|
908 | 'properties' => Array ( |
---|
909 | 'attendee' => True |
---|
910 | ) |
---|
911 | ), |
---|
912 | 'delegated_from' => Array ( |
---|
913 | 'type' => 'function', |
---|
914 | 'function' => 'switch_mailto', |
---|
915 | 'quoted' => True, |
---|
916 | 'to_text' => False, |
---|
917 | 'properties' => Array ( |
---|
918 | 'attendee' => True |
---|
919 | ) |
---|
920 | ), |
---|
921 | 'delegated_to' => Array ( |
---|
922 | 'type' => 'function', |
---|
923 | 'function' => 'switch_mailto', |
---|
924 | 'quoted' => True, |
---|
925 | 'to_text' => False, |
---|
926 | 'properties' => Array ( |
---|
927 | 'attendee' => True |
---|
928 | ) |
---|
929 | ), |
---|
930 | 'dir' => Array ( |
---|
931 | 'type' => 'dir', |
---|
932 | 'quoted' => True, |
---|
933 | 'to_text' => True, |
---|
934 | 'properties' => Array ( |
---|
935 | 'attendee' => True, |
---|
936 | 'organizer' => True |
---|
937 | ) |
---|
938 | ), |
---|
939 | 'dtend' => Array ( |
---|
940 | 'type' => 'function', |
---|
941 | 'function' => 'switch_date', |
---|
942 | 'quoted' => False, |
---|
943 | 'to_text' => False, |
---|
944 | 'properties' => Array ( |
---|
945 | 'dtend' => True |
---|
946 | ) |
---|
947 | ), |
---|
948 | 'dtstamp' => Array ( |
---|
949 | 'type' => 'function', |
---|
950 | 'function' => 'switch_date', |
---|
951 | 'quoted' => False, |
---|
952 | 'to_text' => False, |
---|
953 | 'properties' => Array ( |
---|
954 | 'dtstamp' => True |
---|
955 | ) |
---|
956 | ), |
---|
957 | 'dtstart' => Array ( |
---|
958 | 'type' => 'function', |
---|
959 | 'function' => 'switch_date', |
---|
960 | 'quoted' => False, |
---|
961 | 'to_text' => False, |
---|
962 | 'properties' => Array ( |
---|
963 | 'dtstart' => True |
---|
964 | ) |
---|
965 | ), |
---|
966 | 'encoding' => Array (// was enocding ??? |
---|
967 | 'type' => 'function', |
---|
968 | 'function' => 'switch_encoding', |
---|
969 | 'quoted' => False, |
---|
970 | 'to_text' => False, |
---|
971 | 'properties' => Array ( |
---|
972 | 'attach' => True |
---|
973 | ) |
---|
974 | ), |
---|
975 | 'fmttype' => Array ( |
---|
976 | 'type' => 'text', |
---|
977 | 'quoted' => False, |
---|
978 | 'to_text' => False, |
---|
979 | 'properties' => Array ( |
---|
980 | 'attach' => True |
---|
981 | ) |
---|
982 | ), |
---|
983 | 'fbtype' => Array ( |
---|
984 | 'type' => 'function', |
---|
985 | 'function' => 'switch_fbtype', |
---|
986 | 'quoted' => False, |
---|
987 | 'to_text' => False, |
---|
988 | 'properties' => Array ( |
---|
989 | 'attach' => True |
---|
990 | ) |
---|
991 | ), |
---|
992 | 'freq' => Array ( |
---|
993 | 'type' => 'function', |
---|
994 | 'function' => 'switch_freq', |
---|
995 | 'quoted' => False, |
---|
996 | 'to_text' => False, |
---|
997 | 'properties' => Array ( |
---|
998 | 'rrule' => True |
---|
999 | ) |
---|
1000 | ), |
---|
1001 | 'interval' => Array ( |
---|
1002 | 'type' => 'integer', |
---|
1003 | 'quoted' => False, |
---|
1004 | 'to_text' => False, |
---|
1005 | 'properties' => Array ( |
---|
1006 | 'rrule' => True |
---|
1007 | ) |
---|
1008 | ), |
---|
1009 | 'language' => Array ( |
---|
1010 | 'type' => 'text', |
---|
1011 | 'quoted' => False, |
---|
1012 | 'to_text' => False, |
---|
1013 | 'properties' => Array ( |
---|
1014 | 'categories' => True, |
---|
1015 | 'comment' => True, |
---|
1016 | 'description' => True, |
---|
1017 | 'location' => True, |
---|
1018 | 'resources' => True, |
---|
1019 | 'summary' => True, |
---|
1020 | 'tzname' => True, |
---|
1021 | 'attendee' => True, |
---|
1022 | 'contact' => True, |
---|
1023 | 'organizer' => True, |
---|
1024 | 'x-type' => True |
---|
1025 | ) |
---|
1026 | ), |
---|
1027 | 'last_modified' => Array ( |
---|
1028 | 'type' => 'function', |
---|
1029 | 'function' => 'switch_date', |
---|
1030 | 'quoted' => False, |
---|
1031 | 'to_text' => False, |
---|
1032 | 'properties' => Array ( |
---|
1033 | 'last_modified' => True |
---|
1034 | ) |
---|
1035 | ), |
---|
1036 | 'mailto' => Array ( |
---|
1037 | 'type' => 'function', |
---|
1038 | 'function' => 'switch_mailto', |
---|
1039 | 'quoted' => False, |
---|
1040 | 'to_text' => False, |
---|
1041 | 'properties' => Array ( |
---|
1042 | 'attendee' => True, |
---|
1043 | 'organizer' => True |
---|
1044 | ) |
---|
1045 | ), |
---|
1046 | 'member' => Array ( |
---|
1047 | 'type' => 'function', |
---|
1048 | 'function' => 'switch_mailto', |
---|
1049 | 'quoted' => True, |
---|
1050 | 'to_text' => False, |
---|
1051 | 'properties' => Array ( |
---|
1052 | 'attendee' => True |
---|
1053 | ) |
---|
1054 | ), |
---|
1055 | 'partstat' => Array ( |
---|
1056 | 'type' => 'function', |
---|
1057 | 'function' => 'switch_partstat', |
---|
1058 | 'quoted' => False, |
---|
1059 | 'to_text' => False, |
---|
1060 | 'properties' => Array ( |
---|
1061 | 'attendee' => True, |
---|
1062 | 'organizer' => True |
---|
1063 | ) |
---|
1064 | ), |
---|
1065 | 'range' => Array ( |
---|
1066 | 'type' => 'function', |
---|
1067 | 'function' => 'switch_range', |
---|
1068 | 'quoted' => False, |
---|
1069 | 'to_text' => False, |
---|
1070 | 'properties' => Array ( |
---|
1071 | 'recurrence_id' => True |
---|
1072 | ) |
---|
1073 | ), |
---|
1074 | 'related' => Array ( |
---|
1075 | 'type' => 'function', |
---|
1076 | 'function' => 'switch_related', |
---|
1077 | 'quoted' => False, |
---|
1078 | 'to_text' => False, |
---|
1079 | 'properties' => Array ( |
---|
1080 | 'related_to' => True |
---|
1081 | ) |
---|
1082 | ), |
---|
1083 | 'role' => Array ( |
---|
1084 | 'type' => 'function', |
---|
1085 | 'function' => 'switch_role', |
---|
1086 | 'quoted' => False, |
---|
1087 | 'to_text' => False, |
---|
1088 | 'properties' => Array ( |
---|
1089 | 'attendee' => True, |
---|
1090 | 'organizer' => True |
---|
1091 | ) |
---|
1092 | ), |
---|
1093 | 'rsvp' => Array ( |
---|
1094 | 'type' => 'function', |
---|
1095 | 'function' => 'switch_rsvp', |
---|
1096 | 'quoted' => False, |
---|
1097 | 'to_text' => False, |
---|
1098 | 'properties' => Array ( |
---|
1099 | 'attendee' => True |
---|
1100 | ) |
---|
1101 | ), |
---|
1102 | 'sent_by' => Array ( |
---|
1103 | 'type' => 'function', |
---|
1104 | 'function' => 'parse_user_host', |
---|
1105 | 'quoted' => True, |
---|
1106 | 'to_text' => False, |
---|
1107 | 'properties' => Array ( |
---|
1108 | 'attendee' => True, |
---|
1109 | 'organizer' => True |
---|
1110 | ) |
---|
1111 | ), |
---|
1112 | 'tzid' => Array ( |
---|
1113 | 'type' => 'text', |
---|
1114 | 'quoted' => False, |
---|
1115 | 'to_text' => False, |
---|
1116 | 'properties' => Array ( |
---|
1117 | 'dtend' => True, |
---|
1118 | 'due' => True, |
---|
1119 | 'dtstart' => True, |
---|
1120 | 'exdate' => True, |
---|
1121 | 'rdate' => True, |
---|
1122 | 'recurrence_id' => True |
---|
1123 | ) |
---|
1124 | ), |
---|
1125 | 'until' => Array ( |
---|
1126 | 'type' => 'function', |
---|
1127 | 'function' => 'switch_date', |
---|
1128 | 'quoted' => False, |
---|
1129 | 'to_text' => False, |
---|
1130 | 'properties' => Array ( |
---|
1131 | 'rrule' => True |
---|
1132 | ) |
---|
1133 | ), |
---|
1134 | 'value' => Array ( |
---|
1135 | 'type' => 'value', |
---|
1136 | 'quoted' => False, |
---|
1137 | 'to_text' => False, |
---|
1138 | 'properties' => Array ( |
---|
1139 | 'calscale' => True, |
---|
1140 | 'prodid' => True, |
---|
1141 | 'method' => True, |
---|
1142 | 'version' => True, |
---|
1143 | 'attach' => True, |
---|
1144 | 'categories' => True, |
---|
1145 | 'class' => True, |
---|
1146 | 'comment' => True, |
---|
1147 | 'description' => True, |
---|
1148 | 'geo' => True, |
---|
1149 | 'location' => True, |
---|
1150 | 'percent' => True, |
---|
1151 | 'priority' => True, |
---|
1152 | 'resources' => True, |
---|
1153 | 'status' => True, |
---|
1154 | 'summary' => True, |
---|
1155 | 'completed' => True, |
---|
1156 | 'dtend' => True, |
---|
1157 | 'due' => True, |
---|
1158 | 'dtstart' => True, |
---|
1159 | 'duration' => True, |
---|
1160 | 'freebusy' => True, |
---|
1161 | 'transp' => True, |
---|
1162 | 'tzid' => True, |
---|
1163 | 'tzname' => True, |
---|
1164 | 'tzoffsetfrom' => True, |
---|
1165 | 'tzoffsetto' => True, |
---|
1166 | 'tzurl' => True, |
---|
1167 | 'attendee' => True, |
---|
1168 | 'contact' => True, |
---|
1169 | 'organizer' => True, |
---|
1170 | 'recurrence_id' => True, |
---|
1171 | 'url' => True, |
---|
1172 | 'uid' => True, |
---|
1173 | 'exdate' => True, |
---|
1174 | 'exrule' => True, |
---|
1175 | 'rdate' => True, |
---|
1176 | 'rrule' => True, |
---|
1177 | 'action' => True, |
---|
1178 | 'repeat' => True, |
---|
1179 | 'trigger' => True, |
---|
1180 | 'created' => True, |
---|
1181 | 'dtstamp' => True, |
---|
1182 | 'last_modified' => True, |
---|
1183 | 'sequence' => True, |
---|
1184 | 'x_type' => True, |
---|
1185 | 'request_status' => True |
---|
1186 | ) |
---|
1187 | ), |
---|
1188 | 'wkst' => Array ( |
---|
1189 | 'type' => 'string', |
---|
1190 | 'quoted' => False, |
---|
1191 | 'to_text' => False, |
---|
1192 | 'properties' => Array ( |
---|
1193 | 'rrule' => True |
---|
1194 | ) |
---|
1195 | ), |
---|
1196 | 'x_type' => Array ( |
---|
1197 | 'type' => 'x_type', |
---|
1198 | 'quoted' => False, |
---|
1199 | 'to_text' => False, |
---|
1200 | 'properties' => Array ( |
---|
1201 | 'calscale' => True, |
---|
1202 | 'method' => True, |
---|
1203 | 'prodid' => True, |
---|
1204 | 'version' => True, |
---|
1205 | 'attach' => True, |
---|
1206 | 'categories' => True, |
---|
1207 | 'class' => True, |
---|
1208 | 'comment' => True, |
---|
1209 | 'description' => True, |
---|
1210 | 'geo' => True, |
---|
1211 | 'location' => True, |
---|
1212 | 'percent' => True, |
---|
1213 | 'priority' => True, |
---|
1214 | 'resources' => True, |
---|
1215 | 'status' => True, |
---|
1216 | 'summary' => True, |
---|
1217 | 'completed' => True, |
---|
1218 | 'dtend' => True, |
---|
1219 | 'due' => True, |
---|
1220 | 'dtstart' => True, |
---|
1221 | 'duration' => True, |
---|
1222 | 'freebusy' => True, |
---|
1223 | 'transp' => True, |
---|
1224 | 'tzid' => True, |
---|
1225 | 'tzname' => True, |
---|
1226 | 'tzoffsetfrom' => True, |
---|
1227 | 'tzoffsetto' => True, |
---|
1228 | 'tzurl' => True, |
---|
1229 | 'attendee' => True, |
---|
1230 | 'contact' => True, |
---|
1231 | 'organizer' => True, |
---|
1232 | 'recurrence_id' => True, |
---|
1233 | 'url' => True, |
---|
1234 | 'uid' => True, |
---|
1235 | 'exdate' => True, |
---|
1236 | 'exrule' => True, |
---|
1237 | 'rdate' => True, |
---|
1238 | 'rrule' => True, |
---|
1239 | 'action' => True, |
---|
1240 | 'repeat' => True, |
---|
1241 | 'trigger' => True, |
---|
1242 | 'created' => True, |
---|
1243 | 'dtstamp' => True, |
---|
1244 | 'last_modified' => True, |
---|
1245 | 'sequence' => True, |
---|
1246 | 'x_type' => True, |
---|
1247 | 'request_status' => True |
---|
1248 | ) |
---|
1249 | ) |
---|
1250 | ); |
---|
1251 | if (!is_object($GLOBALS['phpgw']->datetime)) { |
---|
1252 | $GLOBALS['phpgw']->datetime = createobject('phpgwapi.date_time'); |
---|
1253 | } |
---|
1254 | } |
---|
1255 | |
---|
1256 | function set_var(& $event, $type, $value) { |
---|
1257 | $type = strtolower(str_replace('-', '_', $type)); |
---|
1258 | $event[$type] = $value; |
---|
1259 | /* |
---|
1260 | if(is_string($value)) |
---|
1261 | { |
---|
1262 | $this->debug("Setting ".$type." = ".$value); |
---|
1263 | } |
---|
1264 | else |
---|
1265 | { |
---|
1266 | $this->debug("Setting ".$type." = "._debug_array($value,False)); |
---|
1267 | } |
---|
1268 | */ |
---|
1269 | } |
---|
1270 | |
---|
1271 | function read_line_unfold($ical_text) { |
---|
1272 | if ($this->line < count($ical_text)) { |
---|
1273 | $str = str_replace(array ( |
---|
1274 | "\r\n", |
---|
1275 | "\r", |
---|
1276 | "\n" |
---|
1277 | ), '', $ical_text[$this->line]); |
---|
1278 | |
---|
1279 | $this->line = $this->line + 1; |
---|
1280 | while (ereg("^[[:space:]]", $ical_text[$this->line])) { |
---|
1281 | $str .= substr(str_replace("\r\n", '', $ical_text[$this->line]), 1); |
---|
1282 | $this->line = $this->line + 1; |
---|
1283 | } |
---|
1284 | |
---|
1285 | // Corrige a codificacao dos caracteres, caso haja suporte a mesma. |
---|
1286 | $str = trim($str); |
---|
1287 | if (mb_detect_encoding($str, 'auto') == 'UTF-8') |
---|
1288 | if ($conv = preg_replace("/([\xC2\xC3])([\x80-\xBF])/e", "chr(ord('\\1')<<6&0xC0|ord('\\2')&0x3F)", $str)) |
---|
1289 | $str = $conv; |
---|
1290 | |
---|
1291 | //$this->debug("LINE : ".$str); |
---|
1292 | return $str; |
---|
1293 | } else { |
---|
1294 | return False; |
---|
1295 | } |
---|
1296 | } |
---|
1297 | |
---|
1298 | function fold($str) { |
---|
1299 | return $this->chunk_split == True ? chunk_split($str, FOLD_LENGTH, "\r\n") : $str . "\r\n"; |
---|
1300 | } |
---|
1301 | |
---|
1302 | function strip_quotes($str) { |
---|
1303 | return str_replace('"', '', $str); |
---|
1304 | } |
---|
1305 | |
---|
1306 | function from_text($str) { |
---|
1307 | $str = str_replace("\\,", ",", $str); |
---|
1308 | $str = str_replace("\\;", ";", $str); |
---|
1309 | $str = str_replace("\\N", "\n", $str); |
---|
1310 | $str = str_replace("\\n", "\n", $str); |
---|
1311 | $str = str_replace("\\\\", "\\", $str); |
---|
1312 | return "$str"; |
---|
1313 | } |
---|
1314 | |
---|
1315 | function to_text($str) { |
---|
1316 | $str = str_replace("\\", "\\\\", $str); |
---|
1317 | $str = str_replace(",", "\\,", $str); |
---|
1318 | $str = str_replace(";", "\\;", $str); |
---|
1319 | $str = str_replace("\n", "\\n", $str); |
---|
1320 | return "$str"; |
---|
1321 | } |
---|
1322 | |
---|
1323 | function from_dir($str) { |
---|
1324 | return str_replace('=3D', '=', str_replace('%20', ' ', $str)); |
---|
1325 | } |
---|
1326 | |
---|
1327 | function to_dir($str) { |
---|
1328 | return str_replace('=', '=3D', str_replace(' ', '%20', $str)); |
---|
1329 | } |
---|
1330 | |
---|
1331 | function find_parameters($property) { |
---|
1332 | static $cached_returns; |
---|
1333 | |
---|
1334 | if (isset ($cached_returns[$property])) { |
---|
1335 | reset($cached_returns[$property]); |
---|
1336 | return $cached_returns[$property]; |
---|
1337 | } |
---|
1338 | |
---|
1339 | reset($this->parameter); |
---|
1340 | while (list ($key, $param_array) = each($this->parameter)) { |
---|
1341 | if ($param_array['properties'][$property]) { |
---|
1342 | $param[] = $key; |
---|
1343 | $this->debug('Property : ' . $property . ' = Parameter : ' . $key); |
---|
1344 | } |
---|
1345 | } |
---|
1346 | reset($param); |
---|
1347 | $cached_returns[$property] = $param; |
---|
1348 | return $param; |
---|
1349 | } |
---|
1350 | |
---|
1351 | function find_properties($ical_type) { |
---|
1352 | static $cached_returns; |
---|
1353 | |
---|
1354 | if (isset ($cached_returns[$ical_type])) { |
---|
1355 | reset($cached_returns[$ical_type]); |
---|
1356 | return $cached_returns[$ical_type]; |
---|
1357 | } |
---|
1358 | |
---|
1359 | reset($this->property); |
---|
1360 | while (list ($key, $param_array) = each($this->property)) { |
---|
1361 | if ($param_array[$ical_type]) { |
---|
1362 | $prop[] = $key; |
---|
1363 | } |
---|
1364 | } |
---|
1365 | reset($prop); |
---|
1366 | $cached_returns[$ical_type] = $prop; |
---|
1367 | return $prop; |
---|
1368 | } |
---|
1369 | |
---|
1370 | function new_ical() { |
---|
1371 | return Array (); |
---|
1372 | } |
---|
1373 | |
---|
1374 | /* |
---|
1375 | * Parse Functions |
---|
1376 | */ |
---|
1377 | |
---|
1378 | function parse_geo(& $event, $value) { |
---|
1379 | // $return_value = $this->explode_param($value,True); |
---|
1380 | if (count($return_value) == 2) { |
---|
1381 | $event['lat'] = $return_value[0]; |
---|
1382 | $event['lon'] = $return_value[1]; |
---|
1383 | } |
---|
1384 | } |
---|
1385 | |
---|
1386 | function parse_xtype(& $event, $majortype, $value) { |
---|
1387 | $temp_x_type['name'] = strtoupper(substr($majortype, 2)); |
---|
1388 | $temp_x_type['value'] = $value; |
---|
1389 | $event['x_type'][] = $temp_x_type; |
---|
1390 | } |
---|
1391 | |
---|
1392 | function parse_parameters(& $event, $majortype, $value) { |
---|
1393 | //$this->debug ('value: '.$value); |
---|
1394 | if (!ereg('[\=\;]', $value)) { |
---|
1395 | $return_value[] = Array ( |
---|
1396 | 'param' => $majortype, |
---|
1397 | 'value' => $value |
---|
1398 | ); |
---|
1399 | $value = ''; |
---|
1400 | } |
---|
1401 | elseif (ereg('(.*(\:\\\\)?.*):(.*)', $value, $temp)) { |
---|
1402 | //$this->debug('Value : '._debug_array($temp,False)); |
---|
1403 | //$this->debug('Param '.$majortype.' Value : '.$temp[3]); |
---|
1404 | if ($temp[3]) { |
---|
1405 | $return_value[] = Array ( |
---|
1406 | 'param' => $majortype, |
---|
1407 | 'value' => $temp[3] |
---|
1408 | ); |
---|
1409 | $value = str_replace(':MAILTO', '', $temp[1]); |
---|
1410 | } |
---|
1411 | while (ereg('(([A-Z\-]*)[=]([[:alnum:] \_\)\(\/\$\.\,\:\\\|\*\&\^\%\#\!\~\"\?\&\@\<\>\-]*))([\;]?)(.*)', $value, $temp)) { |
---|
1412 | //$this->debug('Value : '._debug_array($temp,False)); |
---|
1413 | //$this->debug('Param '.$temp[2].' Value : '.$temp[3]); |
---|
1414 | $return_value[] = Array ( |
---|
1415 | 'param' => $temp[2], |
---|
1416 | 'value' => $temp[3] |
---|
1417 | ); |
---|
1418 | $value = chop($temp[5]); |
---|
1419 | //$this->debug('Value would be = '.$value); |
---|
1420 | } |
---|
1421 | } else { |
---|
1422 | while (ereg('(([A-Z\-]*)[=]([[:alnum:] \_\)\(\/\$\.\,\:\\\|\*\&\^\%\#\!\~\"\?\&\@\<\>\-]*))([\;]?)(.*)', $value, $temp)) { |
---|
1423 | $this->debug('Value : ' . _debug_array($temp, False)); |
---|
1424 | $this->debug('Param ' . $temp[2] . ' Value : ' . $temp[3]); |
---|
1425 | $return_value[] = Array ( |
---|
1426 | 'param' => $temp[2], |
---|
1427 | 'value' => $temp[3] |
---|
1428 | ); |
---|
1429 | $value = chop($temp[5]); |
---|
1430 | $this->debug('Value would be = ' . $value); |
---|
1431 | } |
---|
1432 | } |
---|
1433 | |
---|
1434 | //$this->debug('parse_parameters array return_value: '._debug_array($return_value,False)); |
---|
1435 | |
---|
1436 | for ($i = 0; $i < count($return_value); $i++) { |
---|
1437 | $name = strtolower($return_value[$i]['param']); |
---|
1438 | $value = $this->strip_quotes($return_value[$i]['value']); |
---|
1439 | if (substr($name, 0, 2) == 'x-') { |
---|
1440 | $param = 'x_type'; |
---|
1441 | $name = str_replace('-', '_', $return_value[$i]['param']); |
---|
1442 | } else { |
---|
1443 | $param = str_replace('-', '_', strtolower($name)); |
---|
1444 | if (!isset ($this->parameter[$param]) || $majortype == 'tzid') { |
---|
1445 | if ($majortype == 'attendee' || $majortype == 'organizer') { |
---|
1446 | $param = 'mailto'; |
---|
1447 | $name = $param; |
---|
1448 | } else { |
---|
1449 | $param = 'value'; |
---|
1450 | } |
---|
1451 | } |
---|
1452 | } |
---|
1453 | //$this->debug('name : '.$name.' : Param = '.$param); |
---|
1454 | if (@ $this->parameter[$param]['properties'][$majortype]) { |
---|
1455 | switch (@ $this->parameter[$param]['type']) { |
---|
1456 | case 'dir' : |
---|
1457 | $this->set_var($event, $name, $this->from_dir($value)); |
---|
1458 | break; |
---|
1459 | case 'text' : |
---|
1460 | $this->set_var($event, $name, $value); |
---|
1461 | break; |
---|
1462 | case 'x_type' : |
---|
1463 | $this->parse_xtype($event, $name, $value); |
---|
1464 | break; |
---|
1465 | case 'function' : |
---|
1466 | $function = $this->parameter[$param]['function']; |
---|
1467 | $this->set_var($event, $name, $this-> $function ($value)); |
---|
1468 | break; |
---|
1469 | case 'uri' : |
---|
1470 | if (@ $this->parameter[$param]['to_text']) { |
---|
1471 | $value = $this->to_text($value); |
---|
1472 | } |
---|
1473 | $this->set_var($event, $name, $value); |
---|
1474 | break; |
---|
1475 | case 'integer' : |
---|
1476 | $this->set_var($event, $name, (int) $value); |
---|
1477 | break; |
---|
1478 | case 'value' : |
---|
1479 | if (@ $this->property[$majortype]['type'] == 'date-time') { |
---|
1480 | $this->set_var($event, $param, $this->switch_date($name)); |
---|
1481 | } |
---|
1482 | elseif ($value <> "\\n" && $value) { |
---|
1483 | $this->set_var($event[$majortype], $param, $value); |
---|
1484 | } |
---|
1485 | $this->debug('Event : ' . _debug_array($event, False)); |
---|
1486 | break; |
---|
1487 | } |
---|
1488 | } |
---|
1489 | } |
---|
1490 | } |
---|
1491 | |
---|
1492 | function parse_value(& $event, $majortype, $value, $mode) { |
---|
1493 | $var = Array (); |
---|
1494 | //$this->debug('Mode : '.$mode.' Majortype : '.$majortype); |
---|
1495 | $this->parse_parameters($var, $majortype, $value); |
---|
1496 | if ($this->property[$majortype][$mode]['multiples']) { |
---|
1497 | //$this->debug('parse_value var array: '._debug_array($var,False)); |
---|
1498 | $event[$majortype][] = $var; |
---|
1499 | } else { |
---|
1500 | //$this->debug('Majortype : '.$majortype); |
---|
1501 | //$this->debug('Property : '.$this->property[$majortype]['type']); |
---|
1502 | if ($this->property[$majortype]['type'] == 'date-time') { |
---|
1503 | //$this->debug('Got a DATE-TIME type!'); |
---|
1504 | $t_var = $var[$majortype]; |
---|
1505 | unset ($var[$majortype]); |
---|
1506 | if ($t_var) { |
---|
1507 | reset($t_var); |
---|
1508 | while (list ($key, $val) = each($t_var)) { |
---|
1509 | $var[$key] = $val; |
---|
1510 | } |
---|
1511 | //$this->debug($majortype.' : '._debug_array($var,False)); |
---|
1512 | } |
---|
1513 | } |
---|
1514 | $this->set_var($event, $majortype, $var); |
---|
1515 | } |
---|
1516 | } |
---|
1517 | |
---|
1518 | /* |
---|
1519 | * Build-Card Functions |
---|
1520 | */ |
---|
1521 | |
---|
1522 | function build_xtype($x_type, $seperator = '=') { |
---|
1523 | $quote = ''; |
---|
1524 | if ($seperator == '=') { |
---|
1525 | $quote = '"'; |
---|
1526 | } |
---|
1527 | |
---|
1528 | $return_value = $this->fold('X-' . $x_type['name'] . $seperator . $quote . $x_type['value'] . $quote); |
---|
1529 | if ($seperator == '=') { |
---|
1530 | return str_replace("\r\n", '', $return_value); |
---|
1531 | } else { |
---|
1532 | return $return_value; |
---|
1533 | } |
---|
1534 | } |
---|
1535 | |
---|
1536 | function build_parameters($event, $property) { |
---|
1537 | $str = ''; |
---|
1538 | $include_mailto = False; |
---|
1539 | $include_datetime = False; |
---|
1540 | $param = $this->find_parameters($property); |
---|
1541 | |
---|
1542 | if ($property == 'exdate') { |
---|
1543 | while (list ($key, $value) = each($event)) { |
---|
1544 | $exdates[] = $this->switch_date($value); |
---|
1545 | } |
---|
1546 | return ':' . implode($exdates, ','); |
---|
1547 | } else { |
---|
1548 | while (list ($dumb_key, $key) = each($param)) { |
---|
1549 | if ($key == 'value') { |
---|
1550 | continue; |
---|
1551 | } |
---|
1552 | if ($key == 'mailto') { |
---|
1553 | $include_mailto = True; |
---|
1554 | continue; |
---|
1555 | } |
---|
1556 | $param_array = @ $this->parameter[$key]; |
---|
1557 | $type = @ $this->parameter[$key]['type']; |
---|
1558 | if ($type == 'date-time') { |
---|
1559 | $include_datetime = True; |
---|
1560 | continue; |
---|
1561 | } |
---|
1562 | $quote = (@ $this->parameter[$key]['quoted'] ? '"' : ''); |
---|
1563 | if (isset ($event[$key]) && @ $this->parameter[$key]['properties'][$property]) { |
---|
1564 | $change_text = @ $this->parameter[$key]['to_text']; |
---|
1565 | $value = $event[$key]; |
---|
1566 | if ($change_text && $type == 'text') { |
---|
1567 | $value = $this->to_text($value); |
---|
1568 | } |
---|
1569 | switch ($type) { |
---|
1570 | case 'dir' : |
---|
1571 | $str .= ';' . str_replace('_', '-', strtoupper($key)) . '=' . $quote . $this->to_dir($value) . $quote; |
---|
1572 | break; |
---|
1573 | case 'function' : |
---|
1574 | $str .= ';' . str_replace('_', '-', strtoupper($key)) . '='; |
---|
1575 | $function = $this->parameter[$key]['function']; |
---|
1576 | $this->debug($key . ' Function Param : ' . $value); |
---|
1577 | $str .= $quote . $this-> $function ($value) . $quote; |
---|
1578 | break; |
---|
1579 | case 'text' : |
---|
1580 | case 'string' : |
---|
1581 | $str .= ';' . strtoupper($key) . '=' . $quote . $value . $quote; |
---|
1582 | break; |
---|
1583 | case 'date-time' : |
---|
1584 | $str .= ($key == 'until' ? ':' : ';UNTIL=') . date('Ymd\THis', mktime($event['hour'], $event['min'], $event['sec'], $event['month'], $event['mday'], $event['year'])) . (!@ isset ($event['tzid']) ? 'Z' : ''); |
---|
1585 | break; |
---|
1586 | } |
---|
1587 | unset ($value); |
---|
1588 | } |
---|
1589 | } |
---|
1590 | |
---|
1591 | if (!empty ($event['x_type'])) { |
---|
1592 | $c_x_type = count($event['x_type']); |
---|
1593 | for ($j = 0; $j < $c_x_type; $j++) { |
---|
1594 | $str .= ';' . $this->build_xtype($event['x_type'][$j], '='); |
---|
1595 | } |
---|
1596 | } |
---|
1597 | if (!empty ($event['value'])) { |
---|
1598 | if ($property == 'trigger') { |
---|
1599 | $seperator = ';'; |
---|
1600 | } else { |
---|
1601 | $seperator = ':'; |
---|
1602 | } |
---|
1603 | $str .= $seperator . ($this->parameter['value']['to_text'] ? $this->to_text($event['value']) : $event['value']); |
---|
1604 | } |
---|
1605 | if ($include_mailto == True) { |
---|
1606 | $key = 'mailto'; |
---|
1607 | $function = $this->parameter[$key]['function']; |
---|
1608 | $ret_value = $this-> $function ($event[$key]); |
---|
1609 | $str .= ($ret_value ? ':' . $ret_value : ''); |
---|
1610 | } |
---|
1611 | if ($include_datetime == True || @ $this->property[$property]['type'] == 'date-time') { |
---|
1612 | $str .= ':' . date('Ymd\THis', mktime($event['hour'], $event['min'], $event['sec'], $event['month'], $event['mday'], $event['year'])) . (!@ isset ($event['tzid']) ? 'Z' : ''); |
---|
1613 | } |
---|
1614 | return ($property == 'rrule' ? ':' . substr($str, 1) : $str); |
---|
1615 | } |
---|
1616 | } |
---|
1617 | |
---|
1618 | function build_text($event, $property) { |
---|
1619 | $str = ''; |
---|
1620 | $param = $this->find_parameters($property); |
---|
1621 | while (list ($dumb_key, $key) = each($param)) { |
---|
1622 | if (!empty ($event[$key]) && $key != 'value') { |
---|
1623 | $type = @ $this->parameter[$key]['type']; |
---|
1624 | $quote = @ $this->parameter[$key]['quote']; |
---|
1625 | if (@ $this->parameter[$key]['to_text'] == True) { |
---|
1626 | $value = $this->to_text($event[$key]); |
---|
1627 | } else { |
---|
1628 | $value = $event[$key]; |
---|
1629 | } |
---|
1630 | switch ($type) { |
---|
1631 | case 'text' : |
---|
1632 | $str .= ';' . strtoupper($key) . '=' . $quote . $value . $quote; |
---|
1633 | break; |
---|
1634 | } |
---|
1635 | } |
---|
1636 | } |
---|
1637 | if (!empty ($event['x_type'])) { |
---|
1638 | $c_x_type = count($event['x_type']); |
---|
1639 | for ($j = 0; $j < $c_x_type; $j++) { |
---|
1640 | $str .= ';' . $this->build_xtype($event['x_type'][$j], '='); |
---|
1641 | } |
---|
1642 | } |
---|
1643 | if (!empty ($event['value'])) { |
---|
1644 | $str .= ':' . ($this->parameter['value']['to_text'] ? $this->to_text($event['value']) : $event['value']); |
---|
1645 | } |
---|
1646 | return $str; |
---|
1647 | } |
---|
1648 | |
---|
1649 | function build_card_internals($ical_item, $event) { |
---|
1650 | $prop = $this->find_properties($ical_item); |
---|
1651 | reset($prop); |
---|
1652 | while (list ($dumb_key, $key) = each($prop)) { |
---|
1653 | $value = $key; |
---|
1654 | $varray = $this->property[$key]; |
---|
1655 | $type = $varray['type']; |
---|
1656 | $to_text = $varray['to_text']; |
---|
1657 | $state = @ $varray[$ical_item]['state']; |
---|
1658 | $multiples = @ $varray[$ical_item]['multiples']; |
---|
1659 | switch ($type) { |
---|
1660 | case 'date-time' : |
---|
1661 | if (!empty ($event[$value])) { |
---|
1662 | if ($multiples && $value != 'exdate') { |
---|
1663 | for ($i = 0; $i < count($event[$value]); $i++) { |
---|
1664 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $value)); |
---|
1665 | } |
---|
1666 | } else { |
---|
1667 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value], $value)); |
---|
1668 | } |
---|
1669 | } |
---|
1670 | elseif ($value == 'dtstamp' || $value == 'created') { |
---|
1671 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . gmdate('Ymd\THis\Z')); |
---|
1672 | } |
---|
1673 | break; |
---|
1674 | case 'uri' : |
---|
1675 | if (!empty ($event[$value])) { |
---|
1676 | for ($i = 0; $i < count($event[$value]); $i++) { |
---|
1677 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $to_text)); |
---|
1678 | } |
---|
1679 | } |
---|
1680 | break; |
---|
1681 | case 'recur' : |
---|
1682 | if (!empty ($event[$value])) { |
---|
1683 | if ($multiples) { |
---|
1684 | for ($i = 0; $i < count($event[$value]); $i++) { |
---|
1685 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $value)); |
---|
1686 | } |
---|
1687 | } else { |
---|
1688 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value], $value)); |
---|
1689 | } |
---|
1690 | } |
---|
1691 | break; |
---|
1692 | case 'integer' : |
---|
1693 | if (!empty ($event[$value])) { |
---|
1694 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $event[$value]); |
---|
1695 | } |
---|
1696 | elseif ($value == 'sequence' || $value == 'percent_complete') { |
---|
1697 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':0'); |
---|
1698 | } |
---|
1699 | break; |
---|
1700 | case 'function' : |
---|
1701 | $str .= ';' . str_replace('_', '-', strtoupper($value)) . '='; |
---|
1702 | $function = @ $this->parameter[$key]['function']; |
---|
1703 | $str .= (@ $this->parameter[$key]['quoted'] ? '"' : '') . $this-> $function ($event[$key]) . (@ $this->parameter[$key]['quoted'] ? '"' : ''); |
---|
1704 | break; |
---|
1705 | case 'float' : |
---|
1706 | if (!empty ($event[$value])) { |
---|
1707 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $event[$value]['lat'] . ';' . $event[$value]['lon']); |
---|
1708 | } |
---|
1709 | break; |
---|
1710 | case 'text' : |
---|
1711 | if (isset ($event[$value])) { |
---|
1712 | if (@ $this->parameter[$key]['type'] != 'function') { |
---|
1713 | if ($multiples && count($event[$value]) > 1) { |
---|
1714 | for ($i = 0; $i < count($event[$value]); $i++) { |
---|
1715 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $value)); |
---|
1716 | } |
---|
1717 | } else { |
---|
1718 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value], $value)); |
---|
1719 | } |
---|
1720 | } else { |
---|
1721 | $function = $this->parameter[$value]['function']; |
---|
1722 | if ($multiples) { |
---|
1723 | for ($i = 0; $i < count($event[$value]); $i++) { |
---|
1724 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $this-> $function ($event[$value][$i])); |
---|
1725 | } |
---|
1726 | } else { |
---|
1727 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $this-> $function ($event[$value])); |
---|
1728 | } |
---|
1729 | } |
---|
1730 | } |
---|
1731 | break; |
---|
1732 | case 'cal-address' : |
---|
1733 | if (is_array($event[$value][0])) { |
---|
1734 | for ($j = 0; $j < count($event[$value]); $j++) { |
---|
1735 | $temp_output = $this->build_parameters($event[$value][$j], $value); |
---|
1736 | if ($temp_output) { |
---|
1737 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $temp_output); |
---|
1738 | } |
---|
1739 | } |
---|
1740 | } else { |
---|
1741 | $temp_output = $this->build_parameters($event[$value], $value); |
---|
1742 | if ($temp_output) { |
---|
1743 | $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $temp_output); |
---|
1744 | } |
---|
1745 | } |
---|
1746 | break; |
---|
1747 | } |
---|
1748 | } |
---|
1749 | if (!empty ($event['x_type'])) { |
---|
1750 | for ($i = 0; $i < count($event['x_type']); $i++) { |
---|
1751 | $str .= $this->build_xtype($event['x_type'][$i], ':'); |
---|
1752 | } |
---|
1753 | } |
---|
1754 | |
---|
1755 | if ($ical_item == 'vtimezone') { |
---|
1756 | if ($event['tzdata']) { |
---|
1757 | for ($k = 0; $k < count($event['tzdata']); $k++) { |
---|
1758 | $str .= 'BEGIN:' . strtoupper($event['tzdata'][$k]['type']) . "\r\n"; |
---|
1759 | $str .= $this->build_card_internals(strtolower($event['tzdata'][$k]['type']), $event['tzdata'][$k]); |
---|
1760 | $str .= 'END:' . strtoupper($event['tzdata'][$k]['type']) . "\r\n"; |
---|
1761 | } |
---|
1762 | } |
---|
1763 | } |
---|
1764 | elseif ($event['alarm']) { |
---|
1765 | for ($k = 0; $k < count($event['alarm']); $k++) { |
---|
1766 | $str .= 'BEGIN:VALARM' . "\r\n"; |
---|
1767 | $str .= $this->build_card_internals('valarm', $event['alarm'][$k]); |
---|
1768 | $str .= 'END:VALARM' . "\r\n"; |
---|
1769 | } |
---|
1770 | } |
---|
1771 | return $str; |
---|
1772 | } |
---|
1773 | |
---|
1774 | /* |
---|
1775 | * Switching Functions |
---|
1776 | */ |
---|
1777 | |
---|
1778 | function parse_user_host($var) { |
---|
1779 | return $this->switch_mailto($var); |
---|
1780 | } |
---|
1781 | |
---|
1782 | function switch_class($var) { |
---|
1783 | if (is_string($var)) { |
---|
1784 | switch ($var) { |
---|
1785 | case '_PRIVATE' : |
---|
1786 | $var = _PRIVATE; |
---|
1787 | break; |
---|
1788 | case '_PUBLIC' : |
---|
1789 | $var = _PUBLIC; |
---|
1790 | break; |
---|
1791 | case '_CONFIDENTIAL' : |
---|
1792 | $var = _CONFIDENTIAL; |
---|
1793 | break; |
---|
1794 | } |
---|
1795 | } |
---|
1796 | elseif (is_int($var)) { |
---|
1797 | switch ((int) $var) { |
---|
1798 | case _PRIVATE : |
---|
1799 | $var = '_PRIVATE'; |
---|
1800 | break; |
---|
1801 | case _PUBLIC : |
---|
1802 | $var = '_PUBLIC'; |
---|
1803 | break; |
---|
1804 | case _CONFIDENTIAL : |
---|
1805 | $var = '_CONFIDENTIAL'; |
---|
1806 | break; |
---|
1807 | } |
---|
1808 | } |
---|
1809 | return $var; |
---|
1810 | } |
---|
1811 | |
---|
1812 | function switch_cu($var) { |
---|
1813 | if (gettype($var) == 'string') { |
---|
1814 | switch ($var) { |
---|
1815 | case 'INDIVIDUAL' : |
---|
1816 | return INDIVIDUAL; |
---|
1817 | break; |
---|
1818 | case 'GROUP' : |
---|
1819 | return GROUP; |
---|
1820 | break; |
---|
1821 | case 'RESOURCE' : |
---|
1822 | return RESOURCE; |
---|
1823 | break; |
---|
1824 | case 'ROOM' : |
---|
1825 | return ROOM; |
---|
1826 | break; |
---|
1827 | case 'UNKNOWN' : |
---|
1828 | return UNKNOWN; |
---|
1829 | break; |
---|
1830 | default : |
---|
1831 | return OTHER; |
---|
1832 | break; |
---|
1833 | } |
---|
1834 | } |
---|
1835 | elseif (gettype($var) == 'integer') { |
---|
1836 | switch ($var) { |
---|
1837 | case INDIVIDUAL : |
---|
1838 | return 'INDIVIDUAL'; |
---|
1839 | break; |
---|
1840 | case GROUP : |
---|
1841 | return 'GROUP'; |
---|
1842 | break; |
---|
1843 | case RESOURCE : |
---|
1844 | return 'RESOURCE'; |
---|
1845 | break; |
---|
1846 | case ROOM : |
---|
1847 | return 'ROOM'; |
---|
1848 | break; |
---|
1849 | case UNKNOWN : |
---|
1850 | return 'UNKNOWN'; |
---|
1851 | break; |
---|
1852 | default : |
---|
1853 | return 'X-OTHER'; |
---|
1854 | break; |
---|
1855 | } |
---|
1856 | } else { |
---|
1857 | return $var; |
---|
1858 | } |
---|
1859 | } |
---|
1860 | |
---|
1861 | function switch_date($var) { |
---|
1862 | $this->debug('SWITCH_DATE: gettype = ' . gettype($var)); |
---|
1863 | if (is_string($var)) { |
---|
1864 | $dtime = Array (); |
---|
1865 | if (strpos($var, ':')) { |
---|
1866 | $pos = explode(':', $var); |
---|
1867 | $var = $pos[1]; |
---|
1868 | } |
---|
1869 | $this->set_var($dtime, 'year', (int) (substr($var, 0, 4))); |
---|
1870 | $this->set_var($dtime, 'month', (int) (substr($var, 4, 2))); |
---|
1871 | $this->set_var($dtime, 'mday', (int) (substr($var, 6, 2))); |
---|
1872 | if (substr($var, 8, 1) == 'T') { |
---|
1873 | $this->set_var($dtime, 'hour', (int) (substr($var, 9, 2))); |
---|
1874 | $this->set_var($dtime, 'min', (int) (substr($var, 11, 2))); |
---|
1875 | $this->set_var($dtime, 'sec', (int) (substr($var, 13, 2))); |
---|
1876 | if (strlen($var) > 14) { |
---|
1877 | if (substr($var, 14, 1) != 'Z') { |
---|
1878 | if ($this->api) { |
---|
1879 | $dtime['hour'] -= $GLOBALS['phpgw_info']['users']['common']['tz_offset']; |
---|
1880 | if ($dtime['hour'] < 0) { |
---|
1881 | $dtime['mday'] -= 1; |
---|
1882 | $dtime['hour'] = 24 - $dtime['hour']; |
---|
1883 | } |
---|
1884 | elseif ($dtime['hour'] >= 24) { |
---|
1885 | $dtime['mday'] += 1; |
---|
1886 | $dtime['hour'] = $dtime['hour'] - 24; |
---|
1887 | } |
---|
1888 | } |
---|
1889 | } |
---|
1890 | } else { |
---|
1891 | /* |
---|
1892 | * The time provided by the iCal is considered local time. |
---|
1893 | * |
---|
1894 | * The implementor will need to consider how to convert that time to UTC. |
---|
1895 | */ |
---|
1896 | // if($this->api) |
---|
1897 | // { |
---|
1898 | // $dtime['hour'] -= $GLOBALS['phpgw_info']['users']['common']['tz_offset']; |
---|
1899 | // if($dtime['hour'] < 0) |
---|
1900 | // { |
---|
1901 | // $dtime['mday'] -= 1; |
---|
1902 | // $dtime['hour'] = 24 - $dtime['hour']; |
---|
1903 | // } |
---|
1904 | // elseif($dtime['hour'] >= 24) |
---|
1905 | // { |
---|
1906 | // $dtime['mday'] += 1; |
---|
1907 | // $dtime['hour'] = $dtime['hour'] - 24; |
---|
1908 | // } |
---|
1909 | // } |
---|
1910 | } |
---|
1911 | } else { |
---|
1912 | $this->set_var($dtime, 'hour', 0); |
---|
1913 | $this->set_var($dtime, 'min', 0); |
---|
1914 | $this->set_var($dtime, 'sec', 0); |
---|
1915 | if ($this->api) { |
---|
1916 | $dtime['hour'] -= $GLOBALS['phpgw_info']['users']['common']['tz_offset']; |
---|
1917 | if ($dtime['hour'] < 0) { |
---|
1918 | $dtime['mday'] -= 1; |
---|
1919 | $dtime['hour'] = 24 - $dtime['hour']; |
---|
1920 | } |
---|
1921 | elseif ($dtime['hour'] >= 24) { |
---|
1922 | $dtime['mday'] += 1; |
---|
1923 | $dtime['hour'] = $dtime['hour'] - 24; |
---|
1924 | } |
---|
1925 | } |
---|
1926 | } |
---|
1927 | $this->debug('DATETIME : ' . _debug_array($dtime, False)); |
---|
1928 | return $dtime; |
---|
1929 | } |
---|
1930 | elseif (is_array($var)) { |
---|
1931 | return date('Ymd\THis\Z', mktime($var['hour'], $var['min'], $var['sec'], $var['month'], $var['mday'], $var['year'])); |
---|
1932 | } else { |
---|
1933 | return $var; |
---|
1934 | } |
---|
1935 | } |
---|
1936 | |
---|
1937 | function switch_encoding($var) { |
---|
1938 | if (is_string($var)) { |
---|
1939 | switch ($var) { |
---|
1940 | case '8BIT' : |
---|
1941 | return _8BIT; |
---|
1942 | break; |
---|
1943 | case 'BASE64' : |
---|
1944 | return _BASE64; |
---|
1945 | break; |
---|
1946 | default : |
---|
1947 | return OTHER; |
---|
1948 | break; |
---|
1949 | } |
---|
1950 | } |
---|
1951 | elseif (is_int($var)) { |
---|
1952 | switch ($var) { |
---|
1953 | case _8BIT : |
---|
1954 | return '8BIT'; |
---|
1955 | break; |
---|
1956 | case _BASE64 : |
---|
1957 | return 'BASE64'; |
---|
1958 | break; |
---|
1959 | case OTHER : |
---|
1960 | return 'OTHER'; |
---|
1961 | break; |
---|
1962 | } |
---|
1963 | } else { |
---|
1964 | return $var; |
---|
1965 | } |
---|
1966 | } |
---|
1967 | |
---|
1968 | function switch_fbtype($var) { |
---|
1969 | if (is_string($var)) { |
---|
1970 | switch ($var) { |
---|
1971 | case 'FREE' : |
---|
1972 | return FREE; |
---|
1973 | break; |
---|
1974 | case 'BUSY' : |
---|
1975 | return BUSY; |
---|
1976 | break; |
---|
1977 | case 'BUSY-UNAVAILABLE' : |
---|
1978 | return BUSY_UNAVAILABLE; |
---|
1979 | break; |
---|
1980 | case 'BUSY-TENTATIVE' : |
---|
1981 | return BUSY_TENTATIVE; |
---|
1982 | break; |
---|
1983 | default : |
---|
1984 | return OTHER; |
---|
1985 | break; |
---|
1986 | } |
---|
1987 | } |
---|
1988 | elseif (is_int($var)) { |
---|
1989 | switch ($var) { |
---|
1990 | case FREE : |
---|
1991 | return 'FREE'; |
---|
1992 | break; |
---|
1993 | case BUSY : |
---|
1994 | return 'BUSY'; |
---|
1995 | break; |
---|
1996 | case BUSY_UNAVAILABLE : |
---|
1997 | return 'BUSY-UNAVAILABLE'; |
---|
1998 | break; |
---|
1999 | case BUSY_TENTATIVE : |
---|
2000 | return 'BUSY-TENTATIVE'; |
---|
2001 | break; |
---|
2002 | default : |
---|
2003 | return 'OTHER'; |
---|
2004 | break; |
---|
2005 | } |
---|
2006 | } else { |
---|
2007 | return $var; |
---|
2008 | } |
---|
2009 | } |
---|
2010 | |
---|
2011 | function switch_freq($var) { |
---|
2012 | if (is_string($var)) { |
---|
2013 | switch ($var) { |
---|
2014 | case 'SECONDLY' : |
---|
2015 | return SECONDLY; |
---|
2016 | break; |
---|
2017 | case 'MINUTELY' : |
---|
2018 | return MINUTELY; |
---|
2019 | break; |
---|
2020 | case 'HOURLY' : |
---|
2021 | return HOURLY; |
---|
2022 | break; |
---|
2023 | case 'DAILY' : |
---|
2024 | return DAILY; |
---|
2025 | break; |
---|
2026 | case 'WEEKLY' : |
---|
2027 | return WEEKLY; |
---|
2028 | break; |
---|
2029 | case 'MONTHLY' : |
---|
2030 | return MONTHLY; |
---|
2031 | break; |
---|
2032 | case 'YEARLY' : |
---|
2033 | return YEARLY; |
---|
2034 | break; |
---|
2035 | } |
---|
2036 | } |
---|
2037 | elseif (is_int($var)) { |
---|
2038 | switch ($var) { |
---|
2039 | case SECONDLY : |
---|
2040 | return 'SECONDLY'; |
---|
2041 | break; |
---|
2042 | case MINUTELY : |
---|
2043 | return 'MINUTELY'; |
---|
2044 | break; |
---|
2045 | case HOURLY : |
---|
2046 | return 'HOURLY'; |
---|
2047 | break; |
---|
2048 | case DAILY : |
---|
2049 | return 'DAILY'; |
---|
2050 | break; |
---|
2051 | case WEEKLY : |
---|
2052 | return 'WEEKLY'; |
---|
2053 | break; |
---|
2054 | case MONTHLY : |
---|
2055 | return 'MONTHLY'; |
---|
2056 | break; |
---|
2057 | case YEARLY : |
---|
2058 | return 'YEARLY'; |
---|
2059 | break; |
---|
2060 | } |
---|
2061 | } else { |
---|
2062 | return $var; |
---|
2063 | } |
---|
2064 | } |
---|
2065 | |
---|
2066 | function switch_mailto($var) { |
---|
2067 | if (is_string($var)) { |
---|
2068 | $var = str_replace(array ( |
---|
2069 | "\r\n", |
---|
2070 | "\n", |
---|
2071 | "\r" |
---|
2072 | ), "", $var); |
---|
2073 | if (strpos(' ' . $var, ':')) { |
---|
2074 | $parts = explode(':', $var); |
---|
2075 | $var = $parts[1]; |
---|
2076 | } |
---|
2077 | |
---|
2078 | $parts = explode('@', $var); |
---|
2079 | //$this->debug("Count of mailto parts : ".count($parts)); |
---|
2080 | if (count($parts) == 2) { |
---|
2081 | //$this->debug("Splitting ".$parts[0]." @ ".$parts[1]); |
---|
2082 | $temp_address = Array (); |
---|
2083 | $temp_address['user'] = $parts[0]; |
---|
2084 | $temp_address['host'] = $parts[1]; |
---|
2085 | return $temp_address; |
---|
2086 | } else { |
---|
2087 | return False; |
---|
2088 | } |
---|
2089 | } |
---|
2090 | elseif (is_array($var)) { |
---|
2091 | // return 'MAILTO:'.$var['user'].'@'.$var['host']; |
---|
2092 | return $var['user'] . '@' . $var['host']; |
---|
2093 | } |
---|
2094 | } |
---|
2095 | |
---|
2096 | function switch_partstat($var) { |
---|
2097 | $this->debug('PARTSTAT = ' . $var); |
---|
2098 | if (is_string($var)) { |
---|
2099 | switch ($var) { |
---|
2100 | case 'NEEDS-ACTION' : |
---|
2101 | return 0; // NEEDS_ACTION; |
---|
2102 | break; |
---|
2103 | case 'ACCEPTED' : |
---|
2104 | return 1; // ACCEPTED; |
---|
2105 | break; |
---|
2106 | case 'DECLINED' : |
---|
2107 | return 2; // DECLINED; |
---|
2108 | break; |
---|
2109 | case 'TENTATIVE' : |
---|
2110 | return 3; // TENTATIVE; |
---|
2111 | break; |
---|
2112 | case 'DELEGATED' : |
---|
2113 | return 4; // DELEGATED; |
---|
2114 | break; |
---|
2115 | case 'COMPLETED' : |
---|
2116 | return 5; // COMPLETED; |
---|
2117 | break; |
---|
2118 | case 'IN-PROCESS' : |
---|
2119 | return 6; // IN_PROCESS; |
---|
2120 | break; |
---|
2121 | default : |
---|
2122 | return 99; // OTHER; |
---|
2123 | break; |
---|
2124 | } |
---|
2125 | } |
---|
2126 | elseif (is_int($var)) { |
---|
2127 | switch ((int) $var) { |
---|
2128 | case 0 : // NEEDS_ACTION: |
---|
2129 | return 'NEEDS-ACTION'; |
---|
2130 | break; |
---|
2131 | case 1 : // ACCEPTED: |
---|
2132 | return 'ACCEPTED'; |
---|
2133 | break; |
---|
2134 | case 2 : // DECLINED: |
---|
2135 | return 'DECLINED'; |
---|
2136 | break; |
---|
2137 | case 3 : // TENTATIVE: |
---|
2138 | return 'TENTATIVE'; |
---|
2139 | break; |
---|
2140 | case 4 : // DELEGATED: |
---|
2141 | return 'DELEGATED'; |
---|
2142 | break; |
---|
2143 | case 5 : // COMPLETED: |
---|
2144 | return 'COMPLETED'; |
---|
2145 | break; |
---|
2146 | case 6 : // IN_PROCESS: |
---|
2147 | return 'IN-PROCESS'; |
---|
2148 | break; |
---|
2149 | default : |
---|
2150 | return 'X-OTHER'; |
---|
2151 | break; |
---|
2152 | } |
---|
2153 | } else { |
---|
2154 | return $var; |
---|
2155 | } |
---|
2156 | } |
---|
2157 | |
---|
2158 | function switch_range($var) { |
---|
2159 | if (is_string($var)) { |
---|
2160 | switch ($var) { |
---|
2161 | case 'THISANDPRIOR' : |
---|
2162 | return THISANDPRIOR; |
---|
2163 | break; |
---|
2164 | case 'THISANDFUTURE' : |
---|
2165 | return THISANDFUTURE; |
---|
2166 | break; |
---|
2167 | } |
---|
2168 | } |
---|
2169 | elseif (is_int($var)) { |
---|
2170 | switch ($var) { |
---|
2171 | case THISANDPRIOR : |
---|
2172 | return 'THISANDPRIOR'; |
---|
2173 | break; |
---|
2174 | case THISANDFUTURE : |
---|
2175 | return 'THISANDFUTURE'; |
---|
2176 | break; |
---|
2177 | } |
---|
2178 | } else { |
---|
2179 | return $var; |
---|
2180 | } |
---|
2181 | } |
---|
2182 | |
---|
2183 | function switch_related($var) { |
---|
2184 | if (is_string($var)) { |
---|
2185 | switch ($var) { |
---|
2186 | case 'START' : |
---|
2187 | return START; |
---|
2188 | break; |
---|
2189 | case 'END' : |
---|
2190 | return END; |
---|
2191 | break; |
---|
2192 | } |
---|
2193 | } |
---|
2194 | elseif (is_int($var)) { |
---|
2195 | switch ($var) { |
---|
2196 | case START : |
---|
2197 | return 'START'; |
---|
2198 | break; |
---|
2199 | case END : |
---|
2200 | return 'END'; |
---|
2201 | break; |
---|
2202 | } |
---|
2203 | } else { |
---|
2204 | return $var; |
---|
2205 | } |
---|
2206 | } |
---|
2207 | |
---|
2208 | function switch_reltype($var) { |
---|
2209 | if (is_string($var)) { |
---|
2210 | switch ($var) { |
---|
2211 | case 'PARENT' : |
---|
2212 | return PARENT; |
---|
2213 | break; |
---|
2214 | case 'CHILD' : |
---|
2215 | return CHILD; |
---|
2216 | break; |
---|
2217 | case 'SIBLING' : |
---|
2218 | return SIBLING; |
---|
2219 | break; |
---|
2220 | } |
---|
2221 | } |
---|
2222 | elseif (is_int($var)) { |
---|
2223 | switch ($var) { |
---|
2224 | case PARENT : |
---|
2225 | return 'PARENT'; |
---|
2226 | break; |
---|
2227 | case CHILD : |
---|
2228 | return 'CHILD'; |
---|
2229 | break; |
---|
2230 | case SIBLING : |
---|
2231 | return 'SIBLING'; |
---|
2232 | break; |
---|
2233 | } |
---|
2234 | } else { |
---|
2235 | return $var; |
---|
2236 | } |
---|
2237 | } |
---|
2238 | |
---|
2239 | function switch_role($var) { |
---|
2240 | if (is_string($var)) { |
---|
2241 | switch ($var) { |
---|
2242 | case 'NONE' : |
---|
2243 | return NONE; |
---|
2244 | break; |
---|
2245 | case 'CHAIR' : |
---|
2246 | return CHAIR; |
---|
2247 | break; |
---|
2248 | case 'REQ-PARTICIPANT' : |
---|
2249 | return REQ_PARTICIPANT; |
---|
2250 | break; |
---|
2251 | case 'OPT-PARTICIPANT' : |
---|
2252 | return OPT_PARTICIPANT; |
---|
2253 | break; |
---|
2254 | case 'NON-PARTICIPANT' : |
---|
2255 | return NON_PARTICIPANT; |
---|
2256 | break; |
---|
2257 | } |
---|
2258 | } |
---|
2259 | elseif (is_int($var)) { |
---|
2260 | switch ($var) { |
---|
2261 | case NONE : |
---|
2262 | return 'NONE'; |
---|
2263 | break; |
---|
2264 | case CHAIR : |
---|
2265 | return 'CHAIR'; |
---|
2266 | break; |
---|
2267 | case REQ_PARTICIPANT : |
---|
2268 | return 'REQ-PARTICIPANT'; |
---|
2269 | break; |
---|
2270 | case OPT_PARTICIPANT : |
---|
2271 | return 'OPT-PARTICIPANT'; |
---|
2272 | break; |
---|
2273 | case NON_PARTICIPANT : |
---|
2274 | return 'NON-PARTICIPANT'; |
---|
2275 | break; |
---|
2276 | } |
---|
2277 | } else { |
---|
2278 | return $var; |
---|
2279 | } |
---|
2280 | } |
---|
2281 | |
---|
2282 | function switch_rsvp($var) { |
---|
2283 | if (is_string($var)) { |
---|
2284 | if ($var == 'TRUE') { |
---|
2285 | return 1; |
---|
2286 | } |
---|
2287 | elseif ($var == 'FALSE') { |
---|
2288 | return 0; |
---|
2289 | } |
---|
2290 | } |
---|
2291 | elseif (is_int($var) || $var == False) { |
---|
2292 | if ($var == 1) { |
---|
2293 | return 'TRUE'; |
---|
2294 | } |
---|
2295 | elseif ($var == 0) { |
---|
2296 | return 'FALSE'; |
---|
2297 | } |
---|
2298 | } else { |
---|
2299 | return $var; |
---|
2300 | } |
---|
2301 | } |
---|
2302 | |
---|
2303 | function switch_transp($var) { |
---|
2304 | if (is_string($var)) { |
---|
2305 | switch ($var) { |
---|
2306 | case 'TRANSPARENT' : |
---|
2307 | return TRANSPARENT; |
---|
2308 | break; |
---|
2309 | case 'OPAQUE' : |
---|
2310 | return OPAQUE; |
---|
2311 | break; |
---|
2312 | } |
---|
2313 | } |
---|
2314 | elseif (is_int($var)) { |
---|
2315 | switch ($var) { |
---|
2316 | case TRANSPARENT : |
---|
2317 | return 'TRANSPARENT'; |
---|
2318 | break; |
---|
2319 | case OPAQUE : |
---|
2320 | return 'OPAQUE'; |
---|
2321 | break; |
---|
2322 | } |
---|
2323 | } else { |
---|
2324 | return $var; |
---|
2325 | } |
---|
2326 | } |
---|
2327 | |
---|
2328 | /* |
---|
2329 | * The brunt of the class |
---|
2330 | */ |
---|
2331 | |
---|
2332 | function parse($ical_text) { |
---|
2333 | $begin_regexp = '^'; |
---|
2334 | $semi_colon_regexp = '[\;\:]'; |
---|
2335 | $colon_regexp = '[\:]'; |
---|
2336 | $catch_all_regexp = '(.*)'; |
---|
2337 | $end_regexp = '$'; |
---|
2338 | $property_regexp = $begin_regexp . '([A-Z\-]*)' . $semi_colon_regexp . $catch_all_regexp . $end_regexp; |
---|
2339 | $param_regexp = $begin_regexp . $catch_all_regexp . ':' . $catch_all_regexp . $end_regexp; |
---|
2340 | |
---|
2341 | $mode = 'none'; |
---|
2342 | $text = $this->read_line_unfold($ical_text); |
---|
2343 | while ($text) { |
---|
2344 | // if(strlen($ical_text[$i]) > 75) |
---|
2345 | // { |
---|
2346 | // continue; |
---|
2347 | // } |
---|
2348 | |
---|
2349 | ereg($property_regexp, $text, $temp); |
---|
2350 | //$this->debug ('Majortype dump: '._debug_array($temp, false) ); |
---|
2351 | $majortype = str_replace('-', '_', strtolower($temp[1])); |
---|
2352 | $value = chop($temp[2]); |
---|
2353 | if ($mode != 'none' && ($majortype != 'begin' && $majortype != 'end')) { |
---|
2354 | //$this->debug('PARSE:MAJORTYPE : '.$majortype); |
---|
2355 | if (isset ($this->property[$majortype])) { |
---|
2356 | $state = @ $this->property[$majortype]["$mode"]['state']; |
---|
2357 | $type = @ $this->property[$majortype]['type']; |
---|
2358 | $multiples = @ $this->property[$majortype]["$mode"]['multiples']; |
---|
2359 | $do_to_text = @ $this->property[$majortype]['to_text']; |
---|
2360 | } |
---|
2361 | elseif (substr($majortype, 0, 2) == 'x_') { |
---|
2362 | $state = 'optional'; |
---|
2363 | $type = 'xtype'; |
---|
2364 | $multiples = True; |
---|
2365 | $do_to_test = True; |
---|
2366 | } else { |
---|
2367 | $state = ''; |
---|
2368 | } |
---|
2369 | } else { |
---|
2370 | $state = 'required'; |
---|
2371 | } |
---|
2372 | |
---|
2373 | if ($majortype == 'duration') { |
---|
2374 | // Unset dur var |
---|
2375 | unset ($dur); |
---|
2376 | |
---|
2377 | // Split DURATION |
---|
2378 | list ($_f_['day_raw'], $_f_['time_raw']) = split('T', substr($value, 1, strlen($value) - 1)); |
---|
2379 | |
---|
2380 | /* Datecode */ |
---|
2381 | if (isset ($_f_['day_raw']) OR $_f_['day_raw']) { |
---|
2382 | // Days |
---|
2383 | // if(ereg('D', $_f_['day_raw'])) |
---|
2384 | if (strstr($_f_['day_raw'], 'D')) { |
---|
2385 | $dur['days'] = eregi_replace("([0-9]+)D(.*)", "\\1", $_f_['day_raw']); |
---|
2386 | } |
---|
2387 | |
---|
2388 | // Weeks |
---|
2389 | // if(ereg("W", $_f_["day_raw"])) |
---|
2390 | if (strstr($_f_['day_raw'], 'W')) { |
---|
2391 | $dur['weeks'] = eregi_replace("([^|.*]+D)?([0-9]+)W", "\\2", $_f_['day_raw']); |
---|
2392 | } |
---|
2393 | } |
---|
2394 | |
---|
2395 | /* Timecode */ |
---|
2396 | if (isset ($_f_['time_raw']) OR $_f_['time_raw']) { |
---|
2397 | // Hours |
---|
2398 | // if(ereg("H", $_f_["time_raw"])) |
---|
2399 | if (strstr($_f_['time_raw'], 'H')) { |
---|
2400 | $dur['hours'] = eregi_replace("([0-9]+)H(.*)", "\\1", $_f_['time_raw']); |
---|
2401 | } |
---|
2402 | |
---|
2403 | // Minutes |
---|
2404 | /* If you find better, contact me very quickly :) */ |
---|
2405 | // if(ereg("M", $_f_["time_raw"])) |
---|
2406 | if (strstr($_f_['time_raw'], 'M')) { |
---|
2407 | $dur['minutes'] = eregi_replace("([^|.*]+H)?([0-9]+)M(.*)", "\\2", $_f_['time_raw']); |
---|
2408 | } |
---|
2409 | |
---|
2410 | // Seconds |
---|
2411 | /* Same comment :) */ |
---|
2412 | // if(ereg("S", $_f_["time_raw"]) ) |
---|
2413 | if (strstr($_f_['time_raw'], 'S')) { |
---|
2414 | $dur['seconds'] = eregi_replace("([^|.*]+M)?([0-9]+)S(.*)", "\\2", $_f_['time_raw']); |
---|
2415 | } |
---|
2416 | } |
---|
2417 | |
---|
2418 | $dur['raw'] = Array ( |
---|
2419 | 'timecode' => $_f_['time_raw'], |
---|
2420 | 'datecode' => $_f_['day_raw'], |
---|
2421 | 'all' => $value |
---|
2422 | ); |
---|
2423 | // Add new parameters in Event |
---|
2424 | $this->set_var($event, $majortype, $dur); |
---|
2425 | } |
---|
2426 | |
---|
2427 | if ($majortype == 'begin') { |
---|
2428 | $tmode = $mode; |
---|
2429 | $mode = strtolower($value); |
---|
2430 | switch (strtolower($value)) { |
---|
2431 | case 'daylight' : |
---|
2432 | case 'standard' : |
---|
2433 | $t_event = Array (); |
---|
2434 | $t_event = $event; |
---|
2435 | $event = Array (); |
---|
2436 | break; |
---|
2437 | case 'valarm' : |
---|
2438 | if ($tmode == 'vevent' || $tmode == 'vtodo') { |
---|
2439 | $t_event = $event; |
---|
2440 | unset ($event); |
---|
2441 | $event = Array (); |
---|
2442 | } else { |
---|
2443 | $mode = $tmode; |
---|
2444 | } |
---|
2445 | break; |
---|
2446 | case 'vcalendar' : |
---|
2447 | $ical = $this->new_ical(); |
---|
2448 | break; |
---|
2449 | case 'vevent' : |
---|
2450 | case 'vfreebusy' : |
---|
2451 | case 'vjournal' : |
---|
2452 | case 'vtimezone' : |
---|
2453 | case 'vtodo' : |
---|
2454 | $event = Array (); |
---|
2455 | break; |
---|
2456 | } |
---|
2457 | $event['type'] = strtolower($value); |
---|
2458 | } |
---|
2459 | elseif ($majortype == 'end') { |
---|
2460 | $mode = 'none'; |
---|
2461 | switch (strtolower($value)) { |
---|
2462 | case 'daylight' : |
---|
2463 | case 'standard' : |
---|
2464 | $tzdata[] = $event; |
---|
2465 | unset ($event); |
---|
2466 | $event = $t_event; |
---|
2467 | unset ($t_event); |
---|
2468 | $mode = 'vtimezone'; |
---|
2469 | break; |
---|
2470 | case 'valarm' : |
---|
2471 | $alarm[] = $event; |
---|
2472 | unset ($event); |
---|
2473 | $event = $t_event; |
---|
2474 | unset ($t_event); |
---|
2475 | $mode = $tmode; |
---|
2476 | break; |
---|
2477 | case 'vevent' : |
---|
2478 | if (!empty ($alarm)) { |
---|
2479 | $event['alarm'] = $alarm; |
---|
2480 | unset ($alarm); |
---|
2481 | } |
---|
2482 | $this->event[] = $event; |
---|
2483 | unset ($event); |
---|
2484 | break; |
---|
2485 | case 'vfreebusy' : |
---|
2486 | $this->freebusy[] = $event; |
---|
2487 | unset ($event); |
---|
2488 | break; |
---|
2489 | case 'vjournal' : |
---|
2490 | $this->journal[] = $event; |
---|
2491 | unset ($event); |
---|
2492 | break; |
---|
2493 | case 'vtimezone' : |
---|
2494 | if (!empty ($tzdata)) { |
---|
2495 | $event['tzdata'] = $tzdata; |
---|
2496 | unset ($tzdata); |
---|
2497 | } |
---|
2498 | $this->timezone[] = $event; |
---|
2499 | unset ($event); |
---|
2500 | break; |
---|
2501 | case 'vtodo' : |
---|
2502 | if (!empty ($alarm)) { |
---|
2503 | $event['alarm'] = $alarm; |
---|
2504 | unset ($alarm); |
---|
2505 | } |
---|
2506 | $this->todo[] = $event['alarm']; |
---|
2507 | unset ($event); |
---|
2508 | break; |
---|
2509 | case 'vcalendar' : |
---|
2510 | $this->ical = $ical; |
---|
2511 | $this->ical['event'] = $this->event; |
---|
2512 | $this->ical['freebusy'] = $this->freebusy; |
---|
2513 | $this->ical['journal'] = $this->journal; |
---|
2514 | $this->ical['timezone'] = $this->timezone; |
---|
2515 | $this->ical['todo'] = $this->todo; |
---|
2516 | break 2; |
---|
2517 | } |
---|
2518 | } |
---|
2519 | elseif ($majortype == 'prodid' || $majortype == 'version' || $majortype == 'method' || $majortype == 'calscale') { |
---|
2520 | $this->parse_parameters($ical, $majortype, $this->from_text($value)); |
---|
2521 | } |
---|
2522 | elseif ($state == 'optional' || $state == 'required') { |
---|
2523 | //$this->debug('Mode : '.$mode.' Majortype : '.$majortype . ' Type : '.$type); |
---|
2524 | if ($do_to_text) { |
---|
2525 | $value = $this->from_text($value); |
---|
2526 | } |
---|
2527 | switch ($type) { |
---|
2528 | case 'text' : |
---|
2529 | $this->parse_parameters($event, $majortype, $value); |
---|
2530 | break; |
---|
2531 | case 'recur' : |
---|
2532 | case 'date-time' : |
---|
2533 | case 'cal-address' : |
---|
2534 | $this->parse_value($event, $majortype, $value, $mode); |
---|
2535 | break; |
---|
2536 | case 'integer' : |
---|
2537 | if ($multiples) { |
---|
2538 | $event[$majortype][] = (int) $value; |
---|
2539 | } else { |
---|
2540 | $this->set_var($event, $majortype, (int) $value); |
---|
2541 | } |
---|
2542 | break; |
---|
2543 | case 'float' : |
---|
2544 | $event-> $majortype = new class_geo; |
---|
2545 | $this->parse_geo($event-> $majortype, $value); |
---|
2546 | break; |
---|
2547 | case 'utc-offset' : |
---|
2548 | $this->set_var($event, $majortype, (int) $value); |
---|
2549 | break; |
---|
2550 | case 'uri' : |
---|
2551 | $new_var = Array (); |
---|
2552 | $this->parse_parameters($new_var, $majortype, $value); |
---|
2553 | if ($multiples) { |
---|
2554 | switch ($mode) { |
---|
2555 | case 'valarm' : |
---|
2556 | $alarm['attach'][] = $new_var; |
---|
2557 | break; |
---|
2558 | default : |
---|
2559 | $event[$majortype][] = $new_var; |
---|
2560 | break; |
---|
2561 | } |
---|
2562 | } else { |
---|
2563 | $event[$majortype] = $new_var; |
---|
2564 | } |
---|
2565 | unset ($new_var); |
---|
2566 | break; |
---|
2567 | case 'xtype' : |
---|
2568 | $this->parse_xtype($event, $majortype, $value); |
---|
2569 | break; |
---|
2570 | } |
---|
2571 | } |
---|
2572 | $text = $this->read_line_unfold($ical_text); |
---|
2573 | } |
---|
2574 | return $this->ical; |
---|
2575 | } |
---|
2576 | |
---|
2577 | function switch_to_phpgw_status($partstat) { |
---|
2578 | switch ($partstat) { |
---|
2579 | case 0 : |
---|
2580 | return 'U'; |
---|
2581 | break; |
---|
2582 | case 1 : |
---|
2583 | return 'A'; |
---|
2584 | break; |
---|
2585 | case 2 : |
---|
2586 | return 'R'; |
---|
2587 | break; |
---|
2588 | case 3 : |
---|
2589 | return 'T'; |
---|
2590 | break; |
---|
2591 | default : |
---|
2592 | return 'U'; |
---|
2593 | break; |
---|
2594 | } |
---|
2595 | } |
---|
2596 | |
---|
2597 | function switch_phpgw_status($status) { |
---|
2598 | switch ($status) { |
---|
2599 | case 'U' : |
---|
2600 | return 0; |
---|
2601 | break; |
---|
2602 | case 'A' : |
---|
2603 | return 1; |
---|
2604 | break; |
---|
2605 | case 'R' : |
---|
2606 | return 2; |
---|
2607 | break; |
---|
2608 | case 'T' : |
---|
2609 | return 3; |
---|
2610 | break; |
---|
2611 | } |
---|
2612 | } |
---|
2613 | |
---|
2614 | function is_owner($part_record) { |
---|
2615 | if (($part_record['user'] . '@' . $part_record['host'] == $GLOBALS['phpgw_info']['user']['preferences']['email']['address']) || ($part_record['cn'] == $GLOBALS['phpgw_info']['user']['account_lid']) || |
---|
2616 | ($part_record['mailto']['user'] == $GLOBALS['phpgw_info']['user']['account_lid'])) { |
---|
2617 | return True; |
---|
2618 | } else { |
---|
2619 | return False; |
---|
2620 | } |
---|
2621 | } |
---|
2622 | |
---|
2623 | function check_owner(& $event, $ical, $so_event) { |
---|
2624 | if (!isset ($event['participant'][$GLOBALS['phpgw_info']['user']['account_id']])) { |
---|
2625 | if (isset ($ical['organizer'])) { |
---|
2626 | if ($this->is_owner($ical['organizer'])) { |
---|
2627 | $so_event->add_attribute('owner', $GLOBALS['phpgw_info']['user']['account_id']); |
---|
2628 | $so_event->add_attribute('participants', $this->switch_to_phpgw_status($ical['organizer']['partstat']), $GLOBALS['phpgw_info']['user']['account_id']); |
---|
2629 | } |
---|
2630 | } |
---|
2631 | elseif (isset ($ical['attendee'])) { |
---|
2632 | $attendee_count = count($ical['attendee']); |
---|
2633 | |
---|
2634 | for ($j = 0; $j < $attendee_count; $j++) { |
---|
2635 | if ($this->is_owner($ical['attendee'][$j])) { |
---|
2636 | $so_event->add_attribute('participants', $this->switch_to_phpgw_status($ical['attendee'][$j]['partstat']), (int) $GLOBALS['phpgw_info']['user']['account_id']); |
---|
2637 | } |
---|
2638 | } |
---|
2639 | } else { |
---|
2640 | $so_event->add_attribute('owner', $GLOBALS['phpgw_info']['user']['account_id']); |
---|
2641 | $so_event->add_attribute('participants', 'A', $GLOBALS['phpgw_info']['user']['account_id']); |
---|
2642 | } |
---|
2643 | } |
---|
2644 | } |
---|
2645 | |
---|
2646 | function import_file() { |
---|
2647 | if ($_FILES['uploadedfile']['tmp_name'] == 'none' || $_FILES['uploadedfile']['tmp_name'] == '') { |
---|
2648 | Header('Location: ' . $GLOBALS['phpgw']->link('/index.php', Array ( |
---|
2649 | 'menuaction' => 'calendar.uiicalendar.import', |
---|
2650 | 'action' => 'GetFile' |
---|
2651 | ))); |
---|
2652 | $GLOBALS['phpwg']->common->phpgw_exit(); |
---|
2653 | } |
---|
2654 | $uploaddir = $GLOBALS['phpgw_info']['server']['temp_dir'] . SEP; |
---|
2655 | |
---|
2656 | srand((double) microtime() * 1000000); |
---|
2657 | $random_number = rand(100000000, 999999999); |
---|
2658 | $newfilename = md5($_FILES['uploadedfile']['tmp_name'] . ", " . $uploadedfile_name . ", " . time() . getenv("REMOTE_ADDR") . $random_number); |
---|
2659 | |
---|
2660 | $filename = $uploaddir . $newfilename; |
---|
2661 | |
---|
2662 | move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $filename); |
---|
2663 | // $ftp = fopen($uploaddir . $newfilename . '.info','wb'); |
---|
2664 | // fputs($ftp,$uploadedfile_type."\n".$uploadedfile_name."\n"); |
---|
2665 | // fclose($ftp); |
---|
2666 | return $filename; |
---|
2667 | } |
---|
2668 | |
---|
2669 | function safeBitCheck($number, $comparison) { |
---|
2670 | $binNumber = base_convert($number, 10, 2); |
---|
2671 | $binComparison = strrev(base_convert($comparison, 10, 2)); |
---|
2672 | $str = strlen($binNumber); |
---|
2673 | |
---|
2674 | if (($str <= strlen($binComparison)) && ($binComparison { |
---|
2675 | $str -1 } |
---|
2676 | === "1")) |
---|
2677 | return '1'; |
---|
2678 | else |
---|
2679 | return '0'; |
---|
2680 | } |
---|
2681 | |
---|
2682 | function import($mime_msg = '', $from_ajax = false, $importAccount = false) { |
---|
2683 | /* |
---|
2684 | * Caso seja uma importação para conta compartilhada carrega as acls do usuario |
---|
2685 | */ |
---|
2686 | if ($importAccount != false) { |
---|
2687 | $colunas = array ( |
---|
2688 | 'acl_appname', |
---|
2689 | 'acl_location', |
---|
2690 | 'acl_account', |
---|
2691 | 'acl_rights' |
---|
2692 | ); |
---|
2693 | $where = array ( |
---|
2694 | 'acl_appname' => 'calendar', |
---|
2695 | 'acl_account' => $importAccount['uidnumber'], |
---|
2696 | 'acl_location' => $GLOBALS['phpgw_info']['user']['account_id'] |
---|
2697 | ); |
---|
2698 | $db = $GLOBALS['phpgw']->db; |
---|
2699 | $db->select('phpgw_acl', $colunas, $where, null, null); |
---|
2700 | $row = $db->row(true); |
---|
2701 | |
---|
2702 | if (!$this->safeBitCheck(2, $row['acl_rights'])) //Se o usuario não tem permisão de adicionar eventos |
---|
2703 | return 'You do not have permission to add events'; |
---|
2704 | } |
---|
2705 | |
---|
2706 | if ($_FILES['uploadedfile']['tmp_name'] != 'none' && $_FILES['uploadedfile']['tmp_name'] != '') { |
---|
2707 | $filename = $this->import_file(); |
---|
2708 | $fp = fopen($filename, 'rt'); |
---|
2709 | $mime_msg = explode("\n", fread($fp, filesize($filename))); |
---|
2710 | fclose($fp); |
---|
2711 | unlink($filename); |
---|
2712 | } |
---|
2713 | elseif (!$mime_msg) { |
---|
2714 | Header('Location: ' . $GLOBALS['phpgw']->link('/index.php', Array ( |
---|
2715 | 'menuaction' => 'calendar.uiicalendar.import', |
---|
2716 | 'action' => 'GetFile' |
---|
2717 | ))); |
---|
2718 | $GLOBALS['phpwg']->common->phpgw_exit(); |
---|
2719 | } |
---|
2720 | |
---|
2721 | if (!is_object($GLOBALS['uicalendar'])) { |
---|
2722 | $so_event = createobject('calendar.socalendar', Array ( |
---|
2723 | 'owner' => 0, |
---|
2724 | 'filter' => '', |
---|
2725 | 'category' => '' |
---|
2726 | )); |
---|
2727 | } else { |
---|
2728 | $so_event = $GLOBALS['uicalendar']->bo->so; |
---|
2729 | } |
---|
2730 | |
---|
2731 | $datetime_vars = Array ( |
---|
2732 | 'start' => 'dtstart', |
---|
2733 | 'end' => 'dtend', |
---|
2734 | 'modtime' => 'dtstamp', |
---|
2735 | 'modtime' => 'last_modified' |
---|
2736 | ); |
---|
2737 | |
---|
2738 | $date_array = Array ( |
---|
2739 | 'Y' => 'year', |
---|
2740 | 'm' => 'month', |
---|
2741 | 'd' => 'mday', |
---|
2742 | 'H' => 'hour', |
---|
2743 | 'i' => 'min', |
---|
2744 | 's' => 'sec' |
---|
2745 | ); |
---|
2746 | |
---|
2747 | // time limit should be controlled elsewhere |
---|
2748 | @ set_time_limit(0); |
---|
2749 | $GLOBALS['phpgw_info']['user']['preferences'] = $GLOBALS['phpgw']->preferences->create_email_preferences(); |
---|
2750 | $users_email = $GLOBALS['phpgw_info']['user']['preferences']['email']['address']; |
---|
2751 | $cats = CreateObject('phpgwapi.categories'); |
---|
2752 | $ical = $this->parse($mime_msg); |
---|
2753 | switch ($ical['version']['value']) { |
---|
2754 | case '1.0' : |
---|
2755 | $cat_sep = ';'; |
---|
2756 | break; |
---|
2757 | case '2.0' : |
---|
2758 | default : |
---|
2759 | $cat_sep = ','; |
---|
2760 | break; |
---|
2761 | } |
---|
2762 | |
---|
2763 | /* |
---|
2764 | * Caso seja um Reply. |
---|
2765 | */ |
---|
2766 | if (strtoupper($ical['method']['value']) == 'REPLY') { |
---|
2767 | //atualiza evento caso seja evento externo |
---|
2768 | if (isset ($ical['event']['0']['x_type'])) |
---|
2769 | foreach ($ical['event']['0']['x_type'] as $property) |
---|
2770 | if ($property['name'] === 'MICROSOFT_CDO_IMPORTANCE') |
---|
2771 | return $this->updateHour($ical); |
---|
2772 | |
---|
2773 | //Ignora respostas externas |
---|
2774 | return 'The import was executed successfully.'; |
---|
2775 | } |
---|
2776 | |
---|
2777 | /*-------------------------------------------------------------*/ |
---|
2778 | |
---|
2779 | /* |
---|
2780 | * Ativa a flag de cancelamento caso o ical for do method CANCEL |
---|
2781 | */ |
---|
2782 | $cancelEvent = false; |
---|
2783 | if (strtoupper($ical['method']['value']) == 'CANCEL') |
---|
2784 | $cancelEvent = true; |
---|
2785 | /*-------------------------------------------------------------*/ |
---|
2786 | |
---|
2787 | require_once (dirname(__FILE__) . '/class.ex_participants.inc.php'); |
---|
2788 | |
---|
2789 | $c_events = count($ical['event']); |
---|
2790 | for ($i = 0; $i < $c_events; $i++) { |
---|
2791 | $ex_participants = new exParticipants(); |
---|
2792 | |
---|
2793 | if ($ical['event'][$i]['uid']['value']) |
---|
2794 | $uid_exists = $so_event->find_cal_id($ical['event'][$i]['uid']['value']); |
---|
2795 | else |
---|
2796 | $uid_exists = False; |
---|
2797 | |
---|
2798 | if ($cancelEvent) // If cancelamento |
---|
2799 | { |
---|
2800 | if ($importAccount != false && !$this->safeBitCheck(8, $row['acl_rights'])) // se for em uma conta compartilhada e se tem permisão de deletar |
---|
2801 | return 'You do not have permission to delete events'; |
---|
2802 | |
---|
2803 | if ($uid_exists) // If o evento existe na agenda |
---|
2804 | $so_event->delete_entry($uid_exists); // Adicona o id a lista de eventos a deletar |
---|
2805 | |
---|
2806 | continue; // Continua o for nenhum processamento mais é nescessario |
---|
2807 | } |
---|
2808 | |
---|
2809 | if ($uid_exists) { |
---|
2810 | $event = $so_event->read_entry($uid_exists); |
---|
2811 | $this->check_owner($event, $ical['event'][$i], $so_event); |
---|
2812 | } else { |
---|
2813 | $so_event->event_init(); |
---|
2814 | $so_event->add_attribute('id', 0); |
---|
2815 | $so_event->add_attribute('reference', 0); |
---|
2816 | } |
---|
2817 | |
---|
2818 | if ($ical['event'][$i]['uid']['value']) { |
---|
2819 | $so_event->add_attribute('uid', $ical['event'][$i]['uid']['value']); |
---|
2820 | } |
---|
2821 | if ($ical['event'][$i]['summary']['value']) { |
---|
2822 | $so_event->set_title($ical['event'][$i]['summary']['value']); |
---|
2823 | } |
---|
2824 | if ($ical['event'][$i]['description']['value']) { |
---|
2825 | $so_event->set_description($ical['event'][$i]['description']['value']); |
---|
2826 | } |
---|
2827 | if ($ical['event'][$i]['ex_participants']['value']) { |
---|
2828 | $ex_participants->setParticipantsByString($ical['event'][$i]['ex_participants']['value']); |
---|
2829 | } |
---|
2830 | // Compatibilidade com agendamentos vindos do outlook/exchange |
---|
2831 | if (isset ($ical['event'][$i]['attendee'])) { |
---|
2832 | $c_attendees = count($ical['event'][$i]['attendee']); |
---|
2833 | $all_attendees = ''; |
---|
2834 | for ($a = 0; $a < $c_attendees; $a++) { |
---|
2835 | $cname = '"' . $ical['event'][$i]['attendee'][$a]['cn'] . '"'; |
---|
2836 | $email = $ical['event'][$i]['attendee'][$a]['mailto']['user']; |
---|
2837 | if ($email) { |
---|
2838 | // Remove os espaços, tabs e quebra-de-linha no dominio |
---|
2839 | //$email_domain = preg_replace('/\s*/m', '', $ical['event'][$i]['attendee'][$a]['mailto']['host']); |
---|
2840 | $email_domain = $ical['event'][$i]['attendee'][$a]['mailto']['host']; |
---|
2841 | $email = '<' . $email . '@' . $email_domain . '>'; |
---|
2842 | } else |
---|
2843 | $email = ''; |
---|
2844 | |
---|
2845 | $all_attendees .= $cname . $email . ', '; |
---|
2846 | } |
---|
2847 | $this->debug('All attendees: ' . $all_attendees); |
---|
2848 | |
---|
2849 | $ex_participants->setParticipantsByString($all_attendees); |
---|
2850 | |
---|
2851 | } |
---|
2852 | |
---|
2853 | if ($ical['event'][$i]['location']['value']) { |
---|
2854 | $so_event->add_attribute('location', $ical['event'][$i]['location']['value']); |
---|
2855 | } |
---|
2856 | if (isset ($ical['event'][$i]['priority'])) { |
---|
2857 | $so_event->add_attribute('priority', $ical['event'][$i]['priority']); |
---|
2858 | } else { |
---|
2859 | $so_event->add_attribute('priority', 2); |
---|
2860 | } |
---|
2861 | if (!isset ($ical['event'][$i]['class'])) { |
---|
2862 | $ical['event'][$i]['class'] = 1; |
---|
2863 | } |
---|
2864 | $so_event->set_class($ical['event'][$i]['class']); |
---|
2865 | |
---|
2866 | @ reset($datetime_vars); |
---|
2867 | while (list ($e_datevar, $i_datevar) = each($datetime_vars)) { |
---|
2868 | if (isset ($ical['event'][$i][$i_datevar])) { |
---|
2869 | $temp_time = $so_event->maketime($ical['event'][$i][$i_datevar]) + $GLOBALS['phpgw']->datetime->tz_offset; |
---|
2870 | @ reset($date_array); |
---|
2871 | while (list ($key, $var) = each($date_array)) { |
---|
2872 | $event[$e_datevar][$var] = (int) (date($key, $temp_time)); |
---|
2873 | } |
---|
2874 | $so_event->set_date($e_datevar, $event[$e_datevar]['year'], $event[$e_datevar]['month'], $event[$e_datevar]['mday'], $event[$e_datevar]['hour'], $event[$e_datevar]['min'], $event[$e_datevar]['sec']); |
---|
2875 | } |
---|
2876 | } |
---|
2877 | if (!isset ($ical['event'][$i]['categories']['value']) || !$ical['event'][$i]['categories']['value']) { |
---|
2878 | $so_event->set_category(0); |
---|
2879 | } else { |
---|
2880 | $ical_cats = Array (); |
---|
2881 | if (strpos($ical['event'][$i]['categories']['value'], $cat_sep)) { |
---|
2882 | $ical_cats = explode($cat_sep, $ical['event'][$i]['categories']['value']); |
---|
2883 | } else { |
---|
2884 | $ical_cats[] = $ical['event'][$i]['categories']['value']; |
---|
2885 | } |
---|
2886 | |
---|
2887 | @ reset($ical_cats); |
---|
2888 | $cat_id_nums = Array (); |
---|
2889 | while (list ($key, $cat) = each($ical_cats)) { |
---|
2890 | if (!$cats->exists('appandmains', $cat)) { |
---|
2891 | $cats->add(Array ( |
---|
2892 | 'name' => $cat, |
---|
2893 | 'descr' => $cat, |
---|
2894 | 'parent' => '', |
---|
2895 | 'access' => 'private', |
---|
2896 | 'data' => '' |
---|
2897 | )); |
---|
2898 | } |
---|
2899 | // $temp_id = $cats->name2id($cat); |
---|
2900 | // echo 'Category Name : '.$cat.' : Category ID :'.$temp_id."<br>\n"; |
---|
2901 | // $cat_id_nums[] = $temp_id; |
---|
2902 | $cat_id_nums[] = $cats->name2id($cat); |
---|
2903 | } |
---|
2904 | @ reset($cat_id_nums); |
---|
2905 | if (count($cat_id_nums) > 1) { |
---|
2906 | $so_event->set_category(implode($cat_id_nums, ',')); |
---|
2907 | } else { |
---|
2908 | $so_event->set_category($cat_id_nums[0]); |
---|
2909 | } |
---|
2910 | } |
---|
2911 | |
---|
2912 | //rrule |
---|
2913 | if (isset ($ical['event'][$i]['rrule']) OR isset ($ical['event'][$i]['duration'])) { |
---|
2914 | // recur_enddate |
---|
2915 | if (isset ($ical['event'][$i]['rrule']['until'])) { |
---|
2916 | $recur_enddate['year'] = (int) ($ical['event'][$i]['rrule']['until']['year']); |
---|
2917 | $recur_enddate['month'] = (int) ($ical['event'][$i]['rrule']['until']['month']); |
---|
2918 | $recur_enddate['mday'] = (int) ($ical['event'][$i]['rrule']['until']['mday']); |
---|
2919 | } |
---|
2920 | elseif (isset ($ical['event'][$i]['duration'])) { |
---|
2921 | // Create timecode for strtotime |
---|
2922 | $ptimer = mktime($ical['event'][$i]['dtstart']['hour'], $ical['event'][$i]['dtstart']['min'], $ical['event'][$i]['dtstart']['sec'], $ical['event'][$i]['dtstart']['month'], $ical['event'][$i]['dtstart']['mday'], $ical['event'][$i]['dtstart']['year']); |
---|
2923 | |
---|
2924 | /* -- Fixbug -- |
---|
2925 | * if "DURATION" has 1 day (for example). |
---|
2926 | * Event takes places between the first date |
---|
2927 | * (this define in "start" tag) and next day :( |
---|
2928 | * This "fix" destroy one day and set hours as "23" and minutes as "59" |
---|
2929 | */ |
---|
2930 | |
---|
2931 | // Weeks::Day-- |
---|
2932 | if ($ical['event'][$i]['duration']['weeks'] AND ($ical['event'][$i]['duration']['hours'] == 0) AND ($ical['event'][$i]['duration']['minutes'] == 0)) { |
---|
2933 | $ical['event'][$i]['duration']['days'] = ($ical['event'][$i]['duration']['days'] + ($ical['event'][$i]['duration']['weeks'] * 7)) - 1; |
---|
2934 | unset ($ical['event'][$i]['duration']['weeks']); |
---|
2935 | $ical['event'][$i]['duration']['hours'] = "23"; |
---|
2936 | $ical['event'][$i]['duration']['minutes'] = "59"; |
---|
2937 | $ical['event'][$i]['duration']['seconds'] = "59"; |
---|
2938 | } |
---|
2939 | // Days::Day-- |
---|
2940 | if ($ical['event'][$i]['duration']['days'] AND ($ical['event'][$i]['duration']['hours'] == 0) AND ($ical['event'][$i]['duration']['minutes'] == 0)) { |
---|
2941 | $ical['event'][$i]['duration']['days']--; |
---|
2942 | $ical['event'][$i]['duration']['hours'] = "23"; |
---|
2943 | $ical['event'][$i]['duration']['minutes'] = "59"; |
---|
2944 | $ical['event'][$i]['duration']['seconds'] = "59"; |
---|
2945 | } |
---|
2946 | |
---|
2947 | // Create string contains datetime for strtotime |
---|
2948 | $pdate = "+"; |
---|
2949 | if (isset ($ical['event'][$i]['duration']['weeks'])) |
---|
2950 | $pdate .= $ical['event'][$i]['duration']['weeks'] . " weeks "; |
---|
2951 | if (isset ($ical['event'][$i]['duration']['days'])) |
---|
2952 | $pdate .= $ical['event'][$i]['duration']['days'] . " days "; |
---|
2953 | if (isset ($ical['event'][$i]['duration']['hours'])) |
---|
2954 | $pdate .= $ical['event'][$i]['duration']['hours'] . " hours "; |
---|
2955 | if (isset ($ical['event'][$i]['duration']['minutes'])) |
---|
2956 | $pdate .= $ical['event'][$i]['duration']['minutes'] . " minutes "; |
---|
2957 | if (isset ($ical['event'][$i]['duration']['seconds'])) |
---|
2958 | $pdate .= $ical['event'][$i]['duration']['seconds'] . " seconds "; |
---|
2959 | |
---|
2960 | // What is datetime in 2192 ? |
---|
2961 | $enddate = strtotime($pdate, $ptimer); |
---|
2962 | list ($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $recur_enddate['hour'], $recur_enddate['min'], $recur_enddate['sec']) = split(":", date("Y:m:d:H:i:s", $enddate)); |
---|
2963 | |
---|
2964 | // Set End of event |
---|
2965 | $so_event->set_end($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $recur_enddate['hour'], $recur_enddate['min'], $recur_enddate['sec']); |
---|
2966 | |
---|
2967 | } else { |
---|
2968 | $recur_enddate['year'] = 0; |
---|
2969 | $recur_enddate['month'] = 0; |
---|
2970 | $recur_enddate['mday'] = 0; |
---|
2971 | } |
---|
2972 | |
---|
2973 | // recur_data |
---|
2974 | $recur_data = 0; |
---|
2975 | if (isset ($ical['event'][$i]['rrule']['byday'])) { |
---|
2976 | $week_days = Array ( |
---|
2977 | MCAL_M_SUNDAY => 'SU', |
---|
2978 | MCAL_M_MONDAY => 'MO', |
---|
2979 | MCAL_M_TUESDAY => 'TU', |
---|
2980 | MCAL_M_WEDNESDAY => 'WE', |
---|
2981 | MCAL_M_THURSDAY => 'TH', |
---|
2982 | MCAL_M_FRIDAY => 'FR', |
---|
2983 | MCAL_M_SATURDAY => 'SA' |
---|
2984 | ); |
---|
2985 | @ reset($week_days); |
---|
2986 | while (list ($key, $val) = each($week_days)) { |
---|
2987 | if (strpos(' ' . $ical['event'][$i]['rrule']['byday'], $val)) { |
---|
2988 | $recur_data += $key; |
---|
2989 | } |
---|
2990 | } |
---|
2991 | } |
---|
2992 | |
---|
2993 | // interval |
---|
2994 | if (!isset ($ical['event'][$i]['rrule']['interval'])) { |
---|
2995 | $interval = 1; |
---|
2996 | } else { |
---|
2997 | $interval = (int) $ical['event'][$i]['rrule']['interval']; |
---|
2998 | } |
---|
2999 | // recur_type |
---|
3000 | switch ($ical['event'][$i]['rrule']['freq']) { |
---|
3001 | case DAILY : |
---|
3002 | $recur_type = MCAL_RECUR_DAILY; |
---|
3003 | break; |
---|
3004 | case WEEKLY : |
---|
3005 | $so_event->set_recur_weekly($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $interval, $recur_data); |
---|
3006 | break; |
---|
3007 | case MONTHLY : |
---|
3008 | // Still need to determine if this is by day or by week for the month.. |
---|
3009 | // $recur_type = MCAL_RECUR_M??????; |
---|
3010 | break; |
---|
3011 | case YEARLY : |
---|
3012 | $so_event->set_recur_yearly($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $interval); |
---|
3013 | break; |
---|
3014 | } |
---|
3015 | } else { |
---|
3016 | $so_event->set_recur_none(); |
---|
3017 | } |
---|
3018 | |
---|
3019 | // Owner |
---|
3020 | $organizer = $ical['event'][$i]['organizer']; |
---|
3021 | |
---|
3022 | if (isset ($organizer)) { |
---|
3023 | if ($this->is_owner($organizer) || $organizer == -2) { |
---|
3024 | $so_event->add_attribute('owner', $GLOBALS['phpgw_info']['user']['account_id']); |
---|
3025 | } else { |
---|
3026 | $so_event->add_attribute('owner', -2); |
---|
3027 | $aux = explode(':', $organizer['cn']); |
---|
3028 | $so_event->add_attribute('organizer', '' . $aux[0] . ' <' . $organizer['mailto']['user'] . '@'. $organizer['mailto']['host'].'>'); |
---|
3029 | } |
---|
3030 | } |
---|
3031 | |
---|
3032 | // se for importação para conta compartilhada |
---|
3033 | $user = (int) ($importAccount ? $importAccount['uidnumber'] : $GLOBALS['phpgw_info']['user']['account_id']); |
---|
3034 | $userMail = $importAccount['mail'] ? $importAccount['mail'] : $GLOBALS['phpgw_info']['user']['email']; |
---|
3035 | |
---|
3036 | $so_event->add_attribute('participants', 'A', $user); |
---|
3037 | $event = $so_event->get_cached_event(); |
---|
3038 | |
---|
3039 | /* |
---|
3040 | * Remove Email do participantes externos |
---|
3041 | */ |
---|
3042 | $usersToRemove = array (); |
---|
3043 | $usersToRemove[] = $user; |
---|
3044 | foreach ($event['participants'] as $auxi=> $v) |
---|
3045 | $usersToRemove[] = $auxi; |
---|
3046 | |
---|
3047 | $ldapService = ServiceLocator :: getService('ldap'); |
---|
3048 | foreach ($usersToRemove as $v) { |
---|
3049 | $ex_participants->removeParticipant($ldapService->getMailByUidNumber($v)); |
---|
3050 | $alternates = $ldapService->getMailAlternateByUidNumber($v); |
---|
3051 | foreach ($alternates as $ii => $vv) |
---|
3052 | $ex_participants->removeParticipant($vv); |
---|
3053 | } |
---|
3054 | $ex_participants->removeParticipant($event['organizer']); |
---|
3055 | /// -------------------------------------------------------- /// |
---|
3056 | |
---|
3057 | $event['ex_participants'] = $ex_participants->getParticipantsSerializable(); |
---|
3058 | |
---|
3059 | if (!isset ($this->bo)) { |
---|
3060 | require_once (dirname(__FILE__) . '/class.bocalendar.inc.php'); |
---|
3061 | $this->bo = new bocalendar(); |
---|
3062 | } |
---|
3063 | |
---|
3064 | if ($c_events < 2) //Ignora verificação de conflito quando o ical é de varios eventos |
---|
3065 | { |
---|
3066 | if ($overlapping_events = $this->bo->event_overlap($event, (!$from_ajax), null, $user)) { |
---|
3067 | if ($_GET['calendarImport'] == 1) //caso venha do modulo calendar |
---|
3068 | { |
---|
3069 | $url = 'expressoMail1_2/controller.php?action=' . implode("&", array ( |
---|
3070 | 'calendar.uicalendar.overlap', |
---|
3071 | 'o_events=' . implode(';', $overlapping_events), |
---|
3072 | 'this_event=' . $event['id'], |
---|
3073 | 'this_account=' . $user |
---|
3074 | )); |
---|
3075 | |
---|
3076 | echo "<script>document.location='" . $url . "'</script>"; |
---|
3077 | exit; |
---|
3078 | } else |
---|
3079 | return array ( |
---|
3080 | 'url' => implode("&", array ( |
---|
3081 | 'calendar.uicalendar.overlap', |
---|
3082 | 'o_events=' . implode(';', $overlapping_events), |
---|
3083 | 'this_event=' . $event['id'], |
---|
3084 | 'this_account=' . $user |
---|
3085 | )) |
---|
3086 | ); |
---|
3087 | } |
---|
3088 | } |
---|
3089 | |
---|
3090 | if ($importAccount) |
---|
3091 | $so_event->add_entry($event, true, $importAccount); |
---|
3092 | else |
---|
3093 | $so_event->add_entry($event); |
---|
3094 | |
---|
3095 | } |
---|
3096 | |
---|
3097 | /* |
---|
3098 | * Exclue os eventos que estão na lista para serem deletados |
---|
3099 | */ |
---|
3100 | if ($cancelEvent) |
---|
3101 | $so_event->expunge(); |
---|
3102 | /*----------------------------------------------------------*/ |
---|
3103 | |
---|
3104 | if (!$from_ajax) { |
---|
3105 | Header('Location: ' . $GLOBALS['phpgw']->link('/index.php', Array ( |
---|
3106 | 'menuaction' => 'calendar.uicalendar.view', |
---|
3107 | 'cal_id' => $event['id'] |
---|
3108 | ))); |
---|
3109 | $GLOBALS['phpgw']->common->phpgw_exit(); |
---|
3110 | } else // checando se o icalendar veio no formato esperado, ou seja, foi parseado corretamente |
---|
3111 | if (!empty ($ical)) |
---|
3112 | return true; |
---|
3113 | else |
---|
3114 | return 'Cannot import target event. Please check if the format is right.'; |
---|
3115 | |
---|
3116 | } |
---|
3117 | |
---|
3118 | function updateHour($ical) { |
---|
3119 | |
---|
3120 | if (!is_object($GLOBALS['uicalendar'])) { |
---|
3121 | $so_event = createobject('calendar.socalendar', Array ( |
---|
3122 | 'owner' => 0, |
---|
3123 | 'filter' => '', |
---|
3124 | 'category' => '' |
---|
3125 | )); |
---|
3126 | } else |
---|
3127 | $so_event = $GLOBALS['uicalendar']->bo->so; |
---|
3128 | |
---|
3129 | $cal_id = $so_event->find_cal_id($ical['event'][0]['uid']['value']); |
---|
3130 | |
---|
3131 | //Agendamento nao ecnontrado |
---|
3132 | if (!$cal_id) |
---|
3133 | return 'The event was not found in your calendar'; |
---|
3134 | |
---|
3135 | $event = $so_event->read_entry($cal_id); |
---|
3136 | |
---|
3137 | $datetime_vars = Array ( |
---|
3138 | 'start' => 'dtstart', |
---|
3139 | 'end' => 'dtend', |
---|
3140 | 'modtime' => 'dtstamp', |
---|
3141 | 'modtime' => 'last_modified' |
---|
3142 | ); |
---|
3143 | |
---|
3144 | $date_array = Array ( |
---|
3145 | 'Y' => 'year', |
---|
3146 | 'm' => 'month', |
---|
3147 | 'd' => 'mday', |
---|
3148 | 'H' => 'hour', |
---|
3149 | 'i' => 'min', |
---|
3150 | 's' => 'sec' |
---|
3151 | ); |
---|
3152 | |
---|
3153 | @ reset($datetime_vars); |
---|
3154 | while (list ($e_datevar, $i_datevar) = each($datetime_vars)) { |
---|
3155 | if (isset ($ical['event'][0][$i_datevar])) { |
---|
3156 | $temp_time = $so_event->maketime($ical['event'][0][$i_datevar]); |
---|
3157 | @ reset($date_array); |
---|
3158 | while (list ($key, $var) = each($date_array)) |
---|
3159 | $event[$e_datevar][$var] = (int) (date($key, $temp_time)); |
---|
3160 | |
---|
3161 | $so_event->set_date($e_datevar, $event[$e_datevar]['year'], $event[$e_datevar]['month'], $event[$e_datevar]['mday'], $event[$e_datevar]['hour'], $event[$e_datevar]['min'], $event[$e_datevar]['sec']); |
---|
3162 | } |
---|
3163 | } |
---|
3164 | |
---|
3165 | $so_event->add_entry($event, false); |
---|
3166 | $bo_event = createobject('calendar.bocalendar'); |
---|
3167 | $bo_event->send_update(MSG_MODIFIED, $event['participants'], $event, $event); |
---|
3168 | |
---|
3169 | return 'Event successfully updated'; |
---|
3170 | } |
---|
3171 | |
---|
3172 | function export($params) { |
---|
3173 | $event_id = $params['l_event_id'] ? $params['l_event_id'] : $_GET['cal_id']; |
---|
3174 | $this->chunk_split = $params['chunk_split']; |
---|
3175 | $method = $params['method'] ? $params['method'] : 'publish'; |
---|
3176 | $vtype = $params['vtype'] ? $params['vtype'] : 'event'; |
---|
3177 | |
---|
3178 | $string_array = Array ( |
---|
3179 | 'summary' => 'description', |
---|
3180 | 'location' => 'location', |
---|
3181 | 'description' => 'title', |
---|
3182 | 'uid' => 'uid' |
---|
3183 | ); |
---|
3184 | |
---|
3185 | $cats = CreateObject('phpgwapi.categories'); |
---|
3186 | |
---|
3187 | include (PHPGW_SERVER_ROOT . '/calendar/setup/setup.inc.php'); |
---|
3188 | if (!is_array($event_id)) { |
---|
3189 | $ids[] = $event_id; |
---|
3190 | } else { |
---|
3191 | $ids = $event_id; |
---|
3192 | } |
---|
3193 | |
---|
3194 | $ical = $this->new_ical(); |
---|
3195 | |
---|
3196 | $this->set_var($ical['prodid'], 'value', '-//eGroupWare//eGroupWare ' . $setup_info['calendar']['version'] . ' MIMEDIR//' . strtoupper($GLOBALS['phpgw_info']['user']['preferences']['common']['lang'])); |
---|
3197 | $this->set_var($ical['version'], 'value', '2.0'); |
---|
3198 | $this->set_var($ical['method'], 'value', strtoupper($method)); |
---|
3199 | |
---|
3200 | if (!$GLOBALS['phpgw_info']['flags']['included_classes']['uicalendar']) { |
---|
3201 | if (!$GLOBALS['phpgw_info']['flags']['included_classes']['bocalendar']) { |
---|
3202 | $so_event = createobject('calendar.socalendar', Array ( |
---|
3203 | 'owner' => 0, |
---|
3204 | 'filter' => '', |
---|
3205 | 'category' => '' |
---|
3206 | )); |
---|
3207 | } else { |
---|
3208 | $so_event = $GLOBALS['bocalendar']->so; |
---|
3209 | } |
---|
3210 | } else { |
---|
3211 | $so_event = $GLOBALS['uicalendar']->bo->so; |
---|
3212 | } |
---|
3213 | |
---|
3214 | foreach ($ids as $event) { |
---|
3215 | $ical_event = Array (); |
---|
3216 | if (!is_array($event)) { |
---|
3217 | $event = $so_event->read_entry($event); |
---|
3218 | } |
---|
3219 | if ($event['alarm']) { |
---|
3220 | foreach ($event['alarm'] as $alarm) { |
---|
3221 | $ical_temp = Array (); |
---|
3222 | $ical_temp['action']['value'] = 'DISPLAY'; |
---|
3223 | $ical_temp['description']['value'] = $alarm['text']; |
---|
3224 | $this->set_var($ical_temp['trigger'], 'value', 'VALUE=DATE-TIME:' . date('Ymd\THis\Z', $alarm['time']), 'valarm'); |
---|
3225 | $ical_event['alarm'][] = $ical_temp; |
---|
3226 | } |
---|
3227 | } |
---|
3228 | |
---|
3229 | // use system's date info for caluculating local timezone's offset in minutes |
---|
3230 | // |
---|
3231 | $gmt_offset = date('O', $GLOBALS['phpgw']->datetime->users_localtime); // offset to GMT |
---|
3232 | $offset = (int) (substr($gmt_offset, 0, 3)) * 60 + (int) (substr($gmt_offset, 3, 2)); |
---|
3233 | $event['start']['min'] -= $offset; |
---|
3234 | $event['end']['min'] -= $offset; |
---|
3235 | $event['modtime']['min'] -= $offset; |
---|
3236 | |
---|
3237 | $ical_event['priority'] = $event['priority']; |
---|
3238 | $ical_event['class'] = (int) $event['public']; |
---|
3239 | $dtstart_mktime = $so_event->maketime($event['start']); |
---|
3240 | $this->parse_value($ical_event, 'dtstart', date('Ymd\THis\Z', $dtstart_mktime), 'vevent'); |
---|
3241 | $dtend_mktime = $so_event->maketime($event['end']); |
---|
3242 | $this->parse_value($ical_event, 'dtend', date('Ymd\THis\Z', $dtend_mktime), 'vevent'); |
---|
3243 | $mod_mktime = $so_event->maketime($event['modtime']); |
---|
3244 | $this->parse_value($ical_event, 'last_modified', date('Ymd\THis\Z', $mod_mktime), 'vevent'); |
---|
3245 | foreach ($string_array as $ical_value => $event_value) { |
---|
3246 | if ($event[$event_value]) { |
---|
3247 | $this->set_var($ical_event[$ical_value], 'value', $event[$event_value]); |
---|
3248 | } |
---|
3249 | } |
---|
3250 | |
---|
3251 | if ($event['category']) { |
---|
3252 | $cats->categories(0, 'calendar'); |
---|
3253 | foreach (explode(',', $event['category']) as $cat) { |
---|
3254 | $_cat = $cats->return_single($cat); |
---|
3255 | $cat_string[] = $_cat[0]['name']; |
---|
3256 | } |
---|
3257 | @ reset($cat_string); |
---|
3258 | $this->set_var($ical_event['categories'], 'value', implode($cat_string, ',')); |
---|
3259 | } |
---|
3260 | |
---|
3261 | if (count($event['participants']) > 1) { |
---|
3262 | if (!is_object($db)) { |
---|
3263 | $db = $GLOBALS['phpgw']->db; |
---|
3264 | } |
---|
3265 | foreach ($event['participants'] as $part => $status) { |
---|
3266 | $GLOBALS['phpgw']->accounts->get_account_name($part, $lid, $fname, $lname); |
---|
3267 | $name = $fname . ' ' . $lname; |
---|
3268 | |
---|
3269 | $owner_status = $this->switch_partstat((int) $this->switch_phpgw_status($event['participants'][$part])); |
---|
3270 | |
---|
3271 | $mail_prefs = $GLOBALS['phpgw']->preferences->create_email_preferences($part); |
---|
3272 | $mailto = $mail_prefs['email']['address']; |
---|
3273 | |
---|
3274 | $str = 'CN="' . $name . '";PARTSTAT=' . $owner_status . ':' . $mailto; |
---|
3275 | if ($part == $event['owner']) { |
---|
3276 | $str = 'ROLE=CHAIR;' . $str; |
---|
3277 | } else { |
---|
3278 | $str = 'ROLE=REQ-PARTICIPANT;' . $str; |
---|
3279 | } |
---|
3280 | if ($method != 'reply' || $part == $GLOBALS['phpgw_info']['user']['account_id']) { |
---|
3281 | $this->parse_value($ical_event, 'attendee', $str, 'vevent'); |
---|
3282 | } |
---|
3283 | if ($part == $event['owner']) { |
---|
3284 | $this->parse_value($ical_event, 'organizer', $str, 'vevent'); |
---|
3285 | } |
---|
3286 | } |
---|
3287 | } |
---|
3288 | if ($event['recur_type']) { |
---|
3289 | $str = ''; |
---|
3290 | switch ($event['recur_type']) { |
---|
3291 | case MCAL_RECUR_DAILY : |
---|
3292 | $str .= 'FREQ=DAILY'; |
---|
3293 | break; |
---|
3294 | case MCAL_RECUR_WEEKLY : |
---|
3295 | $str .= 'FREQ=WEEKLY'; |
---|
3296 | if ($event['recur_data']) { |
---|
3297 | $str .= ';BYDAY='; |
---|
3298 | for ($i = 1; $i < MCAL_M_ALLDAYS; $i = $i * 2) { |
---|
3299 | if ($i & $event['recur_data']) { |
---|
3300 | switch ($i) { |
---|
3301 | case MCAL_M_SUNDAY : |
---|
3302 | $day[] = 'SU'; |
---|
3303 | break; |
---|
3304 | case MCAL_M_MONDAY : |
---|
3305 | $day[] = 'MO'; |
---|
3306 | break; |
---|
3307 | CASE MCAL_M_TUESDAY : |
---|
3308 | $day[] = 'TU'; |
---|
3309 | break; |
---|
3310 | case MCAL_M_WEDNESDAY : |
---|
3311 | $day[] = 'WE'; |
---|
3312 | break; |
---|
3313 | case MCAL_M_THURSDAY : |
---|
3314 | $day[] = 'TH'; |
---|
3315 | break; |
---|
3316 | case MCAL_M_FRIDAY : |
---|
3317 | $day[] = 'FR'; |
---|
3318 | break; |
---|
3319 | case MCAL_M_SATURDAY : |
---|
3320 | $day[] = 'SA'; |
---|
3321 | break; |
---|
3322 | } |
---|
3323 | } |
---|
3324 | } |
---|
3325 | $str .= implode(',', $day); |
---|
3326 | } |
---|
3327 | break; |
---|
3328 | case MCAL_RECUR_MONTHLY_MDAY : |
---|
3329 | break; |
---|
3330 | case MCAL_RECUR_MONTHLY_WDAY : |
---|
3331 | break; |
---|
3332 | case MCAL_RECUR_YEARLY : |
---|
3333 | $str .= 'FREQ=YEARLY'; |
---|
3334 | break; |
---|
3335 | } |
---|
3336 | if ($event['recur_interval']) { |
---|
3337 | $str .= ';INTERVAL=' . $event['recur_interval']; |
---|
3338 | } |
---|
3339 | if ($event['recur_enddate']['month'] != 0 && $event['recur_enddate']['mday'] != 0 && $event['recur_enddate']['year'] != 0) { |
---|
3340 | $recur_mktime = $so_event->maketime($event['recur_enddate']) - $GLOBALS['phpgw']->datetime->tz_offset; |
---|
3341 | $str .= ';UNTIL=' . date('Ymd\THis\Z', $recur_mktime); |
---|
3342 | } |
---|
3343 | $this->parse_value($ical_event, 'rrule', $str, 'vevent'); |
---|
3344 | |
---|
3345 | $exceptions = $event['recur_exception']; |
---|
3346 | if (is_array($exceptions)) { |
---|
3347 | foreach ($exceptions as $except_datetime) { |
---|
3348 | $ical_event['exdate'][] = $this->switch_date(date('Ymd\THis\Z', $except_datetime)); |
---|
3349 | } |
---|
3350 | } |
---|
3351 | } |
---|
3352 | $ical_events[] = $ical_event; |
---|
3353 | } |
---|
3354 | |
---|
3355 | $ical[$vtype] = $ical_events; |
---|
3356 | |
---|
3357 | // iCals are by default utf-8 |
---|
3358 | return $GLOBALS['phpgw']->translation->convert($this->build_ical($ical), $GLOBALS['phpgw']->translation->charset(), 'utf-8'); |
---|
3359 | } |
---|
3360 | |
---|
3361 | function freebusy($params = False) { |
---|
3362 | if (!$params) |
---|
3363 | $params = $_GET; |
---|
3364 | $user = is_numeric($params['user']) ? (int) $params['user'] : $GLOBALS['phpgw']->accounts->name2id($params['user']); |
---|
3365 | $start = isset ($params['start']) ? $params['start'] : date('Ymd'); |
---|
3366 | $end = isset ($params['end']) ? $params['end'] : (date('Y') + 1) . date('md'); |
---|
3367 | |
---|
3368 | $this->bo = CreateObject('calendar.bocalendar'); |
---|
3369 | $events_per_day = $this->bo->store_to_cache(array ( |
---|
3370 | 'owner' => $user, |
---|
3371 | 'syear' => (int) substr($start, 0, 4), |
---|
3372 | 'smonth' => (int) substr($start, 4, 2), |
---|
3373 | 'sday' => (int) substr($start, 6, 2), |
---|
3374 | 'eyear' => (int) substr($end, 0, 4), |
---|
3375 | 'emonth' => (int) substr($end, 4, 2), |
---|
3376 | 'eday' => (int) substr($end, 6, 2), |
---|
3377 | 'no_doubles' => True, // report events only on the startday |
---|
3378 | |
---|
3379 | )); |
---|
3380 | if (!is_array($events_per_day)) |
---|
3381 | $events_per_day = array (); |
---|
3382 | $ids = array (); |
---|
3383 | foreach ($events_per_day as $day => $events) { |
---|
3384 | foreach ($events as $event) { |
---|
3385 | $ids[] = $event; |
---|
3386 | } |
---|
3387 | } |
---|
3388 | $browser = CreateObject('phpgwapi.browser'); |
---|
3389 | $browser->content_header($GLOBALS['phpgw']->accounts->id2name($user) . '.ifb', 'text/calendar'); |
---|
3390 | |
---|
3391 | echo $this->export(array ( |
---|
3392 | 'vtype' => 'freebusy', |
---|
3393 | 'l_event_id' => $ids, |
---|
3394 | |
---|
3395 | )); |
---|
3396 | } |
---|
3397 | |
---|
3398 | function debug($str = '') { |
---|
3399 | if ($this->debug_str) { |
---|
3400 | //echo $str."<br>\n"; |
---|
3401 | $log = fopen('/tmp/calendar.log', 'a') or die("nao foi possivel abrir o arquivo /tmp/calendar.log"); |
---|
3402 | fwrite($log, $str . "\n"); |
---|
3403 | fclose($log); |
---|
3404 | } |
---|
3405 | } |
---|
3406 | |
---|
3407 | function updateExParticipantState($cal_uid, $mail, $situation, $cn = false) { |
---|
3408 | $db = $GLOBALS['phpgw']->db; |
---|
3409 | $query = 'SELECT ex_participants FROM phpgw_cal WHERE uid = \'' . trim($cal_uid) . '\''; |
---|
3410 | if (!$db->query($query)) |
---|
3411 | return false; |
---|
3412 | $row = $db->row(true); |
---|
3413 | |
---|
3414 | if (!$row) |
---|
3415 | return false; |
---|
3416 | |
---|
3417 | include_once (dirname(__FILE__) . '/class.ex_participants.inc.php'); |
---|
3418 | $exParticipants = new exParticipants(); |
---|
3419 | $exParticipants->setParticipantsBySerializable($row['ex_participants']); |
---|
3420 | $exParticipants->updateParticipant($mail, $situation, $cn); |
---|
3421 | $query = 'UPDATE phpgw_cal SET ex_participants = \'' . $exParticipants->getParticipantsSerializable() . '\' WHERE uid = \'' . trim($cal_uid) . '\''; |
---|
3422 | if (!$db->query($query)) |
---|
3423 | return false; |
---|
3424 | |
---|
3425 | return true; |
---|
3426 | } |
---|
3427 | } |
---|
3428 | ?> |
---|