/**
  * beforeGetProperties
  *
  * This method handler is invoked before any after properties for a
  * resource are fetched. This allows us to add in any CalDAV specific
  * properties.
  *
  * @param string $path
  * @param \Sabre\DAV\INode $node
  * @param array $requestedProperties
  * @param array $returnedProperties
  * @return void
  */
 public function beforeGetProperties($path, \Sabre\DAV\INode $node, &$requestedProperties, &$returnedProperties)
 {
     if ($node instanceof \Sabre\CalDAV\ICalendar || $node instanceof Calendar_Frontend_WebDAV) {
         $vcalendar = new \Sabre\VObject\Component\VCalendar();
         $property = '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}default-alarm-vevent-datetime';
         if (in_array($property, $requestedProperties)) {
             unset($requestedProperties[array_search($property, $requestedProperties)]);
             $valarm = $vcalendar->create('VALARM');
             $valarm->add('ACTION', 'NONE');
             $valarm->add('TRIGGER', '19760401T005545Z', array('VALUE' => 'DATE-TIME'));
             $valarm->add('UID', 'E35C3EB2-4DC1-4223-AA5D-B4B491F2C111');
             // Taking out \r to not screw up the xml output
             $returnedProperties[200][$property] = str_replace("\r", "", $valarm->serialize());
         }
         $property = '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}default-alarm-vevent-date';
         if (in_array($property, $requestedProperties)) {
             unset($requestedProperties[array_search($property, $requestedProperties)]);
             $valarm = $vcalendar->create('VALARM');
             //                 $valarm->add('ACTION',  'AUDIO');
             //                 $valarm->add('ATTACH',  'Basso', array('VALUE' => 'URI'));
             //                 $valarm->add('TRIGGER', '-PT15H');
             $valarm->add('ACTION', 'NONE');
             $valarm->add('TRIGGER', '19760401T005545Z', array('VALUE' => 'DATE-TIME'));
             $valarm->add('UID', '17DC9682-230E-47D6-A035-EEAB602B1229');
             // Taking out \r to not screw up the xml output
             $returnedProperties[200][$property] = str_replace("\r", "", $valarm->serialize());
         }
         $property = '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}default-alarm-vtodo-datetime';
         if (in_array($property, $requestedProperties)) {
             unset($requestedProperties[array_search($property, $requestedProperties)]);
             $valarm = $vcalendar->create('VALARM');
             $valarm->add('ACTION', 'NONE');
             $valarm->add('TRIGGER', '19760401T005545Z', array('VALUE' => 'DATE-TIME'));
             $valarm->add('UID', 'D35C3EB2-4DC1-4223-AA5D-B4B491F2C111');
             // Taking out \r to not screw up the xml output
             $returnedProperties[200][$property] = str_replace("\r", "", $valarm->serialize());
         }
         $property = '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}default-alarm-vtodo-date';
         if (in_array($property, $requestedProperties)) {
             unset($requestedProperties[array_search($property, $requestedProperties)]);
             $valarm = $vcalendar->create('VALARM');
             //                 $valarm->add('ACTION',  'AUDIO');
             //                 $valarm->add('ATTACH',  'Basso', array('VALUE' => 'URI'));
             //                 $valarm->add('TRIGGER', '-PT15H');
             $valarm->add('ACTION', 'NONE');
             $valarm->add('TRIGGER', '19760401T005545Z', array('VALUE' => 'DATE-TIME'));
             $valarm->add('UID', '27DC9682-230E-47D6-A035-EEAB602B1229');
             // Taking out \r to not screw up the xml output
             $returnedProperties[200][$property] = str_replace("\r", "", $valarm->serialize());
         }
     }
 }
 /**
  * convert calendar event to \Sabre\VObject\Component
  * 
  * @param Tasks_Model_Task $_vtodo
  * @param Tasks_Model_Task $mainTask
  * @return \Sabre\VObject\Component
  */
 protected function _convertTasksModelTask(Sabre\VObject\Component\VCalendar $vcalendar, Tasks_Model_Task $task, Tasks_Model_Task $mainTask = null)
 {
     // clone the event and change the timezone
     $task = clone $task;
     if (!empty($task->originator_tz)) {
         $task->setTimezone($task->originator_tz);
     }
     $vtodo = $vcalendar->create('VTODO');
     $vtodo->add('CREATED', $task->creation_time->getClone()->setTimezone('UTC'));
     $lastModifiedDateTime = $task->last_modified_time ? $task->last_modified_time : $task->creation_time;
     $vtodo->add('LAST-MODIFIED', $lastModifiedDateTime->getClone()->setTimezone('UTC'));
     $vtodo->add('DTSTAMP', Tinebase_DateTime::now());
     $vtodo->add('UID', $task->uid);
     $vtodo->add('SEQUENCE', !empty($task->seq) ? $task->seq : 1);
     if (isset($task->dtstart)) {
         $vtodo->add('DTSTART', $task->dtstart);
     }
     if (isset($task->due)) {
         $vtodo->add('DUE', $task->due);
     }
     if (isset($task->completed)) {
         $vtodo->add('COMPLETED', $task->completed);
     }
     switch ($task->priority) {
         case 'LOW':
             $vtodo->add('PRIORITY', 9);
             break;
         case 'NORMAL':
             $vtodo->add('PRIORITY', 0);
             break;
         case 'HIGH':
         case 'URGENT':
             $vtodo->add('PRIORITY', 1);
             break;
     }
     if (!empty($task->percent)) {
         $vtodo->add('PERCENT-COMPLETE', $task->percent);
     }
     // task organizer
     if (!empty($task->organizer)) {
         $organizerContact = $task->resolveOrganizer();
         if ($organizerContact instanceof Addressbook_Model_Contact && !empty($organizerContact->email)) {
             $organizer = $vtodo->add('ORGANIZER', 'mailto:' . $organizerContact->email, array('CN' => $organizerContact->n_fileas, 'EMAIL' => $organizerContact->email));
         }
     }
     $optionalProperties = array('class', 'description', 'geo', 'location', 'summary', 'status', 'url');
     foreach ($optionalProperties as $property) {
         if (!empty($task->{$property})) {
             $vtodo->add($property, $task->{$property});
         }
     }
     // categories
     if (!isset($task->tags)) {
         $task->tags = Tinebase_Tags::getInstance()->getTagsOfRecord($task);
     }
     if (isset($task->tags) && count($task->tags) > 0) {
         $vtodo->add('CATEGORIES', (array) $task->tags->name);
     }
     if ($task->alarms) {
         // fake X-MOZ-LASTACK
         $vtodo->add('X-MOZ-LASTACK', $task->creation_time->getClone()->setTimezone('UTC'), array('VALUE' => 'DATE-TIME'));
         if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) {
             Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' event ' . print_r($task->alarms, TRUE));
         }
         foreach ($task->alarms as $alarm) {
             $valarm = $vcalendar->create('VALARM');
             $valarm->add('ACTION', 'DISPLAY');
             $valarm->add('DESCRIPTION', $task->summary);
             if (is_numeric($alarm->minutes_before)) {
                 if ($task->dtstart == $alarm->alarm_time) {
                     $periodString = 'PT0S';
                 } else {
                     $interval = $task->due->diff($alarm->alarm_time);
                     $periodString = sprintf('%sP%s%s%s%s', $interval->format('%r'), $interval->format('%d') > 0 ? $interval->format('%dD') : null, $interval->format('%h') > 0 || $interval->format('%i') > 0 ? 'T' : null, $interval->format('%h') > 0 ? $interval->format('%hH') : null, $interval->format('%i') > 0 ? $interval->format('%iM') : null);
                 }
                 # TRIGGER;VALUE=DURATION:-PT1H15M
                 $trigger = $valarm->add('TRIGGER', $periodString);
                 $trigger['VALUE'] = "DURATION";
             } else {
                 # TRIGGER;VALUE=DATE-TIME:...
                 $trigger = $valarm->add('TRIGGER', $alarm->alarm_time->getClone()->setTimezone('UTC')->format('Ymd\\THis\\Z'));
                 $trigger['VALUE'] = "DATE-TIME";
             }
             $vtodo->add($valarm);
         }
     }
     $vcalendar->add($vtodo);
 }