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