/**
  * get calendar property value/params
  *
  * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**>
  * @since 2.21.09 - 2015-03-29
  * @param string $propName
  * @param int    $propix    specific property in case of multiply occurences
  * @param bool   $inclParam
  * @uses vcalendar::$propix
  * @uses vcalendar::$components
  * @uses calendarComponent::$objName
  * @uses iCalUtilityFunctions::$vComps
  * @uses iCalUtilityFunctions::$mProps1
  * @uses calendarComponent::_getProperties()
  * @uses calendarComponent::getProperty()
  * @uses iCalUtilityFunctions::_geo2str2()
  * @uses iCalUtilityFunctions::$geoLatFmt
  * @uses iCalUtilityFunctions::$geoLongFmt
  * @uses iCalUtilityFunctions::$fmt
  * @uses vcalendar::$calscale
  * @uses vcalendar::$method
  * @uses vcalendar::$prodid
  * @uses vcalendar::_makeProdid()
  * @uses vcalendar::$version
  * @uses vcalendar::$xprop
  * @return mixed
  */
 function getProperty($propName = FALSE, $propix = FALSE, $inclParam = FALSE)
 {
     $propName = $propName ? strtoupper($propName) : 'X-PROP';
     if ('X-PROP' == $propName) {
         if (empty($propix)) {
             $propix = isset($this->propix[$propName]) ? $this->propix[$propName] + 2 : 1;
         }
         $this->propix[$propName] = --$propix;
     }
     switch ($propName) {
         case 'ATTENDEE':
         case 'CATEGORIES':
         case 'CONTACT':
         case 'DTSTART':
         case 'GEOLOCATION':
         case 'LOCATION':
         case 'ORGANIZER':
         case 'PRIORITY':
         case 'RESOURCES':
         case 'STATUS':
         case 'SUMMARY':
         case 'RECURRENCE-ID-UID':
         case 'RELATED-TO':
         case 'R-UID':
         case 'UID':
         case 'URL':
             $output = array();
             foreach ($this->components as $cix => $component) {
                 if (!in_array($component->objName, iCalUtilityFunctions::$vComps)) {
                     continue;
                 }
                 if (in_array($propName, iCalUtilityFunctions::$mProps1)) {
                     $component->_getProperties($propName, $output);
                     continue;
                 } elseif (3 < strlen($propName) && 'UID' == substr($propName, -3)) {
                     if (FALSE !== ($content = $component->getProperty('RECURRENCE-ID'))) {
                         $content = $component->getProperty('UID');
                     }
                 } elseif ('GEOLOCATION' == $propName) {
                     $content = FALSE === ($loc = $component->getProperty('LOCATION')) ? '' : $loc . ' ';
                     if (FALSE === ($geo = $component->getProperty('GEO'))) {
                         continue;
                     }
                     $content .= iCalUtilityFunctions::_geo2str2($geo['latitude'], iCalUtilityFunctions::$geoLatFmt) . iCalUtilityFunctions::_geo2str2($geo['longitude'], iCalUtilityFunctions::$geoLongFmt) . '/';
                 } elseif (FALSE === ($content = $component->getProperty($propName))) {
                     continue;
                 }
                 if (FALSE === $content || empty($content)) {
                     continue;
                 } elseif (is_array($content)) {
                     if (isset($content['year'])) {
                         $key = sprintf(iCalUtilityFunctions::$fmt['Ymd'], (int) $content['year'], (int) $content['month'], (int) $content['day']);
                         if (!isset($output[$key])) {
                             $output[$key] = 1;
                         } else {
                             $output[$key] += 1;
                         }
                     } else {
                         foreach ($content as $partValue => $partCount) {
                             if (!isset($output[$partValue])) {
                                 $output[$partValue] = $partCount;
                             } else {
                                 $output[$partValue] += $partCount;
                             }
                         }
                     }
                 } elseif (!isset($output[$content])) {
                     $output[$content] = 1;
                 } else {
                     $output[$content] += 1;
                 }
             }
             // end foreach ( $this->components as $cix => $component)
             if (!empty($output)) {
                 ksort($output);
             }
             return $output;
             break;
         case 'CALSCALE':
             return !empty($this->calscale) ? $this->calscale : FALSE;
             break;
         case 'METHOD':
             return !empty($this->method) ? $this->method : FALSE;
             break;
         case 'PRODID':
             if (empty($this->prodid)) {
                 $this->_makeProdid();
             }
             return $this->prodid;
             break;
         case 'VERSION':
             return !empty($this->version) ? $this->version : FALSE;
             break;
         default:
             if ($propName != 'X-PROP') {
                 if (!isset($this->xprop[$propName])) {
                     return FALSE;
                 }
                 return $inclParam ? array($propName, $this->xprop[$propName]) : array($propName, $this->xprop[$propName]['value']);
             } else {
                 if (empty($this->xprop)) {
                     return FALSE;
                 }
                 $xpropno = 0;
                 foreach ($this->xprop as $xpropkey => $xpropvalue) {
                     if ($propix == $xpropno) {
                         return $inclParam ? array($xpropkey, $this->xprop[$xpropkey]) : array($xpropkey, $this->xprop[$xpropkey]['value']);
                     } else {
                         $xpropno++;
                     }
                 }
                 unset($this->propix[$propName]);
                 return FALSE;
                 // not found ??
             }
     }
     return FALSE;
 }
 /**
  * get component property value/params
  *
  * if property has multiply values, consequtive function calls are needed
  *
  * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**>
  * @since 2.21.13 - 2015-03-29
  * @param string  $propName
  * @param int     $propix   specific property in case of multiply occurences
  * @param bool    $inclParam
  * @param bool    $specform
  * @uses calendarComponent::getProperty()
  * @uses iCalUtilityFunctions::_geo2str2()
  * @uses iCalUtilityFunctions::$geoLatFmt
  * @uses iCalUtilityFunctions::$geoLongFmt
  * @uses calendarComponent::_notExistProp()
  * @uses iCalUtilityFunctions::$mProps2
  * @uses calendarComponent::$propix
  * @uses calendarComponent::$action
  * @uses calendarComponent::$attendee
  * @uses calendarComponent::$categories
  * @uses calendarComponent::$class
  * @uses calendarComponent::$comment
  * @uses calendarComponent::$completed
  * @uses calendarComponent::$contact
  * @uses calendarComponent::$created
  * @uses calendarComponent::$description
  * @uses calendarComponent::$dtend
  * @uses iCalUtilityFunctions::$miscComps
  * @uses calendarComponent::$dtstamp
  * @uses calendarComponent::_makeDtstamp()
  * @uses calendarComponent::$dtstart
  * @uses calendarComponent::$due
  * @uses calendarComponent::$duration
  * @uses iCalUtilityFunctions::_duration2date()
  * @uses calendarComponent::$exdate
  * @uses calendarComponent::$exrule
  * @uses calendarComponent::$freebusy
  * @uses calendarComponent::$geo
  * @uses calendarComponent::$lastmodified
  * @uses calendarComponent::$location
  * @uses calendarComponent::$organizer
  * @uses calendarComponent::$percentcomplete
  * @uses calendarComponent::$priority
  * @uses calendarComponent::$rdate
  * @uses calendarComponent::$recurrenceid
  * @uses calendarComponent::$relatedto
  * @uses calendarComponent::$repeat
  * @uses calendarComponent::$requeststatus
  * @uses calendarComponent::$resources
  * @uses calendarComponent::$rrule
  * @uses calendarComponent::$sequence
  * @uses calendarComponent::$status
  * @uses calendarComponent::$summary
  * @uses calendarComponent::$transp
  * @uses calendarComponent::$trigger
  * @uses calendarComponent::$tzid
  * @uses calendarComponent::$tzname
  * @uses calendarComponent::$tzoffsetfrom
  * @uses calendarComponent::$tzoffsetto
  * @uses calendarComponent::$tzurl
  * @uses calendarComponent::$uid
  * @uses calendarComponent::$objName
  * @uses calendarComponent::_makeuid()
  * @uses calendarComponent::$url
  * @uses calendarComponent::$xprop
  * @return mixed
  */
 function getProperty($propName = FALSE, $propix = FALSE, $inclParam = FALSE, $specform = FALSE)
 {
     if ('GEOLOCATION' == strtoupper($propName)) {
         $content = FALSE === ($loc = $this->getProperty('LOCATION')) ? '' : $loc . ' ';
         if (FALSE === ($geo = $this->getProperty('GEO'))) {
             return FALSE;
         }
         return $content . iCalUtilityFunctions::_geo2str2($geo['latitude'], iCalUtilityFunctions::$geoLatFmt) . iCalUtilityFunctions::_geo2str2($geo['longitude'], iCalUtilityFunctions::$geoLongFmt) . '/';
     }
     if ($this->_notExistProp($propName)) {
         return FALSE;
     }
     $propName = $propName ? strtoupper($propName) : 'X-PROP';
     if (in_array($propName, iCalUtilityFunctions::$mProps2)) {
         if (empty($propix)) {
             $propix = isset($this->propix[$propName]) ? $this->propix[$propName] + 2 : 1;
         }
         $this->propix[$propName] = --$propix;
     }
     switch ($propName) {
         case 'ACTION':
             if (isset($this->action['value'])) {
                 return $inclParam ? $this->action : $this->action['value'];
             }
             break;
         case 'ATTACH':
             $ak = is_array($this->attach) ? array_keys($this->attach) : array();
             while (is_array($this->attach) && !isset($this->attach[$propix]) && 0 < count($this->attach) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->attach[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->attach[$propix] : $this->attach[$propix]['value'];
             break;
         case 'ATTENDEE':
             $ak = is_array($this->attendee) ? array_keys($this->attendee) : array();
             while (is_array($this->attendee) && !isset($this->attendee[$propix]) && 0 < count($this->attendee) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->attendee[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->attendee[$propix] : $this->attendee[$propix]['value'];
             break;
         case 'CATEGORIES':
             $ak = is_array($this->categories) ? array_keys($this->categories) : array();
             while (is_array($this->categories) && !isset($this->categories[$propix]) && 0 < count($this->categories) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->categories[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->categories[$propix] : $this->categories[$propix]['value'];
             break;
         case 'CLASS':
             if (isset($this->class['value'])) {
                 return $inclParam ? $this->class : $this->class['value'];
             }
             break;
         case 'COMMENT':
             $ak = is_array($this->comment) ? array_keys($this->comment) : array();
             while (is_array($this->comment) && !isset($this->comment[$propix]) && 0 < count($this->comment) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->comment[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->comment[$propix] : $this->comment[$propix]['value'];
             break;
         case 'COMPLETED':
             if (isset($this->completed['value'])) {
                 return $inclParam ? $this->completed : $this->completed['value'];
             }
             break;
         case 'CONTACT':
             $ak = is_array($this->contact) ? array_keys($this->contact) : array();
             while (is_array($this->contact) && !isset($this->contact[$propix]) && 0 < count($this->contact) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->contact[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->contact[$propix] : $this->contact[$propix]['value'];
             break;
         case 'CREATED':
             if (isset($this->created['value'])) {
                 return $inclParam ? $this->created : $this->created['value'];
             }
             break;
         case 'DESCRIPTION':
             $ak = is_array($this->description) ? array_keys($this->description) : array();
             while (is_array($this->description) && !isset($this->description[$propix]) && 0 < count($this->description) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->description[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->description[$propix] : $this->description[$propix]['value'];
             break;
         case 'DTEND':
             if (isset($this->dtend['value'])) {
                 return $inclParam ? $this->dtend : $this->dtend['value'];
             }
             break;
         case 'DTSTAMP':
             if (in_array($this->objName, iCalUtilityFunctions::$miscComps)) {
                 return;
             }
             if (!isset($this->dtstamp['value'])) {
                 $this->_makeDtstamp();
             }
             return $inclParam ? $this->dtstamp : $this->dtstamp['value'];
             break;
         case 'DTSTART':
             if (isset($this->dtstart['value'])) {
                 return $inclParam ? $this->dtstart : $this->dtstart['value'];
             }
             break;
         case 'DUE':
             if (isset($this->due['value'])) {
                 return $inclParam ? $this->due : $this->due['value'];
             }
             break;
         case 'DURATION':
             if (!isset($this->duration['value'])) {
                 return FALSE;
             }
             $value = $specform && isset($this->dtstart['value']) && isset($this->duration['value']) ? iCalUtilityFunctions::_duration2date($this->dtstart['value'], $this->duration['value']) : $this->duration['value'];
             $params = $specform && $inclParam && isset($this->dtstart['params']['TZID']) ? array_merge((array) $this->duration['params'], $this->dtstart['params']) : $this->duration['params'];
             return $inclParam ? array('value' => $value, 'params' => $params) : $value;
             break;
         case 'EXDATE':
             $ak = is_array($this->exdate) ? array_keys($this->exdate) : array();
             while (is_array($this->exdate) && !isset($this->exdate[$propix]) && 0 < count($this->exdate) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->exdate[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->exdate[$propix] : $this->exdate[$propix]['value'];
             break;
         case 'EXRULE':
             $ak = is_array($this->exrule) ? array_keys($this->exrule) : array();
             while (is_array($this->exrule) && !isset($this->exrule[$propix]) && 0 < count($this->exrule) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->exrule[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->exrule[$propix] : $this->exrule[$propix]['value'];
             break;
         case 'FREEBUSY':
             $ak = is_array($this->freebusy) ? array_keys($this->freebusy) : array();
             while (is_array($this->freebusy) && !isset($this->freebusy[$propix]) && 0 < count($this->freebusy) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->freebusy[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->freebusy[$propix] : $this->freebusy[$propix]['value'];
             break;
         case 'GEO':
             if (isset($this->geo['value'])) {
                 return $inclParam ? $this->geo : $this->geo['value'];
             }
             break;
         case 'LAST-MODIFIED':
             if (isset($this->lastmodified['value'])) {
                 return $inclParam ? $this->lastmodified : $this->lastmodified['value'];
             }
             break;
         case 'LOCATION':
             if (isset($this->location['value'])) {
                 return $inclParam ? $this->location : $this->location['value'];
             }
             break;
         case 'ORGANIZER':
             if (isset($this->organizer['value'])) {
                 return $inclParam ? $this->organizer : $this->organizer['value'];
             }
             break;
         case 'PERCENT-COMPLETE':
             if (isset($this->percentcomplete['value'])) {
                 return $inclParam ? $this->percentcomplete : $this->percentcomplete['value'];
             }
             break;
         case 'PRIORITY':
             if (isset($this->priority['value'])) {
                 return $inclParam ? $this->priority : $this->priority['value'];
             }
             break;
         case 'RDATE':
             $ak = is_array($this->rdate) ? array_keys($this->rdate) : array();
             while (is_array($this->rdate) && !isset($this->rdate[$propix]) && 0 < count($this->rdate) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->rdate[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->rdate[$propix] : $this->rdate[$propix]['value'];
             break;
         case 'RECURRENCE-ID':
             if (isset($this->recurrenceid['value'])) {
                 return $inclParam ? $this->recurrenceid : $this->recurrenceid['value'];
             }
             break;
         case 'RELATED-TO':
             $ak = is_array($this->relatedto) ? array_keys($this->relatedto) : array();
             while (is_array($this->relatedto) && !isset($this->relatedto[$propix]) && 0 < count($this->relatedto) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->relatedto[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->relatedto[$propix] : $this->relatedto[$propix]['value'];
             break;
         case 'REPEAT':
             if (isset($this->repeat['value'])) {
                 return $inclParam ? $this->repeat : $this->repeat['value'];
             }
             break;
         case 'REQUEST-STATUS':
             $ak = is_array($this->requeststatus) ? array_keys($this->requeststatus) : array();
             while (is_array($this->requeststatus) && !isset($this->requeststatus[$propix]) && 0 < count($this->requeststatus) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->requeststatus[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->requeststatus[$propix] : $this->requeststatus[$propix]['value'];
             break;
         case 'RESOURCES':
             $ak = is_array($this->resources) ? array_keys($this->resources) : array();
             while (is_array($this->resources) && !isset($this->resources[$propix]) && 0 < count($this->resources) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->resources[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->resources[$propix] : $this->resources[$propix]['value'];
             break;
         case 'RRULE':
             $ak = is_array($this->rrule) ? array_keys($this->rrule) : array();
             while (is_array($this->rrule) && !isset($this->rrule[$propix]) && 0 < count($this->rrule) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->rrule[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->rrule[$propix] : $this->rrule[$propix]['value'];
             break;
         case 'SEQUENCE':
             if (isset($this->sequence['value'])) {
                 return $inclParam ? $this->sequence : $this->sequence['value'];
             }
             break;
         case 'STATUS':
             if (isset($this->status['value'])) {
                 return $inclParam ? $this->status : $this->status['value'];
             }
             break;
         case 'SUMMARY':
             if (isset($this->summary['value'])) {
                 return $inclParam ? $this->summary : $this->summary['value'];
             }
             break;
         case 'TRANSP':
             if (isset($this->transp['value'])) {
                 return $inclParam ? $this->transp : $this->transp['value'];
             }
             break;
         case 'TRIGGER':
             if (isset($this->trigger['value'])) {
                 return $inclParam ? $this->trigger : $this->trigger['value'];
             }
             break;
         case 'TZID':
             if (isset($this->tzid['value'])) {
                 return $inclParam ? $this->tzid : $this->tzid['value'];
             }
             break;
         case 'TZNAME':
             $ak = is_array($this->tzname) ? array_keys($this->tzname) : array();
             while (is_array($this->tzname) && !isset($this->tzname[$propix]) && 0 < count($this->tzname) && $propix < end($ak)) {
                 $propix++;
             }
             $this->propix[$propName] = $propix;
             if (!isset($this->tzname[$propix])) {
                 unset($this->propix[$propName]);
                 return FALSE;
             }
             return $inclParam ? $this->tzname[$propix] : $this->tzname[$propix]['value'];
             break;
         case 'TZOFFSETFROM':
             if (isset($this->tzoffsetfrom['value'])) {
                 return $inclParam ? $this->tzoffsetfrom : $this->tzoffsetfrom['value'];
             }
             break;
         case 'TZOFFSETTO':
             if (isset($this->tzoffsetto['value'])) {
                 return $inclParam ? $this->tzoffsetto : $this->tzoffsetto['value'];
             }
             break;
         case 'TZURL':
             if (isset($this->tzurl['value'])) {
                 return $inclParam ? $this->tzurl : $this->tzurl['value'];
             }
             break;
         case 'UID':
             if (in_array($this->objName, iCalUtilityFunctions::$miscComps)) {
                 return FALSE;
             }
             if (empty($this->uid)) {
                 $this->_makeuid();
             }
             return $inclParam ? $this->uid : $this->uid['value'];
             break;
         case 'URL':
             if (isset($this->url['value'])) {
                 return $inclParam ? $this->url : $this->url['value'];
             }
             break;
         default:
             if ($propName != 'X-PROP') {
                 if (!isset($this->xprop[$propName])) {
                     return FALSE;
                 }
                 return $inclParam ? array($propName, $this->xprop[$propName]) : array($propName, $this->xprop[$propName]['value']);
             } else {
                 if (empty($this->xprop)) {
                     return FALSE;
                 }
                 $xpropno = 0;
                 foreach ($this->xprop as $xpropkey => $xpropvalue) {
                     if ($propix == $xpropno) {
                         return $inclParam ? array($xpropkey, $this->xprop[$xpropkey]) : array($xpropkey, $this->xprop[$xpropkey]['value']);
                     } else {
                         $xpropno++;
                     }
                 }
                 return FALSE;
                 // not found ??
             }
     }
     return FALSE;
 }
Пример #3
0
/**
 * Add children to a SimpleXMLelement
 *
 * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**>
 * @since 2.18.10 - 2013-09-04
 * @param object $parent   reference to a SimpleXMLelement node
 * @param string $name     new element node name
 * @param string $type     content type, subelement(-s) name
 * @param string $content  new subelement content
 * @param array  $params   new element 'attributes'
 * @uses iCalUtilityFunctions::_duration2str()
 * @uses iCalUtilityFunctions::_geo2str2()
 * @uses iCalUtilityFunctions::$geoLatFmt
 * @uses iCalUtilityFunctions::$geoLongFmt
 * @return void
 */
function _addXMLchild(&$parent, $name, $type, $content, $params = array())
{
    static $fmtYmd = '%04d-%02d-%02d';
    static $fmtYmdHis = '%04d-%02d-%02dT%02d:%02d:%02d';
    /** create new child node */
    $name = strtolower($name);
    $child = $parent->addChild($name);
    if (!empty($params)) {
        $parameters = $child->addChild('parameters');
        foreach ($params as $param => $parVal) {
            if ('VALUE' == $param) {
                continue;
            }
            $param = strtolower($param);
            if ('x-' == substr($param, 0, 2)) {
                $p1 = $parameters->addChild($param);
                $p2 = $p1->addChild('unknown', htmlspecialchars($parVal));
            } else {
                $p1 = $parameters->addChild($param);
                switch ($param) {
                    case 'altrep':
                    case 'dir':
                        $ptype = 'uri';
                        break;
                    case 'delegated-from':
                    case 'delegated-to':
                    case 'member':
                    case 'sent-by':
                        $ptype = 'cal-address';
                        break;
                    case 'rsvp':
                        $ptype = 'boolean';
                        break;
                    default:
                        $ptype = 'text';
                        break;
                }
                if (is_array($parVal)) {
                    foreach ($parVal as $pV) {
                        $p2 = $p1->addChild($ptype, htmlspecialchars($pV));
                    }
                } else {
                    $p2 = $p1->addChild($ptype, htmlspecialchars($parVal));
                }
            }
        }
    }
    // end if( !empty( $params ))
    if (empty($content) && '0' != $content || !is_array($content) && ('-' != substr($content, 0, 1) && 0 > $content)) {
        return;
    }
    /** store content */
    switch ($type) {
        case 'binary':
            $v = $child->addChild($type, $content);
            break;
        case 'boolean':
            break;
        case 'cal-address':
            $v = $child->addChild($type, $content);
            break;
        case 'date':
            if (array_key_exists('year', $content)) {
                $content = array($content);
            }
            foreach ($content as $date) {
                $str = sprintf($fmtYmd, (int) $date['year'], (int) $date['month'], (int) $date['day']);
                $v = $child->addChild($type, $str);
            }
            break;
        case 'date-time':
            if (array_key_exists('year', $content)) {
                $content = array($content);
            }
            foreach ($content as $dt) {
                if (!isset($dt['hour'])) {
                    $dt['hour'] = 0;
                }
                if (!isset($dt['min'])) {
                    $dt['min'] = 0;
                }
                if (!isset($dt['sec'])) {
                    $dt['sec'] = 0;
                }
                $str = sprintf($fmtYmdHis, (int) $dt['year'], (int) $dt['month'], (int) $dt['day'], (int) $dt['hour'], (int) $dt['min'], (int) $dt['sec']);
                if (isset($dt['tz']) && 'Z' == $dt['tz']) {
                    $str .= 'Z';
                }
                $v = $child->addChild($type, $str);
            }
            break;
        case 'duration':
            $output = 'trigger' == $name && FALSE !== $content['before'] ? '-' : '';
            $v = $child->addChild($type, $output . iCalUtilityFunctions::_duration2str($content));
            break;
        case 'geo':
            if (!empty($content)) {
                $v1 = $child->addChild('latitude', iCalUtilityFunctions::_geo2str2($content['latitude'], iCalUtilityFunctions::$geoLatFmt));
                $v1 = $child->addChild('longitude', iCalUtilityFunctions::_geo2str2($content['longitude'], iCalUtilityFunctions::$geoLongFmt));
            }
            break;
        case 'integer':
            $v = $child->addChild($type, (string) $content);
            break;
        case 'period':
            if (!is_array($content)) {
                break;
            }
            foreach ($content as $period) {
                $v1 = $child->addChild($type);
                $str = sprintf($fmtYmdHis, (int) $period[0]['year'], (int) $period[0]['month'], (int) $period[0]['day'], (int) $period[0]['hour'], (int) $period[0]['min'], (int) $period[0]['sec']);
                if (isset($period[0]['tz']) && 'Z' == $period[0]['tz']) {
                    $str .= 'Z';
                }
                $v2 = $v1->addChild('start', $str);
                if (array_key_exists('year', $period[1])) {
                    $str = sprintf($fmtYmdHis, (int) $period[1]['year'], (int) $period[1]['month'], (int) $period[1]['day'], (int) $period[1]['hour'], (int) $period[1]['min'], (int) $period[1]['sec']);
                    if (isset($period[1]['tz']) && 'Z' == $period[1]['tz']) {
                        $str .= 'Z';
                    }
                    $v2 = $v1->addChild('end', $str);
                } else {
                    $v2 = $v1->addChild('duration', iCalUtilityFunctions::_duration2str($period[1]));
                }
            }
            break;
        case 'recur':
            $content = array_change_key_case($content);
            foreach ($content as $rulelabel => $rulevalue) {
                switch ($rulelabel) {
                    case 'until':
                        if (isset($rulevalue['hour'])) {
                            $str = sprintf($fmtYmdHis, (int) $rulevalue['year'], (int) $rulevalue['month'], (int) $rulevalue['day'], (int) $rulevalue['hour'], (int) $rulevalue['min'], (int) $rulevalue['sec']) . 'Z';
                        } else {
                            $str = sprintf($fmtYmd, (int) $rulevalue['year'], (int) $rulevalue['month'], (int) $rulevalue['day']);
                        }
                        $v = $child->addChild($rulelabel, $str);
                        break;
                    case 'bysecond':
                    case 'byminute':
                    case 'byhour':
                    case 'bymonthday':
                    case 'byyearday':
                    case 'byweekno':
                    case 'bymonth':
                    case 'bysetpos':
                        if (is_array($rulevalue)) {
                            foreach ($rulevalue as $vix => $valuePart) {
                                $v = $child->addChild($rulelabel, $valuePart);
                            }
                        } else {
                            $v = $child->addChild($rulelabel, $rulevalue);
                        }
                        break;
                    case 'byday':
                        if (isset($rulevalue['DAY'])) {
                            $str = isset($rulevalue[0]) ? $rulevalue[0] : '';
                            $str .= $rulevalue['DAY'];
                            $p = $child->addChild($rulelabel, $str);
                        } else {
                            foreach ($rulevalue as $valuePart) {
                                if (isset($valuePart['DAY'])) {
                                    $str = isset($valuePart[0]) ? $valuePart[0] : '';
                                    $str .= $valuePart['DAY'];
                                    $p = $child->addChild($rulelabel, $str);
                                } else {
                                    $p = $child->addChild($rulelabel, $valuePart);
                                }
                            }
                        }
                        break;
                    case 'freq':
                    case 'count':
                    case 'interval':
                    case 'wkst':
                    default:
                        $p = $child->addChild($rulelabel, $rulevalue);
                        break;
                }
                // end switch( $rulelabel )
            }
            // end foreach( $content as $rulelabel => $rulevalue )
            break;
        case 'rstatus':
            $v = $child->addChild('code', number_format((double) $content['statcode'], 2, '.', ''));
            $v = $child->addChild('description', htmlspecialchars($content['text']));
            if (isset($content['extdata'])) {
                $v = $child->addChild('data', htmlspecialchars($content['extdata']));
            }
            break;
        case 'text':
            if (!is_array($content)) {
                $content = array($content);
            }
            foreach ($content as $part) {
                $v = $child->addChild($type, htmlspecialchars($part));
            }
            break;
        case 'time':
            break;
        case 'uri':
            $v = $child->addChild($type, $content);
            break;
        case 'utc-offset':
            if (in_array(substr($content, 0, 1), array('-', '+'))) {
                $str = substr($content, 0, 1);
                $content = substr($content, 1);
            } else {
                $str = '+';
            }
            $str .= substr($content, 0, 2) . ':' . substr($content, 2, 2);
            if (4 < strlen($content)) {
                $str .= ':' . substr($content, 4);
            }
            $v = $child->addChild($type, $str);
            break;
        case 'unknown':
        default:
            if (is_array($content)) {
                $content = implode('', $content);
            }
            $v = $child->addChild('unknown', htmlspecialchars($content));
            break;
    }
}