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

Revision 7673, 90.6 KB checked in by douglasz, 11 years ago (diff)

Ticket #3236 - Correcoes para Performance: Function Within Loop Declaration.

  • 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        $return_value_count = count($return_value);
1437                for ($i = 0; $i < $return_value_count; ++$i) {
1438                                $name = strtolower($return_value[$i]['param']);
1439                                $value = $this->strip_quotes($return_value[$i]['value']);
1440                        if (substr($name, 0, 2) == 'x-') {
1441                                        $param = 'x_type';
1442                                $name = str_replace('-', '_', $return_value[$i]['param']);
1443                        } else {
1444                                $param = str_replace('-', '_', strtolower($name));
1445                                if (!isset ($this->parameter[$param]) || $majortype == 'tzid') {
1446                                        if ($majortype == 'attendee' || $majortype == 'organizer') {
1447                                                        $param = 'mailto';
1448                                                        $name = $param;
1449                                        } else {
1450                                                        $param = 'value';
1451                                                }
1452                                        }
1453                                }
1454                                //$this->debug('name : '.$name.' : Param = '.$param);
1455                        if (@ $this->parameter[$param]['properties'][$majortype]) {
1456                                switch (@ $this->parameter[$param]['type']) {
1457                                        case 'dir' :
1458                                                $this->set_var($event, $name, $this->from_dir($value));
1459                                                        break;
1460                                        case 'text' :
1461                                                $this->set_var($event, $name, $value);
1462                                                        break;
1463                                        case 'x_type' :
1464                                                $this->parse_xtype($event, $name, $value);
1465                                                        break;
1466                                        case 'function' :
1467                                                        $function = $this->parameter[$param]['function'];
1468                                                $this->set_var($event, $name, $this-> $function ($value));
1469                                                        break;
1470                                        case 'uri' :
1471                                                if (@ $this->parameter[$param]['to_text']) {
1472                                                                $value = $this->to_text($value);
1473                                                        }
1474                                                $this->set_var($event, $name, $value);
1475                                                        break;
1476                                        case 'integer' :
1477                                                $this->set_var($event, $name, (int) $value);
1478                                                        break;
1479                                        case 'value' :
1480                                                if (@ $this->property[$majortype]['type'] == 'date-time') {
1481                                                        $this->set_var($event, $param, $this->switch_date($name));
1482                                                        }
1483                                                elseif ($value <> "\\n" && $value) {
1484                                                        $this->set_var($event[$majortype], $param, $value);
1485                                                        }
1486                                                $this->debug('Event : ' . _debug_array($event, False));
1487                                                        break;
1488                                        }
1489                                }
1490                        }
1491                }
1492
1493        function parse_value(& $event, $majortype, $value, $mode) {
1494                $var = Array ();
1495                        //$this->debug('Mode : '.$mode.' Majortype : '.$majortype);
1496                $this->parse_parameters($var, $majortype, $value);
1497                if ($this->property[$majortype][$mode]['multiples']) {
1498                                //$this->debug('parse_value var array: '._debug_array($var,False));
1499                                $event[$majortype][] = $var;
1500                } else {
1501                                //$this->debug('Majortype : '.$majortype);
1502                                //$this->debug('Property : '.$this->property[$majortype]['type']);
1503                        if ($this->property[$majortype]['type'] == 'date-time') {
1504                                        //$this->debug('Got a DATE-TIME type!');
1505                                        $t_var = $var[$majortype];
1506                                unset ($var[$majortype]);
1507                                if ($t_var) {
1508                                                reset($t_var);
1509                                        while (list ($key, $val) = each($t_var)) {
1510                                                        $var[$key] = $val;
1511                                                }
1512                                                //$this->debug($majortype.' : '._debug_array($var,False));
1513                                        }
1514                                }
1515                        $this->set_var($event, $majortype, $var);
1516                        }
1517                }
1518
1519                /*
1520                 * Build-Card Functions
1521                 */
1522
1523        function build_xtype($x_type, $seperator = '=') {
1524                        $quote = '';
1525                if ($seperator == '=') {
1526                                $quote = '"';
1527                        }
1528
1529                $return_value = $this->fold('X-' . $x_type['name'] . $seperator . $quote . $x_type['value'] . $quote);
1530                if ($seperator == '=') {
1531                        return str_replace("\r\n", '', $return_value);
1532                } else {
1533                                return $return_value;
1534                        }
1535                }
1536
1537        function build_parameters($event, $property) {
1538                        $str = '';
1539                        $include_mailto = False;
1540                        $include_datetime = False;
1541                        $param = $this->find_parameters($property);
1542
1543                if ($property == 'exdate') {
1544                        while (list ($key, $value) = each($event)) {
1545                                        $exdates[] = $this->switch_date($value);
1546                                }
1547                        return ':' . implode($exdates, ',');
1548                } else {
1549                        while (list ($dumb_key, $key) = each($param)) {
1550                                if ($key == 'value') {
1551                                                continue;
1552                                        }
1553                                if ($key == 'mailto') {
1554                                                $include_mailto = True;
1555                                                continue;
1556                                        }
1557                                $param_array = @ $this->parameter[$key];
1558                                $type = @ $this->parameter[$key]['type'];
1559                                if ($type == 'date-time') {
1560                                                $include_datetime = True;
1561                                                continue;
1562                                        }
1563                                $quote = (@ $this->parameter[$key]['quoted'] ? '"' : '');
1564                                if (isset ($event[$key]) && @ $this->parameter[$key]['properties'][$property]) {
1565                                        $change_text = @ $this->parameter[$key]['to_text'];
1566                                                $value = $event[$key];
1567                                        if ($change_text && $type == 'text') {
1568                                                        $value = $this->to_text($value);
1569                                                }
1570                                        switch ($type) {
1571                                                case 'dir' :
1572                                                        $str .= ';' . str_replace('_', '-', strtoupper($key)) . '=' . $quote . $this->to_dir($value) . $quote;
1573                                                                break;
1574                                                case 'function' :
1575                                                        $str .= ';' . str_replace('_', '-', strtoupper($key)) . '=';
1576                                                                $function = $this->parameter[$key]['function'];
1577                                                        $this->debug($key . ' Function Param : ' . $value);
1578                                                        $str .= $quote . $this-> $function ($value) . $quote;
1579                                                                break;
1580                                                case 'text' :
1581                                                case 'string' :
1582                                                        $str .= ';' . strtoupper($key) . '=' . $quote . $value . $quote;
1583                                                                break;
1584                                                case 'date-time' :
1585                                                        $str .= ($key == 'until' ? ':' : ';UNTIL=') . date('Ymd\THis', mktime($event['hour'], $event['min'], $event['sec'], $event['month'], $event['mday'], $event['year'])) . (!@ isset ($event['tzid']) ? 'Z' : '');
1586                                                                break;
1587                                                }
1588                                        unset ($value);
1589                                        }
1590                                }
1591
1592                        if (!empty ($event['x_type'])) {
1593                                        $c_x_type = count($event['x_type']);
1594                                for ($j = 0; $j < $c_x_type; ++$j) {
1595                                        $str .= ';' . $this->build_xtype($event['x_type'][$j], '=');
1596                                        }
1597                                }
1598                        if (!empty ($event['value'])) {
1599                                if ($property == 'trigger') {
1600                                                $seperator = ';';
1601                                } else {
1602                                                $seperator = ':';
1603                                        }
1604                                $str .= $seperator . ($this->parameter['value']['to_text'] ? $this->to_text($event['value']) : $event['value']);
1605                                }
1606                        if ($include_mailto == True) {
1607                                        $key = 'mailto';
1608                                        $function = $this->parameter[$key]['function'];
1609                                $ret_value = $this-> $function ($event[$key]);
1610                                $str .= ($ret_value ? ':' . $ret_value : '');
1611                                }
1612                        if ($include_datetime == True || @ $this->property[$property]['type'] == 'date-time') {
1613                                $str .= ':' . date('Ymd\THis', mktime($event['hour'], $event['min'], $event['sec'], $event['month'], $event['mday'], $event['year'])) . (!@ isset ($event['tzid']) ? 'Z' : '');
1614                                }
1615                        return ($property == 'rrule' ? ':' . substr($str, 1) : $str);
1616                        }
1617                }
1618
1619        function build_text($event, $property) {
1620                        $str = '';
1621                        $param = $this->find_parameters($property);
1622                while (list ($dumb_key, $key) = each($param)) {
1623                        if (!empty ($event[$key]) && $key != 'value') {
1624                                $type = @ $this->parameter[$key]['type'];
1625                                $quote = @ $this->parameter[$key]['quote'];
1626                                if (@ $this->parameter[$key]['to_text'] == True) {
1627                                                $value = $this->to_text($event[$key]);
1628                                } else {
1629                                                $value = $event[$key];
1630                                        }
1631                                switch ($type) {
1632                                        case 'text' :
1633                                                $str .= ';' . strtoupper($key) . '=' . $quote . $value . $quote;
1634                                                break;
1635                                        }
1636                                }
1637                        }
1638                if (!empty ($event['x_type'])) {
1639                                $c_x_type = count($event['x_type']);
1640                        for ($j = 0; $j < $c_x_type; ++$j) {
1641                                $str .= ';' . $this->build_xtype($event['x_type'][$j], '=');
1642                                }
1643                        }
1644                if (!empty ($event['value'])) {
1645                        $str .= ':' . ($this->parameter['value']['to_text'] ? $this->to_text($event['value']) : $event['value']);
1646                        }
1647                        return $str;
1648                }
1649
1650        function build_card_internals($ical_item, $event) {
1651                        $prop = $this->find_properties($ical_item);
1652                        reset($prop);
1653                while (list ($dumb_key, $key) = each($prop)) {
1654                                $value  = $key;
1655                                $varray = $this->property[$key];
1656                                $type   = $varray['type'];
1657                                $to_text = $varray['to_text'];
1658                        $state = @ $varray[$ical_item]['state'];
1659                        $multiples = @ $varray[$ical_item]['multiples'];
1660                        switch ($type) {
1661                                case 'date-time' :
1662                                        if (!empty ($event[$value])) {
1663                                                if ($multiples && $value != 'exdate') {
1664                            $event_value_count = count($event[$value]);
1665                                                        for ($i = 0; $i < $event_value_count; ++$i) {
1666                                                                $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $value));
1667                                                                }
1668                                                } else {
1669                                                        $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value], $value));
1670                                                        }
1671                                                }
1672                                        elseif ($value == 'dtstamp' || $value == 'created') {
1673                                                $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . gmdate('Ymd\THis\Z'));
1674                                                }
1675                                                break;
1676                                case 'uri' :
1677                                        if (!empty ($event[$value])) {
1678                        $event_value_count = count($event[$value]);
1679                                                for ($i = 0; $i < $event_value_count; ++$i) {
1680                                                        $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $to_text));
1681                                                        }
1682                                                }
1683                                                break;
1684                                case 'recur' :
1685                                        if (!empty ($event[$value])) {
1686                                                if ($multiples) {
1687                            $event_value_count = count($event[$value]);
1688                                                        for ($i = 0; $i < $event_value_count; ++$i) {
1689                                                                $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $value));
1690                                                        }
1691                                                } else {
1692                                                        $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value], $value));
1693                                                        }
1694                                                }
1695                                                break;
1696                                case 'integer' :
1697                                        if (!empty ($event[$value])) {
1698                                                $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $event[$value]);
1699                                                }
1700                                        elseif ($value == 'sequence' || $value == 'percent_complete') {
1701                                                $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':0');
1702                                                }
1703                                                break;
1704                                case 'function' :
1705                                        $str .= ';' . str_replace('_', '-', strtoupper($value)) . '=';
1706                                        $function = @ $this->parameter[$key]['function'];
1707                                        $str .= (@ $this->parameter[$key]['quoted'] ? '"' : '') . $this-> $function ($event[$key]) . (@ $this->parameter[$key]['quoted'] ? '"' : '');
1708                                                break;
1709                                case 'float' :
1710                                        if (!empty ($event[$value])) {
1711                                                $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $event[$value]['lat'] . ';' . $event[$value]['lon']);
1712                                                }
1713                                                break;
1714                                case 'text' :
1715                                        if (isset ($event[$value])) {
1716                                                if (@ $this->parameter[$key]['type'] != 'function') {
1717                                                        if ($multiples && count($event[$value]) > 1) {
1718                                $event_value_count = count($event[$value]);
1719                                                                for ($i = 0; $i < $event_value_count; ++$i) {
1720                                                                        $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value][$i], $value));
1721                                                                }
1722                                                        } else {
1723                                                                $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $this->build_parameters($event[$value], $value));
1724                                                        }
1725                                                } else {
1726                                                                $function = $this->parameter[$value]['function'];
1727                                                        if ($multiples) {
1728                                $event_value_count = count($event[$value]);
1729                                                                for ($i = 0; $i < $event_value_count; ++$i) {
1730                                                                        $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $this-> $function ($event[$value][$i]));
1731                                                                }
1732                                                        } else {
1733                                                                $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . ':' . $this-> $function ($event[$value]));
1734                                                                }
1735                                                        }
1736                                                }
1737                                                break;
1738                                case 'cal-address' :
1739                                        if (is_array($event[$value][0])) {
1740                        $event_value_count = count($event[$value]);
1741                                                for ($j = 0; $j < $event_value_count; ++$j) {
1742                                                        $temp_output = $this->build_parameters($event[$value][$j], $value);
1743                                                        if ($temp_output) {
1744                                                                $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $temp_output);
1745                                                        }
1746                                                }
1747                                        } else {
1748                                                $temp_output = $this->build_parameters($event[$value], $value);
1749                                                if ($temp_output) {
1750                                                        $str .= $this->fold(strtoupper(str_replace('_', '-', $value)) . $temp_output);
1751                                                        }
1752                                                }
1753                                                break;
1754                                }
1755                        }
1756                if (!empty ($event['x_type'])) {
1757            $event_x_type_count = count($event['x_type']);
1758                        for ($i = 0; $i < $event_x_type_count; ++$i) {
1759                                $str .= $this->build_xtype($event['x_type'][$i], ':');
1760                                }
1761                        }
1762
1763                if ($ical_item == 'vtimezone') {
1764                        if ($event['tzdata']) {
1765                $event_tzdata_count = count($event['tzdata']);
1766                                for ($k = 0; $k < $event_tzdata_count; ++$k) {
1767                                        $str .= 'BEGIN:' . strtoupper($event['tzdata'][$k]['type']) . "\r\n";
1768                                        $str .= $this->build_card_internals(strtolower($event['tzdata'][$k]['type']), $event['tzdata'][$k]);
1769                                        $str .= 'END:' . strtoupper($event['tzdata'][$k]['type']) . "\r\n";
1770                                        }
1771                                }
1772                        }
1773                elseif ($event['alarm']) {
1774            $event_alarm_count = count($event['alarm']);
1775                        for ($k = 0; $k < $event_alarm_count; ++$k) {
1776                                $str .= 'BEGIN:VALARM' . "\r\n";
1777                                $str .= $this->build_card_internals('valarm', $event['alarm'][$k]);
1778                                $str .= 'END:VALARM' . "\r\n";
1779                                }
1780                        }
1781                        return $str;
1782                }
1783
1784                /*
1785                * Switching Functions
1786                */
1787               
1788        function parse_user_host($var) {
1789                        return $this->switch_mailto($var);     
1790                }
1791
1792        function switch_class($var) {
1793                if (is_string($var)) {
1794                        switch ($var) {
1795                                case '_PRIVATE' :
1796                                                $var = _PRIVATE;
1797                                                break;
1798                                case '_PUBLIC' :
1799                                                $var = _PUBLIC;
1800                                                break;
1801                                case '_CONFIDENTIAL' :
1802                                                $var = _CONFIDENTIAL;
1803                                                break;
1804                                }
1805                        }
1806                elseif (is_int($var)) {
1807                        switch ((int) $var) {
1808                                case _PRIVATE :
1809                                                $var = '_PRIVATE';
1810                                                break;
1811                                case _PUBLIC :
1812                                                $var = '_PUBLIC';
1813                                                break;
1814                                case _CONFIDENTIAL :
1815                                                $var = '_CONFIDENTIAL';
1816                                                break;
1817                                }
1818                        }
1819                        return $var;
1820                }
1821
1822        function switch_cu($var) {
1823                if (gettype($var) == 'string') {
1824                        switch ($var) {
1825                                case 'INDIVIDUAL' :
1826                                                return INDIVIDUAL;
1827                                                break;
1828                                case 'GROUP' :
1829                                                return GROUP;
1830                                                break;
1831                                case 'RESOURCE' :
1832                                                return RESOURCE;
1833                                                break;
1834                                case 'ROOM' :
1835                                                return ROOM;
1836                                                break;
1837                                case 'UNKNOWN' :
1838                                                return UNKNOWN;
1839                                                break;
1840                                default :
1841                                                return OTHER;
1842                                                break;
1843                                }
1844                        }
1845                elseif (gettype($var) == 'integer') {
1846                        switch ($var) {
1847                                case INDIVIDUAL :
1848                                                return 'INDIVIDUAL';
1849                                                break;
1850                                case GROUP :
1851                                                return 'GROUP';
1852                                                break;
1853                                case RESOURCE :
1854                                                return 'RESOURCE';
1855                                                break;
1856                                case ROOM :
1857                                                return 'ROOM';
1858                                                break;
1859                                case UNKNOWN :
1860                                                return 'UNKNOWN';
1861                                                break;
1862                                default :
1863                                                return 'X-OTHER';
1864                                                break;
1865                                }
1866                } else {
1867                                return $var;
1868                        }
1869                }
1870
1871        function switch_date($var) {
1872                $this->debug('SWITCH_DATE: gettype = ' . gettype($var));
1873                if (is_string($var)) {
1874                        $dtime = Array ();
1875                        if (strpos($var, ':')) {
1876                                $pos = explode(':', $var);
1877                                        $var = $pos[1];
1878                                }
1879                        $this->set_var($dtime, 'year', (int) (substr($var, 0, 4)));
1880                        $this->set_var($dtime, 'month', (int) (substr($var, 4, 2)));
1881                        $this->set_var($dtime, 'mday', (int) (substr($var, 6, 2)));
1882                        if (substr($var, 8, 1) == 'T') {
1883                                $this->set_var($dtime, 'hour', (int) (substr($var, 9, 2)));
1884                                $this->set_var($dtime, 'min', (int) (substr($var, 11, 2)));
1885                                $this->set_var($dtime, 'sec', (int) (substr($var, 13, 2)));
1886                                if (strlen($var) > 14) {
1887                                        if (substr($var, 14, 1) != 'Z') {
1888                                                if ($this->api) {
1889                                                                $dtime['hour'] -= $GLOBALS['phpgw_info']['users']['common']['tz_offset'];
1890                                                        if ($dtime['hour'] < 0) {
1891                                                                        $dtime['mday'] -= 1;
1892                                                                        $dtime['hour'] = 24 - $dtime['hour'];
1893                                                                }
1894                                                        elseif ($dtime['hour'] >= 24) {
1895                                                                        $dtime['mday'] += 1;
1896                                                                        $dtime['hour'] = $dtime['hour'] - 24;
1897                                                                }
1898                                                        }
1899                                                }
1900                                } else {
1901                                                /*
1902                                                * The time provided by the iCal is considered local time.
1903                                                *
1904                                                * The implementor will need to consider how to convert that time to UTC.
1905                                                */
1906                                                //                                      if($this->api)
1907                                                //                                      {
1908                                                //                                              $dtime['hour'] -= $GLOBALS['phpgw_info']['users']['common']['tz_offset'];
1909                                                //                                              if($dtime['hour'] < 0)
1910                                                //                                              {
1911                                                //                                                      $dtime['mday'] -= 1;
1912                                                //                                                      $dtime['hour'] = 24 - $dtime['hour'];
1913                                                //                                              }
1914                                                //                                              elseif($dtime['hour'] >= 24)
1915                                                //                                              {
1916                                                //                                                      $dtime['mday'] += 1;
1917                                                //                                                      $dtime['hour'] = $dtime['hour'] - 24;
1918                                                //                                              }
1919                                                //                                      }
1920                                        }
1921                        } else {
1922                                $this->set_var($dtime, 'hour', 0);
1923                                $this->set_var($dtime, 'min', 0);
1924                                $this->set_var($dtime, 'sec', 0);
1925                                if ($this->api) {
1926                                                $dtime['hour'] -= $GLOBALS['phpgw_info']['users']['common']['tz_offset'];
1927                                        if ($dtime['hour'] < 0) {
1928                                                        $dtime['mday'] -= 1;
1929                                                        $dtime['hour'] = 24 - $dtime['hour'];
1930                                                }
1931                                        elseif ($dtime['hour'] >= 24) {
1932                                                        $dtime['mday'] += 1;
1933                                                        $dtime['hour'] = $dtime['hour'] - 24;
1934                                                }
1935                                        }
1936                                }
1937                        $this->debug('DATETIME : ' . _debug_array($dtime, False));
1938                                return $dtime;
1939                        }
1940                elseif (is_array($var)) {
1941                        return date('Ymd\THis\Z', mktime($var['hour'], $var['min'], $var['sec'], $var['month'], $var['mday'], $var['year']));
1942                } else {
1943                                return $var;
1944                        }
1945                }
1946
1947        function switch_encoding($var) {
1948                if (is_string($var)) {
1949                        switch ($var) {
1950                                case '8BIT' :
1951                                                return _8BIT;
1952                                                break;
1953                                case 'BASE64' :
1954                                                return _BASE64;
1955                                                break;
1956                                default :
1957                                                return OTHER;
1958                                                break;
1959                                }
1960                        }
1961                elseif (is_int($var)) {
1962                        switch ($var) {
1963                                case _8BIT :
1964                                                return '8BIT';
1965                                                break;
1966                                case _BASE64 :
1967                                                return 'BASE64';
1968                                                break;
1969                                case OTHER :
1970                                                return 'OTHER';
1971                                                break;
1972                                }
1973                } else {
1974                                return $var;
1975                        }
1976                }
1977
1978        function switch_fbtype($var) {
1979                if (is_string($var)) {
1980                        switch ($var) {
1981                                case 'FREE' :
1982                                                return FREE;
1983                                                break;
1984                                case 'BUSY' :
1985                                                return BUSY;
1986                                                break;
1987                                case 'BUSY-UNAVAILABLE' :
1988                                                return BUSY_UNAVAILABLE;
1989                                                break;
1990                                case 'BUSY-TENTATIVE' :
1991                                                return BUSY_TENTATIVE;
1992                                                break;
1993                                default :
1994                                                return OTHER;
1995                                                break;
1996                                }
1997                        }
1998                elseif (is_int($var)) {
1999                        switch ($var) {
2000                                case FREE :
2001                                                return 'FREE';
2002                                                break;
2003                                case BUSY :
2004                                                return 'BUSY';
2005                                                break;
2006                                case BUSY_UNAVAILABLE :
2007                                                return 'BUSY-UNAVAILABLE';
2008                                                break;
2009                                case BUSY_TENTATIVE :
2010                                                return 'BUSY-TENTATIVE';
2011                                                break;
2012                                default :
2013                                                return 'OTHER';
2014                                                break;
2015                                }
2016                } else {
2017                                return $var;
2018                        }
2019                }
2020
2021        function switch_freq($var) {
2022                if (is_string($var)) {
2023                        switch ($var) {
2024                                case 'SECONDLY' :
2025                                                return SECONDLY;
2026                                                break;
2027                                case 'MINUTELY' :
2028                                                return MINUTELY;
2029                                                break;
2030                                case 'HOURLY' :
2031                                                return HOURLY;
2032                                                break;
2033                                case 'DAILY' :
2034                                                return DAILY;
2035                                                break;
2036                                case 'WEEKLY' :
2037                                                return WEEKLY;
2038                                                break;
2039                                case 'MONTHLY' :
2040                                                return MONTHLY;
2041                                                break;
2042                                case 'YEARLY' :
2043                                                return YEARLY;
2044                                                break;
2045                                }
2046                        }
2047                elseif (is_int($var)) {
2048                        switch ($var) {
2049                                case SECONDLY :
2050                                                return 'SECONDLY';
2051                                                break;
2052                                case MINUTELY :
2053                                                return 'MINUTELY';
2054                                                break;
2055                                case HOURLY :
2056                                                return 'HOURLY';
2057                                                break;
2058                                case DAILY :
2059                                                return 'DAILY';
2060                                                break;
2061                                case WEEKLY :
2062                                                return 'WEEKLY';
2063                                                break;
2064                                case MONTHLY :
2065                                                return 'MONTHLY';
2066                                                break;
2067                                case YEARLY :
2068                                                return 'YEARLY';
2069                                                break;
2070                                }
2071                } else {
2072                                return $var;
2073                        }
2074                }
2075
2076        function switch_mailto($var) {
2077                if (is_string($var)) {
2078                        $var = str_replace(array (
2079                                "\r\n",
2080                                "\n",
2081                                "\r"
2082                        ), "", $var);
2083                        if (strpos(' ' . $var, ':')) {
2084                                $parts = explode(':', $var);
2085                                        $var = $parts[1];
2086                                }
2087
2088                        $parts = explode('@', $var);
2089                                //$this->debug("Count of mailto parts : ".count($parts));
2090                        if (count($parts) == 2) {
2091                                        //$this->debug("Splitting ".$parts[0]." @ ".$parts[1]);
2092                                $temp_address = Array ();
2093                                        $temp_address['user'] = $parts[0];
2094                                        $temp_address['host'] = $parts[1];
2095                                        return $temp_address;
2096                        } else {
2097                                        return False;
2098                                }
2099                        }
2100                elseif (is_array($var)) {
2101                        //                              return 'MAILTO:'.$var['user'].'@'.$var['host'];
2102                        return $var['user'] . '@' . $var['host'];
2103                        }
2104                }
2105
2106        function switch_partstat($var) {
2107                $this->debug('PARTSTAT = ' . $var);
2108                if (is_string($var)) {
2109                        switch ($var) {
2110                                case 'NEEDS-ACTION' :
2111                                                return 0; // NEEDS_ACTION;
2112                                                break;
2113                                case 'ACCEPTED' :
2114                                                return 1; // ACCEPTED;
2115                                                break;
2116                                case 'DECLINED' :
2117                                                return 2; // DECLINED;
2118                                                break;
2119                                case 'TENTATIVE' :
2120                                                return 3; // TENTATIVE;
2121                                                break;
2122                                case 'DELEGATED' :
2123                                                return 4; // DELEGATED;
2124                                                break;
2125                                case 'COMPLETED' :
2126                                                return 5; // COMPLETED;
2127                                                break;
2128                                case 'IN-PROCESS' :
2129                                                return 6; // IN_PROCESS;
2130                                                break;
2131                                default :
2132                                                return 99; // OTHER;
2133                                                break;
2134                                }
2135                        }
2136                elseif (is_int($var)) {
2137                        switch ((int) $var) {
2138                                case 0 : // NEEDS_ACTION:
2139                                                return 'NEEDS-ACTION';
2140                                                break;
2141                                case 1 : //  ACCEPTED:
2142                                                return 'ACCEPTED';
2143                                                break;
2144                                case 2 : // DECLINED:
2145                                                return 'DECLINED';
2146                                                break;
2147                                case 3 : // TENTATIVE:
2148                                                return 'TENTATIVE';
2149                                                break;
2150                                case 4 : // DELEGATED:
2151                                                return 'DELEGATED';
2152                                                break;
2153                                case 5 : // COMPLETED:
2154                                                return 'COMPLETED';
2155                                                break;
2156                                case 6 : // IN_PROCESS:
2157                                                return 'IN-PROCESS';
2158                                                break;
2159                                default :
2160                                                return 'X-OTHER';
2161                                                break;
2162                                }
2163                } else {
2164                                return $var;
2165                        }
2166                }
2167
2168        function switch_range($var) {
2169                if (is_string($var)) {
2170                        switch ($var) {
2171                                case 'THISANDPRIOR' :
2172                                                return THISANDPRIOR;
2173                                                break;
2174                                case 'THISANDFUTURE' :
2175                                                return THISANDFUTURE;
2176                                                break;
2177                                }
2178                        }
2179                elseif (is_int($var)) {
2180                        switch ($var) {
2181                                case THISANDPRIOR :
2182                                                return 'THISANDPRIOR';
2183                                                break;
2184                                case THISANDFUTURE :
2185                                                return 'THISANDFUTURE';
2186                                                break;
2187                                }
2188                } else {
2189                                return $var;
2190                        }
2191                }
2192
2193        function switch_related($var) {
2194                if (is_string($var)) {
2195                        switch ($var) {
2196                                case 'START' :
2197                                                return START;
2198                                                break;
2199                                case 'END' :
2200                                                return END;
2201                                                break;
2202                                }
2203                        }
2204                elseif (is_int($var)) {
2205                        switch ($var) {
2206                                case START :
2207                                                return 'START';
2208                                                break;
2209                                case END :
2210                                                return 'END';
2211                                                break;
2212                                }
2213                } else {
2214                                return $var;
2215                        }
2216                }
2217
2218        function switch_reltype($var) {
2219                if (is_string($var)) {
2220                        switch ($var) {
2221                                case 'PARENT' :
2222                                                return PARENT;
2223                                                break;
2224                                case 'CHILD' :
2225                                                return CHILD;
2226                                                break;
2227                                case 'SIBLING' :
2228                                                return SIBLING;
2229                                                break;
2230                                }
2231                        }
2232                elseif (is_int($var)) {
2233                        switch ($var) {
2234                                case PARENT :
2235                                                return 'PARENT';
2236                                                break;
2237                                case CHILD :
2238                                                return 'CHILD';
2239                                                break;
2240                                case SIBLING :
2241                                                return 'SIBLING';
2242                                                break;
2243                                }
2244                } else {
2245                        return $var;
2246                        }
2247                }
2248
2249        function switch_role($var) {
2250                if (is_string($var)) {
2251                        switch ($var) {
2252                                case 'NONE' :
2253                                                return NONE;
2254                                                break;
2255                                case 'CHAIR' :
2256                                                return CHAIR;
2257                                                break;
2258                                case 'REQ-PARTICIPANT' :
2259                                                return REQ_PARTICIPANT;
2260                                                break;
2261                                case 'OPT-PARTICIPANT' :
2262                                                return OPT_PARTICIPANT;
2263                                                break;
2264                                case 'NON-PARTICIPANT' :
2265                                                return NON_PARTICIPANT;
2266                                                break;
2267                                }
2268                        }
2269                elseif (is_int($var)) {
2270                        switch ($var) {
2271                                case NONE :
2272                                                return 'NONE';
2273                                                break;
2274                                case CHAIR :
2275                                                return 'CHAIR';
2276                                                break;
2277                                case REQ_PARTICIPANT :
2278                                                return 'REQ-PARTICIPANT';
2279                                                break;
2280                                case OPT_PARTICIPANT :
2281                                                return 'OPT-PARTICIPANT';
2282                                                break;
2283                                case NON_PARTICIPANT :
2284                                                return 'NON-PARTICIPANT';
2285                                                break;
2286                                }
2287                } else {
2288                                return $var;
2289                        }
2290                }
2291
2292        function switch_rsvp($var) {
2293                if (is_string($var)) {
2294                        if ($var == 'TRUE') {
2295                                        return 1;
2296                                }
2297                        elseif ($var == 'FALSE') {
2298                                        return 0;
2299                                }
2300                        }
2301                elseif (is_int($var) || $var == False) {
2302                        if ($var == 1) {
2303                                        return 'TRUE';
2304                                }
2305                        elseif ($var == 0) {
2306                                        return 'FALSE';
2307                                }
2308                } else {
2309                                return $var;
2310                        }
2311                }
2312
2313        function switch_transp($var) {
2314                if (is_string($var)) {
2315                        switch ($var) {
2316                                case 'TRANSPARENT' :
2317                                                return TRANSPARENT;
2318                                                break;
2319                                case 'OPAQUE' :
2320                                                return OPAQUE;
2321                                                break;
2322                                }
2323                        }
2324                elseif (is_int($var)) {
2325                        switch ($var) {
2326                                case TRANSPARENT :
2327                                                return 'TRANSPARENT';
2328                                                break;
2329                                case OPAQUE :
2330                                                return 'OPAQUE';
2331                                                break;
2332                                }
2333                } else {
2334                                return $var;
2335                        }
2336                }
2337
2338                /*
2339                 * The brunt of the class
2340                 */
2341
2342        function parse($ical_text) {
2343                        $begin_regexp = '^';
2344                        $semi_colon_regexp = '[\;\:]';
2345                        $colon_regexp = '[\:]';
2346                        $catch_all_regexp = '(.*)';
2347                        $end_regexp = '$';
2348                $property_regexp = $begin_regexp . '([A-Z\-]*)' . $semi_colon_regexp . $catch_all_regexp . $end_regexp;
2349                $param_regexp = $begin_regexp . $catch_all_regexp . ':' . $catch_all_regexp . $end_regexp;
2350
2351                        $mode = 'none';
2352                        $text = $this->read_line_unfold($ical_text);
2353                while ($text) {
2354                        //                              if(strlen($ical_text[$i]) > 75)
2355                        //                              {
2356                        //                                      continue;
2357                        //                              }
2358
2359                        preg_match("/$property_regexp/", $text, $temp);
2360                                //$this->debug ('Majortype dump: '._debug_array($temp, false) );
2361                        $majortype = str_replace('-', '_', strtolower($temp[1]));
2362                                $value = chop($temp[2]);
2363                        if ($mode != 'none' && ($majortype != 'begin' && $majortype != 'end')) {
2364                                        //$this->debug('PARSE:MAJORTYPE : '.$majortype);
2365                                if (isset ($this->property[$majortype])) {
2366                                        $state = @ $this->property[$majortype]["$mode"]['state'];
2367                                        $type = @ $this->property[$majortype]['type'];
2368                                        $multiples = @ $this->property[$majortype]["$mode"]['multiples'];
2369                                        $do_to_text = @ $this->property[$majortype]['to_text'];
2370                                        }
2371                                elseif (substr($majortype, 0, 2) == 'x_') {
2372                                                $state = 'optional';
2373                                                $type = 'xtype';
2374                                                $multiples = True;
2375                                                $do_to_test = True;
2376                                } else {
2377                                                $state = '';
2378                                        }
2379                        } else {
2380                                        $state = 'required';
2381                                }
2382
2383                        if ($majortype == 'duration') {
2384                                        // Unset dur var
2385                                unset ($dur);
2386
2387                                        // Split DURATION
2388                                list ($_f_['day_raw'], $_f_['time_raw']) = preg_split('/T/', substr($value, 1, strlen($value) - 1));
2389
2390                                        /* Datecode */
2391                                if (isset ($_f_['day_raw']) OR $_f_['day_raw']) {
2392                                                // Days
2393                                        //                                              if(preg_match('/D/', $_f_['day_raw']))
2394                                        if (strstr($_f_['day_raw'], 'D')) {
2395                                                        $dur['days'] = preg_replace('/([0-9]+)D(.*)/i', '\\1', $_f_['day_raw']);
2396                                                }
2397
2398                                                // Weeks
2399                                        //                                              if(preg_match('/W/', $_f_["day_raw"]))
2400                                        if (strstr($_f_['day_raw'], 'W')) {
2401                                                        $dur['weeks'] = preg_replace('/([^|.*]+D)?([0-9]+)W/i', '\\2', $_f_['day_raw']);
2402                                                }
2403                                        }
2404
2405                                        /* Timecode */
2406                                if (isset ($_f_['time_raw']) OR $_f_['time_raw']) {
2407                                                // Hours
2408                                        //                                              if(preg_match('/H/', $_f_["time_raw"]))
2409                                        if (strstr($_f_['time_raw'], 'H')) {
2410                                                        $dur['hours'] = preg_replace('/([0-9]+)H(.*)/i', '\\1', $_f_['time_raw']);
2411                                                }
2412
2413                                                // Minutes
2414                                                /* If you find better, contact me very quickly :) */
2415                                        //                                              if(preg_match('/M/', $_f_["time_raw"]))
2416                                        if (strstr($_f_['time_raw'], 'M')) {
2417                                                        $dur['minutes'] = preg_replace('/([^|.*]+H)?([0-9]+)M(.*)/i', '\\2', $_f_['time_raw']);
2418                                                }
2419
2420                                                // Seconds
2421                                                /* Same comment :) */
2422                                        //                                              if(preg_match('/S/', $_f_["time_raw"]) )
2423                                        if (strstr($_f_['time_raw'], 'S')) {
2424                                                        $dur['seconds'] = preg_replace('/([^|.*]+M)?([0-9]+)S(.*)/i', '\\2', $_f_['time_raw']);
2425                                                }
2426                                        }
2427
2428                                $dur['raw'] = Array (
2429                                                'timecode' => $_f_['time_raw'],
2430                                                'datecode' => $_f_['day_raw'],
2431                                                'all'      => $value
2432                                        );
2433                                        // Add new parameters in Event
2434                                        $this->set_var($event, $majortype, $dur);
2435                                }
2436
2437                        if ($majortype == 'begin') {
2438                                        $tmode = $mode;
2439                                        $mode = strtolower($value);
2440                                switch (strtolower($value)) {
2441                                        case 'daylight' :
2442                                        case 'standard' :
2443                                                $t_event = Array ();
2444                                                        $t_event = $event;
2445                                                $event = Array ();
2446                                                        break;
2447                                        case 'valarm' :
2448                                                if ($tmode == 'vevent' || $tmode == 'vtodo') {
2449                                                                $t_event = $event;
2450                                                        unset ($event);
2451                                                        $event = Array ();
2452                                                } else {
2453                                                                $mode = $tmode;
2454                                                        }
2455                                                        break;
2456                                        case 'vcalendar' :
2457                                                        $ical = $this->new_ical();
2458                                                        break;
2459                                        case 'vevent' :
2460                                        case 'vfreebusy' :
2461                                        case 'vjournal' :
2462                                        case 'vtimezone' :
2463                                        case 'vtodo' :
2464                                                $event = Array ();
2465                                                        break;
2466                                        }
2467                                        $event['type'] = strtolower($value);
2468                                }
2469                        elseif ($majortype == 'end') {
2470                                        $mode = 'none';
2471                                switch (strtolower($value)) {
2472                                        case 'daylight' :
2473                                        case 'standard' :
2474                                                        $tzdata[] = $event;
2475                                                unset ($event);
2476                                                        $event = $t_event;
2477                                                unset ($t_event);
2478                                                        $mode = 'vtimezone';
2479                                                        break;
2480                                        case 'valarm' :
2481                                                        $alarm[] = $event;
2482                                                unset ($event);
2483                                                        $event = $t_event;
2484                                                unset ($t_event);
2485                                                        $mode = $tmode;
2486                                                        break;
2487                                        case 'vevent' :
2488                                                if (!empty ($alarm)) {
2489                                                                $event['alarm'] = $alarm;
2490                                                        unset ($alarm);
2491                                                        }
2492                                                        $this->event[] = $event;
2493                                                unset ($event);
2494                                                        break;
2495                                        case 'vfreebusy' :
2496                                                        $this->freebusy[] = $event;
2497                                                unset ($event);
2498                                                        break;
2499                                        case 'vjournal' :
2500                                                        $this->journal[] = $event;
2501                                                unset ($event);
2502                                                        break;
2503                                        case 'vtimezone' :
2504                                                if (!empty ($tzdata)) {
2505                                                                $event['tzdata'] = $tzdata;
2506                                                        unset ($tzdata);
2507                                                        }
2508                                                        $this->timezone[] = $event;
2509                                                unset ($event);
2510                                                        break;
2511                                        case 'vtodo' :
2512                                                if (!empty ($alarm)) {
2513                                                                $event['alarm'] = $alarm;
2514                                                        unset ($alarm);
2515                                                        }
2516                                                        $this->todo[] = $event['alarm'];
2517                                                unset ($event);
2518                                                        break;
2519                                        case 'vcalendar' :
2520                                                        $this->ical = $ical;
2521                                                        $this->ical['event'] = $this->event;
2522                                                        $this->ical['freebusy'] = $this->freebusy;
2523                                                        $this->ical['journal'] = $this->journal;
2524                                                        $this->ical['timezone'] = $this->timezone;
2525                                                        $this->ical['todo'] = $this->todo;
2526                                                        break 2;
2527                                        }
2528                                }
2529                        elseif ($majortype == 'prodid' || $majortype == 'version' || $majortype == 'method' || $majortype == 'calscale') {
2530                                $this->parse_parameters($ical, $majortype, $this->from_text($value));
2531                                }
2532                        elseif ($state == 'optional' || $state == 'required') {
2533                                        //$this->debug('Mode : '.$mode.' Majortype : '.$majortype . ' Type : '.$type);
2534                                if ($do_to_text) {
2535                                                $value = $this->from_text($value);
2536                                        }
2537                                switch ($type) {
2538                                        case 'text' :
2539                                                $this->parse_parameters($event, $majortype, $value);
2540                                                break;
2541                                        case 'recur' :
2542                                        case 'date-time' :
2543                                        case 'cal-address' :
2544                                                $this->parse_value($event, $majortype, $value, $mode);
2545                                                break;
2546                                        case 'integer' :
2547                                                if ($multiples) {
2548                                                        $event[$majortype][] = (int) $value;
2549                                                } else {
2550                                                        $this->set_var($event, $majortype, (int) $value);
2551                                                }
2552                                                break;
2553                                        case 'float' :
2554                                                $event-> $majortype = new class_geo;
2555                                                $this->parse_geo($event-> $majortype, $value);
2556                                                break;
2557                                        case 'utc-offset' :
2558                                                $this->set_var($event, $majortype, (int) $value);
2559                                                break;
2560                                        case 'uri' :
2561                                                $new_var = Array ();
2562                                                $this->parse_parameters($new_var, $majortype, $value);
2563                                                if ($multiples) {
2564                                                        switch ($mode) {
2565                                                                case 'valarm' :
2566                                                                                $alarm['attach'][] = $new_var;
2567                                                                                break;
2568                                                                default :
2569                                                                                $event[$majortype][] = $new_var;
2570                                                                                break;
2571                                                                }
2572                                                } else {
2573                                                                $event[$majortype] = $new_var;
2574                                                        }
2575                                                unset ($new_var);
2576                                                        break;
2577                                        case 'xtype' :
2578                                                $this->parse_xtype($event, $majortype, $value);
2579                                                        break;
2580                                        }
2581                                }
2582                                $text = $this->read_line_unfold($ical_text);
2583                        }
2584                        return $this->ical;
2585                }
2586
2587        function switch_to_phpgw_status($partstat) {
2588                switch ($partstat) {
2589                        case 0 :
2590                                        return 'U';
2591                                        break;
2592                        case 1 :
2593                                        return 'A';
2594                                        break;
2595                        case 2 :
2596                                        return 'R';
2597                                        break;
2598                        case 3 :
2599                                        return 'T';
2600                                        break;
2601                        default :
2602                                        return 'U';
2603                                        break;
2604                        }
2605                }
2606
2607        function switch_phpgw_status($status) {
2608                switch ($status) {
2609                        case 'U' :
2610                                        return 0;
2611                                        break;
2612                        case 'A' :
2613                                        return 1;
2614                                        break;
2615                        case 'R' :
2616                                        return 2;
2617                                        break;
2618                        case 'T' :
2619                                        return 3;
2620                                        break;
2621                        }
2622                }
2623
2624        function is_owner($part_record) {
2625                if (($part_record['user'] . '@' . $part_record['host'] == $GLOBALS['phpgw_info']['user']['preferences']['email']['address']) || ($part_record['cn'] == $GLOBALS['phpgw_info']['user']['account_lid']) ||
2626                        ($part_record['mailto']['user'] == $GLOBALS['phpgw_info']['user']['account_lid'])) {
2627                                return True;
2628                } else {
2629                                return False;
2630                        }
2631                }
2632
2633        function check_owner(& $event, $ical, $so_event) {
2634                if (!isset ($event['participant'][$GLOBALS['phpgw_info']['user']['account_id']])) {
2635                        if (isset ($ical['organizer'])) {
2636                                if ($this->is_owner($ical['organizer'])) {
2637                                        $so_event->add_attribute('owner', $GLOBALS['phpgw_info']['user']['account_id']);
2638                                        $so_event->add_attribute('participants', $this->switch_to_phpgw_status($ical['organizer']['partstat']), $GLOBALS['phpgw_info']['user']['account_id']);
2639                                        }
2640                                }
2641                        elseif (isset ($ical['attendee'])) {
2642                                        $attendee_count = count($ical['attendee']);
2643
2644                                for ($j = 0; $j < $attendee_count; ++$j) {
2645                                        if ($this->is_owner($ical['attendee'][$j])) {
2646                                                $so_event->add_attribute('participants', $this->switch_to_phpgw_status($ical['attendee'][$j]['partstat']), (int) $GLOBALS['phpgw_info']['user']['account_id']);
2647                                                }
2648                                        }
2649                        } else {
2650                                $so_event->add_attribute('owner', $GLOBALS['phpgw_info']['user']['account_id']);
2651                                $so_event->add_attribute('participants', 'A', $GLOBALS['phpgw_info']['user']['account_id']);
2652                                }
2653                        }
2654                }
2655
2656        function import_file() {
2657                if ($_FILES['uploadedfile']['tmp_name'] == 'none' || $_FILES['uploadedfile']['tmp_name'] == '') {
2658                        Header('Location: ' . $GLOBALS['phpgw']->link('/index.php', Array (
2659                                                        'menuaction'    => 'calendar.uiicalendar.import',
2660                                                        'action'        => 'GetFile'
2661                        )));
2662                                $GLOBALS['phpwg']->common->phpgw_exit();
2663                        }
2664                        $uploaddir = $GLOBALS['phpgw_info']['server']['temp_dir'] . SEP;
2665
2666                srand((double) microtime() * 1000000);
2667                $random_number = rand(100000000, 999999999);
2668                $newfilename = md5($_FILES['uploadedfile']['tmp_name'] . ", " . $uploadedfile_name . ", " . time() . getenv("REMOTE_ADDR") . $random_number);
2669
2670                        $filename = $uploaddir . $newfilename;
2671
2672                        move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $filename);
2673                //                      $ftp = fopen($uploaddir . $newfilename . '.info','wb');
2674                //                      fputs($ftp,$uploadedfile_type."\n".$uploadedfile_name."\n");
2675                //                      fclose($ftp);
2676                        return $filename;
2677                }
2678
2679        function safeBitCheck($number, $comparison) {
2680                $binNumber = base_convert($number, 10, 2);
2681                $binComparison = strrev(base_convert($comparison, 10, 2));
2682                $str = strlen($binNumber);
2683
2684                if (($str <= strlen($binComparison)) && ($binComparison {
2685                        $str -1 }
2686                === "1"))
2687                return '1';
2688else
2689        return '0';
2690}
2691
2692function import($mime_msg = '', $from_ajax = false, $importAccount = false) {
2693        /*
2694         * Caso seja uma importação para conta compartilhada carrega as acls do usuario
2695         */
2696        if ($importAccount != false) {
2697                $colunas = array (
2698                        'acl_appname',
2699                        'acl_location',
2700                        'acl_account',
2701                        'acl_rights'
2702                );
2703                $where = array (
2704                        'acl_appname' => 'calendar',
2705                        'acl_account' => $importAccount['uidnumber'],
2706                        'acl_location' => $GLOBALS['phpgw_info']['user']['account_id']
2707                );
2708                $db = $GLOBALS['phpgw']->db;
2709                $db->select('phpgw_acl', $colunas, $where, null, null);
2710                $row = $db->row(true);
2711
2712                if (!$this->safeBitCheck(2, $row['acl_rights'])) //Se o usuario não tem permisão de adicionar eventos
2713                        return 'You do not have permission to add events';
2714        }
2715
2716        if ($_FILES['uploadedfile']['tmp_name'] != 'none' && $_FILES['uploadedfile']['tmp_name'] != '') {
2717                                $filename = $this->import_file();
2718                $fp = fopen($filename, 'rt');
2719                $mime_msg = explode("\n", fread($fp, filesize($filename)));
2720                                fclose($fp);
2721                                unlink($filename);
2722                        }
2723        elseif (!$mime_msg) {
2724                Header('Location: ' . $GLOBALS['phpgw']->link('/index.php', Array (
2725                                                        'menuaction'    => 'calendar.uiicalendar.import',
2726                                                        'action'        => 'GetFile'
2727                )));
2728                                $GLOBALS['phpwg']->common->phpgw_exit();
2729                        }
2730
2731        if (!is_object($GLOBALS['uicalendar'])) {
2732                $so_event = createobject('calendar.socalendar', Array (
2733                                                'owner' => 0,
2734                                                'filter'        => '',
2735                                                'category'      => ''
2736                ));
2737        } else {
2738                                $so_event = $GLOBALS['uicalendar']->bo->so;
2739                        }
2740
2741        $datetime_vars = Array (
2742                                'start' => 'dtstart',
2743                                'end'   => 'dtend',
2744                                'modtime'       => 'dtstamp',
2745                                'modtime'       => 'last_modified'
2746                        );
2747
2748        $date_array = Array (
2749                                'Y'     => 'year',
2750                                'm'     => 'month',
2751                                'd'     => 'mday',
2752                                'H'     => 'hour',
2753                                'i'     => 'min',
2754                                's'     => 'sec'
2755                        );
2756
2757                        // time limit should be controlled elsewhere
2758        @ set_time_limit(0);
2759                        $GLOBALS['phpgw_info']['user']['preferences'] = $GLOBALS['phpgw']->preferences->create_email_preferences();
2760                        $users_email = $GLOBALS['phpgw_info']['user']['preferences']['email']['address'];
2761                        $cats = CreateObject('phpgwapi.categories');
2762                        $ical = $this->parse($mime_msg);
2763        switch ($ical['version']['value']) {
2764                case '1.0' :
2765                                        $cat_sep = ';';
2766                                        break;
2767                case '2.0' :
2768                default :
2769                                        $cat_sep = ',';
2770                                        break;                 
2771                        }
2772                                       
2773        /*
2774         * Caso seja um Reply.
2775         */
2776        if (strtoupper($ical['method']['value']) == 'REPLY') {
2777                //atualiza evento caso seja evento externo
2778                if (isset ($ical['event']['0']['x_type']))
2779                        foreach ($ical['event']['0']['x_type'] as $property)
2780                                if ($property['name'] === 'MICROSOFT_CDO_IMPORTANCE')
2781                                        return $this->updateHour($ical);
2782
2783                //Ignora respostas externas
2784                return 'The import was executed successfully.';
2785                                }
2786
2787        /*-------------------------------------------------------------*/
2788
2789        /*
2790         * Ativa a flag de cancelamento caso o ical for do method CANCEL
2791         */
2792        $cancelEvent = false;
2793        if (strtoupper($ical['method']['value']) == 'CANCEL')
2794                $cancelEvent = true;
2795        /*-------------------------------------------------------------*/
2796
2797        require_once (dirname(__FILE__) . '/class.ex_participants.inc.php');
2798
2799        $c_events = count($ical['event']);
2800        for ($i = 0; $i < $c_events; ++$i) {
2801                $ex_participants = new exParticipants();
2802
2803                if ($ical['event'][$i]['uid']['value'])
2804                        $uid_exists = $so_event->find_cal_id($ical['event'][$i]['uid']['value']);
2805                                else
2806                                        $uid_exists = False;
2807
2808                if ($cancelEvent) // If cancelamento
2809                                {
2810                        if ($importAccount != false && !$this->safeBitCheck(8, $row['acl_rights'])) // se for em uma conta compartilhada e se tem permisão de deletar
2811                                return 'You do not have permission to delete events';
2812
2813                        if ($uid_exists) // If o evento existe na agenda
2814                                $so_event->delete_entry($uid_exists); // Adicona o id a lista de eventos a deletar
2815
2816                        continue; // Continua o for nenhum processamento mais é nescessario
2817                                }
2818
2819                if ($uid_exists) {
2820                        $event = $so_event->read_entry($uid_exists);
2821                        $this->check_owner($event, $ical['event'][$i], $so_event);
2822                } else {
2823                                        $so_event->event_init();
2824                        $so_event->add_attribute('id', 0);
2825                        $so_event->add_attribute('reference', 0);
2826                                        }
2827
2828                if ($ical['event'][$i]['uid']['value']) {
2829                        $so_event->add_attribute('uid', $ical['event'][$i]['uid']['value']);
2830                }
2831                if ($ical['event'][$i]['summary']['value']) {
2832                                                $so_event->set_title($ical['event'][$i]['summary']['value']);
2833                                        }
2834                if ($ical['event'][$i]['description']['value']) {
2835                                                $so_event->set_description($ical['event'][$i]['description']['value']);
2836                                        }
2837                if ($ical['event'][$i]['ex_participants']['value']) {
2838                        $ex_participants->setParticipantsByString($ical['event'][$i]['ex_participants']['value']);
2839                                        }
2840                                        // Compatibilidade com agendamentos vindos do outlook/exchange
2841                if (isset ($ical['event'][$i]['attendee'])) {
2842                                                $c_attendees = count($ical['event'][$i]['attendee']);
2843                                                $all_attendees = '';
2844                        for ($a = 0; $a < $c_attendees; ++$a) {
2845                                $cname = '"' . $ical['event'][$i]['attendee'][$a]['cn'] . '"';
2846                                                        $email = $ical['event'][$i]['attendee'][$a]['mailto']['user'];
2847                                if ($email) {
2848                                                                // Remove os espaços, tabs e quebra-de-linha no dominio
2849                                                                //$email_domain = preg_replace('/\s*/m', '', $ical['event'][$i]['attendee'][$a]['mailto']['host']);
2850                                                                $email_domain = $ical['event'][$i]['attendee'][$a]['mailto']['host'];
2851                                        $email = '<' . $email . '@' . $email_domain . '>';
2852                                } else
2853                                                                $email = '';
2854                                                       
2855                                $all_attendees .= $cname . $email . ', ';
2856                                        }
2857                        $this->debug('All attendees: ' . $all_attendees);
2858
2859                        $ex_participants->setParticipantsByString($all_attendees);
2860
2861                                        }
2862
2863                if ($ical['event'][$i]['location']['value']) {
2864                        $so_event->add_attribute('location', $ical['event'][$i]['location']['value']);
2865                                        }
2866                if (isset ($ical['event'][$i]['priority'])) {
2867                        $so_event->add_attribute('priority', $ical['event'][$i]['priority']);
2868                } else {
2869                        $so_event->add_attribute('priority', 2);
2870                                        }
2871                if (!isset ($ical['event'][$i]['class'])) {
2872                                                $ical['event'][$i]['class'] = 1;
2873                                        }
2874                                        $so_event->set_class($ical['event'][$i]['class']);
2875
2876                @ reset($datetime_vars);
2877                while (list ($e_datevar, $i_datevar) = each($datetime_vars)) {
2878                        if (isset ($ical['event'][$i][$i_datevar])) {
2879                                                        $temp_time = $so_event->maketime($ical['event'][$i][$i_datevar]) + $GLOBALS['phpgw']->datetime->tz_offset;
2880                                @ reset($date_array);
2881                                while (list ($key, $var) = each($date_array)) {
2882                                        $event[$e_datevar][$var] = (int) (date($key, $temp_time));
2883                                                        }
2884                                $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']);
2885                                                }
2886                                        }
2887                if (!isset ($ical['event'][$i]['categories']['value']) || !$ical['event'][$i]['categories']['value']) {
2888                                                $so_event->set_category(0);
2889                } else {
2890                        $ical_cats = Array ();
2891                        if (strpos($ical['event'][$i]['categories']['value'], $cat_sep)) {
2892                                $ical_cats = explode($cat_sep, $ical['event'][$i]['categories']['value']);
2893                        } else {
2894                                                        $ical_cats[] = $ical['event'][$i]['categories']['value'];
2895                                                }
2896
2897                        @ reset($ical_cats);
2898                        $cat_id_nums = Array ();
2899                        while (list ($key, $cat) = each($ical_cats)) {
2900                                if (!$cats->exists('appandmains', $cat)) {
2901                                        $cats->add(Array (
2902                                                                                'name'  => $cat,
2903                                                                                'descr' => $cat,
2904                                                                                'parent'        => '',
2905                                                                                'access'        => 'private',
2906                                                                                'data'  => ''
2907                                        ));
2908                                                        }
2909                                //                                                      $temp_id = $cats->name2id($cat);
2910                                //                                                      echo 'Category Name : '.$cat.' : Category ID :'.$temp_id."<br>\n";
2911                                //                                                      $cat_id_nums[] = $temp_id;
2912                                                        $cat_id_nums[] = $cats->name2id($cat);
2913                                                }
2914                        @ reset($cat_id_nums);
2915                        if (count($cat_id_nums) > 1) {
2916                                $so_event->set_category(implode($cat_id_nums, ','));
2917                        } else {
2918                                                        $so_event->set_category($cat_id_nums[0]);
2919                                                }
2920                                        }
2921
2922                //rrule
2923                if (isset ($ical['event'][$i]['rrule']) OR isset ($ical['event'][$i]['duration'])) {
2924                        // recur_enddate
2925                        if (isset ($ical['event'][$i]['rrule']['until'])) {
2926                                $recur_enddate['year'] = (int) ($ical['event'][$i]['rrule']['until']['year']);
2927                                $recur_enddate['month'] = (int) ($ical['event'][$i]['rrule']['until']['month']);
2928                                $recur_enddate['mday'] = (int) ($ical['event'][$i]['rrule']['until']['mday']);
2929                                                }
2930                        elseif (isset ($ical['event'][$i]['duration'])) {
2931                                                        // Create timecode for strtotime
2932                                $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']);
2933
2934                                                /*  -- Fixbug --
2935                                                * if "DURATION" has 1 day (for example).
2936                                                * Event takes places between the first date
2937                                                * (this define in "start" tag) and next day  :(
2938                                                        * This "fix" destroy one day and set hours as "23" and minutes as "59"
2939                                                        */
2940
2941                                                        // Weeks::Day--
2942                                if ($ical['event'][$i]['duration']['weeks'] AND ($ical['event'][$i]['duration']['hours'] == 0) AND ($ical['event'][$i]['duration']['minutes'] == 0)) {
2943                                        $ical['event'][$i]['duration']['days'] = ($ical['event'][$i]['duration']['days'] + ($ical['event'][$i]['duration']['weeks'] * 7)) - 1;
2944                                        unset ($ical['event'][$i]['duration']['weeks']);
2945                                                                $ical['event'][$i]['duration']['hours'] = "23";
2946                                                                $ical['event'][$i]['duration']['minutes'] = "59";
2947                                                                $ical['event'][$i]['duration']['seconds'] = "59";
2948                                                        }
2949                                                        // Days::Day--
2950                                if ($ical['event'][$i]['duration']['days'] AND ($ical['event'][$i]['duration']['hours'] == 0) AND ($ical['event'][$i]['duration']['minutes'] == 0)) {
2951                                                                $ical['event'][$i]['duration']['days']--;
2952                                                                $ical['event'][$i]['duration']['hours'] = "23";
2953                                                                $ical['event'][$i]['duration']['minutes'] = "59";
2954                                                                $ical['event'][$i]['duration']['seconds'] = "59";
2955                                                        }
2956
2957                                                        // Create string contains datetime for strtotime
2958                                                        $pdate = "+";
2959                                if (isset ($ical['event'][$i]['duration']['weeks']))
2960                                                        $pdate .= $ical['event'][$i]['duration']['weeks'] . " weeks ";
2961                                if (isset ($ical['event'][$i]['duration']['days']))
2962                                                        $pdate .= $ical['event'][$i]['duration']['days'] . " days ";
2963                                if (isset ($ical['event'][$i]['duration']['hours']))
2964                                                        $pdate .= $ical['event'][$i]['duration']['hours'] . " hours ";
2965                                if (isset ($ical['event'][$i]['duration']['minutes']))
2966                                                        $pdate .= $ical['event'][$i]['duration']['minutes'] . " minutes ";
2967                                if (isset ($ical['event'][$i]['duration']['seconds']))
2968                                                        $pdate .= $ical['event'][$i]['duration']['seconds'] . " seconds ";
2969
2970                                                        // What is datetime in 2192 ?
2971                                                        $enddate = strtotime($pdate, $ptimer);
2972                                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));
2973
2974                                                        // Set End of event
2975                                $so_event->set_end($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $recur_enddate['hour'], $recur_enddate['min'], $recur_enddate['sec']);
2976
2977                        } else {
2978                                                        $recur_enddate['year'] = 0;
2979                                                        $recur_enddate['month'] = 0;
2980                                                        $recur_enddate['mday'] = 0;
2981                                                }
2982
2983                        // recur_data
2984                                                $recur_data = 0;
2985                        if (isset ($ical['event'][$i]['rrule']['byday'])) {
2986                                $week_days = Array (
2987                                                                MCAL_M_SUNDAY   => 'SU',
2988                                                                MCAL_M_MONDAY   => 'MO',
2989                                                                MCAL_M_TUESDAY  => 'TU',
2990                                                                MCAL_M_WEDNESDAY        => 'WE',
2991                                                                MCAL_M_THURSDAY => 'TH',
2992                                                                MCAL_M_FRIDAY   => 'FR',
2993                                                                MCAL_M_SATURDAY => 'SA'
2994                                                        );
2995                                @ reset($week_days);
2996                                while (list ($key, $val) = each($week_days)) {
2997                                        if (strpos(' ' . $ical['event'][$i]['rrule']['byday'], $val)) {
2998                                                                        $recur_data += $key;
2999                                                                }
3000                                                        }
3001                                                }
3002
3003                        // interval
3004                        if (!isset ($ical['event'][$i]['rrule']['interval'])) {
3005                                                        $interval = 1;
3006                        } else {
3007                                $interval = (int) $ical['event'][$i]['rrule']['interval'];
3008                                                }
3009                        // recur_type
3010                        switch ($ical['event'][$i]['rrule']['freq']) {
3011                                case DAILY :
3012                                                                $recur_type = MCAL_RECUR_DAILY;
3013                                                                break;
3014                                case WEEKLY :
3015                                        $so_event->set_recur_weekly($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $interval, $recur_data);
3016                                                                break;
3017                                case MONTHLY :
3018                                        // Still need to determine if this is by day or by week for the month..
3019                                        //                                                              $recur_type = MCAL_RECUR_M??????;
3020                                                                break;
3021                                case YEARLY :
3022                                        $so_event->set_recur_yearly($recur_enddate['year'], $recur_enddate['month'], $recur_enddate['mday'], $interval);
3023                                                                break;
3024                                                }
3025                } else {
3026                                                $so_event->set_recur_none();
3027                                        }
3028
3029                // Owner
3030                $organizer = $ical['event'][$i]['organizer'];
3031
3032                if (isset ($organizer)) {
3033                        if ($this->is_owner($organizer) || $organizer == -2) {
3034                                $so_event->add_attribute('owner', $GLOBALS['phpgw_info']['user']['account_id']);
3035                        } else {
3036                                $so_event->add_attribute('owner', -2);
3037                                $aux = explode(':', $organizer['cn']);
3038                                $so_event->add_attribute('organizer', '' . $aux[0] . ' <' . $organizer['mailto']['user'] . '@'. $organizer['mailto']['host'].'>');
3039                                        }
3040                                        }
3041
3042                // se for importação para conta compartilhada
3043                $user = (int) ($importAccount ? $importAccount['uidnumber'] : $GLOBALS['phpgw_info']['user']['account_id']);
3044                $userMail = $importAccount['mail'] ? $importAccount['mail'] : $GLOBALS['phpgw_info']['user']['email'];
3045
3046                $so_event->add_attribute('participants', 'A', $user);
3047                                        $event = $so_event->get_cached_event();
3048
3049                /*
3050                 * Remove Email do participantes externos
3051                 */
3052                $usersToRemove = array ();
3053                $usersToRemove[] = $user;
3054                foreach ($event['participants'] as $auxi=> $v)
3055                        $usersToRemove[] = $auxi;
3056
3057                $ldapService = ServiceLocator :: getService('ldap');
3058                foreach ($usersToRemove as $v) {
3059                        $ex_participants->removeParticipant($ldapService->getMailByUidNumber($v));
3060                        $alternates = $ldapService->getMailAlternateByUidNumber($v);
3061                        foreach ($alternates as $ii => $vv)
3062                                $ex_participants->removeParticipant($vv);
3063                }
3064                $ex_participants->removeParticipant($event['organizer']);
3065                /// -------------------------------------------------------- ///
3066
3067                $event['ex_participants'] = $ex_participants->getParticipantsSerializable();
3068
3069                if (!isset ($this->bo)) {
3070                        require_once (dirname(__FILE__) . '/class.bocalendar.inc.php');
3071                        $this->bo = new bocalendar();
3072                }
3073
3074                if ($c_events < 2) //Ignora verificação de conflito quando o ical é de varios eventos
3075                {
3076                        if ($overlapping_events = $this->bo->event_overlap($event, (!$from_ajax), null, $user)) {
3077                                if ($_GET['calendarImport'] == 1) //caso venha do modulo calendar
3078                                        {
3079                                        $url = 'expressoMail1_2/controller.php?action=' . implode("&", array (
3080                                                'calendar.uicalendar.overlap',
3081                                                'o_events=' . implode(';', $overlapping_events),
3082                                                'this_event=' . $event['id'],
3083                                                'this_account=' . $user
3084                                        ));
3085
3086                                        echo "<script>document.location='" . $url . "'</script>";
3087                                        exit;
3088                                } else
3089                                        return array (
3090                                                'url' => implode("&", array (
3091                                                        'calendar.uicalendar.overlap',
3092                                                        'o_events=' . implode(';', $overlapping_events),
3093                                                        'this_event=' . $event['id'],
3094                                                        'this_account=' . $user
3095                                                ))
3096                                        );
3097                        }
3098                                }
3099
3100                if ($importAccount)
3101                        $so_event->add_entry($event, true, $importAccount);
3102                else
3103                        $so_event->add_entry($event);
3104
3105                        }
3106
3107        /*
3108         * Exclue os eventos que estão na lista para serem deletados
3109         */
3110        if ($cancelEvent)
3111                $so_event->expunge();
3112        /*----------------------------------------------------------*/
3113
3114        if (!$from_ajax) {
3115                Header('Location: ' . $GLOBALS['phpgw']->link('/index.php', Array (
3116                                                'menuaction'    => 'calendar.uicalendar.view',
3117                                                'cal_id'        => $event['id']
3118                )));
3119                                $GLOBALS['phpgw']->common->phpgw_exit();
3120        } else // checando se o icalendar veio no formato esperado, ou seja, foi parseado corretamente
3121                if (!empty ($ical))
3122                                return true;
3123                else
3124                        return 'Cannot import target event. Please check if the format is right.';
3125
3126}
3127
3128function updateHour($ical) {
3129
3130        if (!is_object($GLOBALS['uicalendar'])) {
3131                $so_event = createobject('calendar.socalendar', Array (
3132                        'owner' => 0,
3133                        'filter' => '',
3134                        'category' => ''
3135                ));
3136        } else
3137                $so_event = $GLOBALS['uicalendar']->bo->so;
3138
3139        $cal_id = $so_event->find_cal_id($ical['event'][0]['uid']['value']);
3140
3141        //Agendamento nao ecnontrado
3142        if (!$cal_id)
3143                return 'The event was not found in your calendar';
3144
3145        $event = $so_event->read_entry($cal_id);
3146
3147        $datetime_vars = Array (
3148                'start' => 'dtstart',
3149                'end' => 'dtend',
3150                'modtime' => 'dtstamp',
3151                'modtime' => 'last_modified'
3152        );
3153
3154        $date_array = Array (
3155                'Y' => 'year',
3156                'm' => 'month',
3157                'd' => 'mday',
3158                'H' => 'hour',
3159                'i' => 'min',
3160                's' => 'sec'
3161        );
3162
3163        @ reset($datetime_vars);
3164        while (list ($e_datevar, $i_datevar) = each($datetime_vars)) {
3165                if (isset ($ical['event'][0][$i_datevar])) {
3166                        $temp_time = $so_event->maketime($ical['event'][0][$i_datevar]);
3167                        @ reset($date_array);
3168                        while (list ($key, $var) = each($date_array))
3169                                $event[$e_datevar][$var] = (int) (date($key, $temp_time));
3170
3171                        $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']);
3172                }
3173                }
3174
3175        $so_event->add_entry($event, false);
3176        $bo_event = createobject('calendar.bocalendar');
3177        $bo_event->send_update(MSG_MODIFIED, $event['participants'], $event, $event);
3178
3179        return 'Event successfully updated';
3180}
3181
3182function export($params) {
3183                        $event_id = $params['l_event_id'] ? $params['l_event_id'] : $_GET['cal_id'];
3184                        $this->chunk_split = $params['chunk_split'];
3185                        $method = $params['method'] ? $params['method'] : 'publish';
3186                        $vtype = $params['vtype'] ? $params['vtype'] : 'event';
3187
3188        $string_array = Array (
3189                                'summary'               => 'description',
3190                                'location'              => 'location',
3191                                'description'   => 'title',
3192                                'uid'           => 'uid'
3193                        );
3194
3195                        $cats = CreateObject('phpgwapi.categories');
3196
3197        include (PHPGW_SERVER_ROOT . '/calendar/setup/setup.inc.php');
3198        if (!is_array($event_id)) {
3199                                $ids[] = $event_id;
3200        } else {
3201                                $ids = $event_id;
3202                        }
3203
3204                        $ical = $this->new_ical();
3205
3206        $this->set_var($ical['prodid'], 'value', '-//eGroupWare//eGroupWare ' . $setup_info['calendar']['version'] . ' MIMEDIR//' . strtoupper($GLOBALS['phpgw_info']['user']['preferences']['common']['lang']));
3207        $this->set_var($ical['version'], 'value', '2.0');
3208        $this->set_var($ical['method'], 'value', strtoupper($method));
3209
3210        if (!$GLOBALS['phpgw_info']['flags']['included_classes']['uicalendar']) {
3211                if (!$GLOBALS['phpgw_info']['flags']['included_classes']['bocalendar']) {
3212                        $so_event = createobject('calendar.socalendar', Array (
3213                                                        'owner' => 0,
3214                                                        'filter'        => '',
3215                                                        'category'      => ''
3216                        ));
3217                } else {
3218                                        $so_event = $GLOBALS['bocalendar']->so;
3219                                }
3220        } else {
3221                                $so_event = $GLOBALS['uicalendar']->bo->so;
3222                        }
3223
3224        foreach ($ids as $event) {
3225                $ical_event = Array ();
3226                if (!is_array($event)) {
3227                                        $event = $so_event->read_entry($event);
3228                                }
3229                if ($event['alarm']) {
3230                        foreach ($event['alarm'] as $alarm) {
3231                                $ical_temp = Array ();
3232                                                $ical_temp['action']['value'] = 'DISPLAY';
3233                                                $ical_temp['description']['value'] = $alarm['text'];
3234                                $this->set_var($ical_temp['trigger'], 'value', 'VALUE=DATE-TIME:' . date('Ymd\THis\Z', $alarm['time']), 'valarm');
3235                                                $ical_event['alarm'][] = $ical_temp;
3236                                        }
3237                                }
3238
3239                                // use system's date info for caluculating local timezone's offset in minutes
3240                                //
3241                $gmt_offset = date('O', $GLOBALS['phpgw']->datetime->users_localtime); // offset to GMT
3242                $offset = (int) (substr($gmt_offset, 0, 3)) * 60 + (int) (substr($gmt_offset, 3, 2));
3243                                $event['start']['min']   -= $offset;
3244                                $event['end']['min']     -= $offset;
3245                                $event['modtime']['min'] -= $offset;
3246
3247                                $ical_event['priority'] = $event['priority'];
3248                $ical_event['class'] = (int) $event['public'];
3249                                $dtstart_mktime = $so_event->maketime($event['start']);
3250                $this->parse_value($ical_event, 'dtstart', date('Ymd\THis\Z', $dtstart_mktime), 'vevent');
3251                                $dtend_mktime = $so_event->maketime($event['end']);
3252                $this->parse_value($ical_event, 'dtend', date('Ymd\THis\Z', $dtend_mktime), 'vevent');
3253                                $mod_mktime = $so_event->maketime($event['modtime']);
3254                $this->parse_value($ical_event, 'last_modified', date('Ymd\THis\Z', $mod_mktime), 'vevent');
3255                foreach ($string_array as $ical_value => $event_value) {
3256                        if ($event[$event_value]) {
3257                                $this->set_var($ical_event[$ical_value], 'value', $event[$event_value]);
3258                                        }
3259                                }
3260
3261                if ($event['category']) {
3262                        $cats->categories(0, 'calendar');
3263                        foreach (explode(',', $event['category']) as $cat) {
3264                                                $_cat = $cats->return_single($cat);
3265                                                $cat_string[] = $_cat[0]['name'];
3266                                        }
3267                        @ reset($cat_string);
3268                        $this->set_var($ical_event['categories'], 'value', implode($cat_string, ','));
3269                                }
3270
3271                if (count($event['participants']) > 1) {
3272                        if (!is_object($db)) {
3273                                                $db = $GLOBALS['phpgw']->db;
3274                                        }
3275                        foreach ($event['participants'] as $part => $status) {
3276                                $GLOBALS['phpgw']->accounts->get_account_name($part, $lid, $fname, $lname);
3277                                $name = $fname . ' ' . $lname;
3278
3279                                $owner_status = $this->switch_partstat((int) $this->switch_phpgw_status($event['participants'][$part]));
3280
3281                                                $mail_prefs = $GLOBALS['phpgw']->preferences->create_email_preferences($part);
3282                                                $mailto = $mail_prefs['email']['address'];
3283
3284                                $str = 'CN="' . $name . '";PARTSTAT=' . $owner_status . ':' . $mailto;
3285                                if ($part == $event['owner']) {
3286                                        $str = 'ROLE=CHAIR;' . $str;
3287                                } else {
3288                                        $str = 'ROLE=REQ-PARTICIPANT;' . $str;
3289                                                }
3290                                if ($method != 'reply' || $part == $GLOBALS['phpgw_info']['user']['account_id']) {
3291                                        $this->parse_value($ical_event, 'attendee', $str, 'vevent');
3292                                                }
3293                                if ($part == $event['owner']) {
3294                                        $this->parse_value($ical_event, 'organizer', $str, 'vevent');
3295                                                }
3296                                        }
3297                                }
3298                if ($event['recur_type']) {
3299                                        $str = '';
3300                        switch ($event['recur_type']) {
3301                                case MCAL_RECUR_DAILY :
3302                                                        $str .= 'FREQ=DAILY';
3303                                                        break;
3304                                case MCAL_RECUR_WEEKLY :
3305                                                        $str .= 'FREQ=WEEKLY';
3306                                        if ($event['recur_data']) {
3307                                                                $str .= ';BYDAY=';
3308                                                for ($i = 1; $i < MCAL_M_ALLDAYS; $i = $i * 2) {
3309                                                        if ($i & $event['recur_data']) {
3310                                                                switch ($i) {
3311                                                                        case MCAL_M_SUNDAY :
3312                                                                                                $day[] = 'SU';
3313                                                                                                break;
3314                                                                        case MCAL_M_MONDAY :
3315                                                                                                $day[] = 'MO';
3316                                                                                                break;
3317                                                                        CASE MCAL_M_TUESDAY :
3318                                                                                                $day[] = 'TU';
3319                                                                                                break;
3320                                                                        case MCAL_M_WEDNESDAY :
3321                                                                                                $day[] = 'WE';
3322                                                                                                break;
3323                                                                        case MCAL_M_THURSDAY :
3324                                                                                                $day[] = 'TH';
3325                                                                                                break;
3326                                                                        case MCAL_M_FRIDAY :
3327                                                                                                $day[] = 'FR';
3328                                                                                                break;
3329                                                                        case MCAL_M_SATURDAY :
3330                                                                                                $day[] = 'SA';
3331                                                                                                break;
3332                                                                                }
3333                                                                        }
3334                                                                }
3335                                                $str .= implode(',', $day);
3336                                                        }
3337                                                        break;
3338                                case MCAL_RECUR_MONTHLY_MDAY :
3339                                                        break;
3340                                case MCAL_RECUR_MONTHLY_WDAY :
3341                                                        break;
3342                                case MCAL_RECUR_YEARLY :
3343                                                        $str .= 'FREQ=YEARLY';
3344                                                        break;
3345                                        }
3346                        if ($event['recur_interval']) {
3347                                $str .= ';INTERVAL=' . $event['recur_interval'];
3348                                        }
3349                        if ($event['recur_enddate']['month'] != 0 && $event['recur_enddate']['mday'] != 0 && $event['recur_enddate']['year'] != 0) {
3350                                                $recur_mktime = $so_event->maketime($event['recur_enddate']) - $GLOBALS['phpgw']->datetime->tz_offset;
3351                                $str .= ';UNTIL=' . date('Ymd\THis\Z', $recur_mktime);
3352                                        }
3353                        $this->parse_value($ical_event, 'rrule', $str, 'vevent');
3354
3355                                        $exceptions = $event['recur_exception'];
3356                        if (is_array($exceptions)) {
3357                                foreach ($exceptions as $except_datetime) {
3358                                        $ical_event['exdate'][] = $this->switch_date(date('Ymd\THis\Z', $except_datetime));
3359                                                }
3360                                        }
3361                                }
3362                                $ical_events[] = $ical_event;
3363                        }
3364
3365                        $ical[$vtype] = $ical_events;
3366
3367                        // iCals are by default utf-8
3368        return $GLOBALS['phpgw']->translation->convert($this->build_ical($ical), $GLOBALS['phpgw']->translation->charset(), 'utf-8');
3369}
3370
3371function freebusy($params = False) {
3372        if (!$params)
3373                $params = $_GET;
3374                        $user  = is_numeric($params['user']) ? (int) $params['user'] : $GLOBALS['phpgw']->accounts->name2id($params['user']);
3375        $start = isset ($params['start']) ? $params['start'] : date('Ymd');
3376        $end = isset ($params['end']) ? $params['end'] : (date('Y') + 1) . date('md');
3377
3378                        $this->bo = CreateObject('calendar.bocalendar');
3379        $events_per_day = $this->bo->store_to_cache(array (
3380                                'owner'  => $user,
3381                'syear' => (int) substr($start, 0, 4),
3382                'smonth' => (int) substr($start, 4, 2),
3383                'sday' => (int) substr($start, 6, 2),
3384                'eyear' => (int) substr($end, 0, 4),
3385                'emonth' => (int) substr($end, 4, 2),
3386                'eday' => (int) substr($end, 6, 2),
3387                                'no_doubles' => True,   // report events only on the startday
3388       
3389                        ));
3390        if (!is_array($events_per_day))
3391                $events_per_day = array ();
3392        $ids = array ();
3393        foreach ($events_per_day as $day => $events) {
3394                foreach ($events as $event) {
3395                                        $ids[] = $event;
3396                                }
3397                        }
3398                        $browser = CreateObject('phpgwapi.browser');
3399        $browser->content_header($GLOBALS['phpgw']->accounts->id2name($user) . '.ifb', 'text/calendar');
3400
3401        echo $this->export(array (
3402                                'vtype'      => 'freebusy',
3403                                'l_event_id' => $ids,
3404               
3405                        ));
3406}
3407
3408function debug($str = '') {
3409        if ($this->debug_str) {
3410                                //echo $str."<br>\n";
3411                                $log = fopen('/tmp/calendar.log', 'a') or die("nao foi possivel abrir o arquivo /tmp/calendar.log");
3412                                fwrite($log, $str . "\n");
3413                                fclose($log);
3414                        }
3415}
3416
3417function updateExParticipantState($cal_uid, $mail, $situation, $cn = false) {
3418        $db = $GLOBALS['phpgw']->db;
3419        $query = 'SELECT ex_participants FROM phpgw_cal WHERE uid = \'' . trim($cal_uid) . '\'';
3420        if (!$db->query($query))
3421                return false;
3422        $row = $db->row(true);
3423
3424        if (!$row)
3425                return false;
3426
3427        include_once (dirname(__FILE__) . '/class.ex_participants.inc.php');
3428        $exParticipants = new exParticipants();
3429        $exParticipants->setParticipantsBySerializable($row['ex_participants']);
3430        $exParticipants->updateParticipant($mail, $situation, $cn);
3431        $query = 'UPDATE phpgw_cal SET ex_participants = \'' . $exParticipants->getParticipantsSerializable() . '\' WHERE uid = \'' . trim($cal_uid) . '\'';
3432        if (!$db->query($query))
3433                return false;
3434
3435        return true;
3436}
3437}
3438?>
Note: See TracBrowser for help on using the repository browser.