source: trunk/calendar/inc/class.bocalendar.inc.php @ 4756

Revision 4756, 140.7 KB checked in by roberto.santosjunior, 13 years ago (diff)

Ticket #1820 - Envio de resposta a um compromisso na agenda. r4601

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1<?php
2  /**************************************************************************\
3  * eGroupWare - Calendar                                                    *
4  * http://www.eGroupWare.org                                                *
5  * Maintained and further developed by RalfBecker@outdoor-training.de       *
6  * Based on Webcalendar by Craig Knudsen <cknudsen@radix.net>               *
7  *          http://www.radix.net/~cknudsen                                  *
8  * Originaly modified by Mark Peters <skeeter@phpgroupware.org>             *
9  * --------------------------------------------                             *
10  *  This program is free software; you can redistribute it and/or modify it *
11  *  under the terms of the GNU General Public License as published by the   *
12  *  Free Software Foundation; either version 2 of the License, or (at your  *
13  *  option) any later version.                                              *
14  \**************************************************************************/
15
16
17        class bocalendar
18        {
19                var $public_functions = Array(
20                        'read_entry'      => True,
21                        'delete_entry'    => True,
22                        'delete_calendar' => True,
23                        'change_owner'    => True,
24                        'update'          => True,
25                        'check_set_default_prefs' => True,
26                        'store_to_cache'  => True,
27                        'export_event'    => True,
28                        'send_alarm'      => True,
29                        'reinstate'       => True
30                );
31
32                var $soap_functions = Array(
33                        'read_entry' => Array(
34                                'in' => Array(
35                                        'int'
36                                ),
37                                'out' => Array(
38                                        'SOAPStruct'
39                                )
40                        ),
41                        'delete_entry' => Array(
42                                'in' => Array(
43                                        'int'
44                                ),
45                                'out' => Array(
46                                        'int'
47                                )
48                        ),
49                        'delete_calendar' => Array(
50                                'in' => Array(
51                                        'int'
52                                ),
53                                'out' => Array(
54                                        'int'
55                                )
56                        ),
57                        'change_owner' => Array(
58                                'in' => Array(
59                                        'array'
60                                ),
61                                'out' => Array(
62                                        'int'
63                                )
64                        ),
65                        'update' => Array(
66                                'in' => Array(
67                                        'array',
68                                        'array',
69                                        'array',
70                                        'array',
71                                        'array'
72                                ),
73                                'out' => Array(
74                                        'array'
75                                )
76                        ),
77                        'store_to_cache'        => Array(
78                                'in' => Array(
79                                        'struct'
80                                ),
81                                'out' => Array(
82                                        'SOAPStruct'
83                                )
84                        ),
85                        'store_to_cache'        => Array(
86                                'in' => Array(
87                                        'array'
88                                ),
89                                'out' => Array(
90                                        'string'
91                                )
92                        ),
93                        'categories' => array(
94                                'in'  => array('bool'),
95                                'out' => array('array')
96                        ),
97                );
98
99                var $wdays;
100
101                var $debug = False;
102//              var $debug = True;
103
104                var $so;
105                var $so1;
106                var $ex_participants;
107                var $cached_events;
108                var $repeating_events;
109                var $day;
110                var $month;
111                var $year;
112                var $prefs;
113
114                var $owner;
115                var $holiday_color;
116                var $printer_friendly = False;
117
118                var $cached_holidays;
119
120                var $g_owner = 0;
121
122                var $filter;
123                var $cat_id;
124                var $users_timeformat;
125
126                var $modified;
127                var $deleted;
128                var $added;
129
130                var $is_group = False;
131
132                var $soap = False;
133
134                var $use_session = False;
135
136                var $today;
137                var $debug_string;
138
139                var $sortby;
140                var $num_months;
141                var $xmlrpc = False;    // not called via xmlrpc
142        var $async = false;
143
144                function bocalendar($session=0)
145                {
146
147                        if(!is_object($GLOBALS['phpgw']->datetime))
148                        {
149                                $GLOBALS['phpgw']->datetime = createobject('phpgwapi.date_time');
150                        }
151
152                        $this->cat = CreateObject('phpgwapi.categories');
153                        $this->grants = $GLOBALS['phpgw']->acl->get_grants('calendar');
154                        @reset($this->grants);
155                        if(DEBUG_APP)
156                        {
157                                if(floor(phpversion()) >= 4)
158                                {
159                                        $this->debug_string = '';
160                                        ob_start();
161                                }
162
163                                foreach($this->grants as $grantor => $rights)
164                                {
165                                        print_debug('Grantor',$grantor);
166                                        print_debug('Rights',$rights);
167                                }
168                        }
169
170                        print_debug('Read use_session',$session);
171
172                        if($session)
173                        {
174                                $this->read_sessiondata();
175                                $this->use_session = True;
176                        }
177                        print_debug('BO Filter',$this->filter);
178                        print_debug('Owner',$this->owner);
179
180                        if ($GLOBALS['argv']) {
181                          $this->async = true;
182                          $this->load_lang();
183                        }
184
185                        $this->prefs['calendar']    = $GLOBALS['phpgw_info']['user']['preferences']['calendar'];
186                        $this->check_set_default_prefs();
187
188                        $owner = get_var('owner',array('GET','POST'),$GLOBALS['owner']);
189
190                        ereg('menuaction=([a-zA-Z.]+)',$_SERVER['HTTP_REFERER'],$regs);
191                        $from = $regs[1];
192                        if ((substr($_SERVER['PHP_SELF'],-8) == 'home.php' && substr($this->prefs['calendar']['defaultcalendar'],0,7) == 'planner'
193                                || $_GET['menuaction'] == 'calendar.uicalendar.planner' &&
194                                $from  != 'calendar.uicalendar.planner' && !$this->save_owner)
195                                && (int)$this->prefs['calendar']['planner_start_with_group'] > 0)
196                        {
197                                // entering planner for the first time ==> saving owner in save_owner, setting owner to default
198                                //
199                                $this->save_owner = $this->owner;
200                                $owner = 'g_'.$this->prefs['calendar']['planner_start_with_group'];
201                        }
202                        elseif ($_GET['menuaction'] != 'calendar.uicalendar.planner' &&
203                                $this->save_owner)
204                        {
205                                // leaving planner with an unchanged user/owner ==> setting owner back to save_owner
206                                //
207                                $owner = (int)(isset($_GET['owner']) ? $_GET['owner'] : $this->save_owner);
208                                unset($this->save_owner);
209                        }
210                        elseif (!empty($owner) && $owner != $this->owner && $from == 'calendar.uicalendar.planner')
211                        {
212                                // user/owner changed within planner ==> forgetting save_owner
213                                //
214                                unset($this->save_owner);
215                        }
216
217                        if(isset($owner) && $owner!='' && substr($owner,0,2) == 'g_')
218                        {
219                                $this->set_owner_to_group(substr($owner,2));
220                        }
221                        elseif(isset($owner) && $owner!='')
222                        {
223                                $this->owner = (int)$owner;
224                        }
225                        elseif(!@isset($this->owner) || !@$this->owner)
226                        {
227                                $this->owner = (int)$GLOBALS['phpgw_info']['user']['account_id'];
228                        }
229                        elseif(isset($this->owner) && $GLOBALS['phpgw']->accounts->get_type($this->owner) == 'g')
230                        {
231                                $this->set_owner_to_group((int)$this->owner);
232                        }
233
234                        $this->prefs['common']    = $GLOBALS['phpgw_info']['user']['preferences']['common'];
235
236                        if ($this->prefs['common']['timeformat'] == '12')
237                        {
238                                $this->users_timeformat = 'h:ia';
239                        }
240                        else
241                        {
242                                $this->users_timeformat = 'H:i';
243                        }
244                        $this->holiday_color = (substr($GLOBALS['phpgw_info']['theme']['bg07'],0,1)=='#'?'':'#').$GLOBALS['phpgw_info']['theme']['bg07'];
245
246                        $friendly = (isset($_GET['friendly'])?$_GET['friendly']:'');
247                        $friendly = ($friendly=='' && isset($_POST['friendly'])?$_POST['friendly']:$friendly);
248
249                        $this->printer_friendly = ((int)$friendly == 1?True:False);
250
251                        if(isset($_POST['filter'])) { $this->filter = $_POST['filter']; }
252                        if(isset($_POST['sortby'])) { $this->sortby = $_POST['sortby']; }
253                        if(isset($_POST['cat_id'])) { $this->cat_id = $_POST['cat_id']; }
254
255                        if(!isset($this->filter))
256                        {
257                                $this->filter = ' '.$this->prefs['calendar']['defaultfilter'].' ';
258                        }
259
260                        if(!isset($this->sortby))
261                        {
262                                $this->sortby = $this->prefs['calendar']['defaultcalendar'] == 'planner_user' ? 'user' : 'category';
263                        }
264
265                        if($GLOBALS['phpgw']->accounts->get_type($this->owner)=='g')
266                        {
267                                $this->filter = ' all ';
268                        }
269
270                        $this->so = CreateObject('calendar.socalendar',
271                                Array(
272                                        'owner'         => $this->owner,
273                                        'filter'        => $this->filter,
274                                        'category'      => $this->cat_id,
275                                        'g_owner'       => $this->g_owner
276                                )
277                        );
278                        $this->rpt_day = array( // need to be after creation of socalendar
279                                MCAL_M_SUNDAY    => 'Sunday',
280                                MCAL_M_MONDAY    => 'Monday',
281                                MCAL_M_TUESDAY   => 'Tuesday',
282                                MCAL_M_WEDNESDAY => 'Wednesday',
283                                MCAL_M_THURSDAY  => 'Thursday',
284                                MCAL_M_FRIDAY    => 'Friday',
285                                MCAL_M_SATURDAY  => 'Saturday'
286                        );
287                        if($this->bo->prefs['calendar']['weekdaystarts'] != 'Sunday')
288                        {
289                                $mcals = array_keys($this->rpt_day);
290                                $days  = array_values($this->rpt_day);
291                                $this->rpt_day = array();
292                                list($n) = $found = array_keys($days,$this->prefs['calendar']['weekdaystarts']);
293                                for ($i = 0; $i < 7; ++$i,++$n)
294                                {
295                                        $this->rpt_day[$mcals[$n % 7]] = $days[$n % 7];
296                                }
297                        }
298                        $this->rpt_type = Array(
299                                MCAL_RECUR_NONE         => 'None',
300                                MCAL_RECUR_DAILY        => 'Daily',
301                                MCAL_RECUR_WEEKLY       => 'Weekly',
302            //MCAL_RECUR_MONTHLY_WDAY   => 'Monthly (by day)',
303                                MCAL_RECUR_MONTHLY_MDAY => 'Monthly (by date)',
304                                MCAL_RECUR_YEARLY       => 'Yearly'
305                        );
306
307                        $localtime = $GLOBALS['phpgw']->datetime->users_localtime;
308
309                        $date = (isset($GLOBALS['date'])?$GLOBALS['date']:'');
310                        $date = (isset($_GET['date'])?$_GET['date']:$date);
311                        $date = ($date=='' && isset($_POST['date'])?$_POST['date']:$date);
312
313                        $year = (isset($_GET['year'])?$_GET['year']:'');
314                        $year = ($year=='' && isset($_POST['year'])?$_POST['year']:$year);
315
316                        $month = (isset($_GET['month'])?$_GET['month']:'');
317                        $month = ($month=='' && isset($_POST['month'])?$_POST['month']:$month);
318
319                        $day = (isset($_GET['day'])?$_GET['day']:'');
320                        $day = ($day=='' && isset($_POST['day'])?$_POST['day']:'');
321
322                        $num_months = (isset($_GET['num_months'])?$_GET['num_months']:'');
323                        $num_months = ($num_months=='' && isset($_POST['num_months'])?$_POST['num_months']:$num_months);
324
325                        if(isset($date) && $date!='')
326                        {
327                                $this->year  = (int)(substr($date,0,4));
328                                $this->month = (int)(substr($date,4,2));
329                                $this->day   = (int)(substr($date,6,2));
330                        }
331                        else
332                        {
333                                if(isset($year) && $year!='')
334                                {
335                                        $this->year = $year;
336                                }
337                                else
338                                {
339                                        $this->year = date('Y',$localtime);
340                                }
341                                if(isset($month) && $month!='')
342                                {
343                                        $this->month = $month;
344                                }
345                                else
346                                {
347                                        $this->month = date('m',$localtime);
348                                }
349                                if(isset($day) && $day!='')
350                                {
351                                        $this->day = $day;
352                                }
353                                else
354                                {
355                                        $this->day = date('d',$localtime);
356                                }
357                        }
358
359                        if(isset($num_months) && $num_months!='')
360                        {
361                                $this->num_months = $num_months;
362                        }
363                        elseif($this->num_months == 0)
364                        {
365                                $this->num_months = 1;
366                        }
367
368                        $this->today = date('Ymd',$GLOBALS['phpgw']->datetime->users_localtime);
369
370                        if(DEBUG_APP)
371                        {
372                                print_debug('BO Filter','('.$this->filter.')');
373                                print_debug('Owner',$this->owner);
374                                print_debug('Today',$this->today);
375                                if(floor(phpversion()) >= 4)
376                                {
377                                        $this->debug_string .= ob_get_contents();
378                                        ob_end_clean();
379                                }
380                        }
381                        $this->xmlrpc = is_object($GLOBALS['server']) && $GLOBALS['server']->last_method;
382                        $this->wdays = Array(MCAL_M_SUNDAY,MCAL_M_MONDAY,MCAL_M_TUESDAY,MCAL_M_WEDNESDAY,
383                            MCAL_M_THURSDAY,MCAL_M_FRIDAY,MCAL_M_SATURDAY);
384                }
385
386                function delegar($idDelegador,$idDelegado,$idEvento) {
387
388                        $this->so->cal->stream->lock(array("phpgw_cal_user"));
389                       
390                        if(substr($idDelegado,-1) == 'U') {
391                            $idDelegado = substr($idDelegado,0,-1);
392                        }
393
394                        $sql = "SELECT * FROM phpgw_cal_user where cal_id=$idEvento and cal_login=$idDelegado";
395
396                        if($idDelegado != '')
397                        {
398                                $this->so->cal->stream->query($sql,__LINE__,__FILE__);
399                                if($this->so->cal->stream->next_record())
400                                {
401                                        throw new Exception("The selected User is already included in this event");
402                                }else{
403                                        $sql = "update phpgw_cal_user set cal_login = $idDelegado,cal_status='U' where cal_id=$idEvento
404                                                and cal_login=$idDelegador";
405
406                                        $this->so->cal->stream->query($sql,__LINE__,__FILE__,0,-1,true);
407                               
408                                        $event = $this->so->read_entry($idEvento);
409
410                                        $this->send_update(MSG_ADDED,array($idDelegado => 'U'),$event,$event);
411                                }
412                        }else {
413                                throw new Exception('999');
414                        }
415
416                        $this->so->cal->stream->unlock();
417                }
418
419          function load_lang() {
420            if(!$_SESSION['phpgw_info']['calendar']['langAlarm'])
421              {
422                $array_keys = array();
423                $fn = '../../calendar/setup/phpgw_alarm_'.$GLOBALS['phpgw_info']['user']['preferences']['common']['lang'].'.lang';                     
424                echo $fn;
425                if (file_exists($fn)){
426                  $fp = fopen($fn,'r');
427                  while ($data = fgets($fp,16000))      {
428                    list($message_id,$app_name,$null,$content) = explode("\t",substr($data,0,-1));                     
429                    $_SESSION['phpgw_info']['calendar']['langAlarm'][$message_id] =  $content;
430                  }
431                  fclose($fp);
432                }
433              }
434          }
435                function list_methods($_type='xmlrpc')
436                {
437                        /*
438                          This handles introspection or discovery by the logged in client,
439                          in which case the input might be an array.  The server always calls
440                          this function to fill the server dispatch map using a string.
441                        */
442                        if (is_array($_type))
443                        {
444                                $_type = $_type['type'];
445                        }
446                        switch($_type)
447                        {
448                                case 'xmlrpc':
449                                        $xml_functions = array(
450                                                'list_methods' => array(
451                                                        'function'  => 'list_methods',
452                                                        'signature' => array(array(xmlrpcStruct,xmlrpcString)),
453                                                        'docstring' => lang('Read this list of methods.')
454                                                ),
455                                                'read' => array(
456                                                        'function'  => 'read_entry',
457                                                        'signature' => array(array(xmlrpcStruct,xmlrpcInt)),
458                                                        'docstring' => lang('Read a single entry by passing the id and fieldlist.')
459                                                ),
460                                                'read_entry' => array(  // deprecated, use read
461                                                        'function'  => 'read_entry',
462                                                        'signature' => array(array(xmlrpcStruct,xmlrpcInt)),
463                                                        'docstring' => lang('Read a single entry by passing the id and fieldlist.')
464                                                ),
465                                                'write' => array(
466                                                        'function'  => 'update',
467                                                        'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
468                                                        'docstring' => lang('Add or update a single entry by passing the fields.')
469                                                ),
470                                                'add_entry' => array(   // deprecated, use write
471                                                        'function'  => 'update',
472                                                        'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
473                                                        'docstring' => lang('Add a single entry by passing the fields.')
474                                                ),
475                                                'update_entry' => array(        // deprecated, use write
476                                                        'function'  => 'update',
477                                                        'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
478                                                        'docstring' => lang('Update a single entry by passing the fields.')
479                                                ),
480                                                'delete' => array(
481                                                        'function'  => 'delete_entry',
482                                                        'signature' => array(array(xmlrpcInt,xmlrpcInt)),
483                                                        'docstring' => lang('Delete a single entry by passing the id.')
484                                                ),
485                                                'delete_entry' => array(        // deprecated, use delete
486                                                        'function'  => 'delete_entry',
487                                                        'signature' => array(array(xmlrpcInt,xmlrpcInt)),
488                                                        'docstring' => lang('Delete a single entry by passing the id.')
489                                                ),
490                                                'delete_calendar' => array(
491                                                        'function'  => 'delete_calendar',
492                                                        'signature' => array(array(xmlrpcInt,xmlrpcInt)),
493                                                        'docstring' => lang('Delete an entire users calendar.')
494                                                ),
495                                                'change_owner' => array(
496                                                        'function'  => 'change_owner',
497                                                        'signature' => array(array(xmlrpcInt,xmlrpcStruct)),
498                                                        'docstring' => lang('Change all events for $params[\'old_owner\'] to $params[\'new_owner\'].')
499                                                ),
500                                                'search' => array(
501                                                        'function'  => 'store_to_cache',
502                                                        'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
503                                                        'docstring' => lang('Read a list of entries.')
504                                                ),
505                                                'store_to_cache' => array(      // deprecated, use search
506                                                        'function'  => 'store_to_cache',
507                                                        'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
508                                                        'docstring' => lang('Read a list of entries.')
509                                                ),
510                                                'export_event' => array(
511                                                        'function'  => 'export_event',
512                                                        'signature' => array(array(xmlrpcString,xmlrpcStruct)),
513                                                        'docstring' => lang('Export a list of entries in iCal format.')
514                                                ),
515                                                'categories' => array(
516                                                        'function'  => 'categories',
517                                                        'signature' => array(array(xmlrpcStruct,xmlrpcStruct)),
518                                                        'docstring' => lang('List all categories.')
519                                                ),
520                                        );
521                                        return $xml_functions;
522                                        break;
523                                case 'soap':
524                                        return $this->soap_functions;
525                                        break;
526                                default:
527                                        return array();
528                                        break;
529                        }
530                }
531
532                function set_owner_to_group($owner)
533                {
534                        print_debug('calendar::bocalendar::set_owner_to_group:owner',$owner);
535                        $this->owner = (int)$owner;
536                        $this->is_group = True;
537                        $this->g_owner = Array();
538                        $members = $GLOBALS['phpgw']->accounts->member($owner);
539                        if (is_array($members))
540                        {
541                                foreach($members as $user)
542                                {
543                                        // use only members which gave the user a read-grant
544                                        if ($this->check_perms(PHPGW_ACL_READ,0,$user['account_id']))
545                                        {
546                                                $this->g_owner[] = $user['account_id'];
547                                        }
548                                }
549                        }
550                        //echo "<p>".function_backtrace().": set_owner_to_group($owner) = ".print_r($this->g_owner,True)."</p>\n";
551                }
552
553                function member_of_group($owner=0)
554                {
555                        $owner = ($owner==0?$GLOBALS['phpgw_info']['user']['account_id']:$owner);
556                        $group_owners = $GLOBALS['phpgw']->accounts->membership();
557                        while($group_owners && list($index,$group_info) = each($group_owners))
558                        {
559                                if($this->owner == $group_info['account_id'])
560                                {
561                                        return True;
562                                }
563                        }
564                        return False;
565                }
566
567                function save_sessiondata($data='')
568                {
569                        if ($this->use_session)
570                        {
571                                if (!is_array($data))
572                                {
573                                        $data = array(
574                                                'filter'     => $this->filter,
575                                                'cat_id'     => $this->cat_id,
576                                                'owner'      => $this->owner,
577                                                'save_owner' => $this->save_owner,
578                                                'year'       => $this->year,
579                                                'month'      => $this->month,
580                                                'day'        => $this->day,
581                                                'date'       => $this->date,
582                                                'sortby'     => $this->sortby,
583                                                'num_months' => $this->num_months,
584                                                'return_to'  => $this->return_to
585                                        );
586                                }
587                                if($this->debug)
588                                {
589                                        if(floor(phpversion()) >= 4)
590                                        {
591                                                ob_start();
592                                        }
593                                        echo '<!-- '."\n".'Save:'."\n"._debug_array($data,False)."\n".' -->'."\n";
594                                        if(floor(phpversion()) >= 4)
595                                        {
596                                                $this->debug_string .= ob_get_contents();
597                                                ob_end_clean();
598                                        }
599                                }
600                                $GLOBALS['phpgw']->session->appsession('session_data','calendar',$data);
601                        }
602                }
603
604                function read_sessiondata()
605                {
606                        $data = $GLOBALS['phpgw']->session->appsession('session_data','calendar');
607                        print_debug('Read',_debug_array($data,False));
608
609                        $this->filter = $data['filter'];
610                        $this->cat_id = $data['cat_id'];
611                        $this->sortby = $data['sortby'];
612                        $this->owner  = (int)$data['owner'];
613                        $this->save_owner = (int)$data['save_owner'];
614                        $this->year   = (int)$data['year'];
615                        $this->month  = (int)$data['month'];
616                        $this->day    = (int)$data['day'];
617                        $this->num_months = (int)$data['num_months'];
618                        $this->return_to = $data['return_to'];
619                }
620
621                function read_entry($id,$ignore_acl=False)
622                {
623                        if (is_array($id) && count($id) == 1)
624                        {
625                                list(,$id) = each($id);
626                        }
627                        if($ignore_acl || $this->check_perms(PHPGW_ACL_READ,$id))
628                        {
629                                $event = $this->so->read_entry($id);
630                                if(!isset($event['participants'][$this->owner]) && $this->user_is_a_member($event,$this->owner))
631                                {
632                                        $this->so->add_attribute('participants','U',(int)$this->owner);
633                                        $this->so->add_entry($event);
634                                        $event = $this->get_cached_event();
635                                }
636                                return $this->xmlrpc ? $this->xmlrpc_prepare($event) : $event;
637                        }
638                        if ($this->xmlrpc)
639                        {
640                                $GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['no_access'],$GLOBALS['xmlrpcstr']['no_access']);
641                        }
642                        return False;
643                }
644
645                function delete_single($param)
646                {
647                        if($this->check_perms(PHPGW_ACL_DELETE,(int)$param['id']))
648                        {
649                                $temp_event = $this->get_cached_event();
650                                $event = $this->read_entry((int)$param['id']);
651//                              if($this->owner == $event['owner'])
652//                              {
653                                $exception_time = mktime($event['start']['hour'],$event['start']['min'],0,$param['month'],$param['day'],$param['year']) - $GLOBALS['phpgw']->datetime->tz_offset;
654                                $event['recur_exception'][] = (int)$exception_time;
655                                $this->so->cal->event = $event;
656//                              print_debug('exception time',$event['recur_exception'][count($event['recur_exception']) -1]);
657//                              print_debug('count event exceptions',count($event['recur_exception']));
658                                $this->so->add_entry($event);
659                                $cd = 16;
660
661                                $this->so->cal->event = $temp_event;
662                                unset($temp_event);
663                        }
664                        else
665                        {
666                                $cd = 60;
667                        }
668//                      }
669                        return $cd;
670                }
671
672                function delete_entry($id)
673                {
674                        if (is_array($id) && count($id) == 1)
675                        {
676                                list(,$id) = each($id);
677                        }
678                        if($this->check_perms(PHPGW_ACL_DELETE,$id))
679                        {
680                                $this->so->delete_entry($id);
681
682                                if ($this->xmlrpc)
683                                {
684                                        $this->so->expunge($id);
685                                }
686                                return $this->xmlrpc ? True : 16;
687                        }
688                        if ($this->xmlrpc)
689                        {
690                                $GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['no_access'],$GLOBALS['xmlrpcstr']['no_access']);
691                        }
692                        return 60;
693                }
694
695                function reinstate($params='')
696                {
697                        if($this->check_perms(PHPGW_ACL_EDIT,$params['cal_id']) && isset($params['reinstate_index']))
698                        {
699                                $event = $this->so->read_entry($params['cal_id']);
700                                @reset($params['reinstate_index']);
701                                print_debug('Count of reinstate_index',count($params['reinstate_index']));
702                                if(count($params['reinstate_index']) > 1)
703                                {
704                                        while(list($key,$value) = each($params['reinstate_index']))
705                                        {
706                                                print_debug('reinstate_index ['.$key.']',(int)$value);
707                                                print_debug('exception time',$event['recur_exception'][(int)$value]);
708                                                unset($event['recur_exception'][(int)$value]);
709                                                print_debug('count event exceptions',count($event['recur_exception']));
710                                        }
711                                }
712                                else
713                                {
714                                        print_debug('reinstate_index[0]',(int)$params['reinstate_index'][0]);
715                                        print_debug('exception time',$event['recur_exception'][(int)$params['reinstate_index'][0]]);
716                                        unset($event['recur_exception'][(int)$params['reinstate_index'][0]]);
717                                        print_debug('count event exceptions',count($event['recur_exception']));
718                                }
719                                $this->so->cal->event = $event;
720                                $this->so->add_entry($event);
721                                return 42;
722                        }
723                        else
724                        {
725                                return 43;
726                        }
727                }
728
729                function delete_calendar($owner)
730                {
731                        if($GLOBALS['phpgw_info']['user']['apps']['admin'])
732                        {
733                                $this->so->delete_calendar($owner);
734                        }
735                }
736
737                function change_owner($params='')
738                {
739                        if($GLOBALS['phpgw_info']['server']['calendar_type'] == 'sql')
740                        {
741                                if(is_array($params))
742                                {
743                                        $this->so->change_owner($params['old_owner'],$params['new_owner']);
744                                }
745                        }
746                }
747
748                function expunge()
749                {
750                        reset($this->so->cal->deleted_events);
751                        while(list($i,$event_id) = each($this->so->cal->deleted_events))
752                        {
753                                $event = $this->so->read_entry($event_id);
754                                if(!$this->ex_participants)
755                                        $this->ex_participants = html_entity_decode($event['ex_participants']);                 
756                                if($this->check_perms(PHPGW_ACL_DELETE,$event))
757                                {
758                                        $this->send_update(MSG_DELETED,$event['participants'],$event);
759                                }
760                                else
761                                {
762                                        unset($this->so->cal->deleted_events[$i]);
763                                }
764                        }
765                        $this->so->expunge();
766                }
767
768                function search_keywords($keywords)
769                {
770                        $type = $GLOBALS['phpgw']->accounts->get_type($this->owner);
771
772                        if($type == 'g')
773                        {
774                                $members = $GLOBALS['phpgw']->acl->get_ids_for_location($this->owner, 1, 'phpgw_group');
775                        }
776                        else
777                        {
778                                $members = array_keys($this->grants);
779
780                                if (!in_array($this->owner,$members))
781                                {
782                                        $members[] = $this->owner;
783                                }
784                        }
785                        foreach($members as $n => $uid)
786                        {
787                                if (!($this->grants[$uid] & PHPGW_ACL_READ))
788                                {
789                                        unset($members[$n]);
790                                }
791                        }
792                        return $this->so->list_events_keyword($keywords,$members);
793                }
794
795                function getNextDow($start){
796                    if ($start == 6)
797                    {
798                        return 0;
799                    }
800                    else
801                    {
802                        return $start + 1;
803                    }
804                }
805
806                // TODO: Levar em consideração no cálculo das ocorrências o parâmetro
807                // $event['recur_interval']
808                function expand_repetition($event){
809                    $return = Array();
810
811                    $event['recur_enddate']['hour'] = 24;
812                    $enddate = $this->maketime($event['recur_enddate']);
813
814                    $owner = $event['owner'];
815                    $participants = $event['participants'];
816
817            //        $new_event = Array();
818            //        $new_event['owner'] = $owner;
819            //        $new_event['participants'] = $participants;
820            //        $new_event['start'] = $event['start'];
821            //        $new_event['end'] = $event['end'];
822            //
823            //        $return[] = $new_event;
824
825                    switch($event['recur_type']) {
826                        case MCAL_RECUR_DAILY:
827                            // add 1 day = 86400 sec
828                            $starttime = $this->maketime($event['start']);
829                            $endtime = $this->maketime($event['end']);
830
831                            $offset = 86400;
832                            for (; $starttime <= $enddate;
833                                $starttime = $starttime+$offset,
834                                $endtime = $endtime+$offset)
835                            {
836                                $new_event = Array();
837                                $new_event['owner'] = $owner;
838                                $new_event['participants'] = $participants;
839                                $new_event['start'] = $starttime;
840                                $new_event['end'] = $endtime;
841                                $return[] = $new_event;
842                            }
843
844                            break;
845                        case MCAL_RECUR_WEEKLY:
846
847                            $setDow = (int)date('w',$this->maketime($event['start']));
848                            $dowOffsets = Array();
849                            $firstDow;
850                            $firstDowOffset = 0;
851
852                            // Initializing do
853                            $mask = $this->wdays[$setDow];
854                            $firstDayMismatch = False;
855                            if (((int)$event['recur_data'] & $mask) == 0){
856                                $firstDayMismatch = True;
857                            }
858
859                            $dow = $setDow;
860
861                            for ($nextDow = $setDow; array_sum($dowOffsets) < 7;)
862                            {
863
864                                $nextDow = $this->getNextDow($nextDow);
865                                $mask = $this->wdays[$nextDow];
866
867                                if (((int)$event['recur_data'] & $mask) != 0)
868                                {
869                                    if ($firstDayMismatch and $firstDowOffset == 0)
870                                    {
871                                        if ($dow < $nextDow)
872                                        {
873                                            $firstDowOffset = $nextDow - $dow;
874                                        }
875                                        else if ($dow > $nextDow)
876                                        {
877                                            $firstDowOffset = (7 - $dow) + $nextDow;
878                                        }
879                                    }
880                                    else
881                                    {
882                                        if ($dow < $nextDow)
883                                        {
884                                            $dowOffsets[] = $nextDow - $dow;
885                                        }
886                                        else if ($dow > $nextDow)
887                                        {
888                                            $dowOffsets[] = (7 - $dow) + $nextDow;
889                                        }
890                                        else
891                                        {
892                                            $dowOffsets[] = 7;
893                                        }
894
895                                    }
896
897                                    $dow = $nextDow;
898                                    if (!isset($firstDow))
899                                    {
900                                        $firstDow = $dow;
901                                    }
902
903                                }
904
905            //                    $nextDow = $this->getNextDow($nextDow);
906            //                    $mask = $this->wdays[$nextDow];
907
908                            }
909
910                            if ($firstDayMismatch)
911                            {
912                                if ($dow < $firstDow)
913                                {
914                                    $dowOffsets[] = $firstDow - $dow;
915                                }
916                                else if ($dow > $firstDow)
917                                {
918                                    $dowOffsets[] = (7 - $dow) + $firstDow;
919                                }
920                            }
921
922                            // Gera os eventos
923                            $starttime = $this->maketime($event['start']);
924                            $endtime = $this->maketime($event['end']);
925                            $offset = 86400;
926
927                            $new_event = Array();
928                            $new_event['owner'] = $owner;
929                            $new_event['participants'] = $participants;
930                            $new_event['start'] = $starttime;
931                            $new_event['end'] = $endtime;
932                            $return[] = $new_event;
933
934                            if ($firstDayMismatch && $firstDowOffset != 0)
935                            {
936                                $multi = $firstDowOffset;
937
938                                $new_event = Array();
939                                $new_event['owner'] = $owner;
940                                $new_event['participants'] = $participants;
941                                $new_event['start'] = $starttime += $offset*$multi;
942                                $new_event['end'] = $endtime += $offset*$multi;
943                                $return[] = $new_event;
944                            }
945
946                            for ($i = 0, $multi = $dowOffsets[$i],
947                                $starttime += $offset*$multi,
948                                $endtime += $offset*$multi;
949                                $starttime <= $enddate;
950                                $i++,
951                                $i = ($i < count($dowOffsets))?$i:0,
952                                $multi = $dowOffsets[$i],
953                                $starttime += $offset*$multi,
954                                $endtime += $offset*$multi)
955                            {
956                                //error_log('loop infinito?');
957                                $new_event = Array();
958                                $new_event['owner'] = $owner;
959                                $new_event['participants'] = $participants;
960                                $new_event['start'] = $starttime; // + $offset*$multi;
961                                $new_event['end'] = $endtime; // + $offset*$multi;
962                                $return[] = $new_event;
963                            }
964
965
966                            break;
967                        case MCAL_RECUR_MONTHLY_WDAY:
968                            // Not working!!!
969                            break;
970                        case MCAL_RECUR_MONTHLY_MDAY:
971                        case MCAL_RECUR_YEARLY:
972
973                            for ($key = ($event['recur_type'] == MCAL_RECUR_YEARLY)?'year':'month',
974                                $starttime = $event['start'], $endtime = $event['end'];
975                                $this->maketime($starttime) <= $enddate;
976                                $starttime['year'] = ($key == 'month' && $starttime['month'] == 12)?$starttime['year']+1:$starttime['year'],
977                                $endtime['year'] = ($key == 'month' && $endtime['month'] == 12)?$endtime['year']+1:$endtime['year'],
978                                $starttime[$key] = ($key == 'year')?$starttime[$key]+1:($key == 'month' && $starttime[$key] < 12)?$starttime[$key]+1:1,
979                                $endtime[$key] = ($key == 'year')?$endtime[$key]+1:($key == 'month' && $endtime[$key] < 12)?$endtime[$key]+1:1)
980                            {
981                                $new_event = Array();
982                                $new_event['owner'] = $owner;
983                                $new_event['participants'] = $participants;
984                                $new_event['start'] = $this->maketime($starttime);
985                                $new_event['end'] = $this->maketime($endtime);
986                                $return[] = $new_event;
987                            }
988
989                            break;
990            //            default:
991            //                return Array();
992
993                    }
994
995                    return $return;
996                }
997
998                function update($params='')
999                {
1000                       
1001                        if($params['from_mobile']) {
1002                                $ui_return = "mobile.ui_mobilecalendar.edit";
1003                                $ui_index = "mobile.ui_mobilecalendar.index";
1004                                $ui_overlap = "mobile.ui_mobilecalendar.overlap";
1005                        }
1006                        else {
1007                                $ui_return = "calendar.uicalendar.edit";
1008                                $ui_index = "calendar.uicalendar.index";               
1009                                $ui_overlap = "calendar.uicalendar.overlap";
1010                        }
1011                       
1012                        if(!is_object($GLOBALS['phpgw']->datetime))
1013                        {
1014                                $GLOBALS['phpgw']->datetime = createobject('phpgwapi.date_time');
1015                        }
1016
1017                        $l_cal = (@isset($params['cal']) && $params['cal']?$params['cal']:$_POST['cal']);
1018
1019                        $post_max_size = ini_get('post_max_size');
1020                        $mul = substr($post_max_size, -1);
1021                        $mul = ($mul == 'M' ? 1048576 : ($mul == 'K' ? 1024 : ($mul == 'G' ? 1073741824 : 1)));
1022                        if ($_SERVER['CONTENT_LENGTH'] > $mul*(int)$post_max_size && $post_max_size)
1023                             $l_cal['attachment'] = 'ERROR';
1024
1025                        if(count($_FILES['cal']) > 0){
1026
1027                            if($l_cal['attachment'] != '')
1028                               $attachments = unserialize($l_cal['attachment']);
1029                            else
1030                               $attachments = Array();
1031
1032                            foreach ($_FILES['cal']['error']['attachment'] as $key => $error) {
1033
1034                                if ($error == UPLOAD_ERR_OK) {
1035
1036                                    $new_file= $GLOBALS['phpgw_info']['server']['temp_dir'].'/'.$_SESSION[ 'phpgw_session' ][ 'session_id' ].md5($attachment['name'].microtime());
1037                                    move_uploaded_file($_FILES['cal']['tmp_name']['attachment'][$key], $new_file);
1038                                    $attach = Array('tmp_name' => $new_file, 'name' => $_FILES['cal']['name']['attachment'][$key], 'type' =>  $_FILES['cal']['type']['attachment'][$key]);
1039
1040                                    $attachments[] = $attach;
1041
1042                                }elseif($error == UPLOAD_ERR_INI_SIZE){
1043                                    $attachments = 'ERROR';
1044                                    break;
1045
1046                                }
1047                            }
1048                            $l_cal['attachment'] = $attachments;
1049
1050                        }
1051                        $l_participants = (@$params['participants']?$params['participants']:$_POST['participants']);
1052                        $this->ex_participants = (@$params['ex_participants']?$params['ex_participants']:$_POST['ex_participants']);
1053                        $l_categories = (@$params['categories']?$params['categories']:$_POST['categories']);
1054                        $l_start = (@isset($params['start']) && $params['start']?$params['start']:$_POST['start']);
1055                        $l_end = (@isset($params['end']) && $params['end']?$params['end']:$_POST['end']);
1056                        $l_recur_enddate = (@isset($params['recur_enddate']) && $params['recur_enddate']?$params['recur_enddate']:$_POST['recur_enddate']);
1057
1058                       
1059                        $send_to_ui = True;
1060                        //if ((!is_array($l_start) || !is_array($l_end)) && !isset($_GET['readsess']))  // xmlrpc call
1061                        if ($this->xmlrpc)      // xmlrpc call
1062                        {
1063                                $send_to_ui = False;
1064
1065                                $l_cal = $params;       // no extra array
1066
1067                                foreach(array('start','end','recur_enddate') as $name)
1068                                {
1069                                        $var = 'l_'.$name;
1070                                        $$var = $GLOBALS['server']->iso86012date($params[$name]);
1071                                        unset($l_cal[$name]);
1072                                }
1073                                if (!is_array($l_participants) || !count($l_participants))
1074                                {
1075                                        $l_participants = array($GLOBALS['phpgw_info']['user']['account_id'].'A');
1076                                }
1077                                else
1078                                {
1079                                        $l_participants = array();
1080                                        foreach($params['participants'] as $user => $data)
1081                                        {
1082                                                $l_participants[] = $user.$data['status'];
1083                                        }
1084                                }
1085                                unset($l_cal['participants']);
1086
1087                                if (!is_object($GLOBALS['phpgw']->categories))
1088                                {
1089                                        $GLOBALS['phpgw']->categories = CreateObject('phpgwapi.categories');
1090                                }
1091                                $l_categories = $GLOBALS['server']->xmlrpc2cats($params['category']);
1092                                unset($l_cal['category']);
1093
1094                                // using access={public|private} in all modules via xmlrpc
1095                                $l_cal['public'] = $params['access'] != 'private';
1096                                unset($l_cal['access']);
1097/*
1098                                $fp = fopen('/tmp/xmlrpc.log','a+');
1099                                ob_start();
1100                                echo "\nbocalendar::update("; print_r($params); echo ")\n";
1101                                //echo "\nl_start="; print_r($l_start);
1102                                //echo "\nl_end="; print_r($l_end);
1103                                fwrite($fp,ob_get_contents());
1104                                ob_end_clean();
1105                                fclose($fp);
1106*/
1107                        }
1108                        print_debug('ID',$l_cal['id']);
1109
1110                        // don't wrap to the next day for no time
1111                        if ($l_end['hour'] == 24 && $l_end['min'] == 0)
1112                        {
1113                                $l_end['hour'] = 23;
1114                                $l_end['min'] = 59;
1115                        }
1116
1117                        if(isset($_GET['readsess']))
1118                        {
1119                                $event = $this->restore_from_appsession();
1120                                $event['title'] = stripslashes($event['title']);
1121                                $event['description'] = stripslashes($event['description']);
1122                                $event['observations'] = stripslashes($event['observations']);
1123                                $event['ex_participants'] = stripslashes($event['ex_participants']);
1124                                $datetime_check = $this->validate_update($event);
1125                                if($datetime_check)
1126                                {
1127                                        ExecMethod($ui_return,
1128                                                Array(
1129                                                        'cd'            => $datetime_check,
1130                                                        'readsess'      => 1
1131                                                )
1132                                        );
1133                                        if(!$params['from_mobile'])
1134                                                $GLOBALS['phpgw']->common->phpgw_exit(True);
1135                                        else
1136                                                return;
1137                                }
1138                                $overlapping_events = False;
1139                        }
1140                        else
1141                        {
1142                                if((!$l_cal['id'] && !$this->check_perms(PHPGW_ACL_ADD)) ||
1143                                   ($l_cal['id'] && !$this->check_perms(PHPGW_ACL_EDIT,$l_cal['id'])))
1144                                {
1145                                        if ($this->xmlrpc)
1146                                        {
1147                                                $GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['no_access'],$GLOBALS['xmlrpcstr']['no_access']);
1148                                        }
1149                                        if (!$send_to_ui)
1150                                        {
1151                                                return array(($l_cal['id']?1:2) => 'permission denied');
1152                                        }
1153                                        ExecMethod($ui_index);
1154                                        if(!$params['from_mobile'])
1155                                                $GLOBALS['phpgw']->common->phpgw_exit();
1156                                        else
1157                                                return;
1158                                }
1159
1160                                print_debug('Prior to fix_update_time()');
1161                                $this->fix_update_time($l_start);
1162                                $this->fix_update_time($l_end);
1163                                if(!isset($l_cal['ex_participants']))
1164                                {
1165                                        $l_cal['ex_participants'] = $this->ex_participants;
1166                                }
1167
1168                                if(!isset($l_categories))
1169                                {
1170                                        $l_categories = 0;
1171                                }
1172
1173                                $is_public = ($l_cal['type'] != 'private' && $l_cal['type'] != 'privateHiddenFields');
1174                                $this->so->event_init();
1175                                $this->add_attribute('uid',$l_cal['uid']);
1176                                $this->add_attribute('type',$l_cal['type']);
1177                                if($l_cal['ex_participants']) {
1178                                        $this->add_attribute('ex_participants',$l_cal['ex_participants']);
1179                                }
1180                                if(count($l_categories) >= 2)
1181                                {
1182                                        $this->so->set_category(implode(',',$l_categories));
1183                                }
1184                                else
1185                                {
1186                                        $this->so->set_category(strval($l_categories[0]));
1187                                }
1188                                $this->so->set_title($l_cal['title']);
1189                                $this->so->set_description($l_cal['description']);
1190                                $this->so->set_observations($l_cal['observations']);
1191                                $this->so->set_notifications_owner($l_cal['notifications_owner']);
1192                                $this->so->set_attachment($l_cal['attachment']);
1193                                $this->so->set_ex_participants($l_cal['ex_participants']);
1194                                $this->so->set_start($l_start['year'],$l_start['month'],$l_start['mday'],$l_start['hour'],$l_start['min'],0);
1195                                $this->so->set_end($l_end['year'],$l_end['month'],$l_end['mday'],$l_end['hour'],$l_end['min'],0);
1196                                $this->so->set_class($is_public);
1197                                $this->so->add_attribute('reference',(@isset($l_cal['reference']) && $l_cal['reference']?$l_cal['reference']:0));
1198                                $this->so->add_attribute('location',(@isset($l_cal['location']) && $l_cal['location']?$l_cal['location']:''));
1199                                $this->so->add_attribute('repeat',(@isset($l_cal['recur_type']) && $l_cal['recur_type']?$l_cal['recur_type']:''));
1200                                $this->so->add_attribute('alarmd',(@isset($l_cal['alarmdays'])?$l_cal['alarmdays']:0));
1201                                $this->so->add_attribute('alarmh',(@isset($l_cal['alarmhours'])?$l_cal['alarmhours']:0));
1202                                $this->so->add_attribute('alarmm',(@isset($l_cal['alarmminutes'])?$l_cal['alarmminutes']:0));
1203                                if($l_cal['id'])
1204                                {
1205                                        $this->so->add_attribute('id',$l_cal['id']);
1206                                }
1207
1208                                if($l_cal['rpt_use_end'] != 'y')
1209                                {
1210                                        $l_recur_enddate['year'] = 0;
1211                                        $l_recur_enddate['month'] = 0;
1212                                        $l_recur_enddate['mday'] = 0;
1213                                }
1214                                elseif (isset($l_recur_enddate['str']))
1215                                {
1216                                        $l_recur_enddate = $this->jscal->input2date($l_recur_enddate['str'],False,'mday');
1217                                }
1218
1219                                switch((int)$l_cal['recur_type'])
1220                                {
1221                                        case MCAL_RECUR_NONE:
1222                                                $this->so->set_recur_none();
1223
1224                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1225                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1226                                                $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1227
1228                                                break;
1229                                        case MCAL_RECUR_DAILY:
1230                                                $this->so->set_recur_daily((int)$l_recur_enddate['year'],(int)$l_recur_enddate['month'],(int)$l_recur_enddate['mday'],(int)$l_cal['recur_interval']);
1231
1232                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1233                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1234
1235                                                $tmp_init = explode("/",$_POST['start']['str']); // recebe a data inicial da repeticao;
1236                                                $init_rept = mktime($_POST['start']['hour'],$_POST['start']['min'],0,intval($tmp_init[1]),$tmp_init[0],$tmp_init[2]); // transforma a data inicial + hora + minuto em UNIX timestamp;
1237
1238                                                if($l_cal['rpt_use_end'] == 'y') // verifica se foi indicada data final da repeticao, se sim:
1239                                                {
1240                                                        $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1241                                                       
1242                                                        $tmp_end = explode("/",$_POST['recur_enddate']['str']); // recebe data final da repeticao;
1243                                                        $end_rept = mktime($_POST['start']['hour'],$_POST['start']['min'],0,intval($tmp_end[1]),$tmp_end[0],$tmp_end[2]); // transforma a data inicial + hora e minuto de inicio da repeticao em UNIX timestamp;
1244
1245                                                }else { // se nao existe data final da repeticao (agendamento infinito):
1246
1247                                                        $end_rept = 0; // variavel recebe zero e nao sera adicionado nenhum alarme para o agendamento;
1248                                                }
1249                                                break;
1250                                        case MCAL_RECUR_WEEKLY:
1251
1252                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1253                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1254
1255                                                $tmp_init = explode("/",$_POST['start']['str']); // recebe a data inicial da repeticao;
1256                                                $init_rept = mktime($_POST['start']['hour'],$_POST['start']['min'],0,intval($tmp_init[1]),$tmp_init[0],$tmp_init[2]); // transforma a data inicial + hora + minuto em UNIX timestamp;
1257
1258                                                if($l_cal['rpt_use_end'] == 'y') // verifica se foi indicada data final da repeticao, se sim:
1259                                                {
1260
1261                                                        $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1262                                                        $tmp_end = explode("/",$_POST['recur_enddate']['str']); // recebe data final da repeticao;
1263                                                        $end_rept = mktime($_POST['start']['hour'],$_POST['start']['min'],0,intval($tmp_end[1]),$tmp_end[0],$tmp_end[2]); // transforma a data inicial + hora e minuto de inicio da repeticao em UNIX timestamp;
1264
1265                                                }else { // se nao existe data final da repeticao (agendamento infinito):
1266
1267                                                        $end_rept = 0; // variavel recebe zero e nao sera adicionado nenhum alarme para o agendamento;
1268                                                }
1269
1270                                                foreach(array('rpt_sun','rpt_mon','rpt_tue','rpt_wed','rpt_thu','rpt_fri','rpt_sat') as $rpt_day)
1271                                                {
1272                                                        $l_cal['recur_data'] += (int)$l_cal[$rpt_day];
1273                                                }
1274                                                if (is_array($l_cal['rpt_day']))
1275                                                {
1276                                                        foreach ($l_cal['rpt_day'] as $mask)
1277                                                        {
1278                                                                $l_cal['recur_data'] |= (int)$mask;
1279                                                                $rpt_wdays = $l_cal['recur_data']; // recebe os dias da semana (somatorio) para repetir o alarme;
1280                                                        }
1281                                                }
1282                                                $this->so->add_attribute('rpt_wdays',(@isset($rpt_wdays) && $rpt_wdays?$rpt_wdays:''));
1283                                                $this->so->set_recur_weekly((int)$l_recur_enddate['year'],(int)$l_recur_enddate['month'],(int)$l_recur_enddate['mday'],(int)$l_cal['recur_interval'],$l_cal['recur_data']);
1284                                                break;
1285                                        case MCAL_RECUR_MONTHLY_MDAY:
1286                                                $this->so->set_recur_monthly_mday((int)$l_recur_enddate['year'],(int)$l_recur_enddate['month'],(int)$l_recur_enddate['mday'],(int)$l_cal['recur_interval']);
1287
1288                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1289                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1290
1291                                                $tmp_init = explode("/",$_POST['start']['str']); // recebe a data inicial da repeticao;
1292                                                $init_rept = mktime($_POST['start']['hour'],$_POST['start']['min'],0,intval($tmp_init[1]),$tmp_init[0],$tmp_init[2]); // transforma a data inicial + hora + minuto em UNIX timestamp;
1293
1294                                                if($l_cal['rpt_use_end'] == 'y') // verifica se foi indicada data final da repeticao, se sim:
1295                                                {
1296                                                        $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1297                                                        $tmp_end = explode("/",$_POST['recur_enddate']['str']); // recebe data final da repeticao;
1298                                                        $end_rept = mktime($_POST['start']['hour'],$_POST['start']['min'],0,intval($tmp_end[1]),$tmp_end[0],$tmp_end[2]); // transforma a data inicial + hora e minuto de inicio da repeticao em UNIX timestamp;
1299
1300                                                }else { // se nao existe data final da repeticao (agendamento infinito):
1301
1302                                                        $end_rept = 0; // variavel recebe zero e nao sera adicionado nenhum alarme para o agendamento;
1303                                                }
1304                                                break;
1305                                        case MCAL_RECUR_MONTHLY_WDAY:
1306                                                $this->so->set_recur_monthly_wday((int)$l_recur_enddate['year'],(int)$l_recur_enddate['month'],(int)$l_recur_enddate['mday'],(int)$l_cal['recur_interval']);
1307                                                break;
1308                                        case MCAL_RECUR_YEARLY:
1309                                                $this->so->set_recur_yearly((int)$l_recur_enddate['year'],(int)$l_recur_enddate['month'],(int)$l_recur_enddate['mday'],(int)$l_cal['recur_interval']);
1310
1311                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1312                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1313
1314                                                $tmp_init = explode("/",$_POST['start']['str']); // recebe a data inicial da repeticao;
1315                                                $init_rept = mktime($_POST['start']['hour'],$_POST['start']['min'],0,intval($tmp_init[1]),$tmp_init[0],$tmp_init[2]); // transforma a data inicial + hora + minuto em UNIX timestamp;
1316
1317                                                if($l_cal['rpt_use_end'] == 'y') // verifica se foi indicada data final da repeticao, se sim:
1318                                                {
1319                                                        $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1320                                                        $tmp_end = explode("/",$_POST['recur_enddate']['str']); // recebe data final da repeticao;
1321                                                        $end_rept = mktime($_POST['start']['hour'],$_POST['start']['min'],0,intval($tmp_end[1]),$tmp_end[0],$tmp_end[2]); // transforma a data inicial + hora e minuto de inicio da repeticao em UNIX timestamp;
1322
1323                                                }else { // se nao existe data final da repeticao (agendamento infinito):
1324
1325                                                        $end_rept = 0; // variavel recebe zero e nao sera adicionado nenhum alarme para o agendamento;
1326                                                }
1327                                                break;
1328                                }
1329
1330                                if($l_participants)
1331                                {
1332                                        $parts = $l_participants;
1333                                        $minparts = min($l_participants);
1334                                        $part = Array();
1335                                        for($i=0;$i<count($parts);$i++)
1336                                        {
1337                                                if (($accept_type = substr($parts[$i],-1,1)) == '0' || (int)$accept_type > 0)
1338                                                {
1339                                                        $accept_type = 'U';
1340                                                }
1341                                                $acct_type = $GLOBALS['phpgw']->accounts->get_type((int)$parts[$i]);
1342                                                if($acct_type == 'u')
1343                                                {
1344                                                        $part[(int)$parts[$i]] = $accept_type;
1345                                                }
1346                                                elseif($acct_type == 'g')
1347                                                {
1348                                                        $part[(int)$parts[$i]] = $accept_type;
1349                                                        $groups[] = $parts[$i];
1350                                                        /* This pulls ALL users of a group and makes them as participants to the event */
1351                                                        /* I would like to turn this back into a group thing. */
1352                                                        $acct = CreateObject('phpgwapi.accounts',(int)$parts[$i]);
1353                                                        $members = $acct->member((int)$parts[$i]);
1354                                                        unset($acct);
1355                                                        if($members == False)
1356                                                        {
1357                                                                continue;
1358                                                        }
1359                                                        while($member = each($members))
1360                                                        {
1361                                                                $part[$member[1]['account_id']] = $accept_type;
1362                                                        }
1363                                                }
1364                                        }
1365                                }
1366                                else
1367                                {
1368                                        $part = False;
1369                                }
1370
1371                                if($part)
1372                                {
1373                                        @reset($part);
1374                                        while(list($key,$accept_type) = each($part))
1375                                        {
1376                                                $this->so->add_attribute('participants',$accept_type,(int)$key);
1377                                        }
1378                                }
1379
1380                                if($groups)
1381                                {
1382                                        @reset($groups);
1383                                        $this->so->add_attribute('groups',(int)$group_id);
1384                                }
1385
1386                                $event = $this->get_cached_event();
1387                                if(!is_int($minparts))
1388                                {
1389                                        $minparts = $this->owner;
1390                                }
1391                                if(!@isset($event['participants'][$l_cal['owner']]))
1392                                {
1393                                        $this->so->add_attribute('owner',$minparts);
1394                                }
1395                                else
1396                                {
1397                                        $this->so->add_attribute('owner',$l_cal['owner']);
1398                                }
1399                                $this->so->add_attribute('priority',$l_cal['priority']);
1400
1401                                foreach($l_cal as $name => $value)
1402                                {
1403                                        if ($name[0] == '#')    // Custom field
1404                                        {
1405                                                $this->so->add_attribute($name,stripslashes($value));
1406                                        }
1407                                }
1408                                if (isset($_POST['preserved']) && is_array($preserved = unserialize(stripslashes($_POST['preserved']))))
1409                                {
1410                                        foreach($preserved as $name => $value)
1411                                        {
1412                                                switch($name)
1413                                                {
1414                                                        case 'owner':
1415                                                                $this->so->add_attribute('participants',$value,$l_cal['owner']);
1416                                                                break;
1417                                                        default:
1418                                                                $this->so->add_attribute($name,str_replace(array('&amp;','&quot;','&lt;','&gt;'),array('&','"','<','>'),$value));
1419                                                }
1420                                        }
1421                                }
1422                                $event = $this->get_cached_event();
1423
1424                                if ($l_cal['alarmdays'] > 0 || $l_cal['alarmhours'] > 0 ||
1425                                                $l_cal['alarmminutes'] > 0)
1426                                {
1427                                        $offset = ($l_cal['alarmdays'] * 24 * 3600) +
1428                                                ($l_cal['alarmhours'] * 3600) + ($l_cal['alarmminutes'] * 60);
1429
1430                                        $time = $this->maketime($event['start']) - $offset;
1431
1432                                        $event['alarm'][] = Array(
1433                                                'time'    => $time,
1434                                                'offset'  => $offset,
1435                                                'owner'   => $this->owner,
1436                                                'enabled' => 1,
1437                                                'repeat'  => $repetido, // para repetir alarme;
1438                                                'init_rept' => $init_rept, // inicio repeticao;
1439                                                'end_rept' => $end_rept, // fim repeticao;
1440                                                'rpt_wdays' => $rpt_wdays // dias repeticao da semana;
1441                                        );
1442                                }
1443
1444                                $this->store_to_appsession($event);
1445                                $datetime_check = $this->validate_update($event);
1446                                print_debug('bo->validated_update() returnval',$datetime_check);
1447                                if($datetime_check)
1448                                {
1449                                        if (!$send_to_ui)
1450                                        {
1451                                                return array($datetime_check => 'invalid input data');
1452                                        }
1453                                        ExecMethod($ui_return,
1454                                                Array(
1455                                                        'cd'            => $datetime_check,
1456                                                        'readsess'      => 1
1457                                                )
1458                                        );
1459                                        if(!$params['from_mobile'])
1460                                                $GLOBALS['phpgw']->common->phpgw_exit(True);
1461                                        else
1462                                                return;
1463                                }
1464
1465                                if($event['id'])
1466                                {
1467                                        $event_ids[] = $event['id'];
1468                                }
1469                                if($event['reference'])
1470                                {
1471                                        $event_ids[] = $event['reference'];
1472                                }
1473
1474                                if (isset($repetido) and $repetido > 0){
1475                                    $events = $this->expand_repetition($event);
1476                                    $overlapping_events = False;
1477                                    foreach($events as $evt){
1478                                        $overlap = $this->overlap(
1479                                            $evt['start'],
1480                                            $evt['end'],
1481                                            $evt['participants'],
1482                                            $evt['owner'],
1483                                            $event_ids);
1484                                        if ($overlap)
1485                                        {
1486                                            if (!$overlapping_events)
1487                                            {
1488                                                $overlapping_events = Array();
1489                                            }
1490                                            array_push($overlapping_events, $overlap);
1491                                        }
1492                                    }
1493                                }
1494                                else {
1495                                    $overlapping_events = $this->overlap(
1496                                        $this->maketime($event['start']),
1497                                        $this->maketime($event['end']),
1498                                        $event['participants'],
1499                                        $event['owner'],
1500                                        $event_ids
1501                                    );
1502                                }
1503                        }
1504                        if(!$this->ex_participants)
1505                                $this->ex_participants = $event['ex_participants'];                     
1506                        if($overlapping_events)
1507                        {
1508                                if($send_to_ui)
1509                                {
1510                                        $event['ex_participants'] = $this->ex_participants;
1511                                        unset($GLOBALS['phpgw_info']['flags']['noheader']);
1512                                        unset($GLOBALS['phpgw_info']['flags']['nonavbar']);
1513                                        ExecMethod($ui_overlap,
1514                                                Array(
1515                                                        'o_events'      => $overlapping_events,
1516                                                        'this_event'    => $event
1517                                                )
1518                                        );
1519                                        if(!$params['from_mobile'])
1520                                                $GLOBALS['phpgw']->common->phpgw_exit(True);
1521                                        else
1522                                                return;
1523                                }
1524                                else
1525                                {
1526                                        return $overlapping_events;
1527                                }
1528                        }
1529                        else
1530                        {
1531                                if(!$event['id'])
1532                                {
1533                                        $this->so->add_entry($event);
1534                                        $this->send_update(MSG_ADDED,$event['participants'],'',$this->get_cached_event());
1535                                        print_debug('New Event ID',$event['id']);
1536                                }
1537                                else
1538                                {
1539                                        print_debug('Updating Event ID',$event['id']);
1540                                        $new_event = $event;
1541                                        $old_event = $this->read_entry($event['id']);
1542                                        // if old event has alarm and the start-time changed => update them
1543                                        //echo "<p>checking ".count($old_event['alarm'])." alarms of event #$event[id] start moved from ".print_r($old_event['start'],True)." to ".print_r($event['start'],True)."</p>\n";
1544                                        if ($old_event['alarm'] &&
1545                                                $this->maketime($old_event['start']) != $this->maketime($event['start']))
1546                                        {
1547                                                $this->so->delete_alarms($old_event['id']);
1548                                                foreach($old_event['alarm'] as $id => $alarm)
1549                                                {
1550                                                        $alarm['time'] = $this->maketime($event['start']) - $alarm['offset'];
1551                                                        $event['alarm'][] = $alarm;
1552                                                }
1553                                                //echo "updated alarms<pre>".print_r($event['alarm'],True)."</pre>\n";
1554                                        }
1555                                        $this->so->cal->event = $event;
1556                                        $this->so->add_entry($event);
1557                                        $this->prepare_recipients($new_event,$old_event);
1558                                }
1559
1560                                $date = sprintf("%04d%02d%02d",$event['start']['year'],$event['start']['month'],$event['start']['mday']);
1561                                if($send_to_ui)
1562                                {
1563                                        $this->read_sessiondata();
1564                                        if ($this->return_to)
1565                                        {
1566                                                $GLOBALS['phpgw']->redirect_link('/index.php','menuaction='.$this->return_to);
1567                                                $GLOBALS['phpgw']->common->phpgw_exit();
1568                                        }
1569                                        Execmethod($ui_index);
1570                                }
1571                                else
1572                                {
1573                                        return (int)$event['id'];
1574                                }
1575                        }
1576                        return True;
1577                }
1578
1579                /* Private functions */
1580                function read_holidays($year=0)
1581                {
1582                        if(!$year)
1583                        {
1584                                $year = $this->year;
1585                        }
1586                        $holiday = CreateObject('calendar.boholiday');
1587                        $holiday->prepare_read_holidays($year,$this->owner);
1588                        $this->cached_holidays = $holiday->read_holiday();
1589                        unset($holiday);
1590                }
1591
1592                function user_is_a_member($event,$user)
1593                {
1594                        @reset($event['participants']);
1595                        $uim = False;
1596                        $security_equals = $GLOBALS['phpgw']->accounts->membership($user);
1597                        while(!$uim && $event['participants'] && $security_equals && list($participant,$status) = each($event['participants']))
1598                        {
1599                                if($GLOBALS['phpgw']->accounts->get_type($participant) == 'g')
1600                                {
1601                                        @reset($security_equals);
1602                                        while(list($key,$group_info) = each($security_equals))
1603                                        {
1604                                                if($group_info['account_id'] == $participant)
1605                                                {
1606                                                        return True;
1607                                                        $uim = True;
1608                                                }
1609                                        }
1610                                }
1611                        }
1612                        return $uim;
1613                }
1614
1615                function maketime($time)
1616                {
1617                        return mktime(intval($time['hour']),intval($time['min']),intval($time['sec']),intval($time['month']),intval($time['mday']),intval($time['year']));
1618                }
1619
1620                /*!
1621                @function time2array
1622                @abstract returns a date-array suitable for the start- or endtime of an event from a timestamp
1623                @syntax time2array($time,$alarm=0)
1624                @param $time the timestamp for the values of the array
1625                @param $alarm (optional) alarm field of the array, defaults to 0
1626                @author ralfbecker
1627                */
1628                function time2array($time,$alarm = 0)
1629                {
1630                        return array(
1631                                'year'  => (int)(date('Y',$time)),
1632                                'month' => (int)(date('m',$time)),
1633                                'mday'  => (int)(date('d',$time)),
1634                                'hour'  => (int)(date('H',$time)),
1635                                'min'   => (int)(date('i',$time)),
1636                                'sec'   => (int)(date('s',$time)),
1637                                'alarm' => (int)($alarm)
1638                        );
1639                }
1640
1641                /*!
1642                @function set_recur_date
1643                @abstract set the start- and enddates of a recuring event for a recur-date
1644                @syntax set_recur_date(&$event,$date)
1645                @param $event the event which fields to set (has to be the original event for start-/end-times)
1646                @param $date  the recuring date in form 'Ymd', eg. 20030226
1647                @author ralfbecker
1648                */
1649                function set_recur_date(&$event,$date)
1650                {
1651                        $org_start = $this->maketime($event['start']);
1652                        $org_end   = $this->maketime($event['end']);
1653                        $start = mktime($event['start']['hour'],$event['start']['min'],0,substr($date,4,2),substr($date,6,2),substr($date,0,4));
1654                        $end   = $org_end + $start - $org_start;
1655                        $event['start'] = $this->time2array($start);
1656                        $event['end']   = $this->time2array($end);
1657                }
1658
1659                function fix_update_time(&$time_param)
1660                {
1661                        if (isset($time_param['str']))
1662                        {
1663                                if (!is_object($this->jscal))
1664                                {
1665                                        $this->jscal = CreateObject('phpgwapi.jscalendar');
1666                                }
1667                                $time_param += $this->jscal->input2date($time_param['str'],False,'mday');
1668                                unset($time_param['str']);
1669                        }
1670                        if ($this->prefs['common']['timeformat'] == '12')
1671                        {
1672                                if ($time_param['ampm'] == 'pm')
1673                                {
1674                                        if ($time_param['hour'] <> 12)
1675                                        {
1676                                                $time_param['hour'] += 12;
1677                                        }
1678                                }
1679                                elseif ($time_param['ampm'] == 'am')
1680                                {
1681                                        if ($time_param['hour'] == 12)
1682                                        {
1683                                                $time_param['hour'] -= 12;
1684                                        }
1685                                }
1686
1687                                if($time_param['hour'] > 24)
1688                                {
1689                                        $time_param['hour'] -= 12;
1690                                }
1691                        }
1692                }
1693
1694                function validate_update($event)
1695                {
1696                        $error = 0;
1697                        // do a little form verifying
1698                        if (!count($event['participants']))
1699                        {
1700                                $error = 43;
1701                        }
1702                        elseif ($event['type'] != 'hourAppointment' && $event['title'] == '')
1703                        {
1704                                $error = 40;
1705                        }
1706                        elseif ($event['repeat'] != 0)
1707                        {
1708                                if( $event['rpt_end_use'] != 'y')
1709                                {
1710                                        $error = 46;
1711                                }
1712                        //}
1713                          if ($event['repeat'] == 2)
1714                          {
1715                                if($event['rpt_wdays'] == '') {
1716                                        $error = 44;
1717                                }
1718                                if( $event['rpt_end_use'] != 'y')
1719                                {
1720                                        $error = 46;
1721                                }
1722
1723                                if (  ( isset($event['alarmd'])  && ($event['alarmd'] != 0) ) || ( isset($event['alarmh'])  && ($event['alarmh'] != 0) ) || ( isset($event['alarmm'])  && ($event['alarmm'] != 0) ) )
1724                                {
1725                                        if( isset($event['recur_type']) && ($event['recur_type'] != 0) )
1726                                        {
1727                                                if( $event['rpt_end_use'] != 'y')
1728                                                {
1729                                                        $error = 45;
1730                                                }
1731                                        }
1732                                }
1733                           }
1734
1735                        //}
1736                  if (  ( isset($event['alarmd'])  && ($event['alarmd'] != 0) ) || ( isset($event['alarmh'])  && ($event['alarmh'] != 0) ) || ( isset($event['alarmm'])  && ($event['alarmm'] != 0) ) )
1737                  {
1738                        if( isset($event['recur_type']) && ($event['recur_type'] != 0) )
1739                        {
1740                                if( $event['rpt_end_use'] != 'y')
1741                                {
1742                                        $error = 45;
1743                                }
1744                        }
1745                  }
1746                }
1747                        elseif (($GLOBALS['phpgw']->datetime->time_valid($event['start']['hour'],$event['start']['min'],0) == False) || ($GLOBALS['phpgw']->datetime->time_valid($event['end']['hour'],$event['end']['min'],0) == False))
1748                        {
1749                                $error = 41;
1750                        }
1751                        elseif (($GLOBALS['phpgw']->datetime->date_valid($event['start']['year'],$event['start']['month'],$event['start']['mday']) == False) || ($GLOBALS['phpgw']->datetime->date_valid($event['end']['year'],$event['end']['month'],$event['end']['mday']) == False) || ($GLOBALS['phpgw']->datetime->date_compare($event['start']['year'],$event['start']['month'],$event['start']['mday'],$event['end']['year'],$event['end']['month'],$event['end']['mday']) == 1))
1752                        {
1753                                $error = 42;
1754                        }
1755                        elseif ($GLOBALS['phpgw']->datetime->date_compare($event['start']['year'],$event['start']['month'],$event['start']['mday'],$event['end']['year'],$event['end']['month'],$event['end']['mday']) == 0)
1756                        {
1757                                if ($GLOBALS['phpgw']->datetime->time_compare($event['start']['hour'],$event['start']['min'],0,$event['end']['hour'],$event['end']['min'],0) == 1)
1758                                {
1759                                        $error = 47;
1760                                }
1761                        }
1762                        if($event['attachment'] == 'ERROR')
1763                            $error = 99;
1764                       
1765                        return $error;
1766                }
1767
1768                /*!
1769                @function participants_not_rejected($participants,$event)
1770                @abstract checks if any of the $particpants participates in $event and has not rejected it
1771                */
1772                function participants_not_rejected($participants,$event)
1773                {
1774                        //echo "participants_not_rejected()<br>participants =<pre>"; print_r($participants); echo "</pre><br>event[participants]=<pre>"; print_r($event['participants']); echo "</pre>\n";
1775                        foreach($participants as $uid => $status)
1776                        {
1777                                //echo "testing event[participants][uid=$uid] = '".$event['participants'][$uid]."'<br>\n";
1778                                if (isset($event['participants'][$uid]) && $event['participants'][$uid] != 'R' &&
1779                                        $status != 'R')
1780                                {
1781                                        return True;    // found not rejected participant in event
1782                                }
1783                        }
1784                        return False;
1785                }
1786               
1787                function participants_unanswered($participants,$event)
1788                {
1789                        foreach($participants as $uid => $status)
1790                        {                               
1791                                if (isset($event['participants'][$uid]) && $event['participants'][$uid] == 'U' && $status == 'U')
1792                                {
1793                                        return False;
1794                                }
1795                        }
1796                        return True;
1797                }
1798
1799                function overlap($starttime,$endtime,$participants,$owner=0,$id=0,$restore_cache=False)
1800                {
1801//                      $retval = Array();
1802//                      $ok = False;
1803
1804/* This needs some attention.. by commenting this chunk of code it will fix bug #444265 */
1805
1806                        if($restore_cache)
1807                        {
1808                                $temp_cache_events = $this->cached_events;
1809                        }
1810
1811//                      $temp_start = (int)$GLOBALS['phpgw']->common->show_date($starttime,'Ymd');
1812//                      $temp_start_time = (int)($GLOBALS['phpgw']->common->show_date($starttime,'Hi');
1813//                      $temp_end = (int)$GLOBALS['phpgw']->common->show_date($endtime,'Ymd');
1814//                      $temp_end_time = (int)$GLOBALS['phpgw']->common->show_date($endtime,'Hi');
1815                        $temp_start = (int)(date('Ymd',$starttime));
1816                        $temp_start_time = (int)(date('Hi',$starttime));
1817                        $temp_end = (int)(date('Ymd',$endtime));
1818                        $temp_end_time = (int)(date('Hi',$endtime));
1819                        if($this->debug)
1820                        {
1821                                echo '<!-- Temp_Start: '.$temp_start.' -->'."\n";
1822                                echo '<!-- Temp_End: '.$temp_end.' -->'."\n";
1823                        }
1824
1825                        $users = Array();
1826                        if(count($participants))
1827                        {
1828                                while(list($user,$status) = each($participants))
1829                                {
1830                                        $users[] = $user;
1831                                }
1832                        }
1833                        else
1834                        {
1835                                $users[] = $this->owner;
1836                        }
1837
1838                        $possible_conflicts = $this->store_to_cache(
1839                                Array(
1840                                        'smonth'        => substr(strval($temp_start),4,2),
1841                                        'sday'  => substr(strval($temp_start),6,2),
1842                                        'syear' => substr(strval($temp_start),0,4),
1843                                        'emonth'        => substr(strval($temp_end),4,2),
1844                                        'eday'  => substr(strval($temp_end),6,2),
1845                                        'eyear' => substr(strval($temp_end),0,4),
1846                                        'owner' => $users
1847                                )
1848                        );
1849
1850                        if($this->debug)
1851                        {
1852                                echo '<!-- Possible Conflicts ('.($temp_start - 1).'): '.count($possible_conflicts[$temp_start - 1]).' -->'."\n";
1853                                echo '<!-- Possible Conflicts ('.$temp_start.'): '.count($possible_conflicts[$temp_start]).' '.count($id).' -->'."\n";
1854                        }
1855
1856                        if($possible_conflicts[$temp_start] || $possible_conflicts[$temp_end])
1857                        {
1858                                if($temp_start == $temp_end)
1859                                {
1860                                        if($this->debug)
1861                                        {
1862                                                echo '<!-- Temp_Start == Temp_End -->'."\n";
1863                                        }
1864                                        @reset($possible_conflicts[$temp_start]);
1865                                        while(list($key,$event) = each($possible_conflicts[$temp_start]))
1866                                        {
1867                                                $found = False;
1868                                                if($id)
1869                                                {
1870                                                        @reset($id);
1871                                                        while(list($key,$event_id) = each($id))
1872                                                        {
1873                                                                if($this->debug)
1874                                                                {
1875                                                                        echo '<!-- $id['.$key.'] = '.$id[$key].' = '.$event_id.' -->'."\n";
1876                                                                        echo '<!-- '.$event['id'].' == '.$event_id.' -->'."\n";
1877                                                                }
1878                                                                if($event['id'] == $event_id)
1879                                                                {
1880                                                                        $found = True;
1881                                                                }
1882                                                        }
1883                                                }
1884                                                if($this->debug)
1885                                                {
1886                                                        echo '<!-- Item found: '.$found.' -->'."<br>\n";
1887                                                }
1888                                                if(!$found)
1889                                                {
1890                                                        if($this->debug)
1891                                                        {
1892                                                                echo '<!-- Checking event id #'.$event['id'];
1893                                                        }
1894                                                        $temp_event_start = sprintf("%d%02d",$event['start']['hour'],$event['start']['min']);
1895                                                        $temp_event_end = sprintf("%d%02d",$event['end']['hour'],$event['end']['min']);
1896//                                                      if((($temp_start_time <= $temp_event_start) && ($temp_end_time >= $temp_event_start) && ($temp_end_time <= $temp_event_end)) ||
1897                                                        if(($temp_start_time <= $temp_event_start &&
1898                                                                $temp_end_time > $temp_event_start &&
1899                                                                $temp_end_time <= $temp_event_end ||
1900                                                                $temp_start_time >= $temp_event_start &&
1901                                                                $temp_start_time < $temp_event_end &&
1902                                                                $temp_end_time >= $temp_event_end ||
1903                                                                $temp_start_time <= $temp_event_start &&
1904                                                                $temp_end_time >= $temp_event_end ||
1905                                                                $temp_start_time >= $temp_event_start &&
1906                                                                $temp_end_time <= $temp_event_end) &&
1907                                                                $this->participants_not_rejected($participants,$event) && $this->participants_unanswered($participants,$event))
1908                                                        {
1909                                                                if($this->debug)
1910                                                                {
1911                                                                        echo ' Conflicts';
1912                                                                }
1913                                                                $retval[] = $event['id'];
1914                                                        }
1915                                                        if($this->debug)
1916                                                        {
1917                                                                echo ' -->'."\n";
1918                                                        }
1919                                                }
1920                                        }
1921                                }
1922                        }
1923                        else
1924                        {
1925                                $retval = False;
1926                        }
1927
1928                        if($restore_cache)
1929                        {
1930                                $this->cached_events = $temp_cache_events;
1931                        }
1932
1933                        return $retval;
1934                }
1935
1936                /*!
1937                @function check_perms( )
1938                @syntax check_perms($needed,$event=0,$other=0)
1939                @abstract Checks if the current user has the necessary ACL rights
1940                @author ralfbecker
1941                @discussion The check is performed on an event or general on the cal of an other user
1942                @param $needed necessary ACL right: PHPGW_ACL_{READ|EDIT|DELETE}
1943                @param $event event as array or the event-id or 0 for general check
1944                @param $other uid to check (if event==0) or 0 to check against $this->owner
1945                @note Participating in an event is considered as haveing read-access on that event, \
1946                        even if you have no general read-grant from that user.
1947                */
1948                function check_perms($needed,$event=0,$other=0)
1949                {
1950                        $event_in = $event;
1951                       
1952                        if (is_int($event) && $event == 0)
1953                        {
1954                                $owner = $other > 0 ? $other : $this->owner;
1955                        }
1956                        else
1957                        {
1958                                if (!is_array($event))
1959                                {
1960                                        $event = $this->so->read_entry((int) $event);
1961                                }
1962                                if (!is_array($event))
1963                                {
1964                                        if ($this->xmlrpc)
1965                                        {
1966                                                $GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['not_exist'],$GLOBALS['xmlrpcstr']['not_exist']);
1967                                        }
1968                                        return False;
1969                                }
1970                                $owner = $event['owner'];
1971                                $private = $event['public'] == False || $event['public'] == 0;
1972                        }
1973                        $user = $GLOBALS['phpgw_info']['user']['account_id'];
1974                        $grants = $this->grants[$owner];
1975
1976                        if (is_array($event) && $needed == PHPGW_ACL_READ)
1977                        {
1978                                // Check if the $user is one of the participants or has a read-grant from one of them
1979                                //
1980                                foreach($event['participants'] as $uid => $accept)
1981                                {
1982                                        if ($this->grants[$uid] & PHPGW_ACL_READ || $uid == $user)
1983                                        {
1984                                                $grants |= PHPGW_ACL_READ;
1985                                                // if the $user is one of the participants read-grant private (restricted) too.
1986                                                if($uid == $user || ($this->grants[$uid] & PHPGW_ACL_PRIVATE)) {
1987                                                        $grants |= PHPGW_ACL_PRIVATE;
1988                                                }
1989                                                //break;
1990                                        }
1991                                }
1992                        }
1993
1994                        if ($GLOBALS['phpgw']->accounts->get_type($owner) == 'g' && $needed == PHPGW_ACL_ADD)
1995                        {
1996                                $access = False;        // a group can't be the owner of an event
1997                        }
1998                        else
1999                        {
2000                                $access = $user == $owner || $grants & $needed && (!$private || $grants & PHPGW_ACL_PRIVATE);
2001                        }
2002                        //echo "<p>".function_backtrace()." check_perms($needed,$event_id,$other) for user $user and needed_acl $needed: event='$event[title]': owner=$owner, private=$private, grants=$grants ==> access=$access</p>\n";
2003
2004                        return $access;
2005                }
2006
2007
2008                function display_status($user_status)
2009                {
2010                        if(@$this->prefs['calendar']['display_status'] && $user_status)
2011                        {
2012                                $user_status = substr($this->get_long_status($user_status),0,1);
2013
2014                                return ' ('.$user_status.')';
2015                        }
2016                        else
2017                        {
2018                                return '';
2019                        }
2020                }
2021
2022                function get_long_status($status_short)
2023                {
2024                        switch ($status_short)
2025                        {
2026                                case 'A':
2027                                        $status = lang('Accepted');
2028                                        break;
2029                                case 'R':
2030                                        $status = lang('Rejected');
2031                                        break;
2032                                case 'T':
2033                                        $status = lang('Tentative');
2034                                        break;
2035                                case 'U':
2036                                        $status = lang('No Response');
2037                                        break;
2038                        }
2039                        return $status;
2040                }
2041
2042                function is_private($event,$owner)
2043                {
2044                        if($owner == 0)
2045                        {
2046                                $owner = $this->owner;
2047                        }
2048                        if ($owner == $GLOBALS['phpgw_info']['user']['account_id'] || ($event['public']==1) || ($this->check_perms(PHPGW_ACL_PRIVATE,$event) && $event['public']==0) || $event['owner'] == $GLOBALS['phpgw_info']['user']['account_id'])
2049                        {
2050                                return False;
2051                        }
2052                        elseif($event['public'] == 0)
2053                        {
2054                                return True;
2055                        }
2056                        elseif($event['public'] == 2)
2057                        {
2058                                $is_private = True;
2059                                $groups = $GLOBALS['phpgw']->accounts->membership($owner);
2060                                while (list($key,$group) = each($groups))
2061                                {
2062                                        if (strpos(' '.implode(',',$event['groups']).' ',$group['account_id']))
2063                                        {
2064                                                return False;
2065                                        }
2066                                }
2067                        }
2068                        else
2069                        {
2070                                return False;
2071                        }
2072
2073                        return $is_private;
2074                }
2075
2076                function get_short_field($event,$is_private=True,$field='')
2077                {
2078                        if($is_private)
2079                        {
2080                                return lang('private');
2081                        }
2082
2083// cut off too long titles
2084                        elseif(strlen($event[$field]) > 19 && !$this->printer_friendly && $field=="title")
2085//                      elseif(strlen($event[$field]) > 19 && $this->printer_friendly)
2086                        {
2087// we dont use currently 160304
2088//                              return substr($event[$field], 0 , 19) . '&nbsp;...';
2089                                return $event[$field];
2090                        }
2091                        else
2092                        {
2093                                return $event[$field];
2094                        }
2095                }
2096
2097                function long_date($first,$last=0)
2098                {
2099                        if (!is_array($first))
2100                        {
2101                                $first = $this->time2array($raw = $first);
2102                                $first['raw'] = $raw;
2103                                $first['day'] = $first['mday'];
2104                        }
2105                        if ($last && !is_array($last))
2106                        {
2107                                $last = $this->time2array($raw = $last);
2108                                $last['raw'] = $raw;
2109                                $last['day'] = $last['mday'];
2110                        }
2111                        $datefmt = $this->prefs['common']['dateformat'];
2112
2113                        $month_before_day = strtolower($datefmt[0]) == 'm' ||
2114                                strtolower($datefmt[2]) == 'm' && $datefmt[4] == 'd';
2115
2116                        for ($i = 0; $i < 5; $i += 2)
2117                        {
2118                                switch($datefmt[$i])
2119                                {
2120                                        case 'd':
2121                                                $range .= $first['day'] . ($datefmt[1] == '.' ? '.' : '');
2122                                                if ($first['month'] != $last['month'] || $first['year'] != $last['year'])
2123                                                {
2124                                                        if (!$month_before_day)
2125                                                        {
2126                                                                $range .= ' '.lang(strftime('%B',$first['raw']));
2127                                                        }
2128                                                        if ($first['year'] != $last['year'] && $datefmt[0] != 'Y')
2129                                                        {
2130                                                                $range .= ($datefmt[0] != 'd' ? ', ' : ' ') . $first['year'];
2131                                                        }
2132                                                        if (!$last)
2133                                                        {
2134                                                                return $range;
2135                                                        }
2136                                                        $range .= ' - ';
2137
2138                                                        if ($first['year'] != $last['year'] && $datefmt[0] == 'Y')
2139                                                        {
2140                                                                $range .= $last['year'] . ', ';
2141                                                        }
2142
2143                                                        if ($month_before_day)
2144                                                        {
2145                                                                $range .= lang(strftime('%B',$last['raw']));
2146                                                        }
2147                                                }
2148                                                else
2149                                                {
2150                                                        $range .= ' - ';
2151                                                }
2152                                                $range .= ' ' . $last['day'] . ($datefmt[1] == '.' ? '.' : '');
2153                                                break;
2154                                        case 'm':
2155                                        case 'M':
2156                                                $range .= ' '.lang(strftime('%B',$month_before_day ? $first['raw'] : $last['raw'])) . ' ';
2157                                                break;
2158                                        case 'Y':
2159                                                $range .= ($datefmt[0] == 'm' ? ', ' : ' ') . ($datefmt[0] == 'Y' ? $first['year'].($datefmt[2] == 'd' ? ', ' : ' ') : $last['year'].' ');
2160                                                break;
2161                                }
2162                        }
2163                        return $range;
2164                }
2165
2166                function get_week_label()
2167                {
2168                        $first = $GLOBALS['phpgw']->datetime->gmtdate($GLOBALS['phpgw']->datetime->get_weekday_start($this->year, $this->month, $this->day));
2169                        $last = $GLOBALS['phpgw']->datetime->gmtdate($first['raw'] + 518400);
2170
2171                        return ($this->long_date($first,$last));
2172                }
2173
2174                function normalizeminutes(&$minutes)
2175                {
2176                        $hour = 0;
2177                        $min = (int)$minutes;
2178                        if($min >= 60)
2179                        {
2180                                $hour += $min / 60;
2181                                $min %= 60;
2182                        }
2183                        settype($minutes,'integer');
2184                        $minutes = $min;
2185                        return $hour;
2186                }
2187
2188                function splittime($time,$follow_24_rule=True)
2189                {
2190                        $temp = array('hour','minute','second','ampm');
2191                        $time = strrev($time);
2192                        $second = (int)(strrev(substr($time,0,2)));
2193                        $minute = (int)(strrev(substr($time,2,2)));
2194                        $hour   = (int)(strrev(substr($time,4)));
2195                        $hour += $this->normalizeminutes($minute);
2196                        $temp['second'] = $second;
2197                        $temp['minute'] = $minute;
2198                        $temp['hour']   = $hour;
2199                        $temp['ampm']   = '  ';
2200                        if($follow_24_rule == True)
2201                        {
2202                                if ($this->prefs['common']['timeformat'] == '24')
2203                                {
2204                                        return $temp;
2205                                }
2206
2207                                $temp['ampm'] = 'am';
2208
2209                                if ((int)$temp['hour'] > 12)
2210                                {
2211                                        $temp['hour'] = (int)((int)$temp['hour'] - 12);
2212                                        $temp['ampm'] = 'pm';
2213                                }
2214                                elseif ((int)$temp['hour'] == 12)
2215                                {
2216                                        $temp['ampm'] = 'pm';
2217                                }
2218                        }
2219                        return $temp;
2220                }
2221
2222                function get_exception_array($exception_str='')
2223                {
2224                        $exception = Array();
2225                        if(strpos(' '.$exception_str,','))
2226                        {
2227                                $exceptions = explode(',',$exception_str);
2228                                for($exception_count=0;$exception_count<count($exceptions);$exception_count++)
2229                                {
2230                                        $exception[] = (int)$exceptions[$exception_count];
2231                                }
2232                        }
2233                        elseif($exception_str != '')
2234                        {
2235                                $exception[] = (int)$exception_str;
2236                        }
2237                        return $exception;
2238                }
2239
2240                function build_time_for_display($fixed_time)
2241                {
2242                        $time = $this->splittime($fixed_time);
2243                        $str = $time['hour'].':'.((int)$time['minute']<=9?'0':'').$time['minute'];
2244
2245                        if ($this->prefs['common']['timeformat'] == '12')
2246                        {
2247                                $str .= ' ' . $time['ampm'];
2248                        }
2249
2250                        return $str;
2251                }
2252
2253                function sort_event($event,$date)
2254                {
2255                        $inserted = False;
2256                        if(isset($event['recur_exception']))
2257                        {
2258                                $event_time = mktime($event['start']['hour'],$event['start']['min'],0,(int)(substr($date,4,2)),(int)(substr($date,6,2)),(int)(substr($date,0,4))) - $GLOBALS['phpgw']->datetime->tz_offset;
2259                                while($inserted == False && list($key,$exception_time) = each($event['recur_exception']))
2260                                {
2261                                        if($this->debug)
2262                                        {
2263                                                echo '<!-- checking exception datetime '.$exception_time.' to event datetime '.$event_time.' -->'."\n";
2264                                        }
2265                                        if($exception_time == $event_time)
2266                                        {
2267                                                $inserted = True;
2268                                        }
2269                                }
2270                        }
2271                        if($this->cached_events[$date] && $inserted == False)
2272                        {
2273
2274                                if($this->debug)
2275                                {
2276                                        echo '<!-- Cached Events found for '.$date.' -->'."\n";
2277                                }
2278                                $year = substr($date,0,4);
2279                                $month = substr($date,4,2);
2280                                $day = substr($date,6,2);
2281
2282                                if($this->debug)
2283                                {
2284                                        echo '<!-- Date : '.$date.' Count : '.count($this->cached_events[$date]).' -->'."\n";
2285                                }
2286
2287                                for($i=0;$i<count($this->cached_events[$date]);$i++)
2288                                {
2289                                        if($this->cached_events[$date][$i]['id'] == $event['id'] || $this->cached_events[$date][$i]['reference'] == $event['id'])
2290                                        {
2291                                                if($this->debug)
2292                                                {
2293                                                        echo '<!-- Item already inserted! -->'."\n";
2294                                                }
2295                                                $inserted = True;
2296                                                break;
2297                                        }
2298                                        /* This puts all spanning events across multiple days up at the top. */
2299                                        if($this->cached_events[$date][$i]['recur_type'] == MCAL_RECUR_NONE)
2300                                        {
2301                                                if($this->cached_events[$date][$i]['start']['mday'] != $day && $this->cached_events[$date][$i]['end']['mday'] >= $day)
2302                                                {
2303                                                        continue;
2304                                                }
2305                                        }
2306                                        if(date('Hi',mktime($event['start']['hour'],$event['start']['min'],$event['start']['sec'],$month,$day,$year)) < date('Hi',mktime($this->cached_events[$date][$i]['start']['hour'],$this->cached_events[$date][$i]['start']['min'],$this->cached_events[$date][$i]['start']['sec'],$month,$day,$year)))
2307                                        {
2308                                                for($j=count($this->cached_events[$date]);$j>=$i;$j--)
2309                                                {
2310                                                        $this->cached_events[$date][$j] = $this->cached_events[$date][$j-1];
2311                                                }
2312                                                if($this->debug)
2313                                                {
2314                                                        echo '<!-- Adding event ID: '.$event['id'].' to cached_events -->'."\n";
2315                                                }
2316                                                $inserted = True;
2317                                                $this->cached_events[$date][$i] = $event;
2318                                                break;
2319                                        }
2320                                }
2321                        }
2322                        if(!$inserted)
2323                        {
2324                                if($this->debug)
2325                                {
2326                                        echo '<!-- Adding event ID: '.$event['id'].' to cached_events -->'."\n";
2327                                }
2328                                $this->cached_events[$date][] = $event;
2329                        }
2330                }
2331
2332                function check_repeating_events($datetime)
2333                {
2334                        @reset($this->repeating_events);
2335                        $search_date_full = date('Ymd',$datetime);
2336                        $search_date_year = date('Y',$datetime);
2337                        $search_date_month = date('m',$datetime);
2338                        $search_date_day = date('d',$datetime);
2339                        $search_date_dow = date('w',$datetime);
2340                        $search_beg_day = mktime(12,0,0,$search_date_month,$search_date_day,$search_date_year);
2341                        if($this->debug)
2342                        {
2343                                echo '<!-- Search Date Full = '.$search_date_full.' -->'."\n";
2344                        }
2345                        $repeated = $this->repeating_events;
2346                        $r_events = count($repeated);
2347                        for ($i=0;$i<$r_events;$i++)
2348                        {
2349                                $rep_events = $this->repeating_events[$i];
2350                                $id = $rep_events['id'];
2351                                $event_beg_day = mktime(0,0,0,$rep_events['start']['month'],$rep_events['start']['mday'],$rep_events['start']['year']);
2352                                if($rep_events['recur_enddate']['month'] != 0 && $rep_events['recur_enddate']['mday'] != 0 && $rep_events['recur_enddate']['year'] != 0)
2353                                {
2354                                        $event_recur_time = $this->maketime($rep_events['recur_enddate']);
2355                                }
2356                                else
2357                                {
2358                                        $event_recur_time = mktime(0,0,0,1,1,2030);
2359                                }
2360                                $end_recur_date = date('Ymd',$event_recur_time);
2361                                $full_event_date = date('Ymd',$event_beg_day);
2362
2363                                if($this->debug)
2364                                {
2365                                        echo '<!-- check_repeating_events - Processing ID - '.$id.' -->'."\n";
2366                                        echo '<!-- check_repeating_events - Recurring End Date - '.$end_recur_date.' -->'."\n";
2367                                }
2368
2369                                // only repeat after the beginning, and if there is an rpt_end before the end date
2370                                if (($search_date_full > $end_recur_date) || ($search_date_full < $full_event_date))
2371                                {
2372                                        continue;
2373                                }
2374
2375                                if ($search_date_full == $full_event_date)
2376                                {
2377                                        $this->sort_event($rep_events,$search_date_full);
2378                                        continue;
2379                                }
2380                                else
2381                                {
2382                                        $freq = $rep_events['recur_interval'];
2383                                        $freq = $freq ? $freq : 1;
2384                                        $type = $rep_events['recur_type'];
2385                                        switch($type)
2386                                        {
2387                                                case MCAL_RECUR_DAILY:
2388                                                        if($this->debug)
2389                                                        {
2390                                                                echo '<!-- check_repeating_events - MCAL_RECUR_DAILY - '.$id.' -->'."\n";
2391                                                        }
2392                                                       
2393                                                        if ($freq == 1 && $rep_events['recur_enddate']['month'] != 0 && $rep_events['recur_enddate']['mday'] != 0 && $rep_events['recur_enddate']['year'] != 0 && $search_date_full <= $end_recur_date)
2394                                                        {
2395                                                                $this->sort_event($rep_events,$search_date_full);
2396                                                        }
2397                                                        elseif (floor(($search_beg_day - $event_beg_day)/86400) % ($freq ? $freq : 1))
2398                                                        {
2399                                                                continue;
2400                                                        }
2401                                                        else
2402                                                        {
2403                                                                $this->sort_event($rep_events,$search_date_full);
2404                                                        }
2405                                                        break;
2406                                                case MCAL_RECUR_WEEKLY:
2407                                                        if (floor(($search_beg_day - $event_beg_day)/604800)  % ($freq ? $freq : 1))
2408                                                        {
2409                                                                continue;
2410                                                        }
2411                                                        $check = 0;
2412                                                        switch($search_date_dow)
2413                                                        {
2414                                                                case 0:
2415                                                                        $check = MCAL_M_SUNDAY;
2416                                                                        break;
2417                                                                case 1:
2418                                                                        $check = MCAL_M_MONDAY;
2419                                                                        break;
2420                                                                case 2:
2421                                                                        $check = MCAL_M_TUESDAY;
2422                                                                        break;
2423                                                                case 3:
2424                                                                        $check = MCAL_M_WEDNESDAY;
2425                                                                        break;
2426                                                                case 4:
2427                                                                        $check = MCAL_M_THURSDAY;
2428                                                                        break;
2429                                                                case 5:
2430                                                                        $check = MCAL_M_FRIDAY;
2431                                                                        break;
2432                                                                case 6:
2433                                                                        $check = MCAL_M_SATURDAY;
2434                                                                        break;
2435                                                        }
2436                                                        if ($rep_events['recur_data'] & $check)
2437                                                        {
2438                                                                $this->sort_event($rep_events,$search_date_full);
2439                                                        }
2440                                                        break;
2441                                                case MCAL_RECUR_MONTHLY_WDAY:
2442                                                        if ((($search_date_year - $rep_events['start']['year']) * 12 + $search_date_month - $rep_events['start']['month']) % $freq)
2443                                                        {
2444                                                                continue;
2445                                                        }
2446
2447                                                        if (($GLOBALS['phpgw']->datetime->day_of_week($rep_events['start']['year'],$rep_events['start']['month'],$rep_events['start']['mday']) == $GLOBALS['phpgw']->datetime->day_of_week($search_date_year,$search_date_month,$search_date_day)) &&
2448                                                                (ceil($rep_events['start']['mday']/7) == ceil($search_date_day/7)))
2449                                                        {
2450                                                                $this->sort_event($rep_events,$search_date_full);
2451                                                        }
2452                                                        break;
2453                                                case MCAL_RECUR_MONTHLY_MDAY:
2454                                                        if ((($search_date_year - $rep_events['start']['year']) * 12 + $search_date_month - $rep_events['start']['month'])  % ($freq ? $freq : 1))
2455                                                        {
2456                                                                continue;
2457                                                        }
2458                                                        if ($search_date_day == $rep_events['start']['mday'])
2459                                                        {
2460                                                                $this->sort_event($rep_events,$search_date_full);
2461                                                        }
2462                                                        break;
2463                                                case MCAL_RECUR_YEARLY:
2464                                                        if (($search_date_year - $rep_events['start']['year']) % ($freq ? $freq : 1))
2465                                                        {
2466                                                                continue;
2467                                                        }
2468                                                        if (date('dm',$datetime) == date('dm',$event_beg_day))
2469                                                        {
2470                                                                $this->sort_event($rep_events,$search_date_full);
2471                                                        }
2472                                                        break;
2473                                        }
2474                                }
2475                        }       // end for loop
2476                }       // end function
2477
2478                function store_to_cache($params)
2479                {
2480                        if(!is_array($params))
2481                        {
2482                                return False;
2483                        }
2484                        if (isset($params['start']) && ($datearr = $GLOBALS['server']->iso86012date($params['start'])))
2485                        {
2486                                $syear = $datearr['year'];
2487                                $smonth = $datearr['month'];
2488                                $sday = $datearr['mday'];
2489                                $this->xmlrpc = True;
2490                        }
2491                        else
2492                        {
2493                                $syear = $params['syear'];
2494                                $smonth = $params['smonth'];
2495                                $sday = $params['sday'];
2496                        }
2497                        if (isset($params['end']) && ($datearr = $GLOBALS['server']->iso86012date($params['end'])))
2498                        {
2499                                $eyear = $datearr['year'];
2500                                $emonth = $datearr['month'];
2501                                $eday = $datearr['mday'];
2502                                $this->xmlrpc = True;
2503                        }
2504                        else
2505                        {
2506                                $eyear = (isset($params['eyear'])?$params['eyear']:0);
2507                                $emonth = (isset($params['emonth'])?$params['emonth']:0);
2508                                $eday = (isset($params['eday'])?$params['eday']:0);
2509                        }
2510                        if (!isset($params['owner']) && @$this->xmlrpc)
2511                        {
2512                                $owner_id = $GLOBALS['phpgw_info']['user']['user_id'];
2513                        }
2514                        else
2515                        {
2516                                $owner_id = (isset($params['owner'])?$params['owner']:0);
2517                                if($owner_id==0 && $this->is_group)
2518                                {
2519                                        unset($owner_id);
2520                                        $owner_id = $this->g_owner;
2521                                        if($this->debug)
2522                                        {
2523                                                echo '<!-- owner_id in ('.implode(',',$owner_id).') -->'."\n";
2524                                        }
2525                                }
2526                        }
2527                        if(!$eyear && !$emonth && !$eday)
2528                        {
2529                                $edate = mktime(23,59,59,$smonth + 1,$sday + 1,$syear);
2530                                $eyear = date('Y',$edate);
2531                                $emonth = date('m',$edate);
2532                                $eday = date('d',$edate);
2533                        }
2534                        else
2535                        {
2536                                if(!$eyear)
2537                                {
2538                                        $eyear = $syear;
2539                                }
2540                                //Tratamento do valor final (mes) da pesquisa de eventos feita em $this->so->list_events.
2541                                //Se $emonth nao tem valor, recebe o valor de $smonth (que recebe $params['smonth']) e soma 1.
2542                                //O valor $params['emonth'] indica o mes final para a pesquisa de eventos, e passou a ser
2543                                //informado na a impressao de eventos mensais. Mudancas feitas em class.uicalendar.inc.php,
2544                                //function display_month_print();
2545                                if(!$emonth)
2546                                {
2547                                        $emonth = $smonth + 1;
2548                                        if($emonth > 12)
2549                                        {
2550                                                $emonth = 1;
2551                                                $eyear++;
2552                                        }
2553                                }
2554                                if(!$eday)
2555                                {
2556                                        $eday = $sday + 1;
2557                                }
2558                                $edate = mktime(23,59,59,$emonth,$eday,$eyear);
2559                        }
2560                        //echo "<p>bocalendar::store_to_cache(".print_r($params,True).") syear=$syear, smonth=$smonth, sday=$sday, eyear=$eyear, emonth=$emonth, eday=$eday, xmlrpc='$param[xmlrpc]'</p>\n";
2561                        if($this->debug)
2562                        {
2563                                echo '<!-- Start Date : '.sprintf("%04d%02d%02d",$syear,$smonth,$sday).' -->'."\n";
2564                                echo '<!-- End   Date : '.sprintf("%04d%02d%02d",$eyear,$emonth,$eday).' -->'."\n";
2565                        }
2566                        //A variavel $month_print recebe o parametro 'saux' com o mes de inicio da pesquisa de eventos por
2567                        //$this->so->list_events. O valor do mes final da pesquisa e tratado no codigo acima;
2568                        //$month_ini = $params['saux'];
2569
2570                        if($owner_id)
2571                        {
2572                                $cached_event_ids = $this->so->list_events($syear,$smonth,$sday,$eyear,$emonth,$eday,$owner_id);
2573                                $cached_event_ids_repeating = $this->so->list_repeated_events($syear,$smonth,$sday,$eyear,$emonth,$eday,$owner_id);
2574                        }
2575                        else
2576                        {
2577                                $cached_event_ids = $this->so->list_events($syear,$smonth,$sday,$eyear,$emonth,$eday);
2578                                $cached_event_ids_repeating = $this->so->list_repeated_events($syear,$smonth,$sday,$eyear,$emonth,$eday);
2579                        }
2580
2581                        $c_cached_ids = count($cached_event_ids);
2582                        $c_cached_ids_repeating = count($cached_event_ids_repeating);
2583
2584                        if($this->debug)
2585                        {
2586                                echo '<!-- events cached : '.$c_cached_ids.' : for : '.sprintf("%04d%02d%02d",$syear,$smonth,$sday).' -->'."\n";
2587                                echo '<!-- repeating events cached : '.$c_cached_ids_repeating.' : for : '.sprintf("%04d%02d%02d",$syear,$smonth,$sday).' -->'."\n";
2588                        }
2589
2590                        $this->cached_events = Array();
2591
2592                        if($c_cached_ids == 0 && $c_cached_ids_repeating == 0)
2593                        {
2594                                return;
2595                        }
2596
2597                        $cache_start = (int)(sprintf("%04d%02d%02d",$syear,$smonth,$sday));
2598                        $cached_event=$this->get_cached_event();
2599                        if($c_cached_ids)
2600                        {
2601                                for($i=0;$i<$c_cached_ids;$i++)
2602                                {
2603                                        $event = $this->so->read_entry($cached_event_ids[$i]);
2604                                        if ($event['recur_type'])
2605                                        {
2606                                                continue;       // fetch recuring events only in 2. loop
2607                                        }
2608                                        $startdate = (int)(date('Ymd',$this->maketime($event['start'])));
2609                                        $enddate = (int)(date('Ymd',$this->maketime($event['end'])));
2610                                        $this->cached_events[$startdate][] = $event;
2611                                        if($startdate != $enddate)
2612                                        {
2613                                                $start['year'] = (int)(substr($startdate,0,4));
2614                                                $start['month'] = (int)(substr($startdate,4,2));
2615                                                $start['mday'] = (int)(substr($startdate,6,2));
2616                                                for($j=$startdate,$k=0;$j<=$enddate;$k++,$j=(int)(date('Ymd',mktime(0,0,0,$start['month'],$start['mday'] + $k,$start['year']))))
2617                                                {
2618                                                        $c_evt_day = count($this->cached_events[$j]) - 1;
2619                                                        if($c_evt_day < 0)
2620                                                        {
2621                                                                $c_evt_day = 0;
2622                                                        }
2623                                                        if($this->debug)
2624                                                        {
2625                                                                echo '<!-- Date: '.$j.' Count : '.$c_evt_day.' -->'."\n";
2626                                                        }
2627                                                        if($this->cached_events[$j][$c_evt_day]['id'] != $event['id'])
2628                                                        {
2629                                                                if($this->debug)
2630                                                                {
2631                                                                        echo '<!-- Adding Event for Date: '.$j.' -->'."\n";
2632                                                                }
2633                                                                $this->cached_events[$j][] = $event;
2634                                                        }
2635                                                        if ($j >= $cache_start && (@$params['no_doubles'] || @$this->xmlrpc))
2636                                                        {
2637                                                                break;  // add event only once on it's startdate
2638                                                        }
2639                                                }
2640                                        }
2641                                }
2642                        }
2643
2644                        $this->repeating_events = Array();
2645                        if($c_cached_ids_repeating)
2646                        {
2647                                for($i=0;$i<$c_cached_ids_repeating;$i++)
2648                                {
2649                                        $this->repeating_events[$i] = $this->so->read_entry($cached_event_ids_repeating[$i]);
2650                                        if($this->debug)
2651                                        {
2652                                                echo '<!-- Cached Events ID: '.$cached_event_ids_repeating[$i].' ('.sprintf("%04d%02d%02d",$this->repeating_events[$i]['start']['year'],$this->repeating_events[$i]['start']['month'],$this->repeating_events[$i]['start']['mday']).') -->'."\n";
2653                                        }
2654                                }
2655                                for($date=mktime(0,0,0,$smonth,$sday,$syear);$date<=$edate;$date += 86400)
2656                                {
2657                                        if($this->debug)
2658                                        {
2659                                                $search_date = date('Ymd',$date);
2660                                                echo '<!-- Calling check_repeating_events('.$search_date.') -->'."\n";
2661                                        }
2662                                        $this->check_repeating_events($date);
2663                                        if($this->debug)
2664                                        {
2665                                                echo '<!-- Total events found matching '.$search_date.' = '.count($this->cached_events[$search_date]).' -->'."\n";
2666                                                for($i=0;$i<count($this->cached_events[$search_date]);$i++)
2667                                                {
2668                                                        echo '<!-- Date: '.$search_date.' ['.$i.'] = '.$this->cached_events[$search_date][$i]['id'].' -->'."\n";
2669                                                }
2670                                        }
2671                                }
2672                        }
2673                        $retval = Array();
2674                        for($j=date('Ymd',mktime(0,0,0,$smonth,$sday,$syear)),$k=0;$j<=date('Ymd',mktime(0,0,0,$emonth,$eday,$eyear));$k++,$j=date('Ymd',mktime(0,0,0,$smonth,$sday + $k,$syear)))
2675                        {
2676                                if(is_array($this->cached_events[$j]))
2677                                {
2678                                        if ($this->xmlrpc)
2679                                        {
2680                                                foreach($this->cached_events[$j] as $event)
2681                                                {
2682                                                        $retval[] = $this->xmlrpc_prepare($event);
2683                                                }
2684                                        }
2685                                        else
2686                                        {
2687                                                $retval[$j] = $this->cached_events[$j];
2688                                        }
2689                                }
2690                        }
2691                        //echo "store_to_cache(".print_r($params,True).")=<pre>".print_r($retval,True)."</pre>\n";
2692                        $this->so->cal->event = $cached_event;
2693                        return $retval;
2694                }
2695
2696                function xmlrpc_prepare(&$event)
2697                {
2698                        $event['rights'] = $this->grants[$event['owner']];
2699
2700                        foreach(array('start','end','modtime','recur_enddate') as $name)
2701                        {
2702                                if (isset($event[$name]))
2703                                {
2704                                        $event[$name] = $GLOBALS['server']->date2iso8601($event[$name]);
2705                                }
2706                        }
2707                        if (is_array($event['recur_exception']))
2708                        {
2709                                foreach($event['recur_exception'] as $key => $timestamp)
2710                                {
2711                                        $event['recur_exception'][$key] = $GLOBALS['server']->date2iso8601($timestamp);
2712                                }
2713                        }
2714                        static $user_cache = array();
2715
2716                        if (!is_object($GLOBALS['phpgw']->perferences))
2717                        {
2718                                $GLOBALS['phpgw']->perferences = CreateObject('phpgwapi.preferences');
2719                        }
2720                        foreach($event['participants'] as $user_id => $status)
2721                        {
2722                                if (!isset($user_cache[$user_id]))
2723                                {
2724                                        $user_cache[$user_id] = array(
2725                                                'name'   => $GLOBALS['phpgw']->common->grab_owner_name($user_id),
2726                                                'email'  => $GLOBALS['phpgw']->perferences->email_address($user_id)
2727                                        );
2728                                }
2729                                $event['participants'][$user_id] = $user_cache[$user_id] + array(
2730                                        'status' => $status,
2731                                );
2732                        }
2733                        if (is_array($event['alarm']))
2734                        {
2735                                foreach($event['alarm'] as $id => $alarm)
2736                                {
2737                                        $event['alarm'][$id]['time'] = $GLOBALS['server']->date2iso8601($alarm['time']);
2738                                        if ($alarm['owner'] != $GLOBALS['phpgw_info']['user']['account_id'])
2739                                        {
2740                                                unset($event['alarm'][$id]);
2741                                        }
2742                                }
2743                        }
2744                        $event['category'] = $GLOBALS['server']->cats2xmlrpc(explode(',',$event['category']));
2745
2746                        // using access={public|privat} in all modules via xmlrpc
2747                        $event['access'] = $event['public'] ? 'public' : 'privat';
2748                        unset($event['public']);
2749
2750                        return $event;
2751                }
2752
2753                /* Begin Appsession Data */
2754                function store_to_appsession($event)
2755                {
2756                        $GLOBALS['phpgw']->session->appsession('entry','calendar',$event);
2757                }
2758
2759                function restore_from_appsession()
2760                {
2761                        $this->event_init();
2762                        $event = $GLOBALS['phpgw']->session->appsession('entry','calendar');
2763                        $this->so->cal->event = $event;
2764                        return $event;
2765                }
2766                /* End Appsession Data */
2767
2768                /* Begin of SO functions */
2769                function get_cached_event()
2770                {
2771                        return $this->so->get_cached_event();
2772                }
2773
2774                function add_attribute($var,$value,$index='**(**')
2775                {
2776                        $this->so->add_attribute($var,$value,$index);
2777                }
2778
2779                function event_init()
2780                {
2781                        $this->so->event_init();
2782                }
2783
2784                function set_start($year,$month,$day=0,$hour=0,$min=0,$sec=0)
2785                {
2786                        $this->so->set_start($year,$month,$day,$hour,$min,$sec);
2787                }
2788
2789                function set_end($year,$month,$day=0,$hour=0,$min=0,$sec=0)
2790                {
2791                        $this->so->set_end($year,$month,$day,$hour,$min,$sec);
2792                }
2793
2794                function set_title($title='')
2795                {
2796                        $this->so->set_title($title);
2797                }
2798
2799                function set_description($description='')
2800                {
2801                        $this->so->set_description($description);
2802                }
2803                function set_ex_participants($ex_participants='')
2804                {
2805                        $this->so->set_ex_participants($ex_participants);
2806                }
2807
2808                function set_class($class)
2809                {
2810                        $this->so->set_class($class);
2811                }
2812
2813                function set_category($category='')
2814                {
2815                        $this->so->set_category($category);
2816                }
2817
2818                function set_alarm($alarm)
2819                {
2820                        $this->so->set_alarm($alarm);
2821                }
2822
2823                function set_recur_none()
2824                {
2825                        $this->so->set_recur_none();
2826                }
2827
2828                function set_recur_daily($year,$month,$day,$interval)
2829                {
2830                        $this->so->set_recur_daily($year,$month,$day,$interval);
2831                }
2832
2833                function set_recur_weekly($year,$month,$day,$interval,$weekdays)
2834                {
2835                        $this->so->set_recur_weekly($year,$month,$day,$interval,$weekdays);
2836                }
2837
2838                function set_recur_monthly_mday($year,$month,$day,$interval)
2839                {
2840                        $this->so->set_recur_monthly_mday($year,$month,$day,$interval);
2841                }
2842
2843                function set_recur_monthly_wday($year,$month,$day,$interval)
2844                {
2845                        $this->so->set_recur_monthly_wday($year,$month,$day,$interval);
2846                }
2847
2848                function set_recur_yearly($year,$month,$day,$interval)
2849                {
2850                        $this->so->set_recur_yearly($year,$month,$day,$interval);
2851                }
2852                /* End of SO functions */
2853
2854                function prepare_matrix($interval,$increment,$part,$fulldate)
2855                {
2856                        for($h=0;$h<24;$h++)
2857                        {
2858                                for($m=0;$m<$interval;$m++)
2859                                {
2860                                        $index = (($h * 10000) + (($m * $increment) * 100));
2861                                        $time_slice[$index]['marker'] = '&nbsp';
2862                                        $time_slice[$index]['description'] = '';
2863                                }
2864                        }
2865                        foreach($this->cached_events[$fulldate] as $event)
2866                        {
2867                                if ($event['participants'][$part] == 'R')
2868                                {
2869                                        continue;       // dont show rejected invitations, as they are free time
2870                                }
2871                                $eventstart = $GLOBALS['phpgw']->datetime->localdates($this->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset);
2872                                $eventend = $GLOBALS['phpgw']->datetime->localdates($this->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset);
2873                                $start = ($eventstart['hour'] * 10000) + ($eventstart['minute'] * 100);
2874                                $starttemp = $this->splittime("$start",False);
2875                                $subminute = 0;
2876                                for($m=0;$m<$interval;$m++)
2877                                {
2878                                        $minutes = $increment * $m;
2879                                        if((int)$starttemp['minute'] > $minutes && (int)$starttemp['minute'] < ($minutes + $increment))
2880                                        {
2881                                                $subminute = ($starttemp['minute'] - $minutes) * 100;
2882                                        }
2883                                }
2884                                $start -= $subminute;
2885                                $end =  ($eventend['hour'] * 10000) + ($eventend['minute'] * 100);
2886                                $endtemp = $this->splittime("$end",False);
2887                                $addminute = 0;
2888                                for($m=0;$m<$interval;$m++)
2889                                {
2890                                        $minutes = ($increment * $m);
2891                                        if($endtemp['minute'] < ($minutes + $increment) && $endtemp['minute'] > $minutes)
2892                                        {
2893                                                $addminute = ($minutes + $increment - $endtemp['minute']) * 100;
2894                                        }
2895                                }
2896                                $end += $addminute;
2897                                $starttemp = $this->splittime("$start",False);
2898                                $endtemp = $this->splittime("$end",False);
2899
2900                                for($h=$starttemp['hour'];$h<=$endtemp['hour'];$h++)
2901                                {
2902                                        $startminute = 0;
2903                                        $endminute = $interval;
2904                                        $hour = $h * 10000;
2905                                        if($h == (int)$starttemp['hour'])
2906                                        {
2907                                                $startminute = ($starttemp['minute'] / $increment);
2908                                        }
2909                                        if($h == (int)$endtemp['hour'])
2910                                        {
2911                                                $endminute = ($endtemp['minute'] / $increment);
2912                                        }
2913                                        $private = $this->is_private($event,$part);
2914                                        $time_display = $GLOBALS['phpgw']->common->show_date($eventstart['raw'],$this->users_timeformat).'-'.$GLOBALS['phpgw']->common->show_date($eventend['raw'],$this->users_timeformat);
2915                                        $time_description = '('.$time_display.') '.$this->get_short_field($event,$private,'title').$this->display_status($event['participants'][$part]);
2916                                        for($m=$startminute;$m<$endminute;$m++)
2917                                        {
2918                                                $index = ($hour + (($m * $increment) * 100));
2919                                                $time_slice[$index]['marker'] = '-';
2920                                                $time_slice[$index]['description'] = $time_description;
2921                                                $time_slice[$index]['id'] = $event['id'];
2922                                        }
2923                                }
2924                        }
2925                        return $time_slice;
2926                }
2927
2928                /*!
2929                @function set_status
2930                @abstract set the participant response $status for event $cal_id and notifies the owner of the event
2931                */
2932                function set_status($cal_id,$status)
2933                {
2934                        $status2msg = array(
2935                                REJECTED  => MSG_REJECTED,
2936                                TENTATIVE => MSG_TENTATIVE,
2937                                ACCEPTED  => MSG_ACCEPTED
2938                        );
2939                        if (!isset($status2msg[$status]))
2940                        {
2941                                return False;
2942                        }
2943                        $event = $this->so->read_entry($cal_id);
2944                        $account_id = $GLOBALS['phpgw_info']['user']['account_id'];
2945                        if(($status2msg[$status] == "5" && $event['participants'][$account_id] == "A") ||
2946                         ($status2msg[$status] == "3" && $event['participants'][$account_id] == "R")) {
2947                                return True;
2948                        }
2949                        $this->so->set_status($cal_id,$status);
2950                        $event = $this->so->read_entry($cal_id);
2951                        $this->send_update($status2msg[$status],$event['participants'],$event);
2952
2953                }
2954
2955                /*!
2956                @function update_requested
2957                @abstract checks if $userid has requested (in $part_prefs) updates for $msg_type
2958                @syntax update_requested($userid,$part_prefs,$msg_type,$old_event,$new_event)
2959                @param $userid numerical user-id
2960                @param $part_prefs preferces of the user $userid
2961                @param $msg_type type of the notification: MSG_ADDED, MSG_MODIFIED, MSG_ACCEPTED, ...
2962                @param $old_event Event before the change
2963                @param $new_event Event after the change
2964                @returns 0 = no update requested, > 0 update requested
2965                */
2966                function update_requested($userid,$part_prefs,$msg_type,$old_event,$new_event)
2967                {
2968                        if ($msg_type == MSG_ALARM)
2969                        {
2970                                return True;    // always True for now
2971                        }
2972                        $want_update = 0;
2973
2974                        // the following switch fall-through all cases, as each included the following too
2975                        //
2976                        $msg_is_response = $msg_type == MSG_REJECTED || $msg_type == MSG_ACCEPTED || $msg_type == MSG_TENTATIVE;
2977
2978                        switch($ru = $part_prefs['calendar']['receive_updates'])
2979                        {
2980                                case 'responses':
2981                                        if ($msg_is_response)
2982                                        {
2983                                                ++$want_update;
2984                                        }
2985                                case 'modifications':
2986                                        if ($msg_type == MSG_MODIFIED)
2987                                        {
2988                                                ++$want_update;
2989                                        }
2990                                case 'time_change_4h':
2991                                case 'time_change':
2992                                        $diff = max(abs($this->maketime($old_event['start'])-$this->maketime($new_event['start'])),
2993                                                abs($this->maketime($old_event['end'])-$this->maketime($new_event['end'])));
2994                                        $check = $ru == 'time_change_4h' ? 4 * 60 * 60 - 1 : 0;
2995                                        if ($msg_type == MSG_MODIFIED && $diff > $check)
2996                                        {
2997                                                ++$want_update;
2998                                        }
2999                                case 'add_cancel':
3000                                        if ($old_event['owner'] == $userid && $msg_is_response ||
3001                                                $msg_type == MSG_DELETED || $msg_type == MSG_ADDED)
3002                                        {
3003                                                ++$want_update;
3004                                        }
3005                                        break;
3006                                case 'no':
3007                                        break;
3008                        }
3009                        //echo "<p>bocalendar::update_requested(user=$userid,pref=".$part_prefs['calendar']['receive_updates'] .",msg_type=$msg_type,".($old_event?$old_event['title']:'False').",".($old_event?$old_event['title']:'False').") = $want_update</p>\n";
3010                        return $want_update > 0;
3011                }
3012
3013                function create_vcard($event_arrays)
3014                {
3015            if(!is_array($event_arrays))
3016                                return null;
3017
3018                        $sender = $GLOBALS['phpgw_info']['user']['email'];
3019                        $uid_dono = $GLOBALS['phpgw_info']['user']['account_lid'];
3020                        $tmpattach="BEGIN:VCALENDAR\n"
3021                        ."PRODID:-//Expresso Livre//Calendar//EN\n"
3022                        ."VERSION:1.0\n";
3023            foreach ($event_arrays as $event)
3024            {
3025                                // It translates int to string
3026                                if (!is_object($event) && !is_array($event) || !array_key_exists  ('end', $event))
3027                                        $event = $event_arrays;
3028
3029                                //set to GMT
3030                                //Aqui estou pegando o horário do evento e setando para GMT de acordo com o fuso horário estabelecido nas configurações do expresso.
3031                                $start_time = mktime($event['start']['hour'],$event['start']['min'],$event['start']['sec'],$event['start']['month'],$event['start']['mday'],$event['start']['year']) - $GLOBALS['phpgw']->datetime->tz_offset;
3032                                $end_time = mktime($event['end']['hour'],$event['end']['min'],$event['end']['sec'],$event['end']['month'],$event['end']['mday'],$event['end']['year']) - $GLOBALS['phpgw']->datetime->tz_offset;
3033                               
3034                                $start_time = date("Ymd\THis\Z", $start_time);
3035                                $end_time = date("Ymd\THis\Z", $end_time);
3036       
3037                                // Necessário espaços após quebra-de-linha, na descrição, caso contrário
3038                                // ocorrerá erro ao importar o agendamento no Outlook (erro lunar).
3039                                $description = str_replace("\n","\n ", $event['description']);
3040                               
3041                                $tmpattach.="BEGIN:VEVENT\r\n"
3042                                ."DTSTART:".$start_time."\r\n"
3043                                ."DTEND:".$end_time."\r\n"
3044                                ."LAST-MODIFIED:".gmdate("Ymd\THis\Z")."\r\n" //Hora no formato UTC
3045                                //."UID:Expresso-".$event['id'].$event['uid']."\r\n"
3046                                ."UID:Expresso-".$event[id]."@".$uid_dono."\n"
3047                                ."DESCRIPTION:".$description."\r\n"
3048                                ."SUMMARY:".$event['title']."\r\n"
3049                                ."LOCATION:".$event['location']."\r\n"
3050                                ."ORGANIZER:mailto:".$sender."\n";
3051                                $expart=preg_split('/,/', $event['ex_participants']);
3052
3053                                foreach ($expart as $mail)
3054                                {
3055                                    if($mail != "")
3056                                    {
3057                                        $tmpattach.="ATTENDEE;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT:mailto:".$mail."\n";
3058                                    }
3059                                }
3060                               
3061                                while (list($id,$status) = each($event['participants']))
3062                                {
3063
3064                                      $preferences = CreateObject('phpgwapi.preferences',$id);
3065                                      $mail = $preferences->email_address($id);
3066                                      if ( $sender != $mail)
3067                                      {
3068                                         if($status == 'U' ){
3069                                                  $tmpattach.="ATTENDEE;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT:mailto:".$mail."\n";
3070                                                        }
3071                                         elseif($status == 'A' ){
3072                                                 $tmpattach.="ATTENDEE;RSVP=TRUE;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPANT:mailto:".$mail."\n";
3073                                                        }
3074                                         elseif($status == 'T' ){
3075                                                 $tmpattach.="ATTENDEE;RSVP=TRUE;PARTSTAT=TENTATIVE;ROLE=REQ-PARTICIPANT:mailto:".$mail."\n";
3076                                                         }
3077                                         else
3078                                                  {
3079                                                     $tmpattach.="ATTENDEE;RSVP=TRUE;PARTSTAT=DECLINED;ROLE=REQ-PARTICIPANT:mailto:".$mail."\n";
3080                                                   }
3081                                      }
3082                                }
3083                                $tmpattach.="END:VEVENT"."\n";
3084                                //."END:VEVENT\r\n";
3085                        }
3086                    $tmpattach.="END:VCALENDAR\r\n";
3087                    return $tmpattach;
3088                }
3089
3090                /*!
3091                @function send_update
3092                @abstract sends update-messages to certain participants of an event
3093                @syntax send_update($msg_type,$to_notify,$old_event,$new_event=False)
3094                @param $msg_type type of the notification: MSG_ADDED, MSG_MODIFIED, MSG_ACCEPTED, ...
3095                @param $to_notify array with numerical user-ids as keys (!) (value is not used)
3096                @param $old_event Event before the change
3097                @param $new_event Event after the change
3098                */
3099                function send_update($msg_type,$to_notify,$old_event,$new_event=False,$user=False)
3100                {                       
3101                        if (!is_array($to_notify))
3102                        {
3103                                $to_notify = array();
3104                        }
3105                        $owner = $old_event ? $old_event['owner'] : $new_event['owner'];
3106                        if ($owner && !isset($to_notify[$owner]) && $msg_type != MSG_ALARM)
3107                        {
3108                                $to_notify[$owner] = 'owner';   // always include the event-owner
3109                        }
3110                        $version = $GLOBALS['phpgw_info']['apps']['calendar']['version'];
3111
3112                        $GLOBALS['phpgw_info']['user']['preferences'] = $GLOBALS['phpgw']->preferences->create_email_preferences();
3113
3114                    $preferences = CreateObject('phpgwapi.preferences',(int)$this->owner);
3115                    $GLOBALS['phpgw']->accounts->get_account_name((int)$owner,$lid,$fname,$lname);
3116                 
3117                        if($new_event['notifications_owner'] == '1'){
3118                        $sender = $preferences->email_address((int)$owner);
3119                        $sender_name = $fname.' '.$lname;
3120                    }else{
3121                        $sender = $GLOBALS['phpgw_info']['user']['email'];
3122                        $sender_name = $GLOBALS['phpgw_info']['user']['fullname'];
3123                        }
3124                 
3125                    $temp_tz_offset = $this->prefs['common']['tz_offset'];
3126                       
3127                        $temp_timeformat = $this->prefs['common']['timeformat'];
3128                        $temp_dateformat = $this->prefs['common']['dateformat'];
3129
3130                        $tz_offset = ((60 * 60) * (int)$temp_tz_offset);
3131
3132                        if($old_event != False)
3133                        {
3134                                $t_old_start_time = $this->maketime($old_event['start']);
3135                                if($t_old_start_time < (time() - 86400))
3136                                {
3137                                        return False;
3138                                }
3139                        }
3140
3141                        $temp_user = $GLOBALS['phpgw_info']['user'];
3142
3143                        if (!$user)
3144                        {
3145                                $user = $this->owner;
3146                        }
3147                        $GLOBALS['phpgw_info']['user']['preferences'] = $GLOBALS['phpgw']->preferences->create_email_preferences($user);
3148
3149                        $event = $msg_type == MSG_ADDED || $msg_type == MSG_MODIFIED ? $new_event : $old_event;
3150                        if($old_event != False)
3151                        {
3152                                $old_starttime = $t_old_start_time - $GLOBALS['phpgw']->datetime->tz_offset;
3153                        }
3154                        $starttime = $this->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset;
3155                        $endtime   = $this->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset;
3156
3157                        switch($msg_type)
3158                        {
3159                                case MSG_DELETED:
3160                                        $action = lang('Canceled');
3161                                        $msg = 'Canceled';
3162                                        $msgtype = '"calendar";';
3163                                        $method = 'cancel';
3164                                        $typesend = 1;
3165                                        break;
3166                                case MSG_MODIFIED:
3167                                        $action = lang('Modified');
3168                                        $msg = 'Modified';
3169                                        $msgtype = '"calendar"; Version="'.$version.'"; Id="'.$new_event['id'].'"';
3170                                        $method = 'request';
3171                                        $typesend = 2;
3172                                        break;
3173                                case MSG_ADDED:
3174                                        $action = lang('Added');
3175                                        $msg = 'Added';
3176                                        $msgtype = '"calendar"; Version="'.$version.'"; Id="'.$new_event['id'].'"';
3177                                        $method = 'request';
3178                                        $typesend = 3;
3179                                        break;
3180                                case MSG_REJECTED:
3181                                        $action = lang('Rejected');
3182                                        $msg = 'Response';
3183                                        $msgtype = '"calendar";';
3184                                        $method = 'reply';
3185                                        $typesend = 4;
3186                                        break;
3187                                case MSG_TENTATIVE:
3188                                        $action = lang('Tentative');
3189                                        $msg = 'Response';
3190                                        $msgtype = '"calendar";';
3191                                        $method = 'reply';
3192                                        $typesend = 5;
3193                                        break;
3194                                case MSG_ACCEPTED:
3195                                        $action = lang('Accepted');
3196                                        $msg = 'Response';
3197                                        $msgtype = '"calendar";';
3198                                        $method = 'reply';
3199                                        $typesend = 6;
3200                                        break;
3201                                case MSG_ALARM:
3202                                        $action = lang('Alarm');
3203                                        $msg = 'Alarm';
3204                                        $msgtype = '"calendar";';
3205                                        $method = 'publish';    // duno if thats right
3206                                        $typesend = 7;
3207                                        break;
3208                                default:
3209                                        $method = 'publish';
3210                                        $typesend = 8;
3211                        }
3212                        $notify_msg = $this->prefs['calendar']['notify'.$msg];
3213                        if (empty($notify_msg))
3214                        {
3215                                $notify_msg = $this->prefs['calendar']['notifyAdded'];  // use a default
3216                        }
3217                        $details = array(                       // event-details for the notify-msg
3218                                'id'          => $msg_type == MSG_ADDED ? $new_event['id'] : $old_event['id'],
3219                                'action'      => $action,
3220                        );
3221                        $event_arr = $this->event2array($event);
3222                        foreach($event_arr as $key => $val)
3223                        {
3224                                $details[$key] = $val['data'];
3225                        }
3226                       
3227                        $details['participants'] = implode("\n",$details['participants']);
3228
3229                        $details['link'] = $GLOBALS['phpgw_info']['server']['webserver_url'].'/index.php?menuaction=calendar.uicalendar.view&cal_id='.$event['id'];
3230                        // if url is only a path, try guessing the rest ;-)
3231                        if ($GLOBALS['phpgw_info']['server']['webserver_url'][0] == '/')
3232                        {
3233                                $details['link'] = ($GLOBALS['phpgw_info']['server']['enforce_ssl'] ? 'https://' : 'http://').
3234                                        ($GLOBALS['phpgw_info']['server']['hostname'] ? $GLOBALS['phpgw_info']['server']['hostname'] : 'localhost').
3235                                        $details['link'];
3236                        }
3237                       
3238                        //Seta o email usando phpmailer
3239                        define('PHPGW_INCLUDE_ROOT','../');     
3240                        define('PHPGW_API_INC','../phpgwapi/inc');     
3241                        include_once(PHPGW_API_INC.'/class.phpmailer.inc.php');
3242                        $mail = new PHPMailer();
3243                        $mail->IsSMTP();
3244                        $boemailadmin = CreateObject('emailadmin.bo');
3245                        $emailadmin_profile = $boemailadmin->getProfileList();
3246                        $emailadmin = $boemailadmin->getProfile($emailadmin_profile[0]['profileID']);
3247               
3248                        $mail->Host = $emailadmin['smtpServer'];
3249                        $mail->Port = $emailadmin['smtpPort'];
3250                        $mail->From = $GLOBALS['phpgw']->preferences->values['email'];
3251                        $mail->FromName = $GLOBALS['phpgw_info']['user']['fullname'];
3252                        //$mail->IsHTML(true);
3253                        $mail->IsCalendar(true);
3254
3255                        // Aqui e enviado o email
3256                        foreach($to_notify as $userid => $statusid)
3257                        {
3258                                $mail->ClearAttachments();
3259                               
3260                                $userid = (int)$userid;
3261
3262                                if ($statusid == 'R' || $GLOBALS['phpgw']->accounts->get_type($userid) == 'g')
3263                                {
3264                                        continue;       // dont notify rejected participants
3265                                }
3266                                if($userid != $GLOBALS['phpgw_info']['user']['account_id'] || ($msg_type == MSG_ADDED && $userid != $owner) || $msg_type == MSG_ALARM || isset($new_event['attachment']))
3267                                //if($userid != $owner ||  $msg_type == MSG_ALARM || isset($new_event['attachment']))
3268                                {
3269                                        print_debug('Msg Type',$msg_type);
3270                                        print_debug('UserID',$userid);
3271
3272                                        $preferences = CreateObject('phpgwapi.preferences',$userid);
3273                                        $part_prefs = $preferences->read_repository();
3274
3275                                        if (!$this->update_requested($userid,$part_prefs,$msg_type,$old_event,$new_event))
3276                                        {
3277                                                continue;
3278                                        }
3279                                        $GLOBALS['phpgw']->accounts->get_account_name($userid,$lid,$details['to-firstname'],$details['to-lastname']);
3280                                        $details['to-fullname'] = $GLOBALS['phpgw']->common->display_fullname('',$details['to-firstname'],$details['to-lastname']);
3281
3282                                        $to = $preferences->email_address($userid);
3283                                       
3284                                        if (empty($to) || $to[0] == '@' || $to[0] == '$')       // we have no valid email-address
3285                                        {
3286                                                //echo "<p>bocalendar::send_update: Empty email adress for user '".$details['to-fullname']."' ==> ignored !!!</p>\n";
3287                                                continue;
3288                                        }
3289                                        print_debug('Email being sent to',$to);
3290
3291                                        $GLOBALS['phpgw_info']['user']['preferences']['common']['tz_offset'] = $part_prefs['common']['tz_offset'];
3292                                        $GLOBALS['phpgw_info']['user']['preferences']['common']['timeformat'] = $part_prefs['common']['timeformat'];
3293                                        $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat'] = $part_prefs['common']['dateformat'];
3294
3295                                        $GLOBALS['phpgw']->datetime->tz_offset = ((60 * 60) * (int)$GLOBALS['phpgw_info']['user']['preferences']['common']['tz_offset']);
3296
3297                                        if($old_starttime)
3298                                        {
3299                                                $details['olddate'] = $GLOBALS['phpgw']->common->show_date($old_starttime);
3300                                        }
3301                                        $details['startdate'] = $GLOBALS['phpgw']->common->show_date($starttime);
3302                                        $details['enddate']   = $GLOBALS['phpgw']->common->show_date($endtime);
3303                                       
3304                                       
3305                                        list($subject,$body1) = split("\n",$GLOBALS['phpgw']->preferences->parse_notify($notify_msg,$details),2);
3306                                       
3307                                        switch($part_prefs['calendar']['update_format'])
3308                                        {
3309                                                case  'extended':
3310                                                        //$body .= "\n\n".lang('Event Details follow').":\n";
3311                                                        $body = '';
3312                                                        $body .= "<br>".lang('Event Details follow')." :: ";
3313                                                        foreach($event_arr as $key => $val)
3314                                                        {
3315                                                                // titulo
3316                                                                if($key =='title')
3317                                                                {
3318                                                                        $var1 = $val['field'];
3319                                                                        $vardata1 = $details[$key];
3320                                                                }
3321                                                                //descricao
3322                                                                if($key =='description')
3323                                                                {
3324                                                                        $var2 = $val['field'];
3325                                                                        $vardata2 = $details[$key];
3326                                                                }
3327                                                                //dt inicio
3328                                                                if($key =='startdate')
3329                                                                {
3330                                                                        switch(trim($part_prefs['common']['dateformat']))
3331                                                                        {
3332                                                                               
3333                                                                                case ($part_prefs['common']['dateformat'] === "m/d/Y" || $part_prefs['common']['dateformat'] === "m-d-Y" || $part_prefs['common']['dateformat'] === "m.d.Y"):
3334                                                                                        $var3 = $val['field'];
3335                                                                                        $vardata3 = $details[$key];
3336                                                                                        $newmounth3 = substr($vardata3,0,2);
3337                                                                                        $newday3 = substr($vardata3,3,2);
3338                                                                                        $newyear3 = substr($vardata3,6,4);
3339                                                                                        $newall3 =$newyear3.$newmounth3.$newday3;
3340                                                                                        break;
3341                                                                                       
3342                                                                                case    ($part_prefs['common']['dateformat'] === "Y/d/m" || $part_prefs['common']['dateformat'] === "Y-d-m" || $part_prefs['common']['dateformat'] === "Y.d.m"):
3343
3344                                                                                        $var3 = $val['field'];
3345                                                                                        $vardata3 = $details[$key];
3346                                                                                        $newyear3 = substr($vardata3,0,4);
3347                                                                                        $newday3 = substr($vardata3,5,2);
3348                                                                                        $newmounth3 = substr($vardata3,8,2);
3349                                                                                        $newall3 =$newyear3.$newmounth3.$newday3;
3350                                                                                        break;
3351
3352                                                                                case ($part_prefs['common']['dateformat'] === "Y/m/d" || $part_prefs['common']['dateformat'] === "Y-m-d" || $part_prefs['common']['dateformat'] === "Y.m.d"):
3353
3354                                                                                        $var3 = $val['field'];
3355                                                                                        $vardata3 = $details[$key];
3356                                                                                        $newyear3 = substr($vardata3,0,4);
3357                                                                                        $newmounth3 = substr($vardata3,5,2);
3358                                                                                        $newday3 = substr($vardata3,8,2);
3359                                                                                        $newall3 =$newyear3.$newmounth3.$newday3;
3360                                                                                        break;
3361
3362                                                                                case ($part_prefs['common']['dateformat'] === "d/m/Y" || $part_prefs['common']['dateformat'] === "d-m-Y" || $part_prefs['common']['dateformat'] === "d.m.Y" || $part_prefs['common']['dateformat'] === "d-M-Y"):
3363                                                                               
3364                                                                                        $var3 = $val['field'];
3365                                                                                        $vardata3 = $details[$key];
3366                                                                                        $newday3 = substr($vardata3,0,2);
3367                                                                                        $newmounth3 = substr($vardata3,3,2);
3368                                                                                        $newyear3 = substr($vardata3,6,4);
3369                                                                                        $newall3 =$newyear3.$newmounth3.$newday3;
3370                                                                                        break;
3371                                                                       
3372                                                                        }
3373                                                                       
3374                                                                }
3375                                                                //dt final
3376                                                                if($key =='enddate')
3377                                                                {
3378                                                                        $var4 = $val['field'];
3379                                                                        $vardata4 = $details[$key];
3380                                                                }
3381                                                                //localizacao
3382                                                                if($key =='location')
3383                                                                {
3384                                                                        $var8 = $val['field'];
3385                                                                        $vardata8 = $details[$key];
3386                                                                }
3387                                                                //participantes
3388                                                                if($key =='participants')
3389                                                                {
3390                                                                        $var5 = $val['field'];
3391                                                                        foreach($val['data'] as $NewKey => $NewVal)
3392                                                                        {
3393                                                                                //Research inside of ldap ( Pesquisa dentro do ldap )
3394                                                                                $newvalue = $this->so->search_uidNumber($to);
3395                                                                                foreach($newvalue as $tmp)
3396                                                                                {
3397                                                                                        $tmpmail = $tmp['mail'][0];
3398                                                                                        $tmpuid = $tmp['uidnumber'][0];
3399                                                                                        if( trim($tmpmail) == trim($to) & trim($tmpuid) == trim($NewKey))
3400                                                                                        {
3401                                                                                                        if( ( $typesend == 3 ) || ( $typesend == 2 ) )
3402                                                                                                        {
3403                                                                                                                $question = "";
3404                                                                                                               
3405                                                                                                                if( $typesend == 2 )
3406                                                                                                                        $question = lang("Do you wish to change your participation in this event?");
3407
3408                                                                                                                $lang1 = lang("To See Commitment");
3409                                                                                                                $varbuttom = "<form action=".$GLOBALS['phpgw_info']['server']['webserver_url']."/index.php?menuaction=calendar.uicalendar.view&cal_id=$event[id]&date=$newall3' method='POST'>
3410                                                                                                                                                                  <input type='submit' value='$lang1'>
3411                                                                                                                                                                   </form>";
3412                                                                                                                $lang2 = lang("To accept");
3413                                                                                                                $varbuttom1 ="<input type='submit' value='$lang2' onClick='javascript:window.open(\"".$GLOBALS['phpgw_info']['server']['webserver_url']."/index.php?menuaction=calendar.uicalendar.set_action&cal_id=$event[id]&action=3&response=1&user_id=$userid\",\"frontpage\",\"height=200,width=450,statusbar=no,toolbar=no,scrollbars=no,menubar=no,left=300,top=200\")'>";
3414
3415                                                                                                                $lang3 = lang("To reject");
3416                                                                                                                $varbuttom2 ="<input type='submit' value='$lang3' onClick='javascript:window.open(\"".$GLOBALS['phpgw_info']['server']['webserver_url']."/index.php?menuaction=calendar.uicalendar.set_action&cal_id=$event[id]&action=0&response=0\",\"frontpage\",\"height=100,width=400,statusbar=no,toolbar=no,scrollbars=no,menubar=no,left=300,top=200\")'>";
3417                                                                                                               
3418                                                                                                                $lang4 = lang("Alarm");
3419                                                                                                                $varbuttom3 = "<form action=".$GLOBALS['phpgw_info']['server']['webserver_url']."/index.php?menuaction=calendar.uialarm.manager method='POST'>
3420                                                                                                                                                                  <input type='submit' value='$lang4'>
3421                                                                                                                                                                  <input type='hidden' name='cal_id' value=$event[id]>
3422                                                                                                                                                                   </form>";
3423                                                                                                                                                                   
3424                                                                                                                $lang5 = lang("Delegate");
3425                                                                                                                $varbuttom4 = "<form action='".$GLOBALS['phpgw_info']['server']['webserver_url']."/index.php?menuaction=calendar.uicalendar.screen_delegate_event&id_event=$event[id]&date=$newall3&delegator=$tmpuid' method='POST'>
3426                                                                                                                                                                  <input type='submit' value='$lang5'>
3427                                                                                                                                                                   </form>";
3428                                                                                                               
3429                                                                                                                $lang6 = lang("Tentative");
3430                                                                                                                $varbuttom5 ="<input type='submit' value='$lang6' onClick='javascript:window.open(\"".$GLOBALS['phpgw_info']['server']['webserver_url']."/index.php?menuaction=calendar.uicalendar.set_action&cal_id=$event[id]&action=2&response=1&user_id=$userid\",\"frontpage\",\"height=200,width=450,statusbar=no,toolbar=no,scrollbars=no,menubar=no,left=300,top=200\")'>";                                                                                                             
3431                                                                                                        }
3432                                                                                                        else
3433                                                                                                        {
3434                                                                                                                        $varbuttom  = "";
3435                                                                                                                        $varbuttom1 = "";
3436                                                                                                                        $varbuttom2 = "";
3437                                                                                                                        $varbuttom3 = "";
3438                                                                                                                        $varbuttom4 = "";
3439                                                                                                                        $varbuttom5 = "";
3440                                                                                                        }
3441                                                                                        }
3442                                                                                        // It only mounts variavel with the name of the participants of the list ( Monta a variavel somente com o nome dos participantes da lista)
3443                                                                                        if($typesend == 3)
3444                                                                                        {
3445                                                                                                list($tmpvardata5,$tmp2vardata5) = explode("(",$NewVal);
3446                                                                                                $vardata5 = $tmpvardata5."<br>";
3447                                                                                        }
3448                                                                                        else
3449                                                                                        {
3450                                                                                                $vardata5 = $NewVal."<br>";
3451                                                                                        }
3452                                                                               
3453                                                                                }
3454                                                                                $vardata6 .= $vardata5;
3455                                                                                unset($vardata5);
3456                                                                        }
3457                                                                }               
3458                                                        }
3459                                                        //To mount the message as text/html (Para montar a mensagem como text/html - /phpgwapi/inc/class.send.inc.php )
3460                                                        $content_type = "text/html";
3461                                                        //It mounts the body of the message (Monta o corpo da mensagem)
3462                                                       
3463                                                        // A constante PHPGW_APP_TPL nao existe para envio de alarmes (cront, asyncservice).
3464                                                        define ("PHPGW_APP_TPL",PHPGW_API_INC . "/../../calendar/templates/".$GLOBALS['phpgw_info']['user']['preferences']['common']['template_dir']."");
3465                                                       
3466                                                        $body = CreateObject('phpgwapi.Template',PHPGW_APP_TPL);
3467                                                        $body->set_file(Array('calendar' => 'body_email.tpl'));
3468                                                        $body->set_block('calendar','list');
3469                                                        $var = Array(
3470                                                                'script'                        => $script,
3471                                                                'subject'                       => $body1,
3472                                                                'var1'                          => $var1,
3473                                                                'vardata1'                      => $vardata1,
3474                                                                'var2'                          => $var2,
3475                                                                'vardata2'                      => $vardata2,
3476                                                                'var3'                          => $var3,
3477                                                                'vardata3'                      => $vardata3,
3478                                                                'var4'                          => $var4,
3479                                                                'vardata4'                      => $vardata4,
3480                                                                'var5'                          => $var5,
3481                                                                'vardata6'                      => $vardata6,
3482                                                                'var8'                          => $var8,
3483                                                                'vardata8'                      => $vardata8,
3484                                                                'question'                      => $question,                                                                                                                   
3485                                                                'varbuttom'                     => $varbuttom,
3486                                                                'varbuttom1'            => $varbuttom1,
3487                                                                'varbuttom2'            => $varbuttom2,
3488                                                                'varbuttom3'            => $varbuttom3,
3489                                                                'varbuttom4'            => $varbuttom4,
3490                                                                'varbuttom5'            => $varbuttom5
3491                                                        );
3492                                                        $body->set_var($var);
3493                                                        $tmpbody = $body->fp('out','list');
3494                                                                                                               
3495                                                        break;
3496
3497                                                case 'ical':
3498                                                        $content_type = "calendar; method=$method; name=calendar.ics";
3499/*                                                      if ($body != '')
3500                                                        {
3501                                                                $boundary = '----Message-Boundary';
3502                                                                $body .= "\n\n\n$boundary\nContent-type: text/$content_type\n".
3503                                                                        "Content-Disposition: inline\nContent-transfer-encoding: 7BIT\n\n";
3504                                                                $content_type = '';
3505                                                        }
3506*/
3507                                                        $body = ExecMethod('calendar.boicalendar.export',array(
3508                                                                'l_event_id'  => $event['id'],
3509                                                                'method'      => $method,
3510                                                                'chunk_split' => False
3511                                                        ));
3512                                                        break;
3513                                        }
3514                                        $mail->AddAddress($to);
3515                                        //$mail->Body = $tmpbody;
3516                                        $tmpattach_n = $this->create_vcard($GLOBALS['bocalendar']->so->cal->event);
3517                                        $tmpattach = str_replace("Expresso-","",$tmpattach_n);
3518                                        $mail->Body = "This is a multi-part message in MIME format.";
3519                                        $mail->Body .= "\n--01BD3665.3AF0D360\n";
3520                                        $mail->Body .= "Content-Type: text/html; charset=\"iso-8859-1\"\nContent-Transfer-Encoding: 8bit\n";
3521                                        $mail->Body .= $tmpbody;
3522                                        $mail->Body .= "\n--01BD3665.3AF0D360\n";
3523                                        $mail->Body .="Content-Type:text/calendar; method=REQUEST; charset=US-ASCII\nContent-Transfer-Encoding:7bit\n\n";
3524                                        $mail->Body .= $tmpattach;
3525                                        $mail->Body .= "\n--01BD3665.3AF0D360--\n";
3526                                        $mail->From = $sender;
3527                                        $mail->FromName = $sender_name;
3528                                        $mail->Sender = $mail->From;
3529                                        $mail->SenderName = $mail->FromName;
3530                                        $mail->Subject = $subject;
3531                                        unset($vardata5);
3532                                        unset($vardata6);
3533                                }
3534                        }
3535
3536                        //Inicializa variï¿œvel de retorno.
3537                        $returncode=true;                       
3538                        if(count($mail->to)) {
3539
3540                            if(isset($new_event['attachment'])){
3541                                foreach($new_event['attachment'] as $attach){
3542                                    $mail->AddAttachment($attach['tmp_name'], $attach['name'], "base64", $attach['type']);
3543                                }
3544                            }
3545                                // Envia aviso a todos os participantes.
3546                                if(!$mail->Send()) {                           
3547                                        $returncode = false;
3548                                        $errorInfo['participants'] = $mail->ErrorInfo;
3549                                }
3550                                else
3551                                        $returncode =  true;
3552                        }
3553                       
3554                        if(count($to_notify) && $this->ex_participants){
3555                                $mail->ClearAllRecipients();
3556                                $var = explode(",",trim($this->ex_participants));
3557                                $mail->IsHTML(true);
3558                                $to = array();
3559                                if(!$subject) {
3560                                        $details['startdate'] = $GLOBALS['phpgw']->common->show_date($starttime);
3561                                        $details['enddate']   = $GLOBALS['phpgw']->common->show_date($endtime);
3562                                        list($subject,$body1) = split("\n",$GLOBALS['phpgw']->preferences->parse_notify($notify_msg,$details),2);
3563                                }
3564                               
3565                                foreach($var as $index => $ex_participant){
3566                                        $ex_participant = trim($ex_participant);
3567                                        $ex_participant = preg_replace('#"(.*)" <(.*)\@(.*)\.(.*)>#','\\2@\\3.\\4',$ex_participant);
3568                                                if($ex_participant)
3569                                                        $to[] = $ex_participant;
3570                                }               
3571                               
3572                                foreach($to as $i => $to_array)
3573                                        $mail->AddAddress($to_array);
3574                               
3575                                $_body = explode("<hr size='1' width='100%'>",$tmpbody);
3576                                $tmpbody = $_body[0] ? $_body[0] : $subject ;
3577                                $tmpbody.= "<br><b>".lang("external participants").":: </b> ".htmlentities($this->ex_participants);
3578                                $tmpbody.= "<br>".lang("Summary").": ".$this->so->cal->event[title]."<br>";
3579                                $tmpbody.= "<br>".lang("Start time").": ".$GLOBALS['phpgw']->common->show_date($starttime)."<br>".lang("End date").": ".$GLOBALS['phpgw']->common->show_date($endtime)."<br>";
3580                                $tmpbody.= "<br><br><hr size='1' width='100%'><font color='red'>"
3581                                .lang("This message was sent by server. You must send a message to sender to confirm this event")."<br>"
3582                                .lang("This is an external event. Even if it added to your expresso its can be changed any time at all")."</font><br>";
3583                               
3584                                if ($GLOBALS['bocalendar']->so->cal->event[start][month] > 10)
3585                                        $event_month=$GLOBALS['bocalendar']->so->cal->event[start][month];
3586                                else
3587                                        $event_month="0".$GLOBALS['bocalendar']->so->cal->event[start][month];
3588                                //attach extern vcalendar/icalendar (ics)                       
3589                                // define('context','$GLOBALS.bocalendar.so.cal.event');
3590                                $tmpattach = $this->create_vcard($GLOBALS['bocalendar']->so->cal->event);
3591                                if($tmpattach){                                 
3592                                        $tmpbody .="<a href='../index.php?menuaction=calendar.uicalendar.add&date="
3593                                        .$GLOBALS['bocalendar']->so->cal->event[start][year]
3594                                .$event_month
3595                                .$GLOBALS['bocalendar']->so->cal->event[start][mday]
3596                                        ."&hour=".$GLOBALS['bocalendar']->so->cal->event[start][hour]
3597                                        ."&minute=".$GLOBALS['bocalendar']->so->cal->event[start][min]
3598                                        ."&title=".$GLOBALS['bocalendar']->so->cal->event['title']
3599                                        ."&description=".$GLOBALS['bocalendar']->so->cal->event['description']
3600                                        ."&location=".$GLOBALS['bocalendar']->so->cal->event['location']."'>"
3601                                        ."<h2>".lang("Add to my expresso")."</h2>";
3602                                        $tempdir = $GLOBALS['phpgw_info']['server']['temp_dir'] . SEP;
3603                                        srand((double)microtime()*1000000);
3604                                        $random_number = rand(100000000,999999999);
3605                                        $newfilename = md5(time() . getenv("REMOTE_ADDR") . $random_number );
3606                                        $filename = $tempdir . $newfilename;
3607                                        $attach_fd = fopen($filename,"w+");
3608                                        fwrite($attach_fd,$tmpattach);
3609                                        $mail->AddAttachment($filename, "extern.ics", "base64", "text/plain"); // "application/octet-stream"
3610                                        fclose($attach_fd);
3611                                }
3612
3613                                if(isset($new_event['attachment'])){
3614                                    foreach($new_event['attachment'] as $attach){
3615                                        $mail->AddAttachment($attach['tmp_name'], $attach['name'], "base64", $attach['type']);
3616                                    }
3617                                }
3618                               
3619                                $mail->From = $sender;
3620                                $mail->FromName = $sender_name;
3621                                $mail->Sender = $mail->From;
3622                                $mail->SenderName = $mail->FromName;
3623                                $mail->Subject = lang("External event from Expresso");
3624                                $mail->Body = $tmpbody;
3625                                                                                                                                               
3626                                if(!$mail->Send())
3627                                {
3628                                        $returncode=false;
3629                                        $errorInfo['ex_participants'] = $mail->ErrorInfo;
3630                                }
3631                                else
3632                                {
3633                                        $returncode=true;
3634                                }
3635                        }
3636
3637
3638                        if((is_int($this->user) && $this->user != $temp_user['account_id']) ||
3639                                (is_string($this->user) && $this->user != $temp_user['account_lid']))
3640                        {
3641                                $GLOBALS['phpgw_info']['user'] = $temp_user;
3642                        }       
3643
3644                        $GLOBALS['phpgw_info']['user']['preferences']['common']['tz_offset'] = $temp_tz_offset;
3645                        $GLBOALS['phpgw']->datetime->tz_offset = ((60 * 60) * $temp_tz_offset);
3646                        $GLOBALS['phpgw_info']['user']['preferences']['common']['timeformat'] = $temp_timeformat;
3647                        $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat'] = $temp_dateformat;
3648                       
3649                        // Notifica por email o criador do compromisso, com as possï¿œveis falhas.                                             
3650                        if($errorInfo) {
3651                                $tmpbody = "<font color='red'>".lang("The following commitment had problems for DELIVERING the NOTIFICATION messages.").".</font><br>";
3652                                $tmpbody.= "<br>".lang("Summary").": ".$this->so->cal->event[title]."<br>";
3653                                $tmpbody.= "<br>".lang("Start time").": ".$GLOBALS['phpgw']->common->show_date($starttime)."<br>".lang("End date").": ".$GLOBALS['phpgw']->common->show_date($endtime)."<br>";                         
3654                                $tmpbody.= "<br><u>".lang("Failed to delivery")."</u><br>";
3655                                $failed = false;                               
3656                                if(strstr($errorInfo['participants'],"recipients_failed")){
3657                                        $failed = explode("recipients_failed",$errorInfo['participants']);
3658                                        $tmpbody.= lang("to").": ".$failed[1];
3659                                }
3660                                if(strstr($errorInfo['ex_participants'],"recipients_failed")){
3661                                        $failed = explode("recipients_failed",$errorInfo['ex_participants']);
3662                                        $tmpbody.= lang("to").": ".$failed[1];
3663                                }                       
3664                                if(!$failed) {
3665                                        $tmpbody.= lang("Description").":<br>";
3666                                        $tmpbody.= $errorInfo['participants'];
3667                                        $tmpbody.= "<br>".$errorInfo['ex_participants'];
3668                                }
3669                                $tmpbody.= "<br>".lang("Subject").": ".$subject;
3670                                // Reinicializa o objeto, devido ao erro anterior na entrega.
3671                               
3672                                $mail = new PHPMailer();
3673                                $mail->IsSMTP();
3674                                $mail->Host = $emailadmin['smtpServer'];
3675                                $mail->Port = $emailadmin['smtpPort'];
3676                                $mail->From = $sender;
3677                                $mail->FromName = $sender_name;
3678                                $mail->Sender = $mail->From;
3679                                $mail->SenderName = $mail->FromName;
3680                                $mail->IsHTML(True);
3681                                $mail->Subject = lang("calendar event")." - ".lang("email notification");                                                       
3682                                $mail->Body = $tmpbody;                                 
3683                                $mail->AddAddress($sender);
3684                                if(!$mail->Send())                     
3685                                        $returncode = false;
3686                                else
3687                                        $returncode =  true;
3688                        }
3689                        return $returncode;
3690                }
3691               
3692                function send_alarm($alarm)
3693                {
3694                        //echo "<p>bocalendar::send_alarm("; print_r($alarm); echo ")</p>\n";
3695                       
3696                        $GLOBALS['phpgw_info']['user']['account_id'] = $this->owner = $alarm['owner'];
3697
3698                        if (!$alarm['enabled'] || !$alarm['owner'] || !$alarm['cal_id'] || !($event = $this->so->read_entry($alarm['cal_id'])))
3699                        {
3700                                return False;   // event not found
3701                        }
3702                        if ($alarm['all'])
3703                        {
3704                                $to_notify = $event['participants'];
3705                        }
3706                        elseif ($this->check_perms(PHPGW_ACL_READ,$event))      // checks agains $this->owner set to $alarm[owner]
3707                        {
3708                                $to_notify[$alarm['owner']] = 'A';
3709                        }
3710                        else
3711                        {
3712                                return False;   // no rights
3713                        }
3714                        return $this->send_update(MSG_ALARM,$to_notify,$event,False,$alarm['owner']);
3715                }
3716
3717                function get_alarms($event_id)
3718                {
3719                        return $this->so->get_alarm($event_id);
3720                }
3721
3722                function alarm_today($event,$today,$starttime)
3723                {
3724                        $found = False;
3725                        @reset($event['alarm']);
3726                        $starttime_hi = $GLOBALS['phpgw']->common->show_date($starttime,'Hi');
3727                        $t_appt['month'] =$GLOBALS['phpgw']->common->show_date($today,'m');
3728                        $t_appt['mday'] = $GLOBALS['phpgw']->common->show_date($today,'d');
3729                        $t_appt['year'] = $GLOBALS['phpgw']->common->show_date($today,'Y');
3730                        $t_appt['hour'] = $GLOBALS['phpgw']->common->show_date($starttime,'H');
3731                        $t_appt['min']  = $GLOBALS['phpgw']->common->show_date($starttime,'i');
3732                        $t_appt['sec']  = 0;
3733                        $t_time = $this->maketime($t_appt) - $GLOBALS['phpgw']->datetime->tz_offset;
3734                        $y_time = $t_time - 86400;
3735                        $tt_time = $t_time + 86399;
3736                        print_debug('T_TIME',$t_time.' : '.$GLOBALS['phpgw']->common->show_date($t_time));
3737                        print_debug('Y_TIME',$y_time.' : '.$GLOBALS['phpgw']->common->show_date($y_time));
3738                        print_debug('TT_TIME',$tt_time.' : '.$GLOBALS['phpgw']->common->show_date($tt_time));
3739                        while(list($key,$alarm) = each($event['alarm']))
3740                        {
3741                                if($alarm['enabled'])
3742                                {
3743                                        print_debug('TIME',$alarm['time'].' : '.$GLOBALS['phpgw']->common->show_date($alarm['time']).' ('.$event['id'].')');
3744                                        if($event['recur_type'] != MCAL_RECUR_NONE)   /* Recurring Event */
3745                                        {
3746                                                print_debug('Recurring Event');
3747                                                if($alarm['time'] > $y_time && $GLOBALS['phpgw']->common->show_date($alarm['time'],'Hi') < $starttime_hi && $alarm['time'] < $t_time)
3748                                                {
3749                                                        $found = True;
3750                                                }
3751                                        }
3752                                        elseif($alarm['time'] > $y_time && $alarm['time'] < $t_time)
3753                                        {
3754                                                $found = True;
3755                                        }
3756                                }
3757                        }
3758                        print_debug('Found',$found);
3759                        return $found;
3760                }
3761
3762                function prepare_recipients(&$new_event,$old_event)
3763                {
3764                                               
3765                        // Find modified and deleted users.....
3766                        while(list($old_userid,$old_status) = each($old_event['participants']))
3767                        {
3768                                if(isset($new_event['participants'][$old_userid]))
3769                                {
3770                                        print_debug('Modifying event for user',$old_userid);
3771                                        $this->modified[(int)$old_userid] = $new_status;
3772                                }
3773                                else
3774                                {
3775                                        print_debug('Deleting user from the event',$old_userid);
3776                                        $this->deleted[(int)$old_userid] = $old_status;
3777                                }
3778                        }
3779                        // Find new users.....
3780                        while(list($new_userid,$new_status) = each($new_event['participants']))
3781                        {
3782                                if(!isset($old_event['participants'][$new_userid]))
3783                                {
3784                                        print_debug('Adding event for user',$new_userid);
3785                                        $this->added[$new_userid] = 'U';
3786                                        $new_event['participants'][$new_userid] = 'U';
3787                                }
3788                        }
3789                       
3790                        if(count($this->added) > 0 || count($this->modified) > 0 || count($this->deleted) > 0)
3791                        {
3792                                if(count($this->added) > 0)
3793                                {
3794                                        $this->ex_participants = '';
3795                                        $this->send_update(MSG_ADDED,$this->added,'',$new_event);
3796                                }
3797                                if(count($this->modified) > 0)
3798                                {
3799                                        $this->send_update(MSG_MODIFIED,$this->modified,$old_event,$new_event);
3800                                }
3801                                if(count($this->deleted) > 0)
3802                                {
3803                                        $this->ex_participants = '';
3804                                        $this->send_update(MSG_DELETED,$this->deleted,$old_event);
3805                                }
3806                        }
3807                }
3808
3809                function remove_doubles_in_cache($firstday,$lastday)
3810                {
3811                        $already_moved = Array();
3812                        for($v=$firstday;$v<=$lastday;$v++)
3813                        {
3814                                if (!$this->cached_events[$v])
3815                                {
3816                                        continue;
3817                                }
3818                                $cached = $this->cached_events[$v];
3819                                $this->cached_events[$v] = array();
3820                                while (list($g,$event) = each($cached))
3821                                {
3822                                        $end = date('Ymd',$this->maketime($event['end']));
3823                                        print_debug('EVENT',_debug_array($event,False));
3824                                        print_debug('start',$start);
3825                                        print_debug('v',$v);
3826
3827                                        if (!isset($already_moved[$event['id']]) || $event['recur_type'] && $v > $end)
3828                                        {
3829                                                $this->cached_events[$v][] = $event;
3830                                                $already_moved[$event['id']] = 1;
3831                                                print_debug('Event moved');
3832                                        }
3833                                }
3834                        }
3835                }
3836
3837                function get_dirty_entries($lastmod=-1)
3838                {
3839                        $events = false;
3840                        $event_ids = $this->so->cal->list_dirty_events($lastmod);
3841                        if(is_array($event_ids))
3842                        {
3843                                foreach($event_ids as $key => $id)
3844                                {
3845                                        $events[$id] = $this->so->cal->fetch_event($id);
3846                                }
3847                        }
3848                        unset($event_ids);
3849
3850                        $rep_event_ids = $this->so->cal->list_dirty_events($lastmod,$true);
3851                        if(is_array($rep_event_ids))
3852                        {
3853                                foreach($rep_event_ids as $key => $id)
3854                                {
3855                                        $events[$id] = $this->so->cal->fetch_event($id);
3856                                }
3857                        }
3858                        unset($rep_event_ids);
3859
3860                        return $events;
3861                }
3862
3863                function _debug_array($data)
3864                {
3865                        echo '<br>UI:';
3866                        _debug_array($data);
3867                }
3868
3869                /*!
3870                @function rejected_no_show
3871                @abstract checks if event is rejected from user and he's not the owner and dont want rejected
3872                @param $event to check
3873                @returns True if event should not be shown
3874                */
3875                function rejected_no_show($event)
3876                {
3877                        $ret = !$this->prefs['calendar']['show_rejected'] &&
3878                                $event['owner'] != $this->owner &&
3879                                $event['participants'][$this->owner] == 'R';
3880                        //echo "<p>rejected_no_show($event[title])='$ret': user=$this->owner, event-owner=$event[owner], status='".$event['participants'][$this->owner]."', show_rejected='".$this->prefs['calendar']['show_rejected']."'</p>\n";
3881                        return $ret;
3882                }
3883
3884                /* This is called only by list_cals().  It was moved here to remove fatal error in php5 beta4 */
3885                function list_cals_add($id,&$users,&$groups)
3886                {
3887                        $name = $GLOBALS['phpgw']->common->grab_owner_name($id);
3888                        if (($type = $GLOBALS['phpgw']->accounts->get_type($id)) == 'g')
3889                        {
3890                                $arr = &$groups;
3891                        }
3892                        else
3893                        {
3894                                $arr = &$users;
3895                        }
3896                        $arr[$name] = Array(
3897                                'grantor' => $id,
3898                                'value'   => ($type == 'g' ? 'g_' : '') . $id,
3899                                'name'    => $name
3900                        );
3901                }
3902
3903                /*!
3904                @function list_cals
3905                @abstract generate list of user- / group-calendars for the selectbox in the header
3906                @returns alphabeticaly sorted array with groups first and then users
3907                */
3908                function list_cals()
3909                {
3910                        $users = $groups = array();
3911                        foreach($this->grants as $id => $rights)
3912                        {
3913                                $this->list_cals_add($id,$users,$groups);
3914                        }
3915                       
3916                        //by JakJr, melhora de performance na abertura da agenda
3917                        /*if ($memberships = $GLOBALS['phpgw']->accounts->membership($GLOBALS['phpgw_info']['user']['account_id']))
3918                        {
3919                                foreach($memberships as $group_info)
3920                                {
3921                                        $this->list_cals_add($group_info['account_id'],$users,$groups);
3922
3923                                        if ($account_perms = $GLOBALS['phpgw']->acl->get_ids_for_location($group_info['account_id'],PHPGW_ACL_READ,'calendar'))
3924                                        {
3925                                                foreach($account_perms as $id)
3926                                                {
3927                                                        $this->list_cals_add($id,$users,$groups);
3928                                                }
3929                                        }
3930                                }
3931                        }*/
3932                        uksort($users,'strnatcasecmp');
3933                        uksort($groups,'strnatcasecmp');
3934
3935                        return $users + $groups;        // users first and then groups, both alphabeticaly
3936                }
3937
3938          function translate($key,$vars=false, $not_found='*' )
3939          {
3940            if ($this->async)
3941              return $GLOBALS['phpgw']->translation->translate_async($key, $vars);
3942            return lang($key, $vars);
3943          }
3944
3945                /*!
3946                @function event2array
3947                @abstract create array with name, translated name and readable content of each attributes of an event
3948                @syntax event2array($event,$sep='<br>')
3949                @param $event event to use
3950                @returns array of attributes with fieldname as key and array with the 'field'=translated name \
3951                        'data' = readable content (for participants this is an array !)
3952                */
3953                function event2array($event)
3954                {
3955                       
3956                       
3957                  $var['title'] = Array(
3958                                'field'         => $this->translate('Title'),
3959                                'data'          => $event['title']
3960                        );
3961
3962                        // Some browser add a \n when its entered in the database. Not a big deal
3963                        // this will be printed even though its not needed.
3964                        $var['description'] = Array(
3965                                'field' => $this->translate('Description'),
3966                                'data'  => $event['description']
3967                        );
3968
3969                        $var['ex_participants'] = Array(
3970                                'field' => $this->translate('External Participants'),
3971                                'data'  => $event['ex_participants']
3972                        );
3973                       
3974                        $cats = Array();
3975                        $this->cat->categories($this->bo->owner,'calendar');
3976                        if(strpos($event['category'],','))
3977                        {
3978                                $cats = explode(',',$event['category']);
3979                        }
3980                        else
3981                        {
3982                                $cats[] = $event['category'];
3983                        }
3984                        foreach($cats as $cat_id)
3985                        {
3986                                list($cat) = $this->cat->return_single($cat_id);
3987                                $cat_string[] = $cat['name'];
3988                        }
3989                        $var['category'] = Array(
3990                                'field' => $this->translate('Category'),
3991                                'data'  => implode(', ',$cat_string)
3992                        );
3993
3994                        $var['location'] = Array(
3995                                'field' => $this->translate('Location'),
3996                                'data'  => $event['location']
3997                        );
3998
3999                        $var['startdate'] = Array(
4000                                'field' => $this->translate('Start Date/Time'),
4001                                'data'  => $GLOBALS['phpgw']->common->show_date($this->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset),
4002                        );
4003
4004                        $var['enddate'] = Array(
4005                                'field' => $this->translate('End Date/Time'),
4006                                'data'  => $GLOBALS['phpgw']->common->show_date($this->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset)
4007                        );
4008
4009                        $pri = Array(
4010                                1       => lang('Low'),
4011                                2       => lang('Normal'),
4012                                3       => lang('High')
4013                        );
4014                        $var['priority'] = Array(
4015                                'field' => lang('Priority'),
4016                                'data'  => $pri[$event['priority']]
4017                        );
4018
4019                        $var['owner'] = Array(
4020                                'field' => lang('Created By'),
4021                                'data'  => $GLOBALS['phpgw']->common->grab_owner_name($event['owner'])
4022                        );
4023
4024                        $var['updated'] = Array(
4025                                'field' => lang('Updated'),
4026                                'data'  => $GLOBALS['phpgw']->common->show_date($this->maketime($event['modtime']) - $GLOBALS['phpgw']->datetime->tz_offset)
4027                        );
4028
4029                        $var['observations'] = Array(
4030                                'field' => $this->translate('Observations'),
4031                                'data'  => $event['observations']
4032                        );
4033                       
4034                        $var['attachment'] = Array(
4035                                'field' => $this->translate('Attachment'),
4036                                'data'  => $event['attachment']
4037                        );
4038
4039                        $var['alter_by'] = Array(
4040                                'field' => $this->translate('Alter by'),
4041                                'data'  => $event['alter_by']
4042                        );
4043
4044                        $var['access'] = Array(
4045                                'field' => lang('Access'),
4046                                'data'  => $event['public'] ? lang('Public') : lang('Private')
4047                        );
4048
4049                        if(@isset($event['groups'][0]))
4050                        {
4051                                $cal_grps = '';
4052                                for($i=0;$i<count($event['groups']);$i++)
4053                                {
4054                                        if($GLOBALS['phpgw']->accounts->exists($event['groups'][$i]))
4055                                        {
4056                                                $cal_grps .= ($i>0?'<br>':'').$GLOBALS['phpgw']->accounts->id2name($event['groups'][$i]);
4057                                        }
4058                                }
4059
4060                                $var['groups'] = Array(
4061                                        'field' => lang('Groups'),
4062                                        'data'  => $cal_grps
4063                                );
4064                        }
4065
4066                        $participants = array();
4067                        foreach($event['participants'] as $user => $short_status)
4068                        {
4069                                if($GLOBALS['phpgw']->accounts->exists($user))
4070                                {
4071                                        $participants[$user] = $GLOBALS['phpgw']->common->grab_owner_name($user).' ('.$this->get_long_status($short_status).')';
4072                                }
4073                        }
4074                        $var['participants'] = Array(
4075                                'field' => $this->translate('Participants'),
4076                                'data'  => $participants
4077                        );
4078
4079                        // Repeated Events
4080                        if($event['recur_type'] != MCAL_RECUR_NONE)
4081                        {
4082                                $str = lang($this->rpt_type[$event['recur_type']]);
4083
4084                                $str_extra = array();
4085                                if ($event['recur_enddate']['mday'] != 0 && $event['recur_enddate']['month'] != 0 && $event['recur_enddate']['year'] != 0)
4086                                {
4087                                        $recur_end = $this->maketime($event['recur_enddate']);
4088                                        if($recur_end != 0)
4089                                        {
4090                                                $recur_end -= $GLOBALS['phpgw']->datetime->tz_offset;
4091                                                $str_extra[] = lang('ends').': '.lang($GLOBALS['phpgw']->common->show_date($recur_end,'l')).', '.$this->long_date($recur_end).' ';
4092                                        }
4093                                }
4094                                // only weekly uses the recur-data (days) !!!
4095                                if($event['recur_type'] == MCAL_RECUR_WEEKLY)
4096                                {
4097                                        $repeat_days = array();
4098                                        foreach ($this->rpt_day as $mcal_mask => $dayname)
4099                                        {
4100                                                if ($event['recur_data'] & $mcal_mask)
4101                                                {
4102                                                        $repeat_days[] = lang($dayname);
4103                                                }
4104                                        }
4105                                        if(count($repeat_days))
4106                                        {
4107                                                $str_extra[] = lang('days repeated').': '.implode(', ',$repeat_days);
4108                                        }
4109                                }
4110                                if($event['recur_interval'] != 0)
4111                                {
4112                                        $str_extra[] = lang('Interval').': '.$event['recur_interval'];
4113                                }
4114
4115                                if(count($str_extra))
4116                                {
4117                                        $str .= ' ('.implode(', ',$str_extra).')';
4118                                }
4119
4120                                $var['recure_type'] = Array(
4121                                        'field' => lang('Repetition'),
4122                                        'data'  => $str,
4123                                );
4124                        }
4125
4126                        if (!isset($this->fields))
4127                        {
4128                                $this->custom_fields = CreateObject('calendar.bocustom_fields');
4129                                $this->fields = &$this->custom_fields->fields;
4130                                $this->stock_fields = &$this->custom_fields->stock_fields;
4131                        }
4132                        foreach($this->fields as $field => $data)
4133                        {
4134                                if (!$data['disabled'])
4135                                {
4136                                        if (isset($var[$field]))
4137                                        {
4138                                                $sorted[$field] = $var[$field];
4139                                        }
4140                                        elseif (!isset($this->stock_fields[$field]) && strlen($event[$field]))  // Custom field
4141                                        {
4142                                                $lang = lang($name = substr($field,1));
4143                                                $sorted[$field] = array(
4144                                                        'field' => $lang == $name.'*' ? $name : $lang,
4145                                                        'data'  => $event[$field]
4146                                                );
4147                                        }
4148                                }
4149                                unset($var[$field]);
4150                        }
4151                        foreach($var as $name => $v)
4152                        {
4153                                $sorted[$name] = $v;
4154
4155                        }
4156                        return $sorted;
4157                }
4158
4159                /*!
4160                @function check_set_default_prefs
4161                @abstract sets the default prefs, if they are not already set (on a per pref. basis)
4162                @note It sets a flag in the app-session-data to be called only once per session
4163                */
4164                function check_set_default_prefs()
4165                {
4166                        if (($set = $GLOBALS['phpgw']->session->appsession('default_prefs_set','calendar')))
4167                        {
4168                                return;
4169                        }
4170                        $GLOBALS['phpgw']->session->appsession('default_prefs_set','calendar','set');
4171
4172                        $default_prefs = $GLOBALS['phpgw']->preferences->default['calendar'];
4173
4174                        $subject = $this->translate('Calendar Event') . ' - $$action$$: $$startdate$$ $$title$$'."\n";
4175                        $defaults = array(
4176                                'defaultcalendar' => 'week',
4177                                'mainscreen_showevents' => '0',
4178                                'summary'         => 'no',
4179                                'receive_updates' => 'no',
4180                                'update_format'   => 'extended',        // leave it to extended for now, as iCal kills the message-body
4181                                'notifyAdded'     => $subject . $this->translate ('You have a meeting scheduled for %1',array('$$startdate$$')),
4182                                'notifyCanceled'  => $subject . $this->translate ('Your meeting scheduled for %1 has been canceled',array('$$startdate$$')),
4183                                'notifyModified'  => $subject . $this->translate ('Your meeting that had been scheduled for %1 has been rescheduled to %2',array('$$olddate$$','$$startdate$$')),
4184                                'notifyResponse'  => $subject . $this->translate ('On %1 %2 %3 your meeting request for %4', array('$$date$$','$$fullname$$','$$action$$','$$startdate$$')),
4185                                'notifyAlarm'     => $this->translate('Alarm for %1 at %2 in %3',array('$$title$$','$$startdate$$','$$location$$')) . "\n" . $this->translate('Here is your requested alarm.'),
4186                                'show_rejected'   => '0',
4187                                'hide_event_conflict'   => '0',
4188                                'display_status'  => '1',
4189                                'weekdaystarts'   => 'Monday',
4190                                'workdaystarts'   => '9',
4191                                'workdayends'     => '17',
4192                                'interval'        => '30',
4193                                'defaultlength'   => '60',
4194                                'planner_start_with_group' => $GLOBALS['phpgw']->accounts->name2id('Default'),
4195                                'planner_intervals_per_day'=> '4',
4196                                'defaultfilter'   => 'all',
4197                                'default_private' => '0',
4198                                'display_minicals'=> '1',
4199                                'print_black_white'=>'0'
4200                        );
4201                        foreach($defaults as $var => $default)
4202                        {
4203                                if (!isset($default_prefs[$var]) || $default_prefs[$var] == '')
4204                                {
4205                                        $GLOBALS['phpgw']->preferences->add('calendar',$var,$default,'default');
4206                                        $need_save = True;
4207                                }
4208                        }
4209                        if ($need_save)
4210                        {
4211                                $prefs = $GLOBALS['phpgw']->preferences->save_repository(False,'default');
4212                                $this->prefs['calendar'] = $prefs['calendar'];
4213                        }
4214                        if ($this->prefs['calendar']['send_updates'] && !isset($this->prefs['calendar']['receive_updates']))
4215                        {
4216                                $this->prefs['calendar']['receive_updates'] = $this->prefs['calendar']['send_updates'];
4217                                $GLOBALS['phpgw']->preferences->add('calendar','receive_updates',$this->prefs['calendar']['send_updates']);
4218                                $GLOBALS['phpgw']->preferences->delete('calendar','send_updates');
4219                                $prefs = $GLOBALS['phpgw']->preferences->save_repository();
4220                        }
4221                }
4222
4223                // return array with all infolog categories (for xmlrpc)
4224                function categories($complete = False)
4225                {
4226                        return $GLOBALS['server']->categories($complete);
4227                }
4228        }
4229?>
Note: See TracBrowser for help on using the repository browser.