function amr_parseRepeats(&$event) { global $amr_globaltz; if (!empty($event['RRULE'])) { /* and is_string($event['RRULE'])) */ $event['RRULE'] = amr_parseRRULE($event['RRULE']); } if (!empty($event['EXRULE'])) { /* and is_string($event['EXRULE'])) */ $event['EXRULE'] = amr_parseRRULE($event['EXRULE']); } if (!empty($event['RDATE'])) { /*and is_string($event['RDATE'])) */ $event['RDATE'] = amr_parseRDATE($event['RDATE'], $amr_globaltz); $event['RDATE'][] = $event['DTSTART']; // 201406 must include DTSTART in RDATE } if (!empty($event['EXDATE'])) { /*and is_string($event['EXDATE']))*/ $event['EXDATE'] = amr_parseRDATE($event['EXDATE'], $amr_globaltz); } return $event; }
function amr_parse_property($parts) { /* would receive something like array ('DTSTART; VALUE=DATE', '20060315')) */ /* NOTE: parts[0] has the long tag eg: RDATE;TZID=US-EASTERN or could be DTEND;TZID=America/New_York;VALUE=DATE-TIME: and the date 20110724T100000 in parts 1 (see forum note from dusty - he is generating the DATETIME parts[1] the bit after the : 19960403T020000Z/19960403T040000Z, 19960404T010000Z/PT3H IF 'Z' then must be in UTC If no Z */ global $amr_globaltz; if (empty($parts[1])) { return false; } // we got crap $tzobj = $amr_globaltz; /* Because if there is no timezone specified in any way for the date time then it must a floating value, and so should be created in the global timezone.*/ // if (ICAL_EVENTS_DEBUG or isset($_REQUEST['tzdebug'])) {echo '<br /> Property : '.$parts[0];} $p0 = explode(';', $parts[0]); /* Looking for ; VALUE = something...; or TZID=... or both, or more than one anyway ???*/ // the first bit will be the property like PRODID, or X_WR_TIMEZONE // the next will be the modifiers $prop = array_shift($p0); if (!empty($p0)) { // if we have some modifiers foreach ($p0 as $p) { // handle special modifiers , could be VALUE=DATE, TZID= if (stristr($p, 'TZID')) { /* Normal TZ, not the one with the path eg: DTSTART;TZID=US-Eastern:19980119T020000 or zimbras TZID="GMT+01.00/+02.00 */ // $TZID = substr($p0[1], 4 ); $TZID = substr($p, 4); $tzobj = amr_parseTZID($TZID); } else { /* might be just a value=date, in which case we use the global tz? no may still have TZid */ $tzobj = $amr_globaltz; if (stristr($p, 'VALUE')) { // we have a possibly redundant modified $VALUE = substr($p, 6); // take everything after the '=' } else { // not necessary to deal with modifier here or unknown maybe custom modifiers // only urgent to get tZID's.. or maybe we could even do those later? //check it out on major code revamp, meanwhile if it aint broke, dont fix it } } } } // else $tzobj = $amr_globaltz; /* Because if there is no timezone specified in any way for the date time then it must a floating value, and so should be created in the global timezone.*/ // switch ($p0[0]) { switch ($prop) { case 'CREATED': case 'COMPLETED': case 'LAST-MODIFIED': case 'DTSTART': case 'DTEND': case 'DTSTAMP': case 'DUE': if (isset($VALUE)) { $date = amr_parseValue($VALUE, $parts[1], $tzobj); } else { $date = amr_parseSingleDate('DATE-TIME', $parts[1], $tzobj); } if (is_object($date) and ($prop === 'LAST-MODIFIED' or $prop === 'CREATED')) { amr_track_last_mod($date); } return $date; case 'ALARM': case 'RECURRENCE-ID': /* could also have range ?*/ if (isset($VALUE)) { return amr_parseValue($VALUE, $parts[1], $tzobj); } elseif (isset($RANGE)) { return amr_parseRange($RANGE, $parts[1], $tzobj); } else { return amr_parseSingleDate('DATE-TIME', $parts[1], $tzobj); } case 'EXRULE': case 'RRULE': return amr_parseRRULE($parts[1]); case 'BDAY': return amr_parseDate($parts[1]); case 'EXDATE': if (isset($_REQUEST['debugexc'])) { echo '<br> Parsing EXDATE '; } case 'RDATE': return amr_parseRDATE($parts[1], $tzobj); case 'TRIGGER': /* not supported yet, check for datetime and / or duration */ /* not supported yet, check for datetime and / or duration */ case 'DURATION': $dur = amr_parseDuration($parts[1]); if (isset($_GET['debugdur'])) { echo '<br />Parts1 = ' . $parts[1] . '<br />Duration = '; var_dump($dur); } return $dur; case 'FREEBUSY': return amr_parsePeriod($parts[1]); case 'TZID': /* ie TZID is a property, not part of a date spec */ return $parts[1]; case 'ORGANIZER': return amr_parseOrganiser($parts); case 'ATTENDEE': return amr_parseAttendees($parts); case 'ATTACH': $attach = amr_parseAttach($parts); if (ICAL_EVENTS_DEBUG) { echo '<br />ATTACH returned:<br />' . print_r($attach, true); } return $attach; case 'CATEGORIES': $cats = amr_parse_CATEGORIES($parts[1]); return $cats; default: return amr_parseDefault($prop, $parts); } }