@@ -105,7 +105,7 @@ discard block |
||
| 105 | 105 | ); |
| 106 | 106 | if ($location == 'admin') |
| 107 | 107 | { |
| 108 | - display_section(self::$appname,$file); |
|
| 108 | + display_section(self::$appname,$file); |
|
| 109 | 109 | } |
| 110 | 110 | else |
| 111 | 111 | { |
@@ -128,7 +128,7 @@ discard block |
||
| 128 | 128 | 'yes' => lang('Yes') |
| 129 | 129 | ); |
| 130 | 130 | |
| 131 | - $settings = array( |
|
| 131 | + $settings = array( |
|
| 132 | 132 | 'startfolder' => array( |
| 133 | 133 | 'type' => 'input', |
| 134 | 134 | 'name' => 'startfolder', |
@@ -123,7 +123,7 @@ |
||
| 123 | 123 | } |
| 124 | 124 | // Custom fields |
| 125 | 125 | if($content && strpos($content, '#') !== 0) |
| 126 | - { |
|
| 126 | + { |
|
| 127 | 127 | // Expand link-to custom fields |
| 128 | 128 | $this->cf_link_to_expand($file, $content, $info); |
| 129 | 129 | |
@@ -1909,7 +1909,7 @@ |
||
| 1909 | 1909 | WHERE cal_id='.(int)$row['cal_id'].' AND cal_start='.(int)$row['cal_start'],__LINE__,__FILE__); |
| 1910 | 1910 | } |
| 1911 | 1911 | |
| 1912 | - $GLOBALS['egw_setup']->db->query('UPDATE egw_cal_repeats SET recur_interval=1 |
|
| 1912 | + $GLOBALS['egw_setup']->db->query('UPDATE egw_cal_repeats SET recur_interval=1 |
|
| 1913 | 1913 | WHERE recur_interval=0',__LINE__,__FILE__); |
| 1914 | 1914 | |
| 1915 | 1915 | return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.007'; |
@@ -483,15 +483,15 @@ discard block |
||
| 483 | 483 | { |
| 484 | 484 | $user = $this->resource_info($this->user); |
| 485 | 485 | $attributes['ATTENDEE'][] = 'mailto:' . $user['email']; |
| 486 | - $parameters['ATTENDEE'][] = array( |
|
| 487 | - 'CN' => $user['name'], |
|
| 488 | - 'ROLE' => 'REQ-PARTICIPANT', |
|
| 486 | + $parameters['ATTENDEE'][] = array( |
|
| 487 | + 'CN' => $user['name'], |
|
| 488 | + 'ROLE' => 'REQ-PARTICIPANT', |
|
| 489 | 489 | 'PARTSTAT' => 'NEEDS-ACTION', |
| 490 | 490 | 'CUTYPE' => 'INDIVIDUAL', |
| 491 | 491 | 'RSVP' => 'TRUE', |
| 492 | 492 | 'X-EGROUPWARE-UID' => (string)$this->user, |
| 493 | - ); |
|
| 494 | - $event['participants'][$this->user] = true; |
|
| 493 | + ); |
|
| 494 | + $event['participants'][$this->user] = true; |
|
| 495 | 495 | } |
| 496 | 496 | break; |
| 497 | 497 | case 'r': |
@@ -543,24 +543,24 @@ discard block |
||
| 543 | 543 | } |
| 544 | 544 | break; |
| 545 | 545 | |
| 546 | - case 'ORGANIZER': |
|
| 547 | - if (!$organizerURL) |
|
| 548 | - { |
|
| 549 | - $organizerCN = '"' . trim($GLOBALS['egw']->accounts->id2name($event['owner'],'account_firstname') |
|
| 550 | - . ' ' . $GLOBALS['egw']->accounts->id2name($event['owner'],'account_lastname')) . '"'; |
|
| 551 | - $organizerEMail = $GLOBALS['egw']->accounts->id2name($event['owner'],'account_email'); |
|
| 552 | - if ($version == '1.0') |
|
| 553 | - { |
|
| 554 | - $organizerURL = trim($organizerCN . (empty($organizerURL) ? '' : ' <' . $organizerURL .'>')); |
|
| 555 | - } |
|
| 556 | - else |
|
| 557 | - { |
|
| 558 | - $organizerURL = empty($organizerEMail) ? '' : 'mailto:' . $organizerEMail; |
|
| 559 | - } |
|
| 560 | - $organizerUID = $event['owner']; |
|
| 561 | - if (!isset($event['participants'][$event['owner']])) |
|
| 562 | - { |
|
| 563 | - $options = array( |
|
| 546 | + case 'ORGANIZER': |
|
| 547 | + if (!$organizerURL) |
|
| 548 | + { |
|
| 549 | + $organizerCN = '"' . trim($GLOBALS['egw']->accounts->id2name($event['owner'],'account_firstname') |
|
| 550 | + . ' ' . $GLOBALS['egw']->accounts->id2name($event['owner'],'account_lastname')) . '"'; |
|
| 551 | + $organizerEMail = $GLOBALS['egw']->accounts->id2name($event['owner'],'account_email'); |
|
| 552 | + if ($version == '1.0') |
|
| 553 | + { |
|
| 554 | + $organizerURL = trim($organizerCN . (empty($organizerURL) ? '' : ' <' . $organizerURL .'>')); |
|
| 555 | + } |
|
| 556 | + else |
|
| 557 | + { |
|
| 558 | + $organizerURL = empty($organizerEMail) ? '' : 'mailto:' . $organizerEMail; |
|
| 559 | + } |
|
| 560 | + $organizerUID = $event['owner']; |
|
| 561 | + if (!isset($event['participants'][$event['owner']])) |
|
| 562 | + { |
|
| 563 | + $options = array( |
|
| 564 | 564 | 'ROLE' => 'CHAIR', |
| 565 | 565 | 'PARTSTAT' => 'DELEGATED', |
| 566 | 566 | 'CUTYPE' => 'INDIVIDUAL', |
@@ -570,20 +570,20 @@ discard block |
||
| 570 | 570 | if (!empty($organizerEMail)) $options['EMAIL'] = $organizerEMail; |
| 571 | 571 | if (!empty($event['owner'])) $options['X-EGROUPWARE-UID'] = $event['owner']; |
| 572 | 572 | $attributes['ATTENDEE'][] = $organizerURL; |
| 573 | - $parameters['ATTENDEE'][] = $options; |
|
| 574 | - } |
|
| 575 | - } |
|
| 576 | - // do NOT use ORGANIZER for events without further participants or a different organizer |
|
| 577 | - if (count($event['participants']) > 1 || !isset($event['participants'][$event['owner']])) |
|
| 578 | - { |
|
| 579 | - $attributes['ORGANIZER'] = $organizerURL; |
|
| 580 | - $parameters['ORGANIZER']['CN'] = $organizerCN; |
|
| 581 | - if (!empty($organizerUID)) |
|
| 582 | - { |
|
| 583 | - $parameters['ORGANIZER']['X-EGROUPWARE-UID'] = $organizerUID; |
|
| 584 | - } |
|
| 585 | - } |
|
| 586 | - break; |
|
| 573 | + $parameters['ATTENDEE'][] = $options; |
|
| 574 | + } |
|
| 575 | + } |
|
| 576 | + // do NOT use ORGANIZER for events without further participants or a different organizer |
|
| 577 | + if (count($event['participants']) > 1 || !isset($event['participants'][$event['owner']])) |
|
| 578 | + { |
|
| 579 | + $attributes['ORGANIZER'] = $organizerURL; |
|
| 580 | + $parameters['ORGANIZER']['CN'] = $organizerCN; |
|
| 581 | + if (!empty($organizerUID)) |
|
| 582 | + { |
|
| 583 | + $parameters['ORGANIZER']['X-EGROUPWARE-UID'] = $organizerUID; |
|
| 584 | + } |
|
| 585 | + } |
|
| 586 | + break; |
|
| 587 | 587 | |
| 588 | 588 | case 'DTSTART': |
| 589 | 589 | if (empty($event['whole_day'])) |
@@ -992,12 +992,12 @@ discard block |
||
| 992 | 992 | foreach (is_array($value) && $parameters[$key]['VALUE']!='DATE' ? $value : array($value) as $valueID => $valueData) |
| 993 | 993 | { |
| 994 | 994 | $valueData = Api\Translation::convert($valueData,Api\Translation::charset(),$charset); |
| 995 | - $paramData = (array) Api\Translation::convert(is_array($value) ? |
|
| 996 | - $parameters[$key][$valueID] : $parameters[$key], |
|
| 997 | - Api\Translation::charset(),$charset); |
|
| 998 | - $valuesData = (array) Api\Translation::convert($values[$key], |
|
| 999 | - Api\Translation::charset(),$charset); |
|
| 1000 | - $content = $valueData . implode(';', $valuesData); |
|
| 995 | + $paramData = (array) Api\Translation::convert(is_array($value) ? |
|
| 996 | + $parameters[$key][$valueID] : $parameters[$key], |
|
| 997 | + Api\Translation::charset(),$charset); |
|
| 998 | + $valuesData = (array) Api\Translation::convert($values[$key], |
|
| 999 | + Api\Translation::charset(),$charset); |
|
| 1000 | + $content = $valueData . implode(';', $valuesData); |
|
| 1001 | 1001 | |
| 1002 | 1002 | if ($version == '1.0' && (preg_match('/[^\x20-\x7F]/', $content) || |
| 1003 | 1003 | ($paramData['CN'] && preg_match('/[^\x20-\x7F]/', $paramData['CN'])))) |
@@ -2233,7 +2233,7 @@ discard block |
||
| 2233 | 2233 | * @param string|resource $_vcalData |
| 2234 | 2234 | * @param string $principalURL ='' Used for CalDAV imports |
| 2235 | 2235 | * @param string $charset The encoding charset for $text. Defaults to |
| 2236 | - * utf-8 for new format, iso-8859-1 for old format. |
|
| 2236 | + * utf-8 for new format, iso-8859-1 for old format. |
|
| 2237 | 2237 | * @return Iterator|array|boolean Iterator if resource given or array of events on success, false on failure |
| 2238 | 2238 | */ |
| 2239 | 2239 | function icaltoegw($_vcalData, $principalURL='', $charset=null) |
@@ -2784,10 +2784,10 @@ discard block |
||
| 2784 | 2784 | // fall throught |
| 2785 | 2785 | case 'ATTENDEE': |
| 2786 | 2786 | if (isset($attributes['params']['PARTSTAT'])) |
| 2787 | - { |
|
| 2788 | - $attributes['params']['STATUS'] = $attributes['params']['PARTSTAT']; |
|
| 2789 | - } |
|
| 2790 | - if (isset($attributes['params']['STATUS'])) |
|
| 2787 | + { |
|
| 2788 | + $attributes['params']['STATUS'] = $attributes['params']['PARTSTAT']; |
|
| 2789 | + } |
|
| 2790 | + if (isset($attributes['params']['STATUS'])) |
|
| 2791 | 2791 | { |
| 2792 | 2792 | $status = $this->status_ical2egw[strtoupper($attributes['params']['STATUS'])]; |
| 2793 | 2793 | if (empty($status)) $status = 'X'; |
@@ -3178,7 +3178,7 @@ discard block |
||
| 3178 | 3178 | array2string($event)."\n",3,$this->logfile); |
| 3179 | 3179 | } |
| 3180 | 3180 | //Horde::logMessage("vevent2egw:\n" . print_r($event, true), |
| 3181 | - // __FILE__, __LINE__, PEAR_LOG_DEBUG); |
|
| 3181 | + // __FILE__, __LINE__, PEAR_LOG_DEBUG); |
|
| 3182 | 3182 | return $event; |
| 3183 | 3183 | } |
| 3184 | 3184 | |
@@ -32,8 +32,8 @@ |
||
| 32 | 32 | protected static $conditions = array('exists'); |
| 33 | 33 | |
| 34 | 34 | /** |
| 35 | - * For figuring out if an entry has changed |
|
| 36 | - */ |
|
| 35 | + * For figuring out if an entry has changed |
|
| 36 | + */ |
|
| 37 | 37 | protected $tracking; |
| 38 | 38 | |
| 39 | 39 | /** |
@@ -177,7 +177,7 @@ |
||
| 177 | 177 | * @param int $cutoffdate =null |
| 178 | 178 | * @param array $not_uids =null uids NOT to return for meeting requests |
| 179 | 179 | * @return array |
| 180 | - */ |
|
| 180 | + */ |
|
| 181 | 181 | function GetMessageList($id, $cutoffdate=NULL, array $not_uids=null) |
| 182 | 182 | { |
| 183 | 183 | if (!isset($this->calendar)) $this->calendar = new calendar_boupdate(); |
@@ -387,11 +387,11 @@ |
||
| 387 | 387 | } |
| 388 | 388 | |
| 389 | 389 | /** |
| 390 | - * gets the icons displayed for a given event |
|
| 391 | - * |
|
| 392 | - * @param array $event |
|
| 393 | - * @return array of 'img' / 'title' pairs |
|
| 394 | - */ |
|
| 390 | + * gets the icons displayed for a given event |
|
| 391 | + * |
|
| 392 | + * @param array $event |
|
| 393 | + * @return array of 'img' / 'title' pairs |
|
| 394 | + */ |
|
| 395 | 395 | function event_icons($event) |
| 396 | 396 | { |
| 397 | 397 | $is_private = !$event['public'] && !$this->bo->check_perms(Acl::READ,$event); |
@@ -2415,14 +2415,14 @@ discard block |
||
| 2415 | 2415 | } |
| 2416 | 2416 | |
| 2417 | 2417 | /** |
| 2418 | - * Export events as vCalendar version 2.0 files (iCal) |
|
| 2419 | - * |
|
| 2420 | - * @param int|array $content numeric cal_id or submitted content from etempalte::exec |
|
| 2421 | - * @param boolean $return_error should an error-msg be returned or a regular page with it generated (default) |
|
| 2422 | - * @return string error-msg if $return_error |
|
| 2423 | - */ |
|
| 2424 | - function export($content=0,$return_error=false) |
|
| 2425 | - { |
|
| 2418 | + * Export events as vCalendar version 2.0 files (iCal) |
|
| 2419 | + * |
|
| 2420 | + * @param int|array $content numeric cal_id or submitted content from etempalte::exec |
|
| 2421 | + * @param boolean $return_error should an error-msg be returned or a regular page with it generated (default) |
|
| 2422 | + * @return string error-msg if $return_error |
|
| 2423 | + */ |
|
| 2424 | + function export($content=0,$return_error=false) |
|
| 2425 | + { |
|
| 2426 | 2426 | $boical = new calendar_ical(); |
| 2427 | 2427 | #error_log(__METHOD__.print_r($content,true)); |
| 2428 | 2428 | if (is_numeric($cal_id = $content ? $content : $_REQUEST['cal_id'])) |
@@ -2476,7 +2476,7 @@ discard block |
||
| 2476 | 2476 | $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('iCal Export'); |
| 2477 | 2477 | $etpl = new etemplate_new('calendar.export'); |
| 2478 | 2478 | $etpl->exec('calendar.calendar_uiforms.export',$content); |
| 2479 | - } |
|
| 2479 | + } |
|
| 2480 | 2480 | |
| 2481 | 2481 | /** |
| 2482 | 2482 | * Edit category ACL (admin only) |
@@ -2548,8 +2548,8 @@ discard block |
||
| 2548 | 2548 | } |
| 2549 | 2549 | |
| 2550 | 2550 | /** |
| 2551 | - * Set up the required fields to get the history tab |
|
| 2552 | - */ |
|
| 2551 | + * Set up the required fields to get the history tab |
|
| 2552 | + */ |
|
| 2553 | 2553 | public function setup_history(&$content, &$sel_options) |
| 2554 | 2554 | { |
| 2555 | 2555 | $status = 'history_status'; |
@@ -557,214 +557,214 @@ discard block |
||
| 557 | 557 | |
| 558 | 558 | switch((string)$button) |
| 559 | 559 | { |
| 560 | - case 'exception': // create an exception in a recuring event |
|
| 561 | - $msg = $this->_create_exception($event,$preserv); |
|
| 562 | - break; |
|
| 560 | + case 'exception': // create an exception in a recuring event |
|
| 561 | + $msg = $this->_create_exception($event,$preserv); |
|
| 562 | + break; |
|
| 563 | 563 | |
| 564 | - case 'copy': // create new event with copied content, some content need to be unset to make a "new" event |
|
| 565 | - unset($event['id']); |
|
| 566 | - unset($event['uid']); |
|
| 567 | - unset($event['reference']); |
|
| 568 | - unset($preserv['reference']); |
|
| 569 | - unset($event['recurrence']); |
|
| 570 | - unset($preserv['recurrence']); |
|
| 571 | - unset($event['recur_exception']); |
|
| 572 | - unset($event['edit_single']); // in case it has been set |
|
| 573 | - unset($event['modified']); |
|
| 574 | - unset($event['modifier']); |
|
| 575 | - unset($event['caldav_name']); |
|
| 576 | - $event['owner'] = !(int)$this->owner || !$this->bo->check_perms(Acl::ADD,0,$this->owner) ? $this->user : $this->owner; |
|
| 564 | + case 'copy': // create new event with copied content, some content need to be unset to make a "new" event |
|
| 565 | + unset($event['id']); |
|
| 566 | + unset($event['uid']); |
|
| 567 | + unset($event['reference']); |
|
| 568 | + unset($preserv['reference']); |
|
| 569 | + unset($event['recurrence']); |
|
| 570 | + unset($preserv['recurrence']); |
|
| 571 | + unset($event['recur_exception']); |
|
| 572 | + unset($event['edit_single']); // in case it has been set |
|
| 573 | + unset($event['modified']); |
|
| 574 | + unset($event['modifier']); |
|
| 575 | + unset($event['caldav_name']); |
|
| 576 | + $event['owner'] = !(int)$this->owner || !$this->bo->check_perms(Acl::ADD,0,$this->owner) ? $this->user : $this->owner; |
|
| 577 | + |
|
| 578 | + // Clear participant stati |
|
| 579 | + foreach($event['participant_types'] as $type => &$participants) |
|
| 580 | + { |
|
| 581 | + foreach($participants as $id => &$p_response) |
|
| 582 | + { |
|
| 583 | + if($type == 'u' && $id == $event['owner']) continue; |
|
| 584 | + calendar_so::split_status($p_response, $quantity, $role); |
|
| 585 | + // if resource defines callback for status of new status (eg. Resources app acknowledges direct booking acl), call it |
|
| 586 | + $status = isset($this->bo->resources[$type]['new_status']) ? ExecMethod($this->bo->resources[$type]['new_status'],$id) : 'U'; |
|
| 587 | + $p_response = calendar_so::combine_status($status,$quantity,$role); |
|
| 588 | + } |
|
| 589 | + } |
|
| 577 | 590 | |
| 578 | - // Clear participant stati |
|
| 579 | - foreach($event['participant_types'] as $type => &$participants) |
|
| 580 | - { |
|
| 581 | - foreach($participants as $id => &$p_response) |
|
| 591 | + // Copy alarms |
|
| 592 | + if (is_array($event['alarm'])) |
|
| 582 | 593 | { |
| 583 | - if($type == 'u' && $id == $event['owner']) continue; |
|
| 584 | - calendar_so::split_status($p_response, $quantity, $role); |
|
| 585 | - // if resource defines callback for status of new status (eg. Resources app acknowledges direct booking acl), call it |
|
| 586 | - $status = isset($this->bo->resources[$type]['new_status']) ? ExecMethod($this->bo->resources[$type]['new_status'],$id) : 'U'; |
|
| 587 | - $p_response = calendar_so::combine_status($status,$quantity,$role); |
|
| 594 | + foreach($event['alarm'] as $n => &$alarm) |
|
| 595 | + { |
|
| 596 | + unset($alarm['id']); |
|
| 597 | + unset($alarm['cal_id']); |
|
| 598 | + } |
|
| 588 | 599 | } |
| 589 | - } |
|
| 590 | 600 | |
| 591 | - // Copy alarms |
|
| 592 | - if (is_array($event['alarm'])) |
|
| 593 | - { |
|
| 594 | - foreach($event['alarm'] as $n => &$alarm) |
|
| 601 | + // Get links to be copied |
|
| 602 | + // With no ID, $content['link_to']['to_id'] is used |
|
| 603 | + $content['link_to']['to_id'] = array('to_app' => 'calendar', 'to_id' => 0); |
|
| 604 | + foreach(Link::get_links('calendar', $content['id']) as $link) |
|
| 595 | 605 | { |
| 596 | - unset($alarm['id']); |
|
| 597 | - unset($alarm['cal_id']); |
|
| 606 | + if ($link['app'] != Link::VFS_APPNAME) |
|
| 607 | + { |
|
| 608 | + Link::link('calendar', $content['link_to']['to_id'], $link['app'], $link['id'], $link['remark']); |
|
| 609 | + } |
|
| 610 | + elseif ($link['app'] == Link::VFS_APPNAME) |
|
| 611 | + { |
|
| 612 | + Link::link('calendar', $content['link_to']['to_id'], Link::VFS_APPNAME, array( |
|
| 613 | + 'tmp_name' => Link::vfs_path($link['app2'], $link['id2']).'/'.$link['id'], |
|
| 614 | + 'name' => $link['id'], |
|
| 615 | + ), $link['remark']); |
|
| 616 | + } |
|
| 598 | 617 | } |
| 599 | - } |
|
| 618 | + unset($link); |
|
| 619 | + $preserv['view'] = $preserv['edit_single'] = false; |
|
| 620 | + $msg = lang('Event copied - the copy can now be edited'); |
|
| 621 | + $event['title'] = lang('Copy of:').' '.$event['title']; |
|
| 622 | + break; |
|
| 600 | 623 | |
| 601 | - // Get links to be copied |
|
| 602 | - // With no ID, $content['link_to']['to_id'] is used |
|
| 603 | - $content['link_to']['to_id'] = array('to_app' => 'calendar', 'to_id' => 0); |
|
| 604 | - foreach(Link::get_links('calendar', $content['id']) as $link) |
|
| 605 | - { |
|
| 606 | - if ($link['app'] != Link::VFS_APPNAME) |
|
| 624 | + case 'mail': |
|
| 625 | + case 'sendrequest': |
|
| 626 | + case 'save': |
|
| 627 | + case 'print': |
|
| 628 | + case 'apply': |
|
| 629 | + case 'infolog': |
|
| 630 | + if ($event['id'] && !$this->bo->check_perms(Acl::EDIT,$event)) |
|
| 607 | 631 | { |
| 608 | - Link::link('calendar', $content['link_to']['to_id'], $link['app'], $link['id'], $link['remark']); |
|
| 632 | + $msg = lang('Permission denied'); |
|
| 633 | + $button = ''; |
|
| 634 | + break; |
|
| 609 | 635 | } |
| 610 | - elseif ($link['app'] == Link::VFS_APPNAME) |
|
| 636 | + if ($event['start'] > $event['end']) |
|
| 611 | 637 | { |
| 612 | - Link::link('calendar', $content['link_to']['to_id'], Link::VFS_APPNAME, array( |
|
| 613 | - 'tmp_name' => Link::vfs_path($link['app2'], $link['id2']).'/'.$link['id'], |
|
| 614 | - 'name' => $link['id'], |
|
| 615 | - ), $link['remark']); |
|
| 638 | + $msg = lang('Error: Starttime has to be before the endtime !!!'); |
|
| 639 | + $button = ''; |
|
| 640 | + break; |
|
| 616 | 641 | } |
| 617 | - } |
|
| 618 | - unset($link); |
|
| 619 | - $preserv['view'] = $preserv['edit_single'] = false; |
|
| 620 | - $msg = lang('Event copied - the copy can now be edited'); |
|
| 621 | - $event['title'] = lang('Copy of:').' '.$event['title']; |
|
| 622 | - break; |
|
| 623 | - |
|
| 624 | - case 'mail': |
|
| 625 | - case 'sendrequest': |
|
| 626 | - case 'save': |
|
| 627 | - case 'print': |
|
| 628 | - case 'apply': |
|
| 629 | - case 'infolog': |
|
| 630 | - if ($event['id'] && !$this->bo->check_perms(Acl::EDIT,$event)) |
|
| 631 | - { |
|
| 632 | - $msg = lang('Permission denied'); |
|
| 633 | - $button = ''; |
|
| 634 | - break; |
|
| 635 | - } |
|
| 636 | - if ($event['start'] > $event['end']) |
|
| 637 | - { |
|
| 638 | - $msg = lang('Error: Starttime has to be before the endtime !!!'); |
|
| 639 | - $button = ''; |
|
| 640 | - break; |
|
| 641 | - } |
|
| 642 | - if ($event['recur_type'] != MCAL_RECUR_NONE && $event['recur_enddate'] && $event['start'] > $event['recur_enddate']) |
|
| 643 | - { |
|
| 644 | - $msg = lang('repetition').': '.lang('Error: Starttime has to be before the endtime !!!'); |
|
| 645 | - $button = ''; |
|
| 646 | - break; |
|
| 647 | - } |
|
| 648 | - if ($event['recur_type'] != MCAL_RECUR_NONE && $event['end']-$event['start'] > calendar_rrule::recurrence_interval($event['recur_type'], $event['recur_interval'])) |
|
| 649 | - { |
|
| 650 | - $msg = lang('Error: Duration of event longer then recurrence interval!'); |
|
| 651 | - $button = ''; |
|
| 652 | - break; |
|
| 653 | - } |
|
| 654 | - if (!$event['participants']) |
|
| 655 | - { |
|
| 656 | - $msg = lang('Error: no participants selected !!!'); |
|
| 657 | - $button = ''; |
|
| 658 | - break; |
|
| 659 | - } |
|
| 660 | - // if private event with ressource reservation is forbidden |
|
| 661 | - if (!$event['public'] && $GLOBALS['egw_info']['server']['no_ressources_private']) |
|
| 662 | - { |
|
| 663 | - foreach (array_keys($event['participants']) as $uid) |
|
| 642 | + if ($event['recur_type'] != MCAL_RECUR_NONE && $event['recur_enddate'] && $event['start'] > $event['recur_enddate']) |
|
| 664 | 643 | { |
| 665 | - if ($uid[0] == 'r') //ressource detection |
|
| 644 | + $msg = lang('repetition').': '.lang('Error: Starttime has to be before the endtime !!!'); |
|
| 645 | + $button = ''; |
|
| 646 | + break; |
|
| 647 | + } |
|
| 648 | + if ($event['recur_type'] != MCAL_RECUR_NONE && $event['end']-$event['start'] > calendar_rrule::recurrence_interval($event['recur_type'], $event['recur_interval'])) |
|
| 649 | + { |
|
| 650 | + $msg = lang('Error: Duration of event longer then recurrence interval!'); |
|
| 651 | + $button = ''; |
|
| 652 | + break; |
|
| 653 | + } |
|
| 654 | + if (!$event['participants']) |
|
| 655 | + { |
|
| 656 | + $msg = lang('Error: no participants selected !!!'); |
|
| 657 | + $button = ''; |
|
| 658 | + break; |
|
| 659 | + } |
|
| 660 | + // if private event with ressource reservation is forbidden |
|
| 661 | + if (!$event['public'] && $GLOBALS['egw_info']['server']['no_ressources_private']) |
|
| 662 | + { |
|
| 663 | + foreach (array_keys($event['participants']) as $uid) |
|
| 666 | 664 | { |
| 667 | - $msg = lang('Error: ressources reservation in private events is not allowed!!!'); |
|
| 668 | - $button = ''; |
|
| 669 | - break 2; //break foreach and case |
|
| 665 | + if ($uid[0] == 'r') //ressource detection |
|
| 666 | + { |
|
| 667 | + $msg = lang('Error: ressources reservation in private events is not allowed!!!'); |
|
| 668 | + $button = ''; |
|
| 669 | + break 2; //break foreach and case |
|
| 670 | + } |
|
| 670 | 671 | } |
| 671 | 672 | } |
| 672 | - } |
|
| 673 | - if ($content['edit_single']) // we edited a single event from a series |
|
| 674 | - { |
|
| 675 | - $event['reference'] = $event['id']; |
|
| 676 | - $event['recurrence'] = $content['edit_single']; |
|
| 677 | - unset($event['id']); |
|
| 678 | - $conflicts = $this->bo->update($event,$ignore_conflicts,true,false,true,$messages,$content['no_notifications']); |
|
| 679 | - if (!is_array($conflicts) && $conflicts) |
|
| 673 | + if ($content['edit_single']) // we edited a single event from a series |
|
| 680 | 674 | { |
| 681 | - // now we need to add the original start as recur-execption to the series |
|
| 682 | - $recur_event = $this->bo->read($event['reference']); |
|
| 683 | - $recur_event['recur_exception'][] = $content['edit_single']; |
|
| 684 | - // check if we need to move the alarms, because they are next on that exception |
|
| 685 | - foreach($recur_event['alarm'] as $id => $alarm) |
|
| 675 | + $event['reference'] = $event['id']; |
|
| 676 | + $event['recurrence'] = $content['edit_single']; |
|
| 677 | + unset($event['id']); |
|
| 678 | + $conflicts = $this->bo->update($event,$ignore_conflicts,true,false,true,$messages,$content['no_notifications']); |
|
| 679 | + if (!is_array($conflicts) && $conflicts) |
|
| 686 | 680 | { |
| 687 | - if ($alarm['time'] == $content['edit_single'] - $alarm['offset']) |
|
| 681 | + // now we need to add the original start as recur-execption to the series |
|
| 682 | + $recur_event = $this->bo->read($event['reference']); |
|
| 683 | + $recur_event['recur_exception'][] = $content['edit_single']; |
|
| 684 | + // check if we need to move the alarms, because they are next on that exception |
|
| 685 | + foreach($recur_event['alarm'] as $id => $alarm) |
|
| 688 | 686 | { |
| 689 | - $rrule = calendar_rrule::event2rrule($recur_event, true); |
|
| 690 | - foreach ($rrule as $time) |
|
| 687 | + if ($alarm['time'] == $content['edit_single'] - $alarm['offset']) |
|
| 691 | 688 | { |
| 692 | - if ($content['edit_single'] < $time->format('ts')) |
|
| 689 | + $rrule = calendar_rrule::event2rrule($recur_event, true); |
|
| 690 | + foreach ($rrule as $time) |
|
| 693 | 691 | { |
| 694 | - $alarm['time'] = $time->format('ts') - $alarm['offset']; |
|
| 695 | - $this->bo->save_alarm($event['reference'], $alarm); |
|
| 696 | - break; |
|
| 692 | + if ($content['edit_single'] < $time->format('ts')) |
|
| 693 | + { |
|
| 694 | + $alarm['time'] = $time->format('ts') - $alarm['offset']; |
|
| 695 | + $this->bo->save_alarm($event['reference'], $alarm); |
|
| 696 | + break; |
|
| 697 | + } |
|
| 697 | 698 | } |
| 698 | 699 | } |
| 699 | 700 | } |
| 700 | - } |
|
| 701 | - unset($recur_event['start']); unset($recur_event['end']); // no update necessary |
|
| 702 | - unset($recur_event['alarm']); // unsetting alarms too, as they cant be updated without start! |
|
| 703 | - $this->bo->update($recur_event,true); // no conflict check here |
|
| 701 | + unset($recur_event['start']); unset($recur_event['end']); // no update necessary |
|
| 702 | + unset($recur_event['alarm']); // unsetting alarms too, as they cant be updated without start! |
|
| 703 | + $this->bo->update($recur_event,true); // no conflict check here |
|
| 704 | 704 | |
| 705 | - if(Api\Json\Response::isJSONResponse()) |
|
| 705 | + if(Api\Json\Response::isJSONResponse()) |
|
| 706 | + { |
|
| 707 | + // Sending null will trigger a removal of the original |
|
| 708 | + // for that date |
|
| 709 | + Api\Json\Response::get()->generic('data', array('uid' => 'calendar::'.$content['reference'].':'.$content['actual_date'], 'data' => null)); |
|
| 710 | + } |
|
| 711 | + |
|
| 712 | + unset($recur_event); |
|
| 713 | + unset($event['edit_single']); // if we further edit it, it's just a single event |
|
| 714 | + unset($preserv['edit_single']); |
|
| 715 | + } |
|
| 716 | + else // conflict or error, we need to reset everything to the state befor we tried to save it |
|
| 706 | 717 | { |
| 707 | - // Sending null will trigger a removal of the original |
|
| 708 | - // for that date |
|
| 709 | - Api\Json\Response::get()->generic('data', array('uid' => 'calendar::'.$content['reference'].':'.$content['actual_date'], 'data' => null)); |
|
| 718 | + $event['id'] = $event['reference']; |
|
| 719 | + $event['reference'] = $event['recurrence'] = 0; |
|
| 720 | + $event['uid'] = $content['uid']; |
|
| 710 | 721 | } |
| 711 | - |
|
| 712 | - unset($recur_event); |
|
| 713 | - unset($event['edit_single']); // if we further edit it, it's just a single event |
|
| 714 | - unset($preserv['edit_single']); |
|
| 715 | - } |
|
| 716 | - else // conflict or error, we need to reset everything to the state befor we tried to save it |
|
| 717 | - { |
|
| 718 | - $event['id'] = $event['reference']; |
|
| 719 | - $event['reference'] = $event['recurrence'] = 0; |
|
| 720 | - $event['uid'] = $content['uid']; |
|
| 722 | + $update_type = 'edit'; |
|
| 721 | 723 | } |
| 722 | - $update_type = 'edit'; |
|
| 723 | - } |
|
| 724 | - else // we edited a non-reccuring event or the whole series |
|
| 725 | - { |
|
| 726 | - if (($old_event = $this->bo->read($event['id']))) |
|
| 724 | + else // we edited a non-reccuring event or the whole series |
|
| 727 | 725 | { |
| 728 | - if ($event['recur_type'] != MCAL_RECUR_NONE) |
|
| 726 | + if (($old_event = $this->bo->read($event['id']))) |
|
| 729 | 727 | { |
| 730 | - $update_type = 'edit'; |
|
| 731 | - |
|
| 732 | - // we edit a existing series event |
|
| 733 | - if ($event['start'] != $old_event['start'] || |
|
| 734 | - $event['whole_day'] != $old_event['whole_day'] || |
|
| 735 | - $event['end'] != $old_event['end']) |
|
| 728 | + if ($event['recur_type'] != MCAL_RECUR_NONE) |
|
| 736 | 729 | { |
| 737 | - // calculate offset against old series start or clicked recurrance, |
|
| 738 | - // depending on which is smaller |
|
| 739 | - $offset = $event['start'] - $old_event['start']; |
|
| 740 | - if (abs($offset) > abs($off2 = $event['start'] - $event['actual_date'])) |
|
| 741 | - { |
|
| 742 | - $offset = $off2; |
|
| 743 | - } |
|
| 744 | - $msg = $this->_break_recurring($event, $old_event, $event['actual_date'] + $offset,$content['no_notifications']); |
|
| 745 | - if($msg) |
|
| 730 | + $update_type = 'edit'; |
|
| 731 | + |
|
| 732 | + // we edit a existing series event |
|
| 733 | + if ($event['start'] != $old_event['start'] || |
|
| 734 | + $event['whole_day'] != $old_event['whole_day'] || |
|
| 735 | + $event['end'] != $old_event['end']) |
|
| 746 | 736 | { |
| 747 | - $noerror = false; |
|
| 737 | + // calculate offset against old series start or clicked recurrance, |
|
| 738 | + // depending on which is smaller |
|
| 739 | + $offset = $event['start'] - $old_event['start']; |
|
| 740 | + if (abs($offset) > abs($off2 = $event['start'] - $event['actual_date'])) |
|
| 741 | + { |
|
| 742 | + $offset = $off2; |
|
| 743 | + } |
|
| 744 | + $msg = $this->_break_recurring($event, $old_event, $event['actual_date'] + $offset,$content['no_notifications']); |
|
| 745 | + if($msg) |
|
| 746 | + { |
|
| 747 | + $noerror = false; |
|
| 748 | + } |
|
| 748 | 749 | } |
| 749 | 750 | } |
| 750 | - } |
|
| 751 | - else |
|
| 752 | - { |
|
| 753 | - if ($old_event['start'] != $event['start'] || |
|
| 754 | - $old_event['end'] != $event['end'] || |
|
| 755 | - $event['whole_day'] != $old_event['whole_day']) |
|
| 751 | + else |
|
| 756 | 752 | { |
| 757 | - $sameday = (date('Ymd', $old_event['start']) == date('Ymd', $event['start'])); |
|
| 758 | - foreach((array)$event['participants'] as $uid => $status) |
|
| 753 | + if ($old_event['start'] != $event['start'] || |
|
| 754 | + $old_event['end'] != $event['end'] || |
|
| 755 | + $event['whole_day'] != $old_event['whole_day']) |
|
| 759 | 756 | { |
| 760 | - $q = $r = null; |
|
| 761 | - calendar_so::split_status($status,$q,$r); |
|
| 762 | - if ($uid[0] != 'c' && $uid[0] != 'e' && $uid != $this->bo->user && $status != 'U') |
|
| 757 | + $sameday = (date('Ymd', $old_event['start']) == date('Ymd', $event['start'])); |
|
| 758 | + foreach((array)$event['participants'] as $uid => $status) |
|
| 763 | 759 | { |
| 764 | - $preferences = CreateObject('phpgwapi.preferences',$uid); |
|
| 765 | - $part_prefs = $preferences->read_repository(); |
|
| 766 | - switch ($part_prefs['calendar']['reset_stati']) |
|
| 760 | + $q = $r = null; |
|
| 761 | + calendar_so::split_status($status,$q,$r); |
|
| 762 | + if ($uid[0] != 'c' && $uid[0] != 'e' && $uid != $this->bo->user && $status != 'U') |
|
| 767 | 763 | { |
| 764 | + $preferences = CreateObject('phpgwapi.preferences',$uid); |
|
| 765 | + $part_prefs = $preferences->read_repository(); |
|
| 766 | + switch ($part_prefs['calendar']['reset_stati']) |
|
| 767 | + { |
|
| 768 | 768 | case 'no': |
| 769 | 769 | break; |
| 770 | 770 | case 'startday': |
@@ -773,7 +773,7 @@ discard block |
||
| 773 | 773 | $status_reset_to_unknown = true; |
| 774 | 774 | $event['participants'][$uid] = calendar_so::combine_status('U',$q,$r); |
| 775 | 775 | // todo: report reset status to user |
| 776 | - } |
|
| 776 | + } |
|
| 777 | 777 | } |
| 778 | 778 | } |
| 779 | 779 | // check if we need to move the alarms, because they are relative |
@@ -910,83 +910,83 @@ discard block |
||
| 910 | 910 | } |
| 911 | 911 | break; |
| 912 | 912 | |
| 913 | - case 'cancel': |
|
| 914 | - if($content['cancel_needs_refresh']) |
|
| 915 | - { |
|
| 916 | - Framework::refresh_opener($msg, 'calendar'); |
|
| 917 | - } |
|
| 918 | - break; |
|
| 919 | - |
|
| 920 | - case 'delete': // delete of event (regular or series) |
|
| 921 | - $exceptions_kept = null; |
|
| 922 | - if ($this->bo->delete($event['id'], (int)$content['edit_single'], false, $event['no_notifications'], |
|
| 923 | - $content['delete_exceptions'] == 'true', $exceptions_kept)) |
|
| 924 | - { |
|
| 925 | - if ($event['recur_type'] != MCAL_RECUR_NONE && $content['reference'] == 0 && !$content['edit_single']) |
|
| 913 | + case 'cancel': |
|
| 914 | + if($content['cancel_needs_refresh']) |
|
| 926 | 915 | { |
| 927 | - $msg = lang('Series deleted'); |
|
| 928 | - if ($exceptions_kept) $msg .= lang(', exceptions preserved'); |
|
| 916 | + Framework::refresh_opener($msg, 'calendar'); |
|
| 929 | 917 | } |
| 930 | - else |
|
| 918 | + break; |
|
| 919 | + |
|
| 920 | + case 'delete': // delete of event (regular or series) |
|
| 921 | + $exceptions_kept = null; |
|
| 922 | + if ($this->bo->delete($event['id'], (int)$content['edit_single'], false, $event['no_notifications'], |
|
| 923 | + $content['delete_exceptions'] == 'true', $exceptions_kept)) |
|
| 931 | 924 | { |
| 932 | - $msg = lang('Event deleted'); |
|
| 933 | - } |
|
| 925 | + if ($event['recur_type'] != MCAL_RECUR_NONE && $content['reference'] == 0 && !$content['edit_single']) |
|
| 926 | + { |
|
| 927 | + $msg = lang('Series deleted'); |
|
| 928 | + if ($exceptions_kept) $msg .= lang(', exceptions preserved'); |
|
| 929 | + } |
|
| 930 | + else |
|
| 931 | + { |
|
| 932 | + $msg = lang('Event deleted'); |
|
| 933 | + } |
|
| 934 | 934 | |
| 935 | - } |
|
| 936 | - break; |
|
| 935 | + } |
|
| 936 | + break; |
|
| 937 | 937 | |
| 938 | - case 'freetime': |
|
| 939 | - // the "click" has to be in onload, to make sure the button is already created |
|
| 940 | - $event['button_was'] = $button; |
|
| 941 | - break; |
|
| 938 | + case 'freetime': |
|
| 939 | + // the "click" has to be in onload, to make sure the button is already created |
|
| 940 | + $event['button_was'] = $button; |
|
| 941 | + break; |
|
| 942 | 942 | |
| 943 | - case 'add_alarm': |
|
| 944 | - $time = $content['start']; |
|
| 945 | - $offset = $time - $content['new_alarm']['date']; |
|
| 946 | - if ($event['recur_type'] != MCAL_RECUR_NONE && |
|
| 947 | - ($next_occurrence = $this->bo->read($event['id'], $this->bo->now_su + $offset, true)) && |
|
| 948 | - $time < $next_occurrence['start']) |
|
| 949 | - { |
|
| 950 | - $content['new_alarm']['date'] = $next_occurrence['start'] - $offset; |
|
| 951 | - } |
|
| 952 | - if ($this->bo->check_perms(Acl::EDIT,!$content['new_alarm']['owner'] ? $event : 0,$content['new_alarm']['owner'])) |
|
| 953 | - { |
|
| 954 | - $alarm = array( |
|
| 955 | - 'offset' => $offset, |
|
| 956 | - 'time' => $content['new_alarm']['date'], |
|
| 957 | - 'all' => !$content['new_alarm']['owner'], |
|
| 958 | - 'owner' => $content['new_alarm']['owner'] ? $content['new_alarm']['owner'] : $this->user, |
|
| 959 | - ); |
|
| 960 | - if ($alarm['time'] < $this->bo->now_su) |
|
| 943 | + case 'add_alarm': |
|
| 944 | + $time = $content['start']; |
|
| 945 | + $offset = $time - $content['new_alarm']['date']; |
|
| 946 | + if ($event['recur_type'] != MCAL_RECUR_NONE && |
|
| 947 | + ($next_occurrence = $this->bo->read($event['id'], $this->bo->now_su + $offset, true)) && |
|
| 948 | + $time < $next_occurrence['start']) |
|
| 961 | 949 | { |
| 962 | - $msg = lang("Can't add alarms in the past !!!"); |
|
| 950 | + $content['new_alarm']['date'] = $next_occurrence['start'] - $offset; |
|
| 963 | 951 | } |
| 964 | - elseif ($event['id']) // save the alarm immediatly |
|
| 952 | + if ($this->bo->check_perms(Acl::EDIT,!$content['new_alarm']['owner'] ? $event : 0,$content['new_alarm']['owner'])) |
|
| 965 | 953 | { |
| 966 | - if (($alarm_id = $this->bo->save_alarm($event['id'],$alarm))) |
|
| 954 | + $alarm = array( |
|
| 955 | + 'offset' => $offset, |
|
| 956 | + 'time' => $content['new_alarm']['date'], |
|
| 957 | + 'all' => !$content['new_alarm']['owner'], |
|
| 958 | + 'owner' => $content['new_alarm']['owner'] ? $content['new_alarm']['owner'] : $this->user, |
|
| 959 | + ); |
|
| 960 | + if ($alarm['time'] < $this->bo->now_su) |
|
| 961 | + { |
|
| 962 | + $msg = lang("Can't add alarms in the past !!!"); |
|
| 963 | + } |
|
| 964 | + elseif ($event['id']) // save the alarm immediatly |
|
| 967 | 965 | { |
| 968 | - $alarm['id'] = $alarm_id; |
|
| 969 | - $event['alarm'][$alarm_id] = $alarm; |
|
| 966 | + if (($alarm_id = $this->bo->save_alarm($event['id'],$alarm))) |
|
| 967 | + { |
|
| 968 | + $alarm['id'] = $alarm_id; |
|
| 969 | + $event['alarm'][$alarm_id] = $alarm; |
|
| 970 | 970 | |
| 971 | - $msg = lang('Alarm added'); |
|
| 972 | - Framework::refresh_opener($msg,'calendar', $event['id'], 'update'); |
|
| 971 | + $msg = lang('Alarm added'); |
|
| 972 | + Framework::refresh_opener($msg,'calendar', $event['id'], 'update'); |
|
| 973 | + } |
|
| 974 | + else |
|
| 975 | + { |
|
| 976 | + $msg = lang('Error adding the alarm'); |
|
| 977 | + } |
|
| 973 | 978 | } |
| 974 | 979 | else |
| 975 | 980 | { |
| 976 | - $msg = lang('Error adding the alarm'); |
|
| 981 | + for($alarm['id']=1; isset($event['alarm'][$alarm['id']]); $alarm['id']++) {} // get a temporary non-conflicting, numeric id |
|
| 982 | + $event['alarm'][$alarm['id']] = $alarm; |
|
| 977 | 983 | } |
| 978 | 984 | } |
| 979 | 985 | else |
| 980 | 986 | { |
| 981 | - for($alarm['id']=1; isset($event['alarm'][$alarm['id']]); $alarm['id']++) {} // get a temporary non-conflicting, numeric id |
|
| 982 | - $event['alarm'][$alarm['id']] = $alarm; |
|
| 987 | + $msg = lang('Permission denied'); |
|
| 983 | 988 | } |
| 984 | - } |
|
| 985 | - else |
|
| 986 | - { |
|
| 987 | - $msg = lang('Permission denied'); |
|
| 988 | - } |
|
| 989 | - break; |
|
| 989 | + break; |
|
| 990 | 990 | } |
| 991 | 991 | // add notification-errors, if we have some |
| 992 | 992 | if (($notification_errors = notifications::errors(true))) |
@@ -1490,13 +1490,13 @@ discard block |
||
| 1490 | 1490 | } |
| 1491 | 1491 | |
| 1492 | 1492 | /** |
| 1493 | - * Converts a participant into a (readable) user- or resource-name |
|
| 1494 | - * |
|
| 1495 | - * @param string|int $id id of user or resource |
|
| 1496 | - * @param string|boolean $use_type =false type-letter or false |
|
| 1497 | - * @param boolean $append_email =false append email (Name <email>) |
|
| 1498 | - * @return string with name |
|
| 1499 | - */ |
|
| 1493 | + * Converts a participant into a (readable) user- or resource-name |
|
| 1494 | + * |
|
| 1495 | + * @param string|int $id id of user or resource |
|
| 1496 | + * @param string|boolean $use_type =false type-letter or false |
|
| 1497 | + * @param boolean $append_email =false append email (Name <email>) |
|
| 1498 | + * @return string with name |
|
| 1499 | + */ |
|
| 1500 | 1500 | function participant_name($id,$use_type=false, $append_email=false) |
| 1501 | 1501 | { |
| 1502 | 1502 | static $id2lid = array(); |
@@ -1525,13 +1525,13 @@ discard block |
||
| 1525 | 1525 | } |
| 1526 | 1526 | |
| 1527 | 1527 | /** |
| 1528 | - * Converts participants array of an event into array of (readable) participant-names with status |
|
| 1529 | - * |
|
| 1530 | - * @param array $event event-data |
|
| 1531 | - * @param boolean $long_status =false should the long/verbose status or an icon be use |
|
| 1532 | - * @param boolean $show_group_invitation =false show group-invitations (status == 'G') or not (default) |
|
| 1533 | - * @return array with id / names with status pairs |
|
| 1534 | - */ |
|
| 1528 | + * Converts participants array of an event into array of (readable) participant-names with status |
|
| 1529 | + * |
|
| 1530 | + * @param array $event event-data |
|
| 1531 | + * @param boolean $long_status =false should the long/verbose status or an icon be use |
|
| 1532 | + * @param boolean $show_group_invitation =false show group-invitations (status == 'G') or not (default) |
|
| 1533 | + * @return array with id / names with status pairs |
|
| 1534 | + */ |
|
| 1535 | 1535 | function participants($event,$long_status=false,$show_group_invitation=false) |
| 1536 | 1536 | { |
| 1537 | 1537 | //error_log(__METHOD__.__LINE__.array2string($event['participants'])); |
@@ -1601,12 +1601,12 @@ discard block |
||
| 1601 | 1601 | } |
| 1602 | 1602 | |
| 1603 | 1603 | /** |
| 1604 | - * Converts category string of an event into array of (readable) category-names |
|
| 1605 | - * |
|
| 1606 | - * @param string $category cat-id (multiple id's commaseparated) |
|
| 1607 | - * @param int $color color of the category, if multiple cats, the color of the last one with color is returned |
|
| 1608 | - * @return array with id / names |
|
| 1609 | - */ |
|
| 1604 | + * Converts category string of an event into array of (readable) category-names |
|
| 1605 | + * |
|
| 1606 | + * @param string $category cat-id (multiple id's commaseparated) |
|
| 1607 | + * @param int $color color of the category, if multiple cats, the color of the last one with color is returned |
|
| 1608 | + * @return array with id / names |
|
| 1609 | + */ |
|
| 1610 | 1610 | function categories($category,&$color) |
| 1611 | 1611 | { |
| 1612 | 1612 | static $id2cat = array(); |