source: branches/2.2/calendar/inc/class.boicalendar.inc.php @ 3736

Revision 3736, 85.6 KB checked in by eduardoalex, 13 years ago (diff)

Ticket #1532 - Adicionada mensagem de erro ao tentar importar o evento 2 vezes

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
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 = preg_replace("/([\xC2\xC3])([\x80-\xBF])/e","chr(ord('\\1')<<6&0xC0|ord('\\2')&0x3F)",$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                                        Header('Location: ' . $GLOBALS['phpgw']->link('/index.php',
3057                                                        Array(
3058                                                                'menuaction'    => 'calendar.uiicalendar.import',
3059                                                                'error_number'  => 1
3060                                                        )
3061                                                )
3062                                        );
3063                                        $GLOBALS['phpwg']->common->phpgw_exit();
3064
3065                                }
3066                                else
3067                                {
3068                                        $so_event->event_init();
3069                                        $so_event->add_attribute('id',0);
3070                                        $so_event->add_attribute('reference',0);
3071                                        if($ical['event'][$i]['uid']['value'])
3072                                        {
3073                                                $so_event->add_attribute('uid',$ical['event'][$i]['uid']['value']);
3074                                        }
3075                                        if($ical['event'][$i]['summary']['value'])
3076                                        {
3077                                                $so_event->set_title($ical['event'][$i]['summary']['value']);
3078                                        }
3079                                        if($ical['event'][$i]['description']['value'])
3080                                        {
3081                                                $so_event->set_description($ical['event'][$i]['description']['value']);
3082                                        }
3083                                        if($ical['event'][$i]['ex_participants']['value'])
3084                                        {
3085                                                $so_event->set_ex_participants($ical['event'][$i]['ex_participants']['value']);
3086                                        }
3087                                        // Compatibilidade com agendamentos vindos do outlook/exchange
3088                                        if ( isset ($ical['event'][$i]['attendee']) )
3089                                        {
3090                                                $c_attendees = count($ical['event'][$i]['attendee']);
3091                                                $all_attendees = '';
3092                                                for ( $a=0; $a < $c_attendees; $a++ )
3093                                                {
3094                                                        $cname = '"'. $ical['event'][$i]['attendee'][$a]['cn'] .'"';
3095                                                        $email = $ical['event'][$i]['attendee'][$a]['mailto']['user'];
3096                                                        if ( $email )
3097                                                        {
3098                                                                // Remove os espaços, tabs e quebra-de-linha no dominio
3099                                                                //$email_domain = preg_replace('/\s*/m', '', $ical['event'][$i]['attendee'][$a]['mailto']['host']);
3100                                                                $email_domain = $ical['event'][$i]['attendee'][$a]['mailto']['host'];
3101                                                                $email = '<'. $email .'@'. $email_domain .'>';
3102                                                        }
3103                                                        else
3104                                                                $email = '';
3105                                                       
3106                                                        $all_attendees .= $cname . $email .', ';
3107                                                }
3108                                                $this->debug ('All attendees: ' . $all_attendees);
3109                                                $so_event->set_ex_participants($all_attendees);
3110                                        }
3111
3112                                        if($ical['event'][$i]['location']['value'])
3113                                        {
3114                                                $so_event->add_attribute('location',$ical['event'][$i]['location']['value']);
3115                                        }
3116                                        if(isset($ical['event'][$i]['priority']))
3117                                        {
3118                                                $so_event->add_attribute('priority',$ical['event'][$i]['priority']);
3119                                        }
3120                                        else
3121                                        {
3122                                                $so_event->add_attribute('priority',2);
3123                                        }
3124                                        if(!isset($ical['event'][$i]['class']))
3125                                        {
3126                                                $ical['event'][$i]['class'] = 1;
3127                                        }
3128                                        $so_event->set_class($ical['event'][$i]['class']);
3129
3130                                        @reset($datetime_vars);
3131                                        while(list($e_datevar,$i_datevar) = each($datetime_vars))
3132                                        {
3133                                                if(isset($ical['event'][$i][$i_datevar]))
3134                                                {
3135                                                        $temp_time = $so_event->maketime($ical['event'][$i][$i_datevar]) + $GLOBALS['phpgw']->datetime->tz_offset;
3136                                                       
3137                                                        //verifica se o vcard importado tem a referência do timezone
3138                                                        if($ical['event'][$i][$i_datevar]['tzid']) {
3139                                                                $dateTimeZone = new DateTimeZone( $ical['event'][$i][$i_datevar]['tzid'] );
3140                                                                $dateTime = new DateTime("now", $dateTimeZone);
3141                                                                $timeOffset = $dateTimeZone->getOffset($dateTime);     
3142                                                               
3143                                                                //tira o time zone do vcard para só ficar o time zone do sistema
3144                                                                $temp_time = $temp_time - $timeOffset;
3145                                                        }
3146                                                       
3147                                                        @reset($date_array);
3148                                                        while(list($key,$var) = each($date_array))
3149                                                        {
3150                                                                $event[$e_datevar][$var] = (int)(date($key,$temp_time));
3151                                                        }
3152                                                        $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']);
3153                                                }
3154                                        }
3155                                        if(!isset($ical['event'][$i]['categories']['value']) || !$ical['event'][$i]['categories']['value'])
3156                                        {
3157                                                $so_event->set_category(0);
3158                                        }
3159                                        else
3160                                        {
3161                                                $ical_cats = Array();
3162                                                if(strpos($ical['event'][$i]['categories']['value'],$cat_sep))
3163                                                {
3164                                                        $ical_cats = explode($cat_sep,$ical['event'][$i]['categories']['value']);
3165                                                }
3166                                                else
3167                                                {
3168                                                        $ical_cats[] = $ical['event'][$i]['categories']['value'];
3169                                                }
3170
3171                                                @reset($ical_cats);
3172                                                $cat_id_nums = Array();
3173                                                while(list($key,$cat) = each($ical_cats))
3174                                                {
3175                                                        if(!$cats->exists('appandmains',$cat))
3176                                                        {
3177                                                                $cats->add(
3178                                                                        Array(
3179                                                                                'name'  => $cat,
3180                                                                                'descr' => $cat,
3181                                                                                'parent'        => '',
3182                                                                                'access'        => 'private',
3183                                                                                'data'  => ''
3184                                                                        )
3185                                                                );
3186                                                        }
3187//                                                      $temp_id = $cats->name2id($cat);
3188//                                                      echo 'Category Name : '.$cat.' : Category ID :'.$temp_id."<br>\n";
3189//                                                      $cat_id_nums[] = $temp_id;
3190                                                        $cat_id_nums[] = $cats->name2id($cat);
3191                                                }
3192                                                @reset($cat_id_nums);
3193                                                if(count($cat_id_nums) > 1)
3194                                                {
3195                                                        $so_event->set_category(implode($cat_id_nums,','));
3196                                                }
3197                                                else
3198                                                {
3199                                                        $so_event->set_category($cat_id_nums[0]);
3200                                                }
3201                                        }
3202
3203//rrule
3204                                        if(isset($ical['event'][$i]['rrule'])  OR isset($ical['event'][$i]['duration']) )
3205                                        {
3206// recur_enddate
3207                                                if(isset($ical['event'][$i]['rrule']['until']))
3208                                                {
3209                                                        $recur_enddate['year']  = (int)($ical['event'][$i]['rrule']['until']['year']);
3210                                                        $recur_enddate['month'] = (int)($ical['event'][$i]['rrule']['until']['month']);
3211                                                        $recur_enddate['mday']  = (int)($ical['event'][$i]['rrule']['until']['mday']);
3212                                                }
3213                                                elseif( isset($ical['event'][$i]['duration']) )
3214                                                {
3215                                                        // Create timecode for strtotime
3216                                                        $ptimer = mktime($ical['event'][$i]['dtstart']['hour'],
3217                                                        $ical['event'][$i]['dtstart']['min'],
3218                                                        $ical['event'][$i]['dtstart']['sec'],
3219                                                        $ical['event'][$i]['dtstart']['month'],
3220                                                        $ical['event'][$i]['dtstart']['mday'],
3221                                                        $ical['event'][$i]['dtstart']['year']
3222                                                );
3223
3224                                                /*  -- Fixbug --
3225                                                * if "DURATION" has 1 day (for example).
3226                                                * Event takes places between the first date
3227                                                * (this define in "start" tag) and next day  :(
3228                                                        * This "fix" destroy one day and set hours as "23" and minutes as "59"
3229                                                        */
3230
3231                                                        // Weeks::Day--
3232                                                        if( $ical['event'][$i]['duration']['weeks']
3233                                                        AND
3234                                                        ( $ical['event'][$i]['duration']['hours'] == 0 )
3235                                                        AND
3236                                                        ( $ical['event'][$i]['duration']['minutes'] == 0 )
3237                                                )
3238                                                {
3239                                                        $ical['event'][$i]['duration']['days'] = (
3240                                                                $ical['event'][$i]['duration']['days'] +
3241                                                                ($ical['event'][$i]['duration']['weeks']*7))-1;
3242                                                                unset($ical['event'][$i]['duration']['weeks']);
3243                                                                $ical['event'][$i]['duration']['hours'] = "23";
3244                                                                $ical['event'][$i]['duration']['minutes'] = "59";
3245                                                                $ical['event'][$i]['duration']['seconds'] = "59";
3246                                                        }
3247                                                        // Days::Day--
3248                                                        if(
3249                                                                $ical['event'][$i]['duration']['days']
3250                                                                AND
3251                                                                ( $ical['event'][$i]['duration']['hours'] == 0 )
3252                                                                AND
3253                                                                ( $ical['event'][$i]['duration']['minutes'] == 0 )
3254                                                        )
3255                                                        {
3256                                                                $ical['event'][$i]['duration']['days']--;
3257                                                                $ical['event'][$i]['duration']['hours'] = "23";
3258                                                                $ical['event'][$i]['duration']['minutes'] = "59";
3259                                                                $ical['event'][$i]['duration']['seconds'] = "59";
3260                                                        }
3261
3262                                                        // Create string contains datetime for strtotime
3263                                                        $pdate = "+";
3264                                                        if( isset($ical['event'][$i]['duration']['weeks']) )
3265                                                        $pdate .= $ical['event'][$i]['duration']['weeks'] . " weeks ";
3266                                                        if( isset($ical['event'][$i]['duration']['days']) )
3267                                                        $pdate .= $ical['event'][$i]['duration']['days'] . " days ";
3268                                                        if( isset($ical['event'][$i]['duration']['hours']) )
3269                                                        $pdate .= $ical['event'][$i]['duration']['hours'] . " hours ";
3270                                                        if( isset($ical['event'][$i]['duration']['minutes']) )
3271                                                        $pdate .= $ical['event'][$i]['duration']['minutes'] . " minutes ";
3272                                                        if( isset($ical['event'][$i]['duration']['seconds']) )
3273                                                        $pdate .= $ical['event'][$i]['duration']['seconds'] . " seconds ";
3274
3275                                                        // What is datetime in 2192 ?
3276                                                        $enddate = strtotime($pdate, $ptimer);
3277                                                        list(   $recur_enddate['year'],
3278                                                        $recur_enddate['month'],
3279                                                        $recur_enddate['mday'],
3280                                                        $recur_enddate['hour'],
3281                                                        $recur_enddate['min'],
3282                                                        $recur_enddate['sec'] ) = split(":", date("Y:m:d:H:i:s", $enddate));
3283
3284                                                        // Set End of event
3285                                                        $so_event->set_end(     $recur_enddate['year'],
3286                                                        $recur_enddate['month'],
3287                                                        $recur_enddate['mday'],
3288                                                        $recur_enddate['hour'],
3289                                                        $recur_enddate['min'],
3290                                                        $recur_enddate['sec']);
3291
3292                                                }
3293                                                else
3294                                                {
3295                                                        $recur_enddate['year'] = 0;
3296                                                        $recur_enddate['month'] = 0;
3297                                                        $recur_enddate['mday'] = 0;
3298                                                }
3299
3300// recur_data
3301                                                $recur_data = 0;
3302                                                if(isset($ical['event'][$i]['rrule']['byday']))
3303                                                {
3304                                                        $week_days = Array(
3305                                                                MCAL_M_SUNDAY   => 'SU',
3306                                                                MCAL_M_MONDAY   => 'MO',
3307                                                                MCAL_M_TUESDAY  => 'TU',
3308                                                                MCAL_M_WEDNESDAY        => 'WE',
3309                                                                MCAL_M_THURSDAY => 'TH',
3310                                                                MCAL_M_FRIDAY   => 'FR',
3311                                                                MCAL_M_SATURDAY => 'SA'
3312                                                        );
3313                                                        @reset($week_days);
3314                                                        while(list($key,$val) = each($week_days))
3315                                                        {
3316                                                                if(strpos(' '.$ical['event'][$i]['rrule']['byday'],$val))
3317                                                                {
3318                                                                        $recur_data += $key;
3319                                                                }
3320                                                        }
3321                                                }
3322
3323// interval
3324                                                if(!isset($ical['event'][$i]['rrule']['interval']))
3325                                                {
3326                                                        $interval = 1;
3327                                                }
3328                                                else
3329                                                {
3330                                                        $interval = (int)$ical['event'][$i]['rrule']['interval'];
3331                                                }
3332// recur_type
3333                                                switch($ical['event'][$i]['rrule']['freq'])
3334                                                {
3335                                                        case DAILY:
3336                                                                $recur_type = MCAL_RECUR_DAILY;
3337                                                                break;
3338                                                        case WEEKLY:
3339                                                                $so_event->set_recur_weekly($recur_enddate['year'],$recur_enddate['month'],$recur_enddate['mday'],$interval,$recur_data);
3340                                                                break;
3341                                                        case MONTHLY:
3342// Still need to determine if this is by day or by week for the month..
3343//                                                              $recur_type = MCAL_RECUR_M??????;
3344                                                                break;
3345                                                        case YEARLY:
3346                                                                $so_event->set_recur_yearly($recur_enddate['year'],$recur_enddate['month'],$recur_enddate['mday'],$interval);
3347                                                                break;
3348                                                }
3349                                        }
3350                                        else
3351                                        {
3352                                                $so_event->set_recur_none();
3353                                        }
3354
3355// Owner
3356                                        if(!isset($ical['event'][$i]['organizer']) || (isset($ical['event'][$i]['organizer']) && $this->is_owner($ical['event'][$i]['organizer'])))
3357                                        {
3358                                                $so_event->add_attribute('owner',$GLOBALS['phpgw_info']['user']['account_id']);
3359                                                $so_event->add_attribute('participants','A',(int)$GLOBALS['phpgw_info']['user']['account_id']);
3360                                        }
3361                                        else
3362                                        {
3363                                                $so_event->add_attribute('participants','A',(int)$GLOBALS['phpgw_info']['user']['account_id']);
3364                                        }
3365
3366                                        $event = $so_event->get_cached_event();
3367                                        $so_event->add_entry($event);
3368//                                      $event = $so_event->get_cached_event();
3369                                }
3370                        }
3371                        if(!$from_ajax) {
3372                                Header('Location: '.$GLOBALS['phpgw']->link('/index.php',
3373                                        Array(
3374                                                'menuaction'    => 'calendar.uicalendar.view',
3375                                                'cal_id'        => $event['id']
3376                                                )
3377                                        )
3378                                );
3379                                $GLOBALS['phpgw']->common->phpgw_exit();
3380                        }
3381                        else
3382                                return true;
3383                }
3384
3385                function export($params)
3386                {
3387                        $event_id = $params['l_event_id'] ? $params['l_event_id'] : $_GET['cal_id'];
3388                        $this->chunk_split = $params['chunk_split'];
3389                        $method = $params['method'] ? $params['method'] : 'publish';
3390                        $vtype = $params['vtype'] ? $params['vtype'] : 'event';
3391
3392                        $string_array = Array(
3393                                'summary'               => 'description',
3394                                'location'              => 'location',
3395                                'description'   => 'title',
3396                                'uid'           => 'uid'
3397                        );
3398
3399                        $cats = CreateObject('phpgwapi.categories');
3400
3401                        include(PHPGW_SERVER_ROOT.'/calendar/setup/setup.inc.php');
3402                        if(!is_array($event_id))
3403                        {
3404                                $ids[] = $event_id;
3405                        }
3406                        else
3407                        {
3408                                $ids = $event_id;
3409                        }
3410
3411                        $ical = $this->new_ical();
3412
3413                        $this->set_var($ical['prodid'],'value','-//eGroupWare//eGroupWare '.$setup_info['calendar']['version'].' MIMEDIR//'.strtoupper($GLOBALS['phpgw_info']['user']['preferences']['common']['lang']));
3414                        $this->set_var($ical['version'],'value','2.0');
3415                        $this->set_var($ical['method'],'value',strtoupper($method));
3416
3417                        if(!$GLOBALS['phpgw_info']['flags']['included_classes']['uicalendar'])
3418                        {
3419                                if(!$GLOBALS['phpgw_info']['flags']['included_classes']['bocalendar'])
3420                                {
3421                                        $so_event = createobject('calendar.socalendar',
3422                                                Array(
3423                                                        'owner' => 0,
3424                                                        'filter'        => '',
3425                                                        'category'      => ''
3426                                                )
3427                                        );
3428                                }
3429                                else
3430                                {
3431                                        $so_event = $GLOBALS['bocalendar']->so;
3432                                }
3433                        }
3434                        else
3435                        {
3436                                $so_event = $GLOBALS['uicalendar']->bo->so;
3437                        }
3438
3439                        foreach($ids as $event)
3440                        {
3441                                $ical_event = Array();
3442                                if (!is_array($event))
3443                                {
3444                                        $event = $so_event->read_entry($event);
3445                                }
3446                                if($event['alarm'])
3447                                {
3448                                        foreach($event['alarm'] as $alarm)
3449                                        {
3450                                                $ical_temp = Array();
3451                                                $ical_temp['action']['value'] = 'DISPLAY';
3452                                                $ical_temp['description']['value'] = $alarm['text'];
3453                                                $this->set_var($ical_temp['trigger'],'value','VALUE=DATE-TIME:'.date('Ymd\THis\Z',$alarm['time']),'valarm');
3454                                                $ical_event['alarm'][] = $ical_temp;
3455                                        }
3456                                }
3457
3458                                // use system's date info for caluculating local timezone's offset in minutes
3459                                //
3460                                $gmt_offset = date('O',$GLOBALS['phpgw']->datetime->users_localtime);  // offset to GMT
3461                                $offset = (int)(substr($gmt_offset, 0, 3)) * 60 + (int)(substr($gmt_offset, 3, 2));
3462                                $event['start']['min']   -= $offset;
3463                                $event['end']['min']     -= $offset;
3464                                $event['modtime']['min'] -= $offset;
3465
3466                                $ical_event['priority'] = $event['priority'];
3467                                $ical_event['class'] = (int)$event['public'];
3468                                $dtstart_mktime = $so_event->maketime($event['start']);
3469                                $this->parse_value($ical_event,'dtstart',date('Ymd\THis\Z',$dtstart_mktime),'vevent');
3470                                $dtend_mktime = $so_event->maketime($event['end']);
3471                                $this->parse_value($ical_event,'dtend',date('Ymd\THis\Z',$dtend_mktime),'vevent');
3472                                $mod_mktime = $so_event->maketime($event['modtime']);
3473                                $this->parse_value($ical_event,'last_modified',date('Ymd\THis\Z',$mod_mktime),'vevent');
3474                                foreach($string_array as $ical_value => $event_value)
3475                                {
3476                                        if($event[$event_value])
3477                                        {
3478                                                $this->set_var($ical_event[$ical_value],'value',$event[$event_value]);
3479                                        }
3480                                }
3481
3482                                if ($event['category'])
3483                                {
3484                                        $cats->categories(0,'calendar');
3485                                        foreach(explode(',',$event['category']) as $cat)
3486                                        {
3487                                                $_cat = $cats->return_single($cat);
3488                                                $cat_string[] = $_cat[0]['name'];
3489                                        }
3490                                        @reset($cat_string);
3491                                        $this->set_var($ical_event['categories'],'value',implode($cat_string,','));
3492                                }
3493
3494                                if(count($event['participants']) > 1)
3495                                {
3496                                        if(!is_object($db))
3497                                        {
3498                                                $db = $GLOBALS['phpgw']->db;
3499                                        }
3500                                        foreach($event['participants'] as $part => $status)
3501                                        {
3502                                                $GLOBALS['phpgw']->accounts->get_account_name($part,$lid,$fname,$lname);
3503                                                $name = $fname.' '.$lname;
3504
3505                                                $owner_status = $this->switch_partstat((int)$this->switch_phpgw_status($event['participants'][$part]));
3506
3507                                                $mail_prefs = $GLOBALS['phpgw']->preferences->create_email_preferences($part);
3508                                                $mailto = $mail_prefs['email']['address'];
3509
3510                                                $str = 'CN="'.$name.'";PARTSTAT='.$owner_status.':'.$mailto;
3511                                                if($part == $event['owner'])
3512                                                {
3513                                                        $str = 'ROLE=CHAIR;'.$str;
3514                                                }
3515                                                else
3516                                                {
3517                                                        $str = 'ROLE=REQ-PARTICIPANT;'.$str;
3518                                                }
3519                                                if ($method != 'reply' || $part == $GLOBALS['phpgw_info']['user']['account_id'])
3520                                                {
3521                                                        $this->parse_value($ical_event,'attendee',$str,'vevent');
3522                                                }
3523                                                if($part == $event['owner'])
3524                                                {
3525                                                        $this->parse_value($ical_event,'organizer',$str,'vevent');
3526                                                }
3527                                        }
3528                                }
3529                                if($event['recur_type'])
3530                                {
3531                                        $str = '';
3532                                        switch($event['recur_type'])
3533                                        {
3534                                                case MCAL_RECUR_DAILY:
3535                                                        $str .= 'FREQ=DAILY';
3536                                                        break;
3537                                                case MCAL_RECUR_WEEKLY:
3538                                                        $str .= 'FREQ=WEEKLY';
3539                                                        if($event['recur_data'])
3540                                                        {
3541                                                                $str .= ';BYDAY=';
3542                                                                for($i=1;$i<MCAL_M_ALLDAYS;$i=$i*2)
3543                                                                {
3544                                                                        if($i & $event['recur_data'])
3545                                                                        {
3546                                                                                switch($i)
3547                                                                                {
3548                                                                                        case MCAL_M_SUNDAY:
3549                                                                                                $day[] = 'SU';
3550                                                                                                break;
3551                                                                                        case MCAL_M_MONDAY:
3552                                                                                                $day[] = 'MO';
3553                                                                                                break;
3554                                                                                        CASE MCAL_M_TUESDAY:
3555                                                                                                $day[] = 'TU';
3556                                                                                                break;
3557                                                                                        case MCAL_M_WEDNESDAY:
3558                                                                                                $day[] = 'WE';
3559                                                                                                break;
3560                                                                                        case MCAL_M_THURSDAY:
3561                                                                                                $day[] = 'TH';
3562                                                                                                break;
3563                                                                                        case MCAL_M_FRIDAY:
3564                                                                                                $day[] = 'FR';
3565                                                                                                break;
3566                                                                                        case MCAL_M_SATURDAY:
3567                                                                                                $day[] = 'SA';
3568                                                                                                break;
3569                                                                                }
3570                                                                        }
3571                                                                }
3572                                                                $str .= implode(',',$day);
3573                                                        }
3574                                                        break;
3575                                                case MCAL_RECUR_MONTHLY_MDAY:
3576                                                        break;
3577                                                case MCAL_RECUR_MONTHLY_WDAY:
3578                                                        break;
3579                                                case MCAL_RECUR_YEARLY:
3580                                                        $str .= 'FREQ=YEARLY';
3581                                                        break;
3582                                        }
3583                                        if($event['recur_interval'])
3584                                        {
3585                                                $str .= ';INTERVAL='.$event['recur_interval'];
3586                                        }
3587                                        if($event['recur_enddate']['month'] != 0 && $event['recur_enddate']['mday'] != 0 && $event['recur_enddate']['year'] != 0)
3588                                        {
3589                                                $recur_mktime = $so_event->maketime($event['recur_enddate']) - $GLOBALS['phpgw']->datetime->tz_offset;
3590                                                $str .= ';UNTIL='.date('Ymd\THis\Z',$recur_mktime);
3591                                        }
3592                                        $this->parse_value($ical_event,'rrule',$str,'vevent');
3593
3594                                        $exceptions = $event['recur_exception'];
3595                                        if(is_array($exceptions))
3596                                        {
3597                                                foreach($exceptions as $except_datetime)
3598                                                {
3599                                                        $ical_event['exdate'][] = $this->switch_date(date('Ymd\THis\Z',$except_datetime));
3600                                                }
3601                                        }
3602                                }
3603                                $ical_events[] = $ical_event;
3604                        }
3605
3606                        $ical[$vtype] = $ical_events;
3607
3608                        // iCals are by default utf-8
3609                        return $GLOBALS['phpgw']->translation->convert($this->build_ical($ical),$GLOBALS['phpgw']->translation->charset(),'utf-8');
3610                }
3611
3612                function freebusy($params=False)
3613                {
3614                        if (!$params) $params = $_GET;
3615                        $user  = is_numeric($params['user']) ? (int) $params['user'] : $GLOBALS['phpgw']->accounts->name2id($params['user']);
3616                        $start = isset($params['start']) ? $params['start'] : date('Ymd');
3617                        $end   = isset($params['end']) ? $params['end'] : (date('Y')+1).date('md');
3618
3619                        $this->bo = CreateObject('calendar.bocalendar');
3620                        $events_per_day = $this->bo->store_to_cache(array(
3621                                'owner'  => $user,
3622                                'syear'  => (int) substr($start,0,4),
3623                                'smonth' => (int) substr($start,4,2),
3624                                'sday'   => (int) substr($start,6,2),
3625                                'eyear'  => (int) substr($end,0,4),
3626                                'emonth' => (int) substr($end,4,2),
3627                                'eday'   => (int) substr($end,6,2),
3628                                'no_doubles' => True,   // report events only on the startday
3629                        ));
3630                        if (!is_array($events_per_day)) $events_per_day = array();
3631                        $ids = array();
3632                        foreach($events_per_day as $day => $events)
3633                        {
3634                                foreach($events as $event)
3635                                {
3636                                        $ids[] = $event;
3637                                }
3638                        }
3639                        $browser = CreateObject('phpgwapi.browser');
3640                        $browser->content_header($GLOBALS['phpgw']->accounts->id2name($user).'.ifb','text/calendar');
3641
3642                        echo $this->export(array(
3643                                'vtype'      => 'freebusy',
3644                                'l_event_id' => $ids,
3645                        ));
3646                }
3647
3648                function debug($str='')
3649                {
3650                        if($this->debug_str)
3651                        {
3652                                //echo $str."<br>\n";
3653                                $log = fopen('/tmp/calendar.log', 'a') or die("nao foi possivel abrir o arquivo /tmp/calendar.log");
3654                                fwrite($log, $str . "\n");
3655                                fclose($log);
3656                        }
3657                }
3658        }
3659?>
Note: See TracBrowser for help on using the repository browser.