/**
 * @param Sabre\VObject\Component\VAlarm $alarm
 * @param Sabre\VObject\Component\VEvent|Sabre\VObject\Component\VTodo $parent
 * @return DateTime|null
 * @throws Sabre_DAV_Exception
 */
function renderCalDavEntry_calcalarm(&$alarm, &$parent)
{
    $trigger = $alarm->__get("TRIGGER");
    if (!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') {
        $triggerDuration = Sabre\VObject\DateTimeParser::parseDuration($trigger->value);
        $related = isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END' ? 'END' : 'START';
        if ($related === 'START') {
            /** @var Sabre\VObject\Property\DateTime $dtstart  */
            $dtstart = $parent->__get("DTSTART");
            $effectiveTrigger = $dtstart->getDateTime();
            $effectiveTrigger->add($triggerDuration);
        } else {
            if ($parent->name === 'VTODO') {
                $endProp = 'DUE';
            } else {
                $endProp = 'DTEND';
            }
            /** @var Sabre\VObject\Property\DateTime $dtstart  */
            $dtstart = $parent->__get("DTSTART");
            if (isset($parent->{$endProp})) {
                $effectiveTrigger = clone $parent->{$endProp}->getDateTime();
                $effectiveTrigger->add($triggerDuration);
            } elseif ($parent->__get("DURATION") != "") {
                $effectiveTrigger = clone $dtstart->getDateTime();
                $duration = Sabre\VObject\DateTimeParser::parseDuration($parent->__get("DURATION"));
                $effectiveTrigger->add($duration);
                $effectiveTrigger->add($triggerDuration);
            } else {
                $effectiveTrigger = clone $dtstart->getDateTime();
                $effectiveTrigger->add($triggerDuration);
            }
        }
    } else {
        // ??? @TODO
        $effectiveTrigger = $trigger->getDateTime();
    }
    return $effectiveTrigger;
}
 /**
  * @static
  * @param Sabre\VObject\Component\VEvent $component
  * @return int
  */
 public static function getDtEndTimeStamp(&$component)
 {
     /** @var Sabre\VObject\Property\DateTime $dtstart */
     $dtstart = $component->__get("DTSTART");
     if ($component->__get("DTEND")) {
         /** @var Sabre\VObject\Property\DateTime $dtend */
         $dtend = $component->__get("DTEND");
         return $dtend->getDateTime()->getTimeStamp();
     } elseif ($component->__get("DURATION")) {
         $endDate = clone $dtstart->getDateTime();
         $endDate->add(Sabre\VObject\DateTimeParser::parse($component->__get("DURATION")->value));
         return $endDate->getTimeStamp();
     } elseif ($dtstart->getDateType() === Sabre\VObject\Property\DateTime::DATE) {
         $endDate = clone $dtstart->getDateTime();
         $endDate->modify('+1 day');
         return $endDate->getTimeStamp();
     } else {
         return $dtstart->getDateTime()->getTimeStamp() + 3600;
     }
 }
/**
 * @param Sabre\VObject\Component\VEvent $component
 * @param wdcal_local $localization
 * @param string $summary
 * @param int $dtstart
 */
function wdcal_set_component_alerts(&$component, &$localization, $summary, $dtstart)
{
    $a = get_app();
    $prev_alarms = $component->select("VALARM");
    $component->__unset("VALARM");
    foreach ($prev_alarms as $al) {
        /** @var Sabre\VObject\Component\VAlarm $al */
        // @TODO Parse notifications that have been there before; e.g. from Lightning
    }
    foreach (array_keys($_REQUEST["noti_type"]) as $key) {
        if (is_numeric($key) || $key == "new" && $_REQUEST["new_alarm"] == 1) {
            $alarm = new Sabre\VObject\Component\VAlarm("VALARM");
            switch ($_REQUEST["noti_type"][$key]) {
                case "email":
                    $mailtext = str_replace(array("#date#", "#name"), array($localization->date_timestamp2local($dtstart), $summary), t("The event #name# will start at #date"));
                    $alarm->add(new Sabre\VObject\Property("ACTION", "EMAIL"));
                    $alarm->add(new Sabre\VObject\Property("SUMMARY", $summary));
                    $alarm->add(new Sabre\VObject\Property("DESCRIPTION", $mailtext));
                    $alarm->add(new Sabre\VObject\Property("ATTENDEE", "MAILTO:" . $a->user["email"]));
                    break;
                case "display":
                    $alarm->add(new Sabre\VObject\Property("ACTION", "DISPLAY"));
                    $text = str_replace("#name#", $summary, t("#name# is about to begin."));
                    $alarm->add(new Sabre\VObject\Property("DESCRIPTION", $text));
                    break;
                default:
                    continue;
            }
            $trigger_name = "TRIGGER";
            $trigger_val = "";
            // @TODO Bugfix : und ; sind evtl. vertauscht vgl. http://www.kanzaki.com/docs/ical/trigger.html
            if ($_REQUEST["noti_ref"][$key] == "end") {
                $trigger_name .= ";RELATED=END";
            }
            $trigger_val .= "-P";
            if (in_array($_REQUEST["noti_unit"][$key], array("H", "M", "S"))) {
                $trigger_val .= "T";
            }
            $trigger_val .= IntVal($_REQUEST["noti_value"][$key]) . $_REQUEST["noti_unit"][$key];
            $alarm->add(new Sabre\VObject\Property($trigger_name, $trigger_val));
            $component->add($alarm);
        }
    }
}