source: branches/2.2/calendar/inc/class.bocalendar.inc.php @ 4427

Revision 4427, 133.4 KB checked in by brunocosta, 13 years ago (diff)

Ticket #1899 - Permite criação de apontamento de horas.

  • 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                        $l_cal = (@isset($params['cal']) && $params['cal']?$params['cal']:$_POST['cal']);
1017                        $l_participants = (@$params['participants']?$params['participants']:$_POST['participants']);
1018                        $this->ex_participants = (@$params['ex_participants']?$params['ex_participants']:$_POST['ex_participants']);
1019                        $l_categories = (@$params['categories']?$params['categories']:$_POST['categories']);
1020                        $l_start = (@isset($params['start']) && $params['start']?$params['start']:$_POST['start']);
1021                        $l_end = (@isset($params['end']) && $params['end']?$params['end']:$_POST['end']);
1022                        $l_recur_enddate = (@isset($params['recur_enddate']) && $params['recur_enddate']?$params['recur_enddate']:$_POST['recur_enddate']);
1023
1024                       
1025                        $send_to_ui = True;
1026                        //if ((!is_array($l_start) || !is_array($l_end)) && !isset($_GET['readsess']))  // xmlrpc call
1027                        if ($this->xmlrpc)      // xmlrpc call
1028                        {
1029                                $send_to_ui = False;
1030
1031                                $l_cal = $params;       // no extra array
1032
1033                                foreach(array('start','end','recur_enddate') as $name)
1034                                {
1035                                        $var = 'l_'.$name;
1036                                        $$var = $GLOBALS['server']->iso86012date($params[$name]);
1037                                        unset($l_cal[$name]);
1038                                }
1039                                if (!is_array($l_participants) || !count($l_participants))
1040                                {
1041                                        $l_participants = array($GLOBALS['phpgw_info']['user']['account_id'].'A');
1042                                }
1043                                else
1044                                {
1045                                        $l_participants = array();
1046                                        foreach($params['participants'] as $user => $data)
1047                                        {
1048                                                $l_participants[] = $user.$data['status'];
1049                                        }
1050                                }
1051                                unset($l_cal['participants']);
1052
1053                                if (!is_object($GLOBALS['phpgw']->categories))
1054                                {
1055                                        $GLOBALS['phpgw']->categories = CreateObject('phpgwapi.categories');
1056                                }
1057                                $l_categories = $GLOBALS['server']->xmlrpc2cats($params['category']);
1058                                unset($l_cal['category']);
1059
1060                                // using access={public|private} in all modules via xmlrpc
1061                                $l_cal['public'] = $params['access'] != 'private';
1062                                unset($l_cal['access']);
1063/*
1064                                $fp = fopen('/tmp/xmlrpc.log','a+');
1065                                ob_start();
1066                                echo "\nbocalendar::update("; print_r($params); echo ")\n";
1067                                //echo "\nl_start="; print_r($l_start);
1068                                //echo "\nl_end="; print_r($l_end);
1069                                fwrite($fp,ob_get_contents());
1070                                ob_end_clean();
1071                                fclose($fp);
1072*/
1073                        }
1074                        print_debug('ID',$l_cal['id']);
1075
1076                        // don't wrap to the next day for no time
1077                        if ($l_end['hour'] == 24 && $l_end['min'] == 0)
1078                        {
1079                                $l_end['hour'] = 23;
1080                                $l_end['min'] = 59;
1081                        }
1082
1083                        if(isset($_GET['readsess']))
1084                        {
1085                                $event = $this->restore_from_appsession();
1086                                $event['title'] = stripslashes($event['title']);
1087                                $event['description'] = stripslashes($event['description']);
1088                                $event['ex_participants'] = stripslashes($event['ex_participants']);
1089                                $datetime_check = $this->validate_update($event);
1090                                if($datetime_check)
1091                                {
1092                                        ExecMethod($ui_return,
1093                                                Array(
1094                                                        'cd'            => $datetime_check,
1095                                                        'readsess'      => 1
1096                                                )
1097                                        );
1098                                        if(!$params['from_mobile'])
1099                                                $GLOBALS['phpgw']->common->phpgw_exit(True);
1100                                        else
1101                                                return;
1102                                }
1103                                $overlapping_events = False;
1104                        }
1105                        else
1106                        {
1107                                if((!$l_cal['id'] && !$this->check_perms(PHPGW_ACL_ADD)) ||
1108                                   ($l_cal['id'] && !$this->check_perms(PHPGW_ACL_EDIT,$l_cal['id'])))
1109                                {
1110                                        if ($this->xmlrpc)
1111                                        {
1112                                                $GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['no_access'],$GLOBALS['xmlrpcstr']['no_access']);
1113                                        }
1114                                        if (!$send_to_ui)
1115                                        {
1116                                                return array(($l_cal['id']?1:2) => 'permission denied');
1117                                        }
1118                                        ExecMethod($ui_index);
1119                                        if(!$params['from_mobile'])
1120                                                $GLOBALS['phpgw']->common->phpgw_exit();
1121                                        else
1122                                                return;
1123                                }
1124
1125                                print_debug('Prior to fix_update_time()');
1126                                $this->fix_update_time($l_start);
1127                                $this->fix_update_time($l_end);
1128                                if(!isset($l_cal['ex_participants']))
1129                                {
1130                                        $l_cal['ex_participants'] = $this->ex_participants;
1131                                }
1132
1133                                if(!isset($l_categories))
1134                                {
1135                                        $l_categories = 0;
1136                                }
1137
1138                                $is_public = ($l_cal['type'] != 'private' && $l_cal['type'] != 'privateHiddenFields');
1139                                $this->so->event_init();
1140                                $this->add_attribute('uid',$l_cal['uid']);
1141                                $this->add_attribute('type',$l_cal['type']);
1142                                if($l_cal['ex_participants']) {
1143                                        $this->add_attribute('ex_participants',$l_cal['ex_participants']);
1144                                }
1145                                if(count($l_categories) >= 2)
1146                                {
1147                                        $this->so->set_category(implode(',',$l_categories));
1148                                }
1149                                else
1150                                {
1151                                        $this->so->set_category(strval($l_categories[0]));
1152                                }
1153                                $this->so->set_title($l_cal['title']);
1154                                $this->so->set_description($l_cal['description']);
1155                                $this->so->set_ex_participants($l_cal['ex_participants']);
1156                                $this->so->set_start($l_start['year'],$l_start['month'],$l_start['mday'],$l_start['hour'],$l_start['min'],0);
1157                                $this->so->set_end($l_end['year'],$l_end['month'],$l_end['mday'],$l_end['hour'],$l_end['min'],0);
1158                                $this->so->set_class($is_public);
1159                                $this->so->add_attribute('reference',(@isset($l_cal['reference']) && $l_cal['reference']?$l_cal['reference']:0));
1160                                $this->so->add_attribute('location',(@isset($l_cal['location']) && $l_cal['location']?$l_cal['location']:''));
1161                                $this->so->add_attribute('repeat',(@isset($l_cal['recur_type']) && $l_cal['recur_type']?$l_cal['recur_type']:''));
1162                                $this->so->add_attribute('alarmd',(@isset($l_cal['alarmdays'])?$l_cal['alarmdays']:0));
1163                                $this->so->add_attribute('alarmh',(@isset($l_cal['alarmhours'])?$l_cal['alarmhours']:0));
1164                                $this->so->add_attribute('alarmm',(@isset($l_cal['alarmminutes'])?$l_cal['alarmminutes']:0));
1165                                if($l_cal['id'])
1166                                {
1167                                        $this->so->add_attribute('id',$l_cal['id']);
1168                                }
1169
1170                                if($l_cal['rpt_use_end'] != 'y')
1171                                {
1172                                        $l_recur_enddate['year'] = 0;
1173                                        $l_recur_enddate['month'] = 0;
1174                                        $l_recur_enddate['mday'] = 0;
1175                                }
1176                                elseif (isset($l_recur_enddate['str']))
1177                                {
1178                                        $l_recur_enddate = $this->jscal->input2date($l_recur_enddate['str'],False,'mday');
1179                                }
1180
1181                                switch((int)$l_cal['recur_type'])
1182                                {
1183                                        case MCAL_RECUR_NONE:
1184                                                $this->so->set_recur_none();
1185
1186                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1187                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1188                                                $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1189
1190                                                break;
1191                                        case MCAL_RECUR_DAILY:
1192                                                $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']);
1193
1194                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1195                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1196
1197                                                $tmp_init = explode("/",$_POST['start']['str']); // recebe a data inicial da repeticao;
1198                                                $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;
1199
1200                                                if($l_cal['rpt_use_end'] == 'y') // verifica se foi indicada data final da repeticao, se sim:
1201                                                {
1202                                                        $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1203                                                       
1204                                                        $tmp_end = explode("/",$_POST['recur_enddate']['str']); // recebe data final da repeticao;
1205                                                        $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;
1206
1207                                                }else { // se nao existe data final da repeticao (agendamento infinito):
1208
1209                                                        $end_rept = 0; // variavel recebe zero e nao sera adicionado nenhum alarme para o agendamento;
1210                                                }
1211                                                break;
1212                                        case MCAL_RECUR_WEEKLY:
1213
1214                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1215                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1216
1217                                                $tmp_init = explode("/",$_POST['start']['str']); // recebe a data inicial da repeticao;
1218                                                $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;
1219
1220                                                if($l_cal['rpt_use_end'] == 'y') // verifica se foi indicada data final da repeticao, se sim:
1221                                                {
1222
1223                                                        $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1224                                                        $tmp_end = explode("/",$_POST['recur_enddate']['str']); // recebe data final da repeticao;
1225                                                        $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;
1226
1227                                                }else { // se nao existe data final da repeticao (agendamento infinito):
1228
1229                                                        $end_rept = 0; // variavel recebe zero e nao sera adicionado nenhum alarme para o agendamento;
1230                                                }
1231
1232                                                foreach(array('rpt_sun','rpt_mon','rpt_tue','rpt_wed','rpt_thu','rpt_fri','rpt_sat') as $rpt_day)
1233                                                {
1234                                                        $l_cal['recur_data'] += (int)$l_cal[$rpt_day];
1235                                                }
1236                                                if (is_array($l_cal['rpt_day']))
1237                                                {
1238                                                        foreach ($l_cal['rpt_day'] as $mask)
1239                                                        {
1240                                                                $l_cal['recur_data'] |= (int)$mask;
1241                                                                $rpt_wdays = $l_cal['recur_data']; // recebe os dias da semana (somatorio) para repetir o alarme;
1242                                                        }
1243                                                }
1244                                                $this->so->add_attribute('rpt_wdays',(@isset($rpt_wdays) && $rpt_wdays?$rpt_wdays:''));
1245                                                $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']);
1246                                                break;
1247                                        case MCAL_RECUR_MONTHLY_MDAY:
1248                                                $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']);
1249
1250                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1251                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1252
1253                                                $tmp_init = explode("/",$_POST['start']['str']); // recebe a data inicial da repeticao;
1254                                                $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;
1255
1256                                                if($l_cal['rpt_use_end'] == 'y') // verifica se foi indicada data final da repeticao, se sim:
1257                                                {
1258                                                        $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1259                                                        $tmp_end = explode("/",$_POST['recur_enddate']['str']); // recebe data final da repeticao;
1260                                                        $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;
1261
1262                                                }else { // se nao existe data final da repeticao (agendamento infinito):
1263
1264                                                        $end_rept = 0; // variavel recebe zero e nao sera adicionado nenhum alarme para o agendamento;
1265                                                }
1266                                                break;
1267                                        case MCAL_RECUR_MONTHLY_WDAY:
1268                                                $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']);
1269                                                break;
1270                                        case MCAL_RECUR_YEARLY:
1271                                                $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']);
1272
1273                                                $repetido = (int)$l_cal['recur_type']; // recebe o tipo de repeticao;
1274                                                $this->so->add_attribute('recur_type',(@isset($repetido) && $repetido?$repetido:0));
1275
1276                                                $tmp_init = explode("/",$_POST['start']['str']); // recebe a data inicial da repeticao;
1277                                                $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;
1278
1279                                                if($l_cal['rpt_use_end'] == 'y') // verifica se foi indicada data final da repeticao, se sim:
1280                                                {
1281                                                        $this->so->add_attribute('rpt_end_use',(@isset($l_cal['rpt_use_end']) && $l_cal['rpt_use_end']?$l_cal['rpt_use_end']:''));
1282                                                        $tmp_end = explode("/",$_POST['recur_enddate']['str']); // recebe data final da repeticao;
1283                                                        $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;
1284
1285                                                }else { // se nao existe data final da repeticao (agendamento infinito):
1286
1287                                                        $end_rept = 0; // variavel recebe zero e nao sera adicionado nenhum alarme para o agendamento;
1288                                                }
1289                                                break;
1290                                }
1291
1292                                if($l_participants)
1293                                {
1294                                        $parts = $l_participants;
1295                                        $minparts = min($l_participants);
1296                                        $part = Array();
1297                                        for($i=0;$i<count($parts);$i++)
1298                                        {
1299                                                if (($accept_type = substr($parts[$i],-1,1)) == '0' || (int)$accept_type > 0)
1300                                                {
1301                                                        $accept_type = 'U';
1302                                                }
1303                                                $acct_type = $GLOBALS['phpgw']->accounts->get_type((int)$parts[$i]);
1304                                                if($acct_type == 'u')
1305                                                {
1306                                                        $part[(int)$parts[$i]] = $accept_type;
1307                                                }
1308                                                elseif($acct_type == 'g')
1309                                                {
1310                                                        $part[(int)$parts[$i]] = $accept_type;
1311                                                        $groups[] = $parts[$i];
1312                                                        /* This pulls ALL users of a group and makes them as participants to the event */
1313                                                        /* I would like to turn this back into a group thing. */
1314                                                        $acct = CreateObject('phpgwapi.accounts',(int)$parts[$i]);
1315                                                        $members = $acct->member((int)$parts[$i]);
1316                                                        unset($acct);
1317                                                        if($members == False)
1318                                                        {
1319                                                                continue;
1320                                                        }
1321                                                        while($member = each($members))
1322                                                        {
1323                                                                $part[$member[1]['account_id']] = $accept_type;
1324                                                        }
1325                                                }
1326                                        }
1327                                }
1328                                else
1329                                {
1330                                        $part = False;
1331                                }
1332
1333                                if($part)
1334                                {
1335                                        @reset($part);
1336                                        while(list($key,$accept_type) = each($part))
1337                                        {
1338                                                $this->so->add_attribute('participants',$accept_type,(int)$key);
1339                                        }
1340                                }
1341
1342                                if($groups)
1343                                {
1344                                        @reset($groups);
1345                                        $this->so->add_attribute('groups',(int)$group_id);
1346                                }
1347
1348                                $event = $this->get_cached_event();
1349                                if(!is_int($minparts))
1350                                {
1351                                        $minparts = $this->owner;
1352                                }
1353                                if(!@isset($event['participants'][$l_cal['owner']]))
1354                                {
1355                                        $this->so->add_attribute('owner',$minparts);
1356                                }
1357                                else
1358                                {
1359                                        $this->so->add_attribute('owner',$l_cal['owner']);
1360                                }
1361                                $this->so->add_attribute('priority',$l_cal['priority']);
1362
1363                                foreach($l_cal as $name => $value)
1364                                {
1365                                        if ($name[0] == '#')    // Custom field
1366                                        {
1367                                                $this->so->add_attribute($name,stripslashes($value));
1368                                        }
1369                                }
1370                                if (isset($_POST['preserved']) && is_array($preserved = unserialize(stripslashes($_POST['preserved']))))
1371                                {
1372                                        foreach($preserved as $name => $value)
1373                                        {
1374                                                switch($name)
1375                                                {
1376                                                        case 'owner':
1377                                                                $this->so->add_attribute('participants',$value,$l_cal['owner']);
1378                                                                break;
1379                                                        default:
1380                                                                $this->so->add_attribute($name,str_replace(array('&amp;','&quot;','&lt;','&gt;'),array('&','"','<','>'),$value));
1381                                                }
1382                                        }
1383                                }
1384                                $event = $this->get_cached_event();
1385
1386                                if ($l_cal['alarmdays'] > 0 || $l_cal['alarmhours'] > 0 ||
1387                                                $l_cal['alarmminutes'] > 0)
1388                                {
1389                                        $offset = ($l_cal['alarmdays'] * 24 * 3600) +
1390                                                ($l_cal['alarmhours'] * 3600) + ($l_cal['alarmminutes'] * 60);
1391
1392                                        $time = $this->maketime($event['start']) - $offset;
1393
1394                                        $event['alarm'][] = Array(
1395                                                'time'    => $time,
1396                                                'offset'  => $offset,
1397                                                'owner'   => $this->owner,
1398                                                'enabled' => 1,
1399                                                'repeat'  => $repetido, // para repetir alarme;
1400                                                'init_rept' => $init_rept, // inicio repeticao;
1401                                                'end_rept' => $end_rept, // fim repeticao;
1402                                                'rpt_wdays' => $rpt_wdays // dias repeticao da semana;
1403                                        );
1404                                }
1405
1406                                $this->store_to_appsession($event);
1407                                $datetime_check = $this->validate_update($event);
1408                                print_debug('bo->validated_update() returnval',$datetime_check);
1409                                if($datetime_check)
1410                                {
1411                                        if (!$send_to_ui)
1412                                        {
1413                                                return array($datetime_check => 'invalid input data');
1414                                        }
1415                                        ExecMethod($ui_return,
1416                                                Array(
1417                                                        'cd'            => $datetime_check,
1418                                                        'readsess'      => 1
1419                                                )
1420                                        );
1421                                        if(!$params['from_mobile'])
1422                                                $GLOBALS['phpgw']->common->phpgw_exit(True);
1423                                        else
1424                                                return;
1425                                }
1426
1427                                if($event['id'])
1428                                {
1429                                        $event_ids[] = $event['id'];
1430                                }
1431                                if($event['reference'])
1432                                {
1433                                        $event_ids[] = $event['reference'];
1434                                }
1435
1436                                if (isset($repetido) and $repetido > 0){
1437                                    $events = $this->expand_repetition($event);
1438                                    $overlapping_events = False;
1439                                    foreach($events as $evt){
1440                                        $overlap = $this->overlap(
1441                                            $evt['start'],
1442                                            $evt['end'],
1443                                            $evt['participants'],
1444                                            $evt['owner'],
1445                                            $event_ids);
1446                                        if ($overlap)
1447                                        {
1448                                            if (!$overlapping_events)
1449                                            {
1450                                                $overlapping_events = Array();
1451                                            }
1452                                            array_push($overlapping_events, $overlap);
1453                                        }
1454                                    }
1455                                }
1456                                else {
1457                                    $overlapping_events = $this->overlap(
1458                                        $this->maketime($event['start']),
1459                                        $this->maketime($event['end']),
1460                                        $event['participants'],
1461                                        $event['owner'],
1462                                        $event_ids
1463                                    );
1464                                }
1465                        }
1466                        if(!$this->ex_participants)
1467                                $this->ex_participants = $event['ex_participants'];                     
1468                        if($overlapping_events)
1469                        {
1470                                if($send_to_ui)
1471                                {
1472                                        $event['ex_participants'] = $this->ex_participants;
1473                                        unset($GLOBALS['phpgw_info']['flags']['noheader']);
1474                                        unset($GLOBALS['phpgw_info']['flags']['nonavbar']);
1475                                        ExecMethod($ui_overlap,
1476                                                Array(
1477                                                        'o_events'      => $overlapping_events,
1478                                                        'this_event'    => $event
1479                                                )
1480                                        );
1481                                        if(!$params['from_mobile'])
1482                                                $GLOBALS['phpgw']->common->phpgw_exit(True);
1483                                        else
1484                                                return;
1485                                }
1486                                else
1487                                {
1488                                        return $overlapping_events;
1489                                }
1490                        }
1491                        else
1492                        {
1493                                if(!$event['id'])
1494                                {
1495                                        $this->so->add_entry($event);
1496                                        $this->send_update(MSG_ADDED,$event['participants'],'',$this->get_cached_event());
1497                                        print_debug('New Event ID',$event['id']);
1498                                }
1499                                else
1500                                {
1501                                        print_debug('Updating Event ID',$event['id']);
1502                                        $new_event = $event;
1503                                        $old_event = $this->read_entry($event['id']);
1504                                        // if old event has alarm and the start-time changed => update them
1505                                        //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";
1506                                        if ($old_event['alarm'] &&
1507                                                $this->maketime($old_event['start']) != $this->maketime($event['start']))
1508                                        {
1509                                                $this->so->delete_alarms($old_event['id']);
1510                                                foreach($old_event['alarm'] as $id => $alarm)
1511                                                {
1512                                                        $alarm['time'] = $this->maketime($event['start']) - $alarm['offset'];
1513                                                        $event['alarm'][] = $alarm;
1514                                                }
1515                                                //echo "updated alarms<pre>".print_r($event['alarm'],True)."</pre>\n";
1516                                        }
1517                                        $this->so->cal->event = $event;
1518                                        $this->so->add_entry($event);
1519                                        $this->prepare_recipients($new_event,$old_event);
1520                                }
1521
1522                                $date = sprintf("%04d%02d%02d",$event['start']['year'],$event['start']['month'],$event['start']['mday']);
1523                                if($send_to_ui)
1524                                {
1525                                        $this->read_sessiondata();
1526                                        if ($this->return_to)
1527                                        {
1528                                                $GLOBALS['phpgw']->redirect_link('/index.php','menuaction='.$this->return_to);
1529                                                $GLOBALS['phpgw']->common->phpgw_exit();
1530                                        }
1531                                        Execmethod($ui_index);
1532                                }
1533                                else
1534                                {
1535                                        return (int)$event['id'];
1536                                }
1537                        }
1538                        return True;
1539                }
1540
1541                /* Private functions */
1542                function read_holidays($year=0)
1543                {
1544                        if(!$year)
1545                        {
1546                                $year = $this->year;
1547                        }
1548                        $holiday = CreateObject('calendar.boholiday');
1549                        $holiday->prepare_read_holidays($year,$this->owner);
1550                        $this->cached_holidays = $holiday->read_holiday();
1551                        unset($holiday);
1552                }
1553
1554                function user_is_a_member($event,$user)
1555                {
1556                        @reset($event['participants']);
1557                        $uim = False;
1558                        $security_equals = $GLOBALS['phpgw']->accounts->membership($user);
1559                        while(!$uim && $event['participants'] && $security_equals && list($participant,$status) = each($event['participants']))
1560                        {
1561                                if($GLOBALS['phpgw']->accounts->get_type($participant) == 'g')
1562                                {
1563                                        @reset($security_equals);
1564                                        while(list($key,$group_info) = each($security_equals))
1565                                        {
1566                                                if($group_info['account_id'] == $participant)
1567                                                {
1568                                                        return True;
1569                                                        $uim = True;
1570                                                }
1571                                        }
1572                                }
1573                        }
1574                        return $uim;
1575                }
1576
1577                function maketime($time)
1578                {
1579                        return mktime(intval($time['hour']),intval($time['min']),intval($time['sec']),intval($time['month']),intval($time['mday']),intval($time['year']));
1580                }
1581
1582                /*!
1583                @function time2array
1584                @abstract returns a date-array suitable for the start- or endtime of an event from a timestamp
1585                @syntax time2array($time,$alarm=0)
1586                @param $time the timestamp for the values of the array
1587                @param $alarm (optional) alarm field of the array, defaults to 0
1588                @author ralfbecker
1589                */
1590                function time2array($time,$alarm = 0)
1591                {
1592                        return array(
1593                                'year'  => (int)(date('Y',$time)),
1594                                'month' => (int)(date('m',$time)),
1595                                'mday'  => (int)(date('d',$time)),
1596                                'hour'  => (int)(date('H',$time)),
1597                                'min'   => (int)(date('i',$time)),
1598                                'sec'   => (int)(date('s',$time)),
1599                                'alarm' => (int)($alarm)
1600                        );
1601                }
1602
1603                /*!
1604                @function set_recur_date
1605                @abstract set the start- and enddates of a recuring event for a recur-date
1606                @syntax set_recur_date(&$event,$date)
1607                @param $event the event which fields to set (has to be the original event for start-/end-times)
1608                @param $date  the recuring date in form 'Ymd', eg. 20030226
1609                @author ralfbecker
1610                */
1611                function set_recur_date(&$event,$date)
1612                {
1613                        $org_start = $this->maketime($event['start']);
1614                        $org_end   = $this->maketime($event['end']);
1615                        $start = mktime($event['start']['hour'],$event['start']['min'],0,substr($date,4,2),substr($date,6,2),substr($date,0,4));
1616                        $end   = $org_end + $start - $org_start;
1617                        $event['start'] = $this->time2array($start);
1618                        $event['end']   = $this->time2array($end);
1619                }
1620
1621                function fix_update_time(&$time_param)
1622                {
1623                        if (isset($time_param['str']))
1624                        {
1625                                if (!is_object($this->jscal))
1626                                {
1627                                        $this->jscal = CreateObject('phpgwapi.jscalendar');
1628                                }
1629                                $time_param += $this->jscal->input2date($time_param['str'],False,'mday');
1630                                unset($time_param['str']);
1631                        }
1632                        if ($this->prefs['common']['timeformat'] == '12')
1633                        {
1634                                if ($time_param['ampm'] == 'pm')
1635                                {
1636                                        if ($time_param['hour'] <> 12)
1637                                        {
1638                                                $time_param['hour'] += 12;
1639                                        }
1640                                }
1641                                elseif ($time_param['ampm'] == 'am')
1642                                {
1643                                        if ($time_param['hour'] == 12)
1644                                        {
1645                                                $time_param['hour'] -= 12;
1646                                        }
1647                                }
1648
1649                                if($time_param['hour'] > 24)
1650                                {
1651                                        $time_param['hour'] -= 12;
1652                                }
1653                        }
1654                }
1655
1656                function validate_update($event)
1657                {
1658                        $error = 0;
1659                        // do a little form verifying
1660                        if (!count($event['participants']))
1661                        {
1662                                $error = 43;
1663                        }
1664                        elseif ($event['type'] != 'hourAppointment' && $event['title'] == '')
1665                        {
1666                                $error = 40;
1667                        }
1668                        elseif ($event['repeat'] != 0)
1669                        {
1670                                if( $event['rpt_end_use'] != 'y')
1671                                {
1672                                        $error = 46;
1673                                }
1674                        //}
1675                          if ($event['repeat'] == 2)
1676                          {
1677                                if($event['rpt_wdays'] == '') {
1678                                        $error = 44;
1679                                }
1680                                if( $event['rpt_end_use'] != 'y')
1681                                {
1682                                        $error = 46;
1683                                }
1684
1685                                if (  ( isset($event['alarmd'])  && ($event['alarmd'] != 0) ) || ( isset($event['alarmh'])  && ($event['alarmh'] != 0) ) || ( isset($event['alarmm'])  && ($event['alarmm'] != 0) ) )
1686                                {
1687                                        if( isset($event['recur_type']) && ($event['recur_type'] != 0) )
1688                                        {
1689                                                if( $event['rpt_end_use'] != 'y')
1690                                                {
1691                                                        $error = 45;
1692                                                }
1693                                        }
1694                                }
1695                           }
1696
1697                        //}
1698                  if (  ( isset($event['alarmd'])  && ($event['alarmd'] != 0) ) || ( isset($event['alarmh'])  && ($event['alarmh'] != 0) ) || ( isset($event['alarmm'])  && ($event['alarmm'] != 0) ) )
1699                  {
1700                        if( isset($event['recur_type']) && ($event['recur_type'] != 0) )
1701                        {
1702                                if( $event['rpt_end_use'] != 'y')
1703                                {
1704                                        $error = 45;
1705                                }
1706                        }
1707                  }
1708                }
1709                        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))
1710                        {
1711                                $error = 41;
1712                        }
1713                        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))
1714                        {
1715                                $error = 42;
1716                        }
1717                        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)
1718                        {
1719                                if ($GLOBALS['phpgw']->datetime->time_compare($event['start']['hour'],$event['start']['min'],0,$event['end']['hour'],$event['end']['min'],0) == 1)
1720                                {
1721                                        $error = 47;
1722                                }
1723                        }
1724                        return $error;
1725                }
1726
1727                /*!
1728                @function participants_not_rejected($participants,$event)
1729                @abstract checks if any of the $particpants participates in $event and has not rejected it
1730                */
1731                function participants_not_rejected($participants,$event)
1732                {
1733                        //echo "participants_not_rejected()<br>participants =<pre>"; print_r($participants); echo "</pre><br>event[participants]=<pre>"; print_r($event['participants']); echo "</pre>\n";
1734                        foreach($participants as $uid => $status)
1735                        {
1736                                //echo "testing event[participants][uid=$uid] = '".$event['participants'][$uid]."'<br>\n";
1737                                if (isset($event['participants'][$uid]) && $event['participants'][$uid] != 'R' &&
1738                                        $status != 'R')
1739                                {
1740                                        return True;    // found not rejected participant in event
1741                                }
1742                        }
1743                        return False;
1744                }
1745               
1746                function participants_unanswered($participants,$event)
1747                {
1748                        foreach($participants as $uid => $status)
1749                        {                               
1750                                if (isset($event['participants'][$uid]) && $event['participants'][$uid] == 'U' && $status == 'U')
1751                                {
1752                                        return False;
1753                                }
1754                        }
1755                        return True;
1756                }
1757
1758                function overlap($starttime,$endtime,$participants,$owner=0,$id=0,$restore_cache=False)
1759                {
1760//                      $retval = Array();
1761//                      $ok = False;
1762
1763/* This needs some attention.. by commenting this chunk of code it will fix bug #444265 */
1764
1765                        if($restore_cache)
1766                        {
1767                                $temp_cache_events = $this->cached_events;
1768                        }
1769
1770//                      $temp_start = (int)$GLOBALS['phpgw']->common->show_date($starttime,'Ymd');
1771//                      $temp_start_time = (int)($GLOBALS['phpgw']->common->show_date($starttime,'Hi');
1772//                      $temp_end = (int)$GLOBALS['phpgw']->common->show_date($endtime,'Ymd');
1773//                      $temp_end_time = (int)$GLOBALS['phpgw']->common->show_date($endtime,'Hi');
1774                        $temp_start = (int)(date('Ymd',$starttime));
1775                        $temp_start_time = (int)(date('Hi',$starttime));
1776                        $temp_end = (int)(date('Ymd',$endtime));
1777                        $temp_end_time = (int)(date('Hi',$endtime));
1778                        if($this->debug)
1779                        {
1780                                echo '<!-- Temp_Start: '.$temp_start.' -->'."\n";
1781                                echo '<!-- Temp_End: '.$temp_end.' -->'."\n";
1782                        }
1783
1784                        $users = Array();
1785                        if(count($participants))
1786                        {
1787                                while(list($user,$status) = each($participants))
1788                                {
1789                                        $users[] = $user;
1790                                }
1791                        }
1792                        else
1793                        {
1794                                $users[] = $this->owner;
1795                        }
1796
1797                        $possible_conflicts = $this->store_to_cache(
1798                                Array(
1799                                        'smonth'        => substr(strval($temp_start),4,2),
1800                                        'sday'  => substr(strval($temp_start),6,2),
1801                                        'syear' => substr(strval($temp_start),0,4),
1802                                        'emonth'        => substr(strval($temp_end),4,2),
1803                                        'eday'  => substr(strval($temp_end),6,2),
1804                                        'eyear' => substr(strval($temp_end),0,4),
1805                                        'owner' => $users
1806                                )
1807                        );
1808
1809                        if($this->debug)
1810                        {
1811                                echo '<!-- Possible Conflicts ('.($temp_start - 1).'): '.count($possible_conflicts[$temp_start - 1]).' -->'."\n";
1812                                echo '<!-- Possible Conflicts ('.$temp_start.'): '.count($possible_conflicts[$temp_start]).' '.count($id).' -->'."\n";
1813                        }
1814
1815                        if($possible_conflicts[$temp_start] || $possible_conflicts[$temp_end])
1816                        {
1817                                if($temp_start == $temp_end)
1818                                {
1819                                        if($this->debug)
1820                                        {
1821                                                echo '<!-- Temp_Start == Temp_End -->'."\n";
1822                                        }
1823                                        @reset($possible_conflicts[$temp_start]);
1824                                        while(list($key,$event) = each($possible_conflicts[$temp_start]))
1825                                        {
1826                                                $found = False;
1827                                                if($id)
1828                                                {
1829                                                        @reset($id);
1830                                                        while(list($key,$event_id) = each($id))
1831                                                        {
1832                                                                if($this->debug)
1833                                                                {
1834                                                                        echo '<!-- $id['.$key.'] = '.$id[$key].' = '.$event_id.' -->'."\n";
1835                                                                        echo '<!-- '.$event['id'].' == '.$event_id.' -->'."\n";
1836                                                                }
1837                                                                if($event['id'] == $event_id)
1838                                                                {
1839                                                                        $found = True;
1840                                                                }
1841                                                        }
1842                                                }
1843                                                if($this->debug)
1844                                                {
1845                                                        echo '<!-- Item found: '.$found.' -->'."<br>\n";
1846                                                }
1847                                                if(!$found)
1848                                                {
1849                                                        if($this->debug)
1850                                                        {
1851                                                                echo '<!-- Checking event id #'.$event['id'];
1852                                                        }
1853                                                        $temp_event_start = sprintf("%d%02d",$event['start']['hour'],$event['start']['min']);
1854                                                        $temp_event_end = sprintf("%d%02d",$event['end']['hour'],$event['end']['min']);
1855//                                                      if((($temp_start_time <= $temp_event_start) && ($temp_end_time >= $temp_event_start) && ($temp_end_time <= $temp_event_end)) ||
1856                                                        if(($temp_start_time <= $temp_event_start &&
1857                                                                $temp_end_time > $temp_event_start &&
1858                                                                $temp_end_time <= $temp_event_end ||
1859                                                                $temp_start_time >= $temp_event_start &&
1860                                                                $temp_start_time < $temp_event_end &&
1861                                                                $temp_end_time >= $temp_event_end ||
1862                                                                $temp_start_time <= $temp_event_start &&
1863                                                                $temp_end_time >= $temp_event_end ||
1864                                                                $temp_start_time >= $temp_event_start &&
1865                                                                $temp_end_time <= $temp_event_end) &&
1866                                                                $this->participants_not_rejected($participants,$event) && $this->participants_unanswered($participants,$event))
1867                                                        {
1868                                                                if($this->debug)
1869                                                                {
1870                                                                        echo ' Conflicts';
1871                                                                }
1872                                                                $retval[] = $event['id'];
1873                                                        }
1874                                                        if($this->debug)
1875                                                        {
1876                                                                echo ' -->'."\n";
1877                                                        }
1878                                                }
1879                                        }
1880                                }
1881                        }
1882                        else
1883                        {
1884                                $retval = False;
1885                        }
1886
1887                        if($restore_cache)
1888                        {
1889                                $this->cached_events = $temp_cache_events;
1890                        }
1891
1892                        return $retval;
1893                }
1894
1895                /*!
1896                @function check_perms( )
1897                @syntax check_perms($needed,$event=0,$other=0)
1898                @abstract Checks if the current user has the necessary ACL rights
1899                @author ralfbecker
1900                @discussion The check is performed on an event or general on the cal of an other user
1901                @param $needed necessary ACL right: PHPGW_ACL_{READ|EDIT|DELETE}
1902                @param $event event as array or the event-id or 0 for general check
1903                @param $other uid to check (if event==0) or 0 to check against $this->owner
1904                @note Participating in an event is considered as haveing read-access on that event, \
1905                        even if you have no general read-grant from that user.
1906                */
1907                function check_perms($needed,$event=0,$other=0)
1908                {
1909                        $event_in = $event;
1910                       
1911                        if (is_int($event) && $event == 0)
1912                        {
1913                                $owner = $other > 0 ? $other : $this->owner;
1914                        }
1915                        else
1916                        {
1917                                if (!is_array($event))
1918                                {
1919                                        $event = $this->so->read_entry((int) $event);
1920                                }
1921                                if (!is_array($event))
1922                                {
1923                                        if ($this->xmlrpc)
1924                                        {
1925                                                $GLOBALS['server']->xmlrpc_error($GLOBALS['xmlrpcerr']['not_exist'],$GLOBALS['xmlrpcstr']['not_exist']);
1926                                        }
1927                                        return False;
1928                                }
1929                                $owner = $event['owner'];
1930                                $private = $event['public'] == False || $event['public'] == 0;
1931                        }
1932                        $user = $GLOBALS['phpgw_info']['user']['account_id'];
1933                        $grants = $this->grants[$owner];
1934
1935                        if (is_array($event) && $needed == PHPGW_ACL_READ)
1936                        {
1937                                // Check if the $user is one of the participants or has a read-grant from one of them
1938                                //
1939                                foreach($event['participants'] as $uid => $accept)
1940                                {
1941                                        if ($this->grants[$uid] & PHPGW_ACL_READ || $uid == $user)
1942                                        {
1943                                                $grants |= PHPGW_ACL_READ;
1944                                                // if the $user is one of the participants read-grant private (restricted) too.
1945                                                if($uid == $user || ($this->grants[$uid] & PHPGW_ACL_PRIVATE)) {
1946                                                        $grants |= PHPGW_ACL_PRIVATE;
1947                                                }
1948                                                //break;
1949                                        }
1950                                }
1951                        }
1952
1953                        if ($GLOBALS['phpgw']->accounts->get_type($owner) == 'g' && $needed == PHPGW_ACL_ADD)
1954                        {
1955                                $access = False;        // a group can't be the owner of an event
1956                        }
1957                        else
1958                        {
1959                                $access = $user == $owner || $grants & $needed && (!$private || $grants & PHPGW_ACL_PRIVATE);
1960                        }
1961                        //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";
1962
1963                        return $access;
1964                }
1965
1966
1967                function display_status($user_status)
1968                {
1969                        if(@$this->prefs['calendar']['display_status'] && $user_status)
1970                        {
1971                                $user_status = substr($this->get_long_status($user_status),0,1);
1972
1973                                return ' ('.$user_status.')';
1974                        }
1975                        else
1976                        {
1977                                return '';
1978                        }
1979                }
1980
1981                function get_long_status($status_short)
1982                {
1983                        switch ($status_short)
1984                        {
1985                                case 'A':
1986                                        $status = lang('Accepted');
1987                                        break;
1988                                case 'R':
1989                                        $status = lang('Rejected');
1990                                        break;
1991                                case 'T':
1992                                        $status = lang('Tentative');
1993                                        break;
1994                                case 'U':
1995                                        $status = lang('No Response');
1996                                        break;
1997                        }
1998                        return $status;
1999                }
2000
2001                function is_private($event,$owner)
2002                {
2003                        if($owner == 0)
2004                        {
2005                                $owner = $this->owner;
2006                        }
2007                        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'])
2008                        {
2009                                return False;
2010                        }
2011                        elseif($event['public'] == 0)
2012                        {
2013                                return True;
2014                        }
2015                        elseif($event['public'] == 2)
2016                        {
2017                                $is_private = True;
2018                                $groups = $GLOBALS['phpgw']->accounts->membership($owner);
2019                                while (list($key,$group) = each($groups))
2020                                {
2021                                        if (strpos(' '.implode(',',$event['groups']).' ',$group['account_id']))
2022                                        {
2023                                                return False;
2024                                        }
2025                                }
2026                        }
2027                        else
2028                        {
2029                                return False;
2030                        }
2031
2032                        return $is_private;
2033                }
2034
2035                function get_short_field($event,$is_private=True,$field='')
2036                {
2037                        if($is_private)
2038                        {
2039                                return lang('private');
2040                        }
2041
2042// cut off too long titles
2043                        elseif(strlen($event[$field]) > 19 && !$this->printer_friendly && $field=="title")
2044//                      elseif(strlen($event[$field]) > 19 && $this->printer_friendly)
2045                        {
2046// we dont use currently 160304
2047//                              return substr($event[$field], 0 , 19) . '&nbsp;...';
2048                                return $event[$field];
2049                        }
2050                        else
2051                        {
2052                                return $event[$field];
2053                        }
2054                }
2055
2056                function long_date($first,$last=0)
2057                {
2058                        if (!is_array($first))
2059                        {
2060                                $first = $this->time2array($raw = $first);
2061                                $first['raw'] = $raw;
2062                                $first['day'] = $first['mday'];
2063                        }
2064                        if ($last && !is_array($last))
2065                        {
2066                                $last = $this->time2array($raw = $last);
2067                                $last['raw'] = $raw;
2068                                $last['day'] = $last['mday'];
2069                        }
2070                        $datefmt = $this->prefs['common']['dateformat'];
2071
2072                        $month_before_day = strtolower($datefmt[0]) == 'm' ||
2073                                strtolower($datefmt[2]) == 'm' && $datefmt[4] == 'd';
2074
2075                        for ($i = 0; $i < 5; $i += 2)
2076                        {
2077                                switch($datefmt[$i])
2078                                {
2079                                        case 'd':
2080                                                $range .= $first['day'] . ($datefmt[1] == '.' ? '.' : '');
2081                                                if ($first['month'] != $last['month'] || $first['year'] != $last['year'])
2082                                                {
2083                                                        if (!$month_before_day)
2084                                                        {
2085                                                                $range .= ' '.lang(strftime('%B',$first['raw']));
2086                                                        }
2087                                                        if ($first['year'] != $last['year'] && $datefmt[0] != 'Y')
2088                                                        {
2089                                                                $range .= ($datefmt[0] != 'd' ? ', ' : ' ') . $first['year'];
2090                                                        }
2091                                                        if (!$last)
2092                                                        {
2093                                                                return $range;
2094                                                        }
2095                                                        $range .= ' - ';
2096
2097                                                        if ($first['year'] != $last['year'] && $datefmt[0] == 'Y')
2098                                                        {
2099                                                                $range .= $last['year'] . ', ';
2100                                                        }
2101
2102                                                        if ($month_before_day)
2103                                                        {
2104                                                                $range .= lang(strftime('%B',$last['raw']));
2105                                                        }
2106                                                }
2107                                                else
2108                                                {
2109                                                        $range .= ' - ';
2110                                                }
2111                                                $range .= ' ' . $last['day'] . ($datefmt[1] == '.' ? '.' : '');
2112                                                break;
2113                                        case 'm':
2114                                        case 'M':
2115                                                $range .= ' '.lang(strftime('%B',$month_before_day ? $first['raw'] : $last['raw'])) . ' ';
2116                                                break;
2117                                        case 'Y':
2118                                                $range .= ($datefmt[0] == 'm' ? ', ' : ' ') . ($datefmt[0] == 'Y' ? $first['year'].($datefmt[2] == 'd' ? ', ' : ' ') : $last['year'].' ');
2119                                                break;
2120                                }
2121                        }
2122                        return $range;
2123                }
2124
2125                function get_week_label()
2126                {
2127                        $first = $GLOBALS['phpgw']->datetime->gmtdate($GLOBALS['phpgw']->datetime->get_weekday_start($this->year, $this->month, $this->day));
2128                        $last = $GLOBALS['phpgw']->datetime->gmtdate($first['raw'] + 518400);
2129
2130                        return ($this->long_date($first,$last));
2131                }
2132
2133                function normalizeminutes(&$minutes)
2134                {
2135                        $hour = 0;
2136                        $min = (int)$minutes;
2137                        if($min >= 60)
2138                        {
2139                                $hour += $min / 60;
2140                                $min %= 60;
2141                        }
2142                        settype($minutes,'integer');
2143                        $minutes = $min;
2144                        return $hour;
2145                }
2146
2147                function splittime($time,$follow_24_rule=True)
2148                {
2149                        $temp = array('hour','minute','second','ampm');
2150                        $time = strrev($time);
2151                        $second = (int)(strrev(substr($time,0,2)));
2152                        $minute = (int)(strrev(substr($time,2,2)));
2153                        $hour   = (int)(strrev(substr($time,4)));
2154                        $hour += $this->normalizeminutes($minute);
2155                        $temp['second'] = $second;
2156                        $temp['minute'] = $minute;
2157                        $temp['hour']   = $hour;
2158                        $temp['ampm']   = '  ';
2159                        if($follow_24_rule == True)
2160                        {
2161                                if ($this->prefs['common']['timeformat'] == '24')
2162                                {
2163                                        return $temp;
2164                                }
2165
2166                                $temp['ampm'] = 'am';
2167
2168                                if ((int)$temp['hour'] > 12)
2169                                {
2170                                        $temp['hour'] = (int)((int)$temp['hour'] - 12);
2171                                        $temp['ampm'] = 'pm';
2172                                }
2173                                elseif ((int)$temp['hour'] == 12)
2174                                {
2175                                        $temp['ampm'] = 'pm';
2176                                }
2177                        }
2178                        return $temp;
2179                }
2180
2181                function get_exception_array($exception_str='')
2182                {
2183                        $exception = Array();
2184                        if(strpos(' '.$exception_str,','))
2185                        {
2186                                $exceptions = explode(',',$exception_str);
2187                                for($exception_count=0;$exception_count<count($exceptions);$exception_count++)
2188                                {
2189                                        $exception[] = (int)$exceptions[$exception_count];
2190                                }
2191                        }
2192                        elseif($exception_str != '')
2193                        {
2194                                $exception[] = (int)$exception_str;
2195                        }
2196                        return $exception;
2197                }
2198
2199                function build_time_for_display($fixed_time)
2200                {
2201                        $time = $this->splittime($fixed_time);
2202                        $str = $time['hour'].':'.((int)$time['minute']<=9?'0':'').$time['minute'];
2203
2204                        if ($this->prefs['common']['timeformat'] == '12')
2205                        {
2206                                $str .= ' ' . $time['ampm'];
2207                        }
2208
2209                        return $str;
2210                }
2211
2212                function sort_event($event,$date)
2213                {
2214                        $inserted = False;
2215                        if(isset($event['recur_exception']))
2216                        {
2217                                $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;
2218                                while($inserted == False && list($key,$exception_time) = each($event['recur_exception']))
2219                                {
2220                                        if($this->debug)
2221                                        {
2222                                                echo '<!-- checking exception datetime '.$exception_time.' to event datetime '.$event_time.' -->'."\n";
2223                                        }
2224                                        if($exception_time == $event_time)
2225                                        {
2226                                                $inserted = True;
2227                                        }
2228                                }
2229                        }
2230                        if($this->cached_events[$date] && $inserted == False)
2231                        {
2232
2233                                if($this->debug)
2234                                {
2235                                        echo '<!-- Cached Events found for '.$date.' -->'."\n";
2236                                }
2237                                $year = substr($date,0,4);
2238                                $month = substr($date,4,2);
2239                                $day = substr($date,6,2);
2240
2241                                if($this->debug)
2242                                {
2243                                        echo '<!-- Date : '.$date.' Count : '.count($this->cached_events[$date]).' -->'."\n";
2244                                }
2245
2246                                for($i=0;$i<count($this->cached_events[$date]);$i++)
2247                                {
2248                                        if($this->cached_events[$date][$i]['id'] == $event['id'] || $this->cached_events[$date][$i]['reference'] == $event['id'])
2249                                        {
2250                                                if($this->debug)
2251                                                {
2252                                                        echo '<!-- Item already inserted! -->'."\n";
2253                                                }
2254                                                $inserted = True;
2255                                                break;
2256                                        }
2257                                        /* This puts all spanning events across multiple days up at the top. */
2258                                        if($this->cached_events[$date][$i]['recur_type'] == MCAL_RECUR_NONE)
2259                                        {
2260                                                if($this->cached_events[$date][$i]['start']['mday'] != $day && $this->cached_events[$date][$i]['end']['mday'] >= $day)
2261                                                {
2262                                                        continue;
2263                                                }
2264                                        }
2265                                        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)))
2266                                        {
2267                                                for($j=count($this->cached_events[$date]);$j>=$i;$j--)
2268                                                {
2269                                                        $this->cached_events[$date][$j] = $this->cached_events[$date][$j-1];
2270                                                }
2271                                                if($this->debug)
2272                                                {
2273                                                        echo '<!-- Adding event ID: '.$event['id'].' to cached_events -->'."\n";
2274                                                }
2275                                                $inserted = True;
2276                                                $this->cached_events[$date][$i] = $event;
2277                                                break;
2278                                        }
2279                                }
2280                        }
2281                        if(!$inserted)
2282                        {
2283                                if($this->debug)
2284                                {
2285                                        echo '<!-- Adding event ID: '.$event['id'].' to cached_events -->'."\n";
2286                                }
2287                                $this->cached_events[$date][] = $event;
2288                        }
2289                }
2290
2291                function check_repeating_events($datetime)
2292                {
2293                        @reset($this->repeating_events);
2294                        $search_date_full = date('Ymd',$datetime);
2295                        $search_date_year = date('Y',$datetime);
2296                        $search_date_month = date('m',$datetime);
2297                        $search_date_day = date('d',$datetime);
2298                        $search_date_dow = date('w',$datetime);
2299                        $search_beg_day = mktime(12,0,0,$search_date_month,$search_date_day,$search_date_year);
2300                        if($this->debug)
2301                        {
2302                                echo '<!-- Search Date Full = '.$search_date_full.' -->'."\n";
2303                        }
2304                        $repeated = $this->repeating_events;
2305                        $r_events = count($repeated);
2306                        for ($i=0;$i<$r_events;$i++)
2307                        {
2308                                $rep_events = $this->repeating_events[$i];
2309                                $id = $rep_events['id'];
2310                                $event_beg_day = mktime(0,0,0,$rep_events['start']['month'],$rep_events['start']['mday'],$rep_events['start']['year']);
2311                                if($rep_events['recur_enddate']['month'] != 0 && $rep_events['recur_enddate']['mday'] != 0 && $rep_events['recur_enddate']['year'] != 0)
2312                                {
2313                                        $event_recur_time = $this->maketime($rep_events['recur_enddate']);
2314                                }
2315                                else
2316                                {
2317                                        $event_recur_time = mktime(0,0,0,1,1,2030);
2318                                }
2319                                $end_recur_date = date('Ymd',$event_recur_time);
2320                                $full_event_date = date('Ymd',$event_beg_day);
2321
2322                                if($this->debug)
2323                                {
2324                                        echo '<!-- check_repeating_events - Processing ID - '.$id.' -->'."\n";
2325                                        echo '<!-- check_repeating_events - Recurring End Date - '.$end_recur_date.' -->'."\n";
2326                                }
2327
2328                                // only repeat after the beginning, and if there is an rpt_end before the end date
2329                                if (($search_date_full > $end_recur_date) || ($search_date_full < $full_event_date))
2330                                {
2331                                        continue;
2332                                }
2333
2334                                if ($search_date_full == $full_event_date)
2335                                {
2336                                        $this->sort_event($rep_events,$search_date_full);
2337                                        continue;
2338                                }
2339                                else
2340                                {
2341                                        $freq = $rep_events['recur_interval'];
2342                                        $freq = $freq ? $freq : 1;
2343                                        $type = $rep_events['recur_type'];
2344                                        switch($type)
2345                                        {
2346                                                case MCAL_RECUR_DAILY:
2347                                                        if($this->debug)
2348                                                        {
2349                                                                echo '<!-- check_repeating_events - MCAL_RECUR_DAILY - '.$id.' -->'."\n";
2350                                                        }
2351                                                       
2352                                                        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)
2353                                                        {
2354                                                                $this->sort_event($rep_events,$search_date_full);
2355                                                        }
2356                                                        elseif (floor(($search_beg_day - $event_beg_day)/86400) % ($freq ? $freq : 1))
2357                                                        {
2358                                                                continue;
2359                                                        }
2360                                                        else
2361                                                        {
2362                                                                $this->sort_event($rep_events,$search_date_full);
2363                                                        }
2364                                                        break;
2365                                                case MCAL_RECUR_WEEKLY:
2366                                                        if (floor(($search_beg_day - $event_beg_day)/604800)  % ($freq ? $freq : 1))
2367                                                        {
2368                                                                continue;
2369                                                        }
2370                                                        $check = 0;
2371                                                        switch($search_date_dow)
2372                                                        {
2373                                                                case 0:
2374                                                                        $check = MCAL_M_SUNDAY;
2375                                                                        break;
2376                                                                case 1:
2377                                                                        $check = MCAL_M_MONDAY;
2378                                                                        break;
2379                                                                case 2:
2380                                                                        $check = MCAL_M_TUESDAY;
2381                                                                        break;
2382                                                                case 3:
2383                                                                        $check = MCAL_M_WEDNESDAY;
2384                                                                        break;
2385                                                                case 4:
2386                                                                        $check = MCAL_M_THURSDAY;
2387                                                                        break;
2388                                                                case 5:
2389                                                                        $check = MCAL_M_FRIDAY;
2390                                                                        break;
2391                                                                case 6:
2392                                                                        $check = MCAL_M_SATURDAY;
2393                                                                        break;
2394                                                        }
2395                                                        if ($rep_events['recur_data'] & $check)
2396                                                        {
2397                                                                $this->sort_event($rep_events,$search_date_full);
2398                                                        }
2399                                                        break;
2400                                                case MCAL_RECUR_MONTHLY_WDAY:
2401                                                        if ((($search_date_year - $rep_events['start']['year']) * 12 + $search_date_month - $rep_events['start']['month']) % $freq)
2402                                                        {
2403                                                                continue;
2404                                                        }
2405
2406                                                        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)) &&
2407                                                                (ceil($rep_events['start']['mday']/7) == ceil($search_date_day/7)))
2408                                                        {
2409                                                                $this->sort_event($rep_events,$search_date_full);
2410                                                        }
2411                                                        break;
2412                                                case MCAL_RECUR_MONTHLY_MDAY:
2413                                                        if ((($search_date_year - $rep_events['start']['year']) * 12 + $search_date_month - $rep_events['start']['month'])  % ($freq ? $freq : 1))
2414                                                        {
2415                                                                continue;
2416                                                        }
2417                                                        if ($search_date_day == $rep_events['start']['mday'])
2418                                                        {
2419                                                                $this->sort_event($rep_events,$search_date_full);
2420                                                        }
2421                                                        break;
2422                                                case MCAL_RECUR_YEARLY:
2423                                                        if (($search_date_year - $rep_events['start']['year']) % ($freq ? $freq : 1))
2424                                                        {
2425                                                                continue;
2426                                                        }
2427                                                        if (date('dm',$datetime) == date('dm',$event_beg_day))
2428                                                        {
2429                                                                $this->sort_event($rep_events,$search_date_full);
2430                                                        }
2431                                                        break;
2432                                        }
2433                                }
2434                        }       // end for loop
2435                }       // end function
2436
2437                function store_to_cache($params)
2438                {
2439                        if(!is_array($params))
2440                        {
2441                                return False;
2442                        }
2443                        if (isset($params['start']) && ($datearr = $GLOBALS['server']->iso86012date($params['start'])))
2444                        {
2445                                $syear = $datearr['year'];
2446                                $smonth = $datearr['month'];
2447                                $sday = $datearr['mday'];
2448                                $this->xmlrpc = True;
2449                        }
2450                        else
2451                        {
2452                                $syear = $params['syear'];
2453                                $smonth = $params['smonth'];
2454                                $sday = $params['sday'];
2455                        }
2456                        if (isset($params['end']) && ($datearr = $GLOBALS['server']->iso86012date($params['end'])))
2457                        {
2458                                $eyear = $datearr['year'];
2459                                $emonth = $datearr['month'];
2460                                $eday = $datearr['mday'];
2461                                $this->xmlrpc = True;
2462                        }
2463                        else
2464                        {
2465                                $eyear = (isset($params['eyear'])?$params['eyear']:0);
2466                                $emonth = (isset($params['emonth'])?$params['emonth']:0);
2467                                $eday = (isset($params['eday'])?$params['eday']:0);
2468                        }
2469                        if (!isset($params['owner']) && @$this->xmlrpc)
2470                        {
2471                                $owner_id = $GLOBALS['phpgw_info']['user']['user_id'];
2472                        }
2473                        else
2474                        {
2475                                $owner_id = (isset($params['owner'])?$params['owner']:0);
2476                                if($owner_id==0 && $this->is_group)
2477                                {
2478                                        unset($owner_id);
2479                                        $owner_id = $this->g_owner;
2480                                        if($this->debug)
2481                                        {
2482                                                echo '<!-- owner_id in ('.implode(',',$owner_id).') -->'."\n";
2483                                        }
2484                                }
2485                        }
2486                        if(!$eyear && !$emonth && !$eday)
2487                        {
2488                                $edate = mktime(23,59,59,$smonth + 1,$sday + 1,$syear);
2489                                $eyear = date('Y',$edate);
2490                                $emonth = date('m',$edate);
2491                                $eday = date('d',$edate);
2492                        }
2493                        else
2494                        {
2495                                if(!$eyear)
2496                                {
2497                                        $eyear = $syear;
2498                                }
2499                                //Tratamento do valor final (mes) da pesquisa de eventos feita em $this->so->list_events.
2500                                //Se $emonth nao tem valor, recebe o valor de $smonth (que recebe $params['smonth']) e soma 1.
2501                                //O valor $params['emonth'] indica o mes final para a pesquisa de eventos, e passou a ser
2502                                //informado na a impressao de eventos mensais. Mudancas feitas em class.uicalendar.inc.php,
2503                                //function display_month_print();
2504                                if(!$emonth)
2505                                {
2506                                        $emonth = $smonth + 1;
2507                                        if($emonth > 12)
2508                                        {
2509                                                $emonth = 1;
2510                                                $eyear++;
2511                                        }
2512                                }
2513                                if(!$eday)
2514                                {
2515                                        $eday = $sday + 1;
2516                                }
2517                                $edate = mktime(23,59,59,$emonth,$eday,$eyear);
2518                        }
2519                        //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";
2520                        if($this->debug)
2521                        {
2522                                echo '<!-- Start Date : '.sprintf("%04d%02d%02d",$syear,$smonth,$sday).' -->'."\n";
2523                                echo '<!-- End   Date : '.sprintf("%04d%02d%02d",$eyear,$emonth,$eday).' -->'."\n";
2524                        }
2525                        //A variavel $month_print recebe o parametro 'saux' com o mes de inicio da pesquisa de eventos por
2526                        //$this->so->list_events. O valor do mes final da pesquisa e tratado no codigo acima;
2527                        //$month_ini = $params['saux'];
2528
2529                        if($owner_id)
2530                        {
2531                                $cached_event_ids = $this->so->list_events($syear,$smonth,$sday,$eyear,$emonth,$eday,$owner_id);
2532                                $cached_event_ids_repeating = $this->so->list_repeated_events($syear,$smonth,$sday,$eyear,$emonth,$eday,$owner_id);
2533                        }
2534                        else
2535                        {
2536                                $cached_event_ids = $this->so->list_events($syear,$smonth,$sday,$eyear,$emonth,$eday);
2537                                $cached_event_ids_repeating = $this->so->list_repeated_events($syear,$smonth,$sday,$eyear,$emonth,$eday);
2538                        }
2539
2540                        $c_cached_ids = count($cached_event_ids);
2541                        $c_cached_ids_repeating = count($cached_event_ids_repeating);
2542
2543                        if($this->debug)
2544                        {
2545                                echo '<!-- events cached : '.$c_cached_ids.' : for : '.sprintf("%04d%02d%02d",$syear,$smonth,$sday).' -->'."\n";
2546                                echo '<!-- repeating events cached : '.$c_cached_ids_repeating.' : for : '.sprintf("%04d%02d%02d",$syear,$smonth,$sday).' -->'."\n";
2547                        }
2548
2549                        $this->cached_events = Array();
2550
2551                        if($c_cached_ids == 0 && $c_cached_ids_repeating == 0)
2552                        {
2553                                return;
2554                        }
2555
2556                        $cache_start = (int)(sprintf("%04d%02d%02d",$syear,$smonth,$sday));
2557                        $cached_event=$this->get_cached_event();
2558                        if($c_cached_ids)
2559                        {
2560                                for($i=0;$i<$c_cached_ids;$i++)
2561                                {
2562                                        $event = $this->so->read_entry($cached_event_ids[$i]);
2563                                        if ($event['recur_type'])
2564                                        {
2565                                                continue;       // fetch recuring events only in 2. loop
2566                                        }
2567                                        $startdate = (int)(date('Ymd',$this->maketime($event['start'])));
2568                                        $enddate = (int)(date('Ymd',$this->maketime($event['end'])));
2569                                        $this->cached_events[$startdate][] = $event;
2570                                        if($startdate != $enddate)
2571                                        {
2572                                                $start['year'] = (int)(substr($startdate,0,4));
2573                                                $start['month'] = (int)(substr($startdate,4,2));
2574                                                $start['mday'] = (int)(substr($startdate,6,2));
2575                                                for($j=$startdate,$k=0;$j<=$enddate;$k++,$j=(int)(date('Ymd',mktime(0,0,0,$start['month'],$start['mday'] + $k,$start['year']))))
2576                                                {
2577                                                        $c_evt_day = count($this->cached_events[$j]) - 1;
2578                                                        if($c_evt_day < 0)
2579                                                        {
2580                                                                $c_evt_day = 0;
2581                                                        }
2582                                                        if($this->debug)
2583                                                        {
2584                                                                echo '<!-- Date: '.$j.' Count : '.$c_evt_day.' -->'."\n";
2585                                                        }
2586                                                        if($this->cached_events[$j][$c_evt_day]['id'] != $event['id'])
2587                                                        {
2588                                                                if($this->debug)
2589                                                                {
2590                                                                        echo '<!-- Adding Event for Date: '.$j.' -->'."\n";
2591                                                                }
2592                                                                $this->cached_events[$j][] = $event;
2593                                                        }
2594                                                        if ($j >= $cache_start && (@$params['no_doubles'] || @$this->xmlrpc))
2595                                                        {
2596                                                                break;  // add event only once on it's startdate
2597                                                        }
2598                                                }
2599                                        }
2600                                }
2601                        }
2602
2603                        $this->repeating_events = Array();
2604                        if($c_cached_ids_repeating)
2605                        {
2606                                for($i=0;$i<$c_cached_ids_repeating;$i++)
2607                                {
2608                                        $this->repeating_events[$i] = $this->so->read_entry($cached_event_ids_repeating[$i]);
2609                                        if($this->debug)
2610                                        {
2611                                                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";
2612                                        }
2613                                }
2614                                for($date=mktime(0,0,0,$smonth,$sday,$syear);$date<=$edate;$date += 86400)
2615                                {
2616                                        if($this->debug)
2617                                        {
2618                                                $search_date = date('Ymd',$date);
2619                                                echo '<!-- Calling check_repeating_events('.$search_date.') -->'."\n";
2620                                        }
2621                                        $this->check_repeating_events($date);
2622                                        if($this->debug)
2623                                        {
2624                                                echo '<!-- Total events found matching '.$search_date.' = '.count($this->cached_events[$search_date]).' -->'."\n";
2625                                                for($i=0;$i<count($this->cached_events[$search_date]);$i++)
2626                                                {
2627                                                        echo '<!-- Date: '.$search_date.' ['.$i.'] = '.$this->cached_events[$search_date][$i]['id'].' -->'."\n";
2628                                                }
2629                                        }
2630                                }
2631                        }
2632                        $retval = Array();
2633                        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)))
2634                        {
2635                                if(is_array($this->cached_events[$j]))
2636                                {
2637                                        if ($this->xmlrpc)
2638                                        {
2639                                                foreach($this->cached_events[$j] as $event)
2640                                                {
2641                                                        $retval[] = $this->xmlrpc_prepare($event);
2642                                                }
2643                                        }
2644                                        else
2645                                        {
2646                                                $retval[$j] = $this->cached_events[$j];
2647                                        }
2648                                }
2649                        }
2650                        //echo "store_to_cache(".print_r($params,True).")=<pre>".print_r($retval,True)."</pre>\n";
2651                        $this->so->cal->event = $cached_event;
2652                        return $retval;
2653                }
2654
2655                function xmlrpc_prepare(&$event)
2656                {
2657                        $event['rights'] = $this->grants[$event['owner']];
2658
2659                        foreach(array('start','end','modtime','recur_enddate') as $name)
2660                        {
2661                                if (isset($event[$name]))
2662                                {
2663                                        $event[$name] = $GLOBALS['server']->date2iso8601($event[$name]);
2664                                }
2665                        }
2666                        if (is_array($event['recur_exception']))
2667                        {
2668                                foreach($event['recur_exception'] as $key => $timestamp)
2669                                {
2670                                        $event['recur_exception'][$key] = $GLOBALS['server']->date2iso8601($timestamp);
2671                                }
2672                        }
2673                        static $user_cache = array();
2674
2675                        if (!is_object($GLOBALS['phpgw']->perferences))
2676                        {
2677                                $GLOBALS['phpgw']->perferences = CreateObject('phpgwapi.preferences');
2678                        }
2679                        foreach($event['participants'] as $user_id => $status)
2680                        {
2681                                if (!isset($user_cache[$user_id]))
2682                                {
2683                                        $user_cache[$user_id] = array(
2684                                                'name'   => $GLOBALS['phpgw']->common->grab_owner_name($user_id),
2685                                                'email'  => $GLOBALS['phpgw']->perferences->email_address($user_id)
2686                                        );
2687                                }
2688                                $event['participants'][$user_id] = $user_cache[$user_id] + array(
2689                                        'status' => $status,
2690                                );
2691                        }
2692                        if (is_array($event['alarm']))
2693                        {
2694                                foreach($event['alarm'] as $id => $alarm)
2695                                {
2696                                        $event['alarm'][$id]['time'] = $GLOBALS['server']->date2iso8601($alarm['time']);
2697                                        if ($alarm['owner'] != $GLOBALS['phpgw_info']['user']['account_id'])
2698                                        {
2699                                                unset($event['alarm'][$id]);
2700                                        }
2701                                }
2702                        }
2703                        $event['category'] = $GLOBALS['server']->cats2xmlrpc(explode(',',$event['category']));
2704
2705                        // using access={public|privat} in all modules via xmlrpc
2706                        $event['access'] = $event['public'] ? 'public' : 'privat';
2707                        unset($event['public']);
2708
2709                        return $event;
2710                }
2711
2712                /* Begin Appsession Data */
2713                function store_to_appsession($event)
2714                {
2715                        $GLOBALS['phpgw']->session->appsession('entry','calendar',$event);
2716                }
2717
2718                function restore_from_appsession()
2719                {
2720                        $this->event_init();
2721                        $event = $GLOBALS['phpgw']->session->appsession('entry','calendar');
2722                        $this->so->cal->event = $event;
2723                        return $event;
2724                }
2725                /* End Appsession Data */
2726
2727                /* Begin of SO functions */
2728                function get_cached_event()
2729                {
2730                        return $this->so->get_cached_event();
2731                }
2732
2733                function add_attribute($var,$value,$index='**(**')
2734                {
2735                        $this->so->add_attribute($var,$value,$index);
2736                }
2737
2738                function event_init()
2739                {
2740                        $this->so->event_init();
2741                }
2742
2743                function set_start($year,$month,$day=0,$hour=0,$min=0,$sec=0)
2744                {
2745                        $this->so->set_start($year,$month,$day,$hour,$min,$sec);
2746                }
2747
2748                function set_end($year,$month,$day=0,$hour=0,$min=0,$sec=0)
2749                {
2750                        $this->so->set_end($year,$month,$day,$hour,$min,$sec);
2751                }
2752
2753                function set_title($title='')
2754                {
2755                        $this->so->set_title($title);
2756                }
2757
2758                function set_description($description='')
2759                {
2760                        $this->so->set_description($description);
2761                }
2762                function set_ex_participants($ex_participants='')
2763                {
2764                        $this->so->set_ex_participants($ex_participants);
2765                }
2766
2767                function set_class($class)
2768                {
2769                        $this->so->set_class($class);
2770                }
2771
2772                function set_category($category='')
2773                {
2774                        $this->so->set_category($category);
2775                }
2776
2777                function set_alarm($alarm)
2778                {
2779                        $this->so->set_alarm($alarm);
2780                }
2781
2782                function set_recur_none()
2783                {
2784                        $this->so->set_recur_none();
2785                }
2786
2787                function set_recur_daily($year,$month,$day,$interval)
2788                {
2789                        $this->so->set_recur_daily($year,$month,$day,$interval);
2790                }
2791
2792                function set_recur_weekly($year,$month,$day,$interval,$weekdays)
2793                {
2794                        $this->so->set_recur_weekly($year,$month,$day,$interval,$weekdays);
2795                }
2796
2797                function set_recur_monthly_mday($year,$month,$day,$interval)
2798                {
2799                        $this->so->set_recur_monthly_mday($year,$month,$day,$interval);
2800                }
2801
2802                function set_recur_monthly_wday($year,$month,$day,$interval)
2803                {
2804                        $this->so->set_recur_monthly_wday($year,$month,$day,$interval);
2805                }
2806
2807                function set_recur_yearly($year,$month,$day,$interval)
2808                {
2809                        $this->so->set_recur_yearly($year,$month,$day,$interval);
2810                }
2811                /* End of SO functions */
2812
2813                function prepare_matrix($interval,$increment,$part,$fulldate)
2814                {
2815                        for($h=0;$h<24;$h++)
2816                        {
2817                                for($m=0;$m<$interval;$m++)
2818                                {
2819                                        $index = (($h * 10000) + (($m * $increment) * 100));
2820                                        $time_slice[$index]['marker'] = '&nbsp';
2821                                        $time_slice[$index]['description'] = '';
2822                                }
2823                        }
2824                        foreach($this->cached_events[$fulldate] as $event)
2825                        {
2826                                if ($event['participants'][$part] == 'R')
2827                                {
2828                                        continue;       // dont show rejected invitations, as they are free time
2829                                }
2830                                $eventstart = $GLOBALS['phpgw']->datetime->localdates($this->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset);
2831                                $eventend = $GLOBALS['phpgw']->datetime->localdates($this->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset);
2832                                $start = ($eventstart['hour'] * 10000) + ($eventstart['minute'] * 100);
2833                                $starttemp = $this->splittime("$start",False);
2834                                $subminute = 0;
2835                                for($m=0;$m<$interval;$m++)
2836                                {
2837                                        $minutes = $increment * $m;
2838                                        if((int)$starttemp['minute'] > $minutes && (int)$starttemp['minute'] < ($minutes + $increment))
2839                                        {
2840                                                $subminute = ($starttemp['minute'] - $minutes) * 100;
2841                                        }
2842                                }
2843                                $start -= $subminute;
2844                                $end =  ($eventend['hour'] * 10000) + ($eventend['minute'] * 100);
2845                                $endtemp = $this->splittime("$end",False);
2846                                $addminute = 0;
2847                                for($m=0;$m<$interval;$m++)
2848                                {
2849                                        $minutes = ($increment * $m);
2850                                        if($endtemp['minute'] < ($minutes + $increment) && $endtemp['minute'] > $minutes)
2851                                        {
2852                                                $addminute = ($minutes + $increment - $endtemp['minute']) * 100;
2853                                        }
2854                                }
2855                                $end += $addminute;
2856                                $starttemp = $this->splittime("$start",False);
2857                                $endtemp = $this->splittime("$end",False);
2858
2859                                for($h=$starttemp['hour'];$h<=$endtemp['hour'];$h++)
2860                                {
2861                                        $startminute = 0;
2862                                        $endminute = $interval;
2863                                        $hour = $h * 10000;
2864                                        if($h == (int)$starttemp['hour'])
2865                                        {
2866                                                $startminute = ($starttemp['minute'] / $increment);
2867                                        }
2868                                        if($h == (int)$endtemp['hour'])
2869                                        {
2870                                                $endminute = ($endtemp['minute'] / $increment);
2871                                        }
2872                                        $private = $this->is_private($event,$part);
2873                                        $time_display = $GLOBALS['phpgw']->common->show_date($eventstart['raw'],$this->users_timeformat).'-'.$GLOBALS['phpgw']->common->show_date($eventend['raw'],$this->users_timeformat);
2874                                        $time_description = '('.$time_display.') '.$this->get_short_field($event,$private,'title').$this->display_status($event['participants'][$part]);
2875                                        for($m=$startminute;$m<$endminute;$m++)
2876                                        {
2877                                                $index = ($hour + (($m * $increment) * 100));
2878                                                $time_slice[$index]['marker'] = '-';
2879                                                $time_slice[$index]['description'] = $time_description;
2880                                                $time_slice[$index]['id'] = $event['id'];
2881                                        }
2882                                }
2883                        }
2884                        return $time_slice;
2885                }
2886
2887                /*!
2888                @function set_status
2889                @abstract set the participant response $status for event $cal_id and notifies the owner of the event
2890                */
2891                function set_status($cal_id,$status)
2892                {
2893                        $status2msg = array(
2894                                REJECTED  => MSG_REJECTED,
2895                                TENTATIVE => MSG_TENTATIVE,
2896                                ACCEPTED  => MSG_ACCEPTED
2897                        );
2898                        if (!isset($status2msg[$status]))
2899                        {
2900                                return False;
2901                        }
2902                        $event = $this->so->read_entry($cal_id);
2903                        $account_id = $GLOBALS['phpgw_info']['user']['account_id'];
2904                        if(($status2msg[$status] == "5" && $event['participants'][$account_id] == "A") ||
2905                         ($status2msg[$status] == "3" && $event['participants'][$account_id] == "R")) {
2906                                return True;
2907                        }
2908                        $this->so->set_status($cal_id,$status);
2909                        $event = $this->so->read_entry($cal_id);
2910                        $this->send_update($status2msg[$status],$event['participants'],$event);
2911
2912                }
2913
2914                /*!
2915                @function update_requested
2916                @abstract checks if $userid has requested (in $part_prefs) updates for $msg_type
2917                @syntax update_requested($userid,$part_prefs,$msg_type,$old_event,$new_event)
2918                @param $userid numerical user-id
2919                @param $part_prefs preferces of the user $userid
2920                @param $msg_type type of the notification: MSG_ADDED, MSG_MODIFIED, MSG_ACCEPTED, ...
2921                @param $old_event Event before the change
2922                @param $new_event Event after the change
2923                @returns 0 = no update requested, > 0 update requested
2924                */
2925                function update_requested($userid,$part_prefs,$msg_type,$old_event,$new_event)
2926                {
2927                        if ($msg_type == MSG_ALARM)
2928                        {
2929                                return True;    // always True for now
2930                        }
2931                        $want_update = 0;
2932
2933                        // the following switch fall-through all cases, as each included the following too
2934                        //
2935                        $msg_is_response = $msg_type == MSG_REJECTED || $msg_type == MSG_ACCEPTED || $msg_type == MSG_TENTATIVE;
2936
2937                        switch($ru = $part_prefs['calendar']['receive_updates'])
2938                        {
2939                                case 'responses':
2940                                        if ($msg_is_response)
2941                                        {
2942                                                ++$want_update;
2943                                        }
2944                                case 'modifications':
2945                                        if ($msg_type == MSG_MODIFIED)
2946                                        {
2947                                                ++$want_update;
2948                                        }
2949                                case 'time_change_4h':
2950                                case 'time_change':
2951                                        $diff = max(abs($this->maketime($old_event['start'])-$this->maketime($new_event['start'])),
2952                                                abs($this->maketime($old_event['end'])-$this->maketime($new_event['end'])));
2953                                        $check = $ru == 'time_change_4h' ? 4 * 60 * 60 - 1 : 0;
2954                                        if ($msg_type == MSG_MODIFIED && $diff > $check)
2955                                        {
2956                                                ++$want_update;
2957                                        }
2958                                case 'add_cancel':
2959                                        if ($old_event['owner'] == $userid && $msg_is_response ||
2960                                                $msg_type == MSG_DELETED || $msg_type == MSG_ADDED)
2961                                        {
2962                                                ++$want_update;
2963                                        }
2964                                        break;
2965                                case 'no':
2966                                        break;
2967                        }
2968                        //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";
2969                        return $want_update > 0;
2970                }
2971
2972                function create_vcard($event_arrays)
2973                {
2974            if(!is_array($event_arrays))
2975                                return null;
2976
2977                        $tmpattach="BEGIN:VCALENDAR\n"
2978                        ."PRODID:-//Expresso Livre//Calendar//EN\n"
2979                        ."VERSION:1.0\n";
2980            foreach ($event_arrays as $event)
2981            {
2982                                // It translates int to string
2983                                if (!is_object($event) && !is_array($event) || !array_key_exists  ('end', $event))
2984                                        $event = $event_arrays;
2985
2986                                //set to GMT
2987                                //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.
2988                                $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;
2989                                $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;
2990                               
2991                                $start_time = date("Ymd\THis\Z", $start_time);
2992                                $end_time = date("Ymd\THis\Z", $end_time);
2993       
2994                                // Necessário espaços após quebra-de-linha, na descrição, caso contrário
2995                                // ocorrerá erro ao importar o agendamento no Outlook (erro lunar).
2996                                $description = str_replace("\n","\n ", $event['description']);
2997                               
2998                                $tmpattach.="BEGIN:VEVENT\r\n"
2999                                ."DTSTART:".$start_time."\r\n"
3000                                ."DTEND:".$end_time."\r\n"
3001                                ."LAST-MODIFIED:".gmdate("Ymd\THis\Z")."\r\n" //Hora no formato UTC
3002                                ."UID:Expresso-".$event['id'].$event['uid']."\r\n"
3003                                ."DESCRIPTION:".$description."\r\n"
3004                                ."SUMMARY:".$event['title']."\r\n"
3005                                ."LOCATION:".$event['location']."\r\n"
3006                                ."END:VEVENT\r\n";
3007                        }
3008                    $tmpattach.="END:VCALENDAR\r\n";
3009                    return $tmpattach;
3010                }
3011
3012                /*!
3013                @function send_update
3014                @abstract sends update-messages to certain participants of an event
3015                @syntax send_update($msg_type,$to_notify,$old_event,$new_event=False)
3016                @param $msg_type type of the notification: MSG_ADDED, MSG_MODIFIED, MSG_ACCEPTED, ...
3017                @param $to_notify array with numerical user-ids as keys (!) (value is not used)
3018                @param $old_event Event before the change
3019                @param $new_event Event after the change
3020                */
3021                function send_update($msg_type,$to_notify,$old_event,$new_event=False,$user=False)
3022                {                       
3023                        if (!is_array($to_notify))
3024                        {
3025                                $to_notify = array();
3026                        }
3027                        $owner = $old_event ? $old_event['owner'] : $new_event['owner'];
3028                        if ($owner && !isset($to_notify[$owner]) && $msg_type != MSG_ALARM)
3029                        {
3030                                $to_notify[$owner] = 'owner';   // always include the event-owner
3031                        }
3032                        $version = $GLOBALS['phpgw_info']['apps']['calendar']['version'];
3033
3034                        $GLOBALS['phpgw_info']['user']['preferences'] = $GLOBALS['phpgw']->preferences->create_email_preferences();
3035                        $sender = $GLOBALS['phpgw_info']['user']['email'];
3036
3037                        $temp_tz_offset = $this->prefs['common']['tz_offset'];
3038                        $temp_timeformat = $this->prefs['common']['timeformat'];
3039                        $temp_dateformat = $this->prefs['common']['dateformat'];
3040
3041                        $tz_offset = ((60 * 60) * (int)$temp_tz_offset);
3042
3043                        if($old_event != False)
3044                        {
3045                                $t_old_start_time = $this->maketime($old_event['start']);
3046                                if($t_old_start_time < (time() - 86400))
3047                                {
3048                                        return False;
3049                                }
3050                        }
3051
3052                        $temp_user = $GLOBALS['phpgw_info']['user'];
3053
3054                        if (!$user)
3055                        {
3056                                $user = $this->owner;
3057                        }
3058                        $GLOBALS['phpgw_info']['user']['preferences'] = $GLOBALS['phpgw']->preferences->create_email_preferences($user);
3059
3060                        $event = $msg_type == MSG_ADDED || $msg_type == MSG_MODIFIED ? $new_event : $old_event;
3061                        if($old_event != False)
3062                        {
3063                                $old_starttime = $t_old_start_time - $GLOBALS['phpgw']->datetime->tz_offset;
3064                        }
3065                        $starttime = $this->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset;
3066                        $endtime   = $this->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset;
3067
3068                        switch($msg_type)
3069                        {
3070                                case MSG_DELETED:
3071                                        $action = lang('Canceled');
3072                                        $msg = 'Canceled';
3073                                        $msgtype = '"calendar";';
3074                                        $method = 'cancel';
3075                                        $typesend = 1;
3076                                        break;
3077                                case MSG_MODIFIED:
3078                                        $action = lang('Modified');
3079                                        $msg = 'Modified';
3080                                        $msgtype = '"calendar"; Version="'.$version.'"; Id="'.$new_event['id'].'"';
3081                                        $method = 'request';
3082                                        $typesend = 2;
3083                                        break;
3084                                case MSG_ADDED:
3085                                        $action = lang('Added');
3086                                        $msg = 'Added';
3087                                        $msgtype = '"calendar"; Version="'.$version.'"; Id="'.$new_event['id'].'"';
3088                                        $method = 'request';
3089                                        $typesend = 3;
3090                                        break;
3091                                case MSG_REJECTED:
3092                                        $action = lang('Rejected');
3093                                        $msg = 'Response';
3094                                        $msgtype = '"calendar";';
3095                                        $method = 'reply';
3096                                        $typesend = 4;
3097                                        break;
3098                                case MSG_TENTATIVE:
3099                                        $action = lang('Tentative');
3100                                        $msg = 'Response';
3101                                        $msgtype = '"calendar";';
3102                                        $method = 'reply';
3103                                        $typesend = 5;
3104                                        break;
3105                                case MSG_ACCEPTED:
3106                                        $action = lang('Accepted');
3107                                        $msg = 'Response';
3108                                        $msgtype = '"calendar";';
3109                                        $method = 'reply';
3110                                        $typesend = 6;
3111                                        break;
3112                                case MSG_ALARM:
3113                                        $action = lang('Alarm');
3114                                        $msg = 'Alarm';
3115                                        $msgtype = '"calendar";';
3116                                        $method = 'publish';    // duno if thats right
3117                                        $typesend = 7;
3118                                        break;
3119                                default:
3120                                        $method = 'publish';
3121                                        $typesend = 8;
3122                        }
3123                        $notify_msg = $this->prefs['calendar']['notify'.$msg];
3124                        if (empty($notify_msg))
3125                        {
3126                                $notify_msg = $this->prefs['calendar']['notifyAdded'];  // use a default
3127                        }
3128                        $details = array(                       // event-details for the notify-msg
3129                                'id'          => $msg_type == MSG_ADDED ? $new_event['id'] : $old_event['id'],
3130                                'action'      => $action,
3131                        );
3132                        $event_arr = $this->event2array($event);
3133                        foreach($event_arr as $key => $val)
3134                        {
3135                                $details[$key] = $val['data'];
3136                        }
3137                       
3138                        $details['participants'] = implode("\n",$details['participants']);
3139
3140                        $details['link'] = $GLOBALS['phpgw_info']['server']['webserver_url'].'/index.php?menuaction=calendar.uicalendar.view&cal_id='.$event['id'];
3141                        // if url is only a path, try guessing the rest ;-)
3142                        if ($GLOBALS['phpgw_info']['server']['webserver_url'][0] == '/')
3143                        {
3144                                $details['link'] = ($GLOBALS['phpgw_info']['server']['enforce_ssl'] ? 'https://' : 'http://').
3145                                        ($GLOBALS['phpgw_info']['server']['hostname'] ? $GLOBALS['phpgw_info']['server']['hostname'] : 'localhost').
3146                                        $details['link'];
3147                        }
3148                       
3149                        //Seta o email usando phpmailer
3150                        define('PHPGW_INCLUDE_ROOT','../');     
3151                        define('PHPGW_API_INC','../phpgwapi/inc');     
3152                        include_once(PHPGW_API_INC.'/class.phpmailer.inc.php');
3153                        $mail = new PHPMailer();
3154                        $mail->IsSMTP();
3155                        $boemailadmin = CreateObject('emailadmin.bo');
3156                        $emailadmin_profile = $boemailadmin->getProfileList();
3157                        $emailadmin = $boemailadmin->getProfile($emailadmin_profile[0]['profileID']);
3158               
3159                        $mail->Host = $emailadmin['smtpServer'];
3160                        $mail->Port = $emailadmin['smtpPort'];
3161                        $mail->From = $GLOBALS['phpgw']->preferences->values['email'];
3162                        $mail->FromName = $GLOBALS['phpgw_info']['user']['fullname'];
3163                        $mail->IsHTML(true);
3164
3165                        // Aqui e enviado o email
3166                        foreach($to_notify as $userid => $statusid)
3167                        {
3168                                $mail->ClearAttachments();
3169                               
3170                                $userid = (int)$userid;
3171
3172                                if ($statusid == 'R' || $GLOBALS['phpgw']->accounts->get_type($userid) == 'g')
3173                                {
3174                                        continue;       // dont notify rejected participants
3175                                }
3176                                if($userid != $GLOBALS['phpgw_info']['user']['account_id'] ||  $msg_type == MSG_ALARM)
3177                                {
3178                                        print_debug('Msg Type',$msg_type);
3179                                        print_debug('UserID',$userid);
3180
3181                                        $preferences = CreateObject('phpgwapi.preferences',$userid);
3182                                        $part_prefs = $preferences->read_repository();
3183
3184                                        if (!$this->update_requested($userid,$part_prefs,$msg_type,$old_event,$new_event))
3185                                        {
3186                                                continue;
3187                                        }
3188                                        $GLOBALS['phpgw']->accounts->get_account_name($userid,$lid,$details['to-firstname'],$details['to-lastname']);
3189                                        $details['to-fullname'] = $GLOBALS['phpgw']->common->display_fullname('',$details['to-firstname'],$details['to-lastname']);
3190
3191                                        $to = $preferences->email_address($userid);
3192                                       
3193                                        if (empty($to) || $to[0] == '@' || $to[0] == '$')       // we have no valid email-address
3194                                        {
3195                                                //echo "<p>bocalendar::send_update: Empty email adress for user '".$details['to-fullname']."' ==> ignored !!!</p>\n";
3196                                                continue;
3197                                        }
3198                                        print_debug('Email being sent to',$to);
3199
3200                                        $GLOBALS['phpgw_info']['user']['preferences']['common']['tz_offset'] = $part_prefs['common']['tz_offset'];
3201                                        $GLOBALS['phpgw_info']['user']['preferences']['common']['timeformat'] = $part_prefs['common']['timeformat'];
3202                                        $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat'] = $part_prefs['common']['dateformat'];
3203
3204                                        $GLOBALS['phpgw']->datetime->tz_offset = ((60 * 60) * (int)$GLOBALS['phpgw_info']['user']['preferences']['common']['tz_offset']);
3205
3206                                        if($old_starttime)
3207                                        {
3208                                                $details['olddate'] = $GLOBALS['phpgw']->common->show_date($old_starttime);
3209                                        }
3210                                        $details['startdate'] = $GLOBALS['phpgw']->common->show_date($starttime);
3211                                        $details['enddate']   = $GLOBALS['phpgw']->common->show_date($endtime);
3212                                       
3213                                       
3214                                        list($subject,$body1) = split("\n",$GLOBALS['phpgw']->preferences->parse_notify($notify_msg,$details),2);
3215                                       
3216                                        switch($part_prefs['calendar']['update_format'])
3217                                        {
3218                                                case  'extended':
3219                                                        //$body .= "\n\n".lang('Event Details follow').":\n";
3220                                                        $body = '';
3221                                                        $body .= "<br>".lang('Event Details follow')." :: ";
3222                                                        foreach($event_arr as $key => $val)
3223                                                        {
3224                                                                // titulo
3225                                                                if($key =='title')
3226                                                                {
3227                                                                        $var1 = $val['field'];
3228                                                                        $vardata1 = $details[$key];
3229                                                                }
3230                                                                //descricao
3231                                                                if($key =='description')
3232                                                                {
3233                                                                        $var2 = $val['field'];
3234                                                                        $vardata2 = $details[$key];
3235                                                                }
3236                                                                //dt inicio
3237                                                                if($key =='startdate')
3238                                                                {
3239                                                                        switch(trim($part_prefs['common']['dateformat']))
3240                                                                        {
3241                                                                               
3242                                                                                case ($part_prefs['common']['dateformat'] === "m/d/Y" || $part_prefs['common']['dateformat'] === "m-d-Y" || $part_prefs['common']['dateformat'] === "m.d.Y"):
3243                                                                                        $var3 = $val['field'];
3244                                                                                        $vardata3 = $details[$key];
3245                                                                                        $newmounth3 = substr($vardata3,0,2);
3246                                                                                        $newday3 = substr($vardata3,3,2);
3247                                                                                        $newyear3 = substr($vardata3,6,4);
3248                                                                                        $newall3 =$newyear3.$newmounth3.$newday3;
3249                                                                                        break;
3250                                                                                       
3251                                                                                case    ($part_prefs['common']['dateformat'] === "Y/d/m" || $part_prefs['common']['dateformat'] === "Y-d-m" || $part_prefs['common']['dateformat'] === "Y.d.m"):
3252
3253                                                                                        $var3 = $val['field'];
3254                                                                                        $vardata3 = $details[$key];
3255                                                                                        $newyear3 = substr($vardata3,0,4);
3256                                                                                        $newday3 = substr($vardata3,5,2);
3257                                                                                        $newmounth3 = substr($vardata3,8,2);
3258                                                                                        $newall3 =$newyear3.$newmounth3.$newday3;
3259                                                                                        break;
3260
3261                                                                                case ($part_prefs['common']['dateformat'] === "Y/m/d" || $part_prefs['common']['dateformat'] === "Y-m-d" || $part_prefs['common']['dateformat'] === "Y.m.d"):
3262
3263                                                                                        $var3 = $val['field'];
3264                                                                                        $vardata3 = $details[$key];
3265                                                                                        $newyear3 = substr($vardata3,0,4);
3266                                                                                        $newmounth3 = substr($vardata3,5,2);
3267                                                                                        $newday3 = substr($vardata3,8,2);
3268                                                                                        $newall3 =$newyear3.$newmounth3.$newday3;
3269                                                                                        break;
3270
3271                                                                                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"):
3272                                                                               
3273                                                                                        $var3 = $val['field'];
3274                                                                                        $vardata3 = $details[$key];
3275                                                                                        $newday3 = substr($vardata3,0,2);
3276                                                                                        $newmounth3 = substr($vardata3,3,2);
3277                                                                                        $newyear3 = substr($vardata3,6,4);
3278                                                                                        $newall3 =$newyear3.$newmounth3.$newday3;
3279                                                                                        break;
3280                                                                       
3281                                                                        }
3282                                                                       
3283                                                                }
3284                                                                //dt final
3285                                                                if($key =='enddate')
3286                                                                {
3287                                                                        $var4 = $val['field'];
3288                                                                        $vardata4 = $details[$key];
3289                                                                }
3290                                                                //localizacao
3291                                                                if($key =='location')
3292                                                                {
3293                                                                        $var8 = $val['field'];
3294                                                                        $vardata8 = $details[$key];
3295                                                                }
3296                                                                //participantes
3297                                                                if($key =='participants')
3298                                                                {
3299                                                                        $var5 = $val['field'];
3300                                                                        foreach($val['data'] as $NewKey => $NewVal)
3301                                                                        {
3302                                                                                //Research inside of ldap ( Pesquisa dentro do ldap )
3303                                                                                $newvalue = $this->so->search_uidNumber($to);
3304                                                                                foreach($newvalue as $tmp)
3305                                                                                {
3306                                                                                        $tmpmail = $tmp['mail'][0];
3307                                                                                        $tmpuid = $tmp['uidnumber'][0];
3308                                                                                        if( trim($tmpmail) == trim($to) & trim($tmpuid) == trim($NewKey))
3309                                                                                        {
3310                                                                                                        if( ( $typesend == 3 ) || ( $typesend == 2 ) )
3311                                                                                                        {
3312                                                                                                                $question = "";
3313                                                                                                               
3314                                                                                                                if( $typesend == 2 )
3315                                                                                                                        $question = lang("Do you wish to change your participation in this event?");
3316
3317                                                                                                                $lang1 = lang("To See Commitment");
3318                                                                                                                $varbuttom = "<form action=".$GLOBALS['phpgw_info']['server']['webserver_url']."/index.php?menuaction=calendar.uicalendar.view&cal_id=$event[id]&date=$newall3' method='POST'>
3319                                                                                                                                                                  <input type='submit' value='$lang1'>
3320                                                                                                                                                                   </form>";
3321                                                                                                                $lang2 = lang("To accept");
3322                                                                                                                $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\")'>";
3323
3324                                                                                                                $lang3 = lang("To reject");
3325                                                                                                                $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\")'>";
3326                                                                                                               
3327                                                                                                                $lang4 = lang("Alarm");
3328                                                                                                                $varbuttom3 = "<form action=".$GLOBALS['phpgw_info']['server']['webserver_url']."/index.php?menuaction=calendar.uialarm.manager method='POST'>
3329                                                                                                                                                                  <input type='submit' value='$lang4'>
3330                                                                                                                                                                  <input type='hidden' name='cal_id' value=$event[id]>
3331                                                                                                                                                                   </form>";
3332                                                                                                                                                                   
3333                                                                                                                $lang5 = lang("Delegate");
3334                                                                                                                $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'>
3335                                                                                                                                                                  <input type='submit' value='$lang5'>
3336                                                                                                                                                                   </form>";
3337                                                                                                               
3338                                                                                                                $lang6 = lang("Tentative");
3339                                                                                                                $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\")'>";                                                                                                             
3340                                                                                                        }
3341                                                                                                        else
3342                                                                                                        {
3343                                                                                                                        $varbuttom  = "";
3344                                                                                                                        $varbuttom1 = "";
3345                                                                                                                        $varbuttom2 = "";
3346                                                                                                                        $varbuttom3 = "";
3347                                                                                                                        $varbuttom4 = "";
3348                                                                                                                        $varbuttom5 = "";
3349                                                                                                        }
3350                                                                                        }
3351                                                                                        // It only mounts variavel with the name of the participants of the list ( Monta a variavel somente com o nome dos participantes da lista)
3352                                                                                        if($typesend == 3)
3353                                                                                        {
3354                                                                                                list($tmpvardata5,$tmp2vardata5) = explode("(",$NewVal);
3355                                                                                                $vardata5 = $tmpvardata5."<br>";
3356                                                                                        }
3357                                                                                        else
3358                                                                                        {
3359                                                                                                $vardata5 = $NewVal."<br>";
3360                                                                                        }
3361                                                                               
3362                                                                                }
3363                                                                                $vardata6 .= $vardata5;
3364                                                                                unset($vardata5);
3365                                                                        }
3366                                                                }               
3367                                                        }
3368                                                        //To mount the message as text/html (Para montar a mensagem como text/html - /phpgwapi/inc/class.send.inc.php )
3369                                                        $content_type = "text/html";
3370                                                        //It mounts the body of the message (Monta o corpo da mensagem)
3371                                                       
3372                                                        // A constante PHPGW_APP_TPL nao existe para envio de alarmes (cront, asyncservice).
3373                                                        define ("PHPGW_APP_TPL",PHPGW_API_INC . "/../../calendar/templates/".$GLOBALS['phpgw_info']['user']['preferences']['common']['template_set']."");
3374                                                       
3375                                                        $body = CreateObject('phpgwapi.Template',PHPGW_APP_TPL);
3376                                                        $body->set_file(Array('calendar' => 'body_email.tpl'));
3377                                                        $body->set_block('calendar','list');
3378                                                        $var = Array(
3379                                                                'script'                        => $script,
3380                                                                'subject'                       => $body1,
3381                                                                'var1'                          => $var1,
3382                                                                'vardata1'                      => $vardata1,
3383                                                                'var2'                          => $var2,
3384                                                                'vardata2'                      => $vardata2,
3385                                                                'var3'                          => $var3,
3386                                                                'vardata3'                      => $vardata3,
3387                                                                'var4'                          => $var4,
3388                                                                'vardata4'                      => $vardata4,
3389                                                                'var5'                          => $var5,
3390                                                                'vardata6'                      => $vardata6,
3391                                                                'var8'                          => $var8,
3392                                                                'vardata8'                      => $vardata8,
3393                                                                'question'                      => $question,                                                                                                                   
3394                                                                'varbuttom'                     => $varbuttom,
3395                                                                'varbuttom1'            => $varbuttom1,
3396                                                                'varbuttom2'            => $varbuttom2,
3397                                                                'varbuttom3'            => $varbuttom3,
3398                                                                'varbuttom4'            => $varbuttom4,
3399                                                                'varbuttom5'            => $varbuttom5
3400                                                        );
3401                                                        $body->set_var($var);
3402                                                        $tmpbody = $body->fp('out','list');
3403                                                                                                               
3404                                                        break;
3405
3406                                                case 'ical':
3407                                                        $content_type = "calendar; method=$method; name=calendar.ics";
3408/*                                                      if ($body != '')
3409                                                        {
3410                                                                $boundary = '----Message-Boundary';
3411                                                                $body .= "\n\n\n$boundary\nContent-type: text/$content_type\n".
3412                                                                        "Content-Disposition: inline\nContent-transfer-encoding: 7BIT\n\n";
3413                                                                $content_type = '';
3414                                                        }
3415*/
3416                                                        $body = ExecMethod('calendar.boicalendar.export',array(
3417                                                                'l_event_id'  => $event['id'],
3418                                                                'method'      => $method,
3419                                                                'chunk_split' => False
3420                                                        ));
3421                                                        break;
3422                                        }
3423                                        $mail->AddAddress($to);
3424                                        $mail->Body = $tmpbody;
3425                                        $mail->From = $sender;
3426                                        $mail->FromName = $GLOBALS['phpgw_info']['user']['fullname'];
3427                                        $mail->Sender = $mail->From;
3428                                        $mail->SenderName = $mail->FromName;
3429                                        $mail->Subject = $subject;
3430                                        unset($vardata5);
3431                                        unset($vardata6);
3432                                }
3433                        }
3434
3435                        //Inicializa variï¿œvel de retorno.
3436                        $returncode=true;                       
3437                        if(count($mail->to)) {                         
3438                                // Envia aviso a todos os participantes.
3439                                if(!$mail->Send()) {                           
3440                                        $returncode = false;
3441                                        $errorInfo['participants'] = $mail->ErrorInfo;
3442                                }
3443                                else
3444                                        $returncode =  true;
3445                        }
3446                       
3447                        if(count($to_notify) && $this->ex_participants){
3448                                $mail->ClearAllRecipients();
3449                                $var = explode(",",trim($this->ex_participants));
3450                                $to = array();
3451                                if(!$subject) {
3452                                        $details['startdate'] = $GLOBALS['phpgw']->common->show_date($starttime);
3453                                        $details['enddate']   = $GLOBALS['phpgw']->common->show_date($endtime);
3454                                        list($subject,$body1) = split("\n",$GLOBALS['phpgw']->preferences->parse_notify($notify_msg,$details),2);
3455                                }
3456                               
3457                                foreach($var as $index => $ex_participant){
3458                                        $ex_participant = trim($ex_participant);
3459                                        $ex_participant = preg_replace('#"(.*)" <(.*)\@(.*)\.(.*)>#','\\2@\\3.\\4',$ex_participant);
3460                                                if($ex_participant)
3461                                                        $to[] = $ex_participant;
3462                                }               
3463                               
3464                                foreach($to as $i => $to_array)
3465                                        $mail->AddAddress($to_array);
3466                               
3467                                $_body = explode("<hr size='1' width='100%'>",$tmpbody);
3468                                $tmpbody = $_body[0] ? $_body[0] : $subject ;
3469                                $tmpbody.= "<br><b>".lang("external participants").":: </b> ".htmlentities($this->ex_participants);
3470                                $tmpbody.= "<br>".lang("Summary").": ".$this->so->cal->event[title]."<br>";
3471                                $tmpbody.= "<br>".lang("Start time").": ".$GLOBALS['phpgw']->common->show_date($starttime)."<br>".lang("End date").": ".$GLOBALS['phpgw']->common->show_date($endtime)."<br>";
3472                                $tmpbody.= "<br><br><hr size='1' width='100%'><font color='red'>"
3473                                .lang("This message was sent by server. You must send a message to sender to confirm this event")."<br>"
3474                                .lang("This is an external event. Even if it added to your expresso its can be changed any time at all")."</font><br>";
3475                               
3476                                if ($GLOBALS['bocalendar']->so->cal->event[start][month] > 10)
3477                                        $event_month=$GLOBALS['bocalendar']->so->cal->event[start][month];
3478                                else
3479                                        $event_month="0".$GLOBALS['bocalendar']->so->cal->event[start][month];
3480                                //attach extern vcalendar/icalendar (ics)                       
3481                                // define('context','$GLOBALS.bocalendar.so.cal.event');
3482                                $tmpattach = $this->create_vcard($GLOBALS['bocalendar']->so->cal->event);
3483                                if($tmpattach){                                 
3484                                        $tmpbody .="<a href='../index.php?menuaction=calendar.uicalendar.add&date="
3485                                        .$GLOBALS['bocalendar']->so->cal->event[start][year]
3486                                .$event_month
3487                                .$GLOBALS['bocalendar']->so->cal->event[start][mday]
3488                                        ."&hour=".$GLOBALS['bocalendar']->so->cal->event[start][hour]
3489                                        ."&minute=".$GLOBALS['bocalendar']->so->cal->event[start][min]
3490                                        ."&title=".$GLOBALS['bocalendar']->so->cal->event['title']
3491                                        ."&description=".$GLOBALS['bocalendar']->so->cal->event['description']
3492                                        ."&location=".$GLOBALS['bocalendar']->so->cal->event['location']."'>"
3493                                        ."<h2>".lang("Add to my expresso")."</h2>";
3494                                        $tempdir = $GLOBALS['phpgw_info']['server']['temp_dir'] . SEP;
3495                                        srand((double)microtime()*1000000);
3496                                        $random_number = rand(100000000,999999999);
3497                                        $newfilename = md5(time() . getenv("REMOTE_ADDR") . $random_number );
3498                                        $filename = $tempdir . $newfilename;
3499                                        $attach_fd = fopen($filename,"w+");
3500                                        fwrite($attach_fd,$tmpattach);
3501                                        $mail->AddAttachment($filename, "extern.ics", "base64", "text/plain"); // "application/octet-stream"
3502                                        fclose($attach_fd);
3503                                }
3504                                $mail->From = $sender;
3505                                $mail->FromName = $GLOBALS['phpgw_info']['user']['fullname'];
3506                                $mail->Sender = $mail->From;
3507                                $mail->SenderName = $mail->FromName;
3508                                $mail->Subject = lang("External event from Expresso");
3509                                $mail->Body = $tmpbody;
3510                                                                                                                                               
3511                                if(!$mail->Send())
3512                                {
3513                                        $returncode=false;
3514                                        $errorInfo['ex_participants'] = $mail->ErrorInfo;
3515                                }
3516                                else
3517                                {
3518                                        $returncode=true;
3519                                }
3520                        }
3521
3522
3523                        if((is_int($this->user) && $this->user != $temp_user['account_id']) ||
3524                                (is_string($this->user) && $this->user != $temp_user['account_lid']))
3525                        {
3526                                $GLOBALS['phpgw_info']['user'] = $temp_user;
3527                        }       
3528
3529                        $GLOBALS['phpgw_info']['user']['preferences']['common']['tz_offset'] = $temp_tz_offset;
3530                        $GLBOALS['phpgw']->datetime->tz_offset = ((60 * 60) * $temp_tz_offset);
3531                        $GLOBALS['phpgw_info']['user']['preferences']['common']['timeformat'] = $temp_timeformat;
3532                        $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat'] = $temp_dateformat;
3533                       
3534                        // Notifica por email o criador do compromisso, com as possï¿œveis falhas.                                             
3535                        if($errorInfo) {
3536                                $tmpbody = "<font color='red'>".lang("The following commitment had problems for DELIVERING the NOTIFICATION messages.").".</font><br>";
3537                                $tmpbody.= "<br>".lang("Summary").": ".$this->so->cal->event[title]."<br>";
3538                                $tmpbody.= "<br>".lang("Start time").": ".$GLOBALS['phpgw']->common->show_date($starttime)."<br>".lang("End date").": ".$GLOBALS['phpgw']->common->show_date($endtime)."<br>";                         
3539                                $tmpbody.= "<br><u>".lang("Failed to delivery")."</u><br>";
3540                                $failed = false;                               
3541                                if(strstr($errorInfo['participants'],"recipients_failed")){
3542                                        $failed = explode("recipients_failed",$errorInfo['participants']);
3543                                        $tmpbody.= lang("to").": ".$failed[1];
3544                                }
3545                                if(strstr($errorInfo['ex_participants'],"recipients_failed")){
3546                                        $failed = explode("recipients_failed",$errorInfo['ex_participants']);
3547                                        $tmpbody.= lang("to").": ".$failed[1];
3548                                }                       
3549                                if(!$failed) {
3550                                        $tmpbody.= lang("Description").":<br>";
3551                                        $tmpbody.= $errorInfo['participants'];
3552                                        $tmpbody.= "<br>".$errorInfo['ex_participants'];
3553                                }
3554                                $tmpbody.= "<br>".lang("Subject").": ".$subject;
3555                                // Reinicializa o objeto, devido ao erro anterior na entrega.
3556                               
3557                                $mail = new PHPMailer();
3558                                $mail->IsSMTP();
3559                                $mail->Host = $emailadmin['smtpServer'];
3560                                $mail->Port = $emailadmin['smtpPort'];
3561                                $mail->From = $sender;
3562                                $mail->FromName = $GLOBALS['phpgw_info']['user']['fullname'];
3563                                $mail->Sender = $mail->From;
3564                                $mail->SenderName = $mail->FromName;
3565                                $mail->IsHTML(True);
3566                                $mail->Subject = lang("calendar event")." - ".lang("email notification");                                                       
3567                                $mail->Body = $tmpbody;                                 
3568                                $mail->AddAddress($sender);
3569                                if(!$mail->Send())                     
3570                                        $returncode = false;
3571                                else
3572                                        $returncode =  true;
3573                        }
3574                        return $returncode;
3575                }
3576               
3577                function send_alarm($alarm)
3578                {
3579                        //echo "<p>bocalendar::send_alarm("; print_r($alarm); echo ")</p>\n";
3580                       
3581                        $GLOBALS['phpgw_info']['user']['account_id'] = $this->owner = $alarm['owner'];
3582
3583                        if (!$alarm['enabled'] || !$alarm['owner'] || !$alarm['cal_id'] || !($event = $this->so->read_entry($alarm['cal_id'])))
3584                        {
3585                                return False;   // event not found
3586                        }
3587                        if ($alarm['all'])
3588                        {
3589                                $to_notify = $event['participants'];
3590                        }
3591                        elseif ($this->check_perms(PHPGW_ACL_READ,$event))      // checks agains $this->owner set to $alarm[owner]
3592                        {
3593                                $to_notify[$alarm['owner']] = 'A';
3594                        }
3595                        else
3596                        {
3597                                return False;   // no rights
3598                        }
3599                        return $this->send_update(MSG_ALARM,$to_notify,$event,False,$alarm['owner']);
3600                }
3601
3602                function get_alarms($event_id)
3603                {
3604                        return $this->so->get_alarm($event_id);
3605                }
3606
3607                function alarm_today($event,$today,$starttime)
3608                {
3609                        $found = False;
3610                        @reset($event['alarm']);
3611                        $starttime_hi = $GLOBALS['phpgw']->common->show_date($starttime,'Hi');
3612                        $t_appt['month'] =$GLOBALS['phpgw']->common->show_date($today,'m');
3613                        $t_appt['mday'] = $GLOBALS['phpgw']->common->show_date($today,'d');
3614                        $t_appt['year'] = $GLOBALS['phpgw']->common->show_date($today,'Y');
3615                        $t_appt['hour'] = $GLOBALS['phpgw']->common->show_date($starttime,'H');
3616                        $t_appt['min']  = $GLOBALS['phpgw']->common->show_date($starttime,'i');
3617                        $t_appt['sec']  = 0;
3618                        $t_time = $this->maketime($t_appt) - $GLOBALS['phpgw']->datetime->tz_offset;
3619                        $y_time = $t_time - 86400;
3620                        $tt_time = $t_time + 86399;
3621                        print_debug('T_TIME',$t_time.' : '.$GLOBALS['phpgw']->common->show_date($t_time));
3622                        print_debug('Y_TIME',$y_time.' : '.$GLOBALS['phpgw']->common->show_date($y_time));
3623                        print_debug('TT_TIME',$tt_time.' : '.$GLOBALS['phpgw']->common->show_date($tt_time));
3624                        while(list($key,$alarm) = each($event['alarm']))
3625                        {
3626                                if($alarm['enabled'])
3627                                {
3628                                        print_debug('TIME',$alarm['time'].' : '.$GLOBALS['phpgw']->common->show_date($alarm['time']).' ('.$event['id'].')');
3629                                        if($event['recur_type'] != MCAL_RECUR_NONE)   /* Recurring Event */
3630                                        {
3631                                                print_debug('Recurring Event');
3632                                                if($alarm['time'] > $y_time && $GLOBALS['phpgw']->common->show_date($alarm['time'],'Hi') < $starttime_hi && $alarm['time'] < $t_time)
3633                                                {
3634                                                        $found = True;
3635                                                }
3636                                        }
3637                                        elseif($alarm['time'] > $y_time && $alarm['time'] < $t_time)
3638                                        {
3639                                                $found = True;
3640                                        }
3641                                }
3642                        }
3643                        print_debug('Found',$found);
3644                        return $found;
3645                }
3646
3647                function prepare_recipients(&$new_event,$old_event)
3648                {
3649                                               
3650                        // Find modified and deleted users.....
3651                        while(list($old_userid,$old_status) = each($old_event['participants']))
3652                        {
3653                                if(isset($new_event['participants'][$old_userid]))
3654                                {
3655                                        print_debug('Modifying event for user',$old_userid);
3656                                        $this->modified[(int)$old_userid] = $new_status;
3657                                }
3658                                else
3659                                {
3660                                        print_debug('Deleting user from the event',$old_userid);
3661                                        $this->deleted[(int)$old_userid] = $old_status;
3662                                }
3663                        }
3664                        // Find new users.....
3665                        while(list($new_userid,$new_status) = each($new_event['participants']))
3666                        {
3667                                if(!isset($old_event['participants'][$new_userid]))
3668                                {
3669                                        print_debug('Adding event for user',$new_userid);
3670                                        $this->added[$new_userid] = 'U';
3671                                        $new_event['participants'][$new_userid] = 'U';
3672                                }
3673                        }
3674                       
3675                        if(count($this->added) > 0 || count($this->modified) > 0 || count($this->deleted) > 0)
3676                        {
3677                                if(count($this->added) > 0)
3678                                {
3679                                        $this->ex_participants = '';
3680                                        $this->send_update(MSG_ADDED,$this->added,'',$new_event);
3681                                }
3682                                if(count($this->modified) > 0)
3683                                {
3684                                        $this->send_update(MSG_MODIFIED,$this->modified,$old_event,$new_event);
3685                                }
3686                                if(count($this->deleted) > 0)
3687                                {
3688                                        $this->ex_participants = '';
3689                                        $this->send_update(MSG_DELETED,$this->deleted,$old_event);
3690                                }
3691                        }
3692                }
3693
3694                function remove_doubles_in_cache($firstday,$lastday)
3695                {
3696                        $already_moved = Array();
3697                        for($v=$firstday;$v<=$lastday;$v++)
3698                        {
3699                                if (!$this->cached_events[$v])
3700                                {
3701                                        continue;
3702                                }
3703                                $cached = $this->cached_events[$v];
3704                                $this->cached_events[$v] = array();
3705                                while (list($g,$event) = each($cached))
3706                                {
3707                                        $end = date('Ymd',$this->maketime($event['end']));
3708                                        print_debug('EVENT',_debug_array($event,False));
3709                                        print_debug('start',$start);
3710                                        print_debug('v',$v);
3711
3712                                        if (!isset($already_moved[$event['id']]) || $event['recur_type'] && $v > $end)
3713                                        {
3714                                                $this->cached_events[$v][] = $event;
3715                                                $already_moved[$event['id']] = 1;
3716                                                print_debug('Event moved');
3717                                        }
3718                                }
3719                        }
3720                }
3721
3722                function get_dirty_entries($lastmod=-1)
3723                {
3724                        $events = false;
3725                        $event_ids = $this->so->cal->list_dirty_events($lastmod);
3726                        if(is_array($event_ids))
3727                        {
3728                                foreach($event_ids as $key => $id)
3729                                {
3730                                        $events[$id] = $this->so->cal->fetch_event($id);
3731                                }
3732                        }
3733                        unset($event_ids);
3734
3735                        $rep_event_ids = $this->so->cal->list_dirty_events($lastmod,$true);
3736                        if(is_array($rep_event_ids))
3737                        {
3738                                foreach($rep_event_ids as $key => $id)
3739                                {
3740                                        $events[$id] = $this->so->cal->fetch_event($id);
3741                                }
3742                        }
3743                        unset($rep_event_ids);
3744
3745                        return $events;
3746                }
3747
3748                function _debug_array($data)
3749                {
3750                        echo '<br>UI:';
3751                        _debug_array($data);
3752                }
3753
3754                /*!
3755                @function rejected_no_show
3756                @abstract checks if event is rejected from user and he's not the owner and dont want rejected
3757                @param $event to check
3758                @returns True if event should not be shown
3759                */
3760                function rejected_no_show($event)
3761                {
3762                        $ret = !$this->prefs['calendar']['show_rejected'] &&
3763                                $event['owner'] != $this->owner &&
3764                                $event['participants'][$this->owner] == 'R';
3765                        //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";
3766                        return $ret;
3767                }
3768
3769                /* This is called only by list_cals().  It was moved here to remove fatal error in php5 beta4 */
3770                function list_cals_add($id,&$users,&$groups)
3771                {
3772                        $name = $GLOBALS['phpgw']->common->grab_owner_name($id);
3773                        if (($type = $GLOBALS['phpgw']->accounts->get_type($id)) == 'g')
3774                        {
3775                                $arr = &$groups;
3776                        }
3777                        else
3778                        {
3779                                $arr = &$users;
3780                        }
3781                        $arr[$name] = Array(
3782                                'grantor' => $id,
3783                                'value'   => ($type == 'g' ? 'g_' : '') . $id,
3784                                'name'    => $name
3785                        );
3786                }
3787
3788                /*!
3789                @function list_cals
3790                @abstract generate list of user- / group-calendars for the selectbox in the header
3791                @returns alphabeticaly sorted array with groups first and then users
3792                */
3793                function list_cals()
3794                {
3795                        $users = $groups = array();
3796                        foreach($this->grants as $id => $rights)
3797                        {
3798                                $this->list_cals_add($id,$users,$groups);
3799                        }
3800                       
3801                        //by JakJr, melhora de performance na abertura da agenda
3802                        /*if ($memberships = $GLOBALS['phpgw']->accounts->membership($GLOBALS['phpgw_info']['user']['account_id']))
3803                        {
3804                                foreach($memberships as $group_info)
3805                                {
3806                                        $this->list_cals_add($group_info['account_id'],$users,$groups);
3807
3808                                        if ($account_perms = $GLOBALS['phpgw']->acl->get_ids_for_location($group_info['account_id'],PHPGW_ACL_READ,'calendar'))
3809                                        {
3810                                                foreach($account_perms as $id)
3811                                                {
3812                                                        $this->list_cals_add($id,$users,$groups);
3813                                                }
3814                                        }
3815                                }
3816                        }*/
3817                        uksort($users,'strnatcasecmp');
3818                        uksort($groups,'strnatcasecmp');
3819
3820                        return $users + $groups;        // users first and then groups, both alphabeticaly
3821                }
3822
3823          function translate($key,$vars=false, $not_found='*' )
3824          {
3825            if ($this->async)
3826              return $GLOBALS['phpgw']->translation->translate_async($key, $vars);
3827            return lang($key, $vars);
3828          }
3829
3830                /*!
3831                @function event2array
3832                @abstract create array with name, translated name and readable content of each attributes of an event
3833                @syntax event2array($event,$sep='<br>')
3834                @param $event event to use
3835                @returns array of attributes with fieldname as key and array with the 'field'=translated name \
3836                        'data' = readable content (for participants this is an array !)
3837                */
3838                function event2array($event)
3839                {
3840                       
3841                       
3842                  $var['title'] = Array(
3843                                'field'         => $this->translate('Title'),
3844                                'data'          => $event['title']
3845                        );
3846
3847                        // Some browser add a \n when its entered in the database. Not a big deal
3848                        // this will be printed even though its not needed.
3849                        $var['description'] = Array(
3850                                'field' => $this->translate('Description'),
3851                                'data'  => $event['description']
3852                        );
3853
3854                        $var['ex_participants'] = Array(
3855                                'field' => $this->translate('External Participants'),
3856                                'data'  => $event['ex_participants']
3857                        );
3858                       
3859                        $cats = Array();
3860                        $this->cat->categories($this->bo->owner,'calendar');
3861                        if(strpos($event['category'],','))
3862                        {
3863                                $cats = explode(',',$event['category']);
3864                        }
3865                        else
3866                        {
3867                                $cats[] = $event['category'];
3868                        }
3869                        foreach($cats as $cat_id)
3870                        {
3871                                list($cat) = $this->cat->return_single($cat_id);
3872                                $cat_string[] = $cat['name'];
3873                        }
3874                        $var['category'] = Array(
3875                                'field' => $this->translate('Category'),
3876                                'data'  => implode(', ',$cat_string)
3877                        );
3878
3879                        $var['location'] = Array(
3880                                'field' => $this->translate('Location'),
3881                                'data'  => $event['location']
3882                        );
3883
3884                        $var['startdate'] = Array(
3885                                'field' => $this->translate('Start Date/Time'),
3886                                'data'  => $GLOBALS['phpgw']->common->show_date($this->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset),
3887                        );
3888
3889                        $var['enddate'] = Array(
3890                                'field' => $this->translate('End Date/Time'),
3891                                'data'  => $GLOBALS['phpgw']->common->show_date($this->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset)
3892                        );
3893
3894                        $pri = Array(
3895                                1       => lang('Low'),
3896                                2       => lang('Normal'),
3897                                3       => lang('High')
3898                        );
3899                        $var['priority'] = Array(
3900                                'field' => lang('Priority'),
3901                                'data'  => $pri[$event['priority']]
3902                        );
3903
3904                        $var['owner'] = Array(
3905                                'field' => lang('Created By'),
3906                                'data'  => $GLOBALS['phpgw']->common->grab_owner_name($event['owner'])
3907                        );
3908
3909                        $var['updated'] = Array(
3910                                'field' => lang('Updated'),
3911                                'data'  => $GLOBALS['phpgw']->common->show_date($this->maketime($event['modtime']) - $GLOBALS['phpgw']->datetime->tz_offset)
3912                        );
3913
3914                        $var['access'] = Array(
3915                                'field' => lang('Access'),
3916                                'data'  => $event['public'] ? lang('Public') : lang('Private')
3917                        );
3918
3919                        if(@isset($event['groups'][0]))
3920                        {
3921                                $cal_grps = '';
3922                                for($i=0;$i<count($event['groups']);$i++)
3923                                {
3924                                        if($GLOBALS['phpgw']->accounts->exists($event['groups'][$i]))
3925                                        {
3926                                                $cal_grps .= ($i>0?'<br>':'').$GLOBALS['phpgw']->accounts->id2name($event['groups'][$i]);
3927                                        }
3928                                }
3929
3930                                $var['groups'] = Array(
3931                                        'field' => lang('Groups'),
3932                                        'data'  => $cal_grps
3933                                );
3934                        }
3935
3936                        $participants = array();
3937                        foreach($event['participants'] as $user => $short_status)
3938                        {
3939                                if($GLOBALS['phpgw']->accounts->exists($user))
3940                                {
3941                                        $participants[$user] = $GLOBALS['phpgw']->common->grab_owner_name($user).' ('.$this->get_long_status($short_status).')';
3942                                }
3943                        }
3944                        $var['participants'] = Array(
3945                                'field' => $this->translate('Participants'),
3946                                'data'  => $participants
3947                        );
3948
3949                        // Repeated Events
3950                        if($event['recur_type'] != MCAL_RECUR_NONE)
3951                        {
3952                                $str = lang($this->rpt_type[$event['recur_type']]);
3953
3954                                $str_extra = array();
3955                                if ($event['recur_enddate']['mday'] != 0 && $event['recur_enddate']['month'] != 0 && $event['recur_enddate']['year'] != 0)
3956                                {
3957                                        $recur_end = $this->maketime($event['recur_enddate']);
3958                                        if($recur_end != 0)
3959                                        {
3960                                                $recur_end -= $GLOBALS['phpgw']->datetime->tz_offset;
3961                                                $str_extra[] = lang('ends').': '.lang($GLOBALS['phpgw']->common->show_date($recur_end,'l')).', '.$this->long_date($recur_end).' ';
3962                                        }
3963                                }
3964                                // only weekly uses the recur-data (days) !!!
3965                                if($event['recur_type'] == MCAL_RECUR_WEEKLY)
3966                                {
3967                                        $repeat_days = array();
3968                                        foreach ($this->rpt_day as $mcal_mask => $dayname)
3969                                        {
3970                                                if ($event['recur_data'] & $mcal_mask)
3971                                                {
3972                                                        $repeat_days[] = lang($dayname);
3973                                                }
3974                                        }
3975                                        if(count($repeat_days))
3976                                        {
3977                                                $str_extra[] = lang('days repeated').': '.implode(', ',$repeat_days);
3978                                        }
3979                                }
3980                                if($event['recur_interval'] != 0)
3981                                {
3982                                        $str_extra[] = lang('Interval').': '.$event['recur_interval'];
3983                                }
3984
3985                                if(count($str_extra))
3986                                {
3987                                        $str .= ' ('.implode(', ',$str_extra).')';
3988                                }
3989
3990                                $var['recure_type'] = Array(
3991                                        'field' => lang('Repetition'),
3992                                        'data'  => $str,
3993                                );
3994                        }
3995
3996                        if (!isset($this->fields))
3997                        {
3998                                $this->custom_fields = CreateObject('calendar.bocustom_fields');
3999                                $this->fields = &$this->custom_fields->fields;
4000                                $this->stock_fields = &$this->custom_fields->stock_fields;
4001                        }
4002                        foreach($this->fields as $field => $data)
4003                        {
4004                                if (!$data['disabled'])
4005                                {
4006                                        if (isset($var[$field]))
4007                                        {
4008                                                $sorted[$field] = $var[$field];
4009                                        }
4010                                        elseif (!isset($this->stock_fields[$field]) && strlen($event[$field]))  // Custom field
4011                                        {
4012                                                $lang = lang($name = substr($field,1));
4013                                                $sorted[$field] = array(
4014                                                        'field' => $lang == $name.'*' ? $name : $lang,
4015                                                        'data'  => $event[$field]
4016                                                );
4017                                        }
4018                                }
4019                                unset($var[$field]);
4020                        }
4021                        foreach($var as $name => $v)
4022                        {
4023                                $sorted[$name] = $v;
4024
4025                        }
4026                        return $sorted;
4027                }
4028
4029                /*!
4030                @function check_set_default_prefs
4031                @abstract sets the default prefs, if they are not already set (on a per pref. basis)
4032                @note It sets a flag in the app-session-data to be called only once per session
4033                */
4034                function check_set_default_prefs()
4035                {
4036                        if (($set = $GLOBALS['phpgw']->session->appsession('default_prefs_set','calendar')))
4037                        {
4038                                return;
4039                        }
4040                        $GLOBALS['phpgw']->session->appsession('default_prefs_set','calendar','set');
4041
4042                        $default_prefs = $GLOBALS['phpgw']->preferences->default['calendar'];
4043
4044                        $subject = $this->translate('Calendar Event') . ' - $$action$$: $$startdate$$ $$title$$'."\n";
4045                        $defaults = array(
4046                                'defaultcalendar' => 'week',
4047                                'mainscreen_showevents' => '0',
4048                                'summary'         => 'no',
4049                                'receive_updates' => 'no',
4050                                'update_format'   => 'extended',        // leave it to extended for now, as iCal kills the message-body
4051                                'notifyAdded'     => $subject . $this->translate ('You have a meeting scheduled for %1',array('$$startdate$$')),
4052                                'notifyCanceled'  => $subject . $this->translate ('Your meeting scheduled for %1 has been canceled',array('$$startdate$$')),
4053                                'notifyModified'  => $subject . $this->translate ('Your meeting that had been scheduled for %1 has been rescheduled to %2',array('$$olddate$$','$$startdate$$')),
4054                                'notifyResponse'  => $subject . $this->translate ('On %1 %2 %3 your meeting request for %4', array('$$date$$','$$fullname$$','$$action$$','$$startdate$$')),
4055                                'notifyAlarm'     => $this->translate('Alarm for %1 at %2 in %3',array('$$title$$','$$startdate$$','$$location$$')) . "\n" . $this->translate('Here is your requested alarm.'),
4056                                'show_rejected'   => '0',
4057                                'hide_event_conflict'   => '0',
4058                                'display_status'  => '1',
4059                                'weekdaystarts'   => 'Monday',
4060                                'workdaystarts'   => '9',
4061                                'workdayends'     => '17',
4062                                'interval'        => '30',
4063                                'defaultlength'   => '60',
4064                                'planner_start_with_group' => $GLOBALS['phpgw']->accounts->name2id('Default'),
4065                                'planner_intervals_per_day'=> '4',
4066                                'defaultfilter'   => 'all',
4067                                'default_private' => '0',
4068                                'display_minicals'=> '1',
4069                                'print_black_white'=>'0'
4070                        );
4071                        foreach($defaults as $var => $default)
4072                        {
4073                                if (!isset($default_prefs[$var]) || $default_prefs[$var] == '')
4074                                {
4075                                        $GLOBALS['phpgw']->preferences->add('calendar',$var,$default,'default');
4076                                        $need_save = True;
4077                                }
4078                        }
4079                        if ($need_save)
4080                        {
4081                                $prefs = $GLOBALS['phpgw']->preferences->save_repository(False,'default');
4082                                $this->prefs['calendar'] = $prefs['calendar'];
4083                        }
4084                        if ($this->prefs['calendar']['send_updates'] && !isset($this->prefs['calendar']['receive_updates']))
4085                        {
4086                                $this->prefs['calendar']['receive_updates'] = $this->prefs['calendar']['send_updates'];
4087                                $GLOBALS['phpgw']->preferences->add('calendar','receive_updates',$this->prefs['calendar']['send_updates']);
4088                                $GLOBALS['phpgw']->preferences->delete('calendar','send_updates');
4089                                $prefs = $GLOBALS['phpgw']->preferences->save_repository();
4090                        }
4091                }
4092
4093                // return array with all infolog categories (for xmlrpc)
4094                function categories($complete = False)
4095                {
4096                        return $GLOBALS['server']->categories($complete);
4097                }
4098        }
4099?>
Note: See TracBrowser for help on using the repository browser.