source: trunk/calendar/inc/class.boicalendar.inc.php @ 7655

Revision 7655, 89.9 KB checked in by douglasz, 11 years ago (diff)

Ticket #3236 - Melhorias de performance no codigo do Expresso.

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