public function parseChild($child, $year)
{
$result['time'] = $result['end'] = 0;
try {
$t = $child->getAttribute('TZOFFSETFROM');
} catch (Horde_Icalendar_Exception $e) {
return array();
}
$result['from'] = ($t['hour'] * 60 * 60 + $t['minute'] * 60) * ($t['ahead'] ? 1 : -1);
try {
$t = $child->getAttribute('TZOFFSETTO');
} catch (Horde_Icalendar_Exception $e) {
return array();
}
$result['to'] = ($t['hour'] * 60 * 60 + $t['minute'] * 60) * ($t['ahead'] ? 1 : -1);
try {
$start = $child->getAttribute('DTSTART');
} catch (Horde_Icalendar_Exception $e) {
return array();
}
if (!is_int($start)) {
return array();
}
$start = getdate($start);
if ($start['year'] > $year) {
return array();
}
$results = array();
try {
$rdates = $child->getAttributeValues('RDATE');
foreach ($rdates as $rdate) {
if ($rdate['year'] == $year || $rdate['year'] == $year - 1) {
$result['time'] = $result['end'] = gmmktime($start['hours'], $start['minutes'], $start['seconds'], $rdate['month'], $rdate['mday'], $rdate['year']);
$results[] = $result;
}
}
} catch (Horde_Icalendar_Exception $e) {
}
try {
$rrules = $child->getAttribute('RRULE');
} catch (Horde_Icalendar_Exception $e) {
if (!$results) {
$result['time'] = $result['end'] = $start[0];
$results[] = $result;
}
return $results;
}
$rrules = explode(';', $rrules);
foreach ($rrules as $rrule) {
$t = explode('=', $rrule);
switch ($t[0]) {
case 'FREQ':
if ($t[1] != 'YEARLY') {
return array();
}
break;
case 'INTERVAL':
if ($t[1] != '1') {
return array();
}
break;
case 'BYMONTH':
$month = intval($t[1]);
break;
case 'BYDAY':
$len = strspn($t[1], '1234567890-+');
if ($len == 0) {
return array();
}
$weekday = substr($t[1], $len);
$weekdays = array('SU' => 0, 'MO' => 1, 'TU' => 2, 'WE' => 3, 'TH' => 4, 'FR' => 5, 'SA' => 6);
$weekday = $weekdays[$weekday];
$which = intval(substr($t[1], 0, $len));
break;
case 'UNTIL':
$result['end'] = intval(substr($t[1], 0, 4));
break;
}
}
if (empty($month) || !isset($weekday)) {
return array();
}
// Get the timestamp for the first day of $month.
$when = gmmktime($start['hours'], $start['minutes'], $start['seconds'], $month, 1, $year);
// Get the day of the week for the first day of $month.
$first_of_month_weekday = intval(gmstrftime('%w', $when));
// Go to the first $weekday before first day of $month.
if ($weekday >= $first_of_month_weekday) {
$weekday -= 7;
}
$when -= ($first_of_month_weekday - $weekday) * 60 * 60 * 24;
// If going backwards go to the first $weekday after last day
// of $month.
if ($which < 0) {
do {
$when += 60 * 60 * 24 * 7;
} while (intval(gmstrftime('%m', $when)) == $month);
}
// Calculate $weekday number $which.
$when += $which * 60 * 60 * 24 * 7;
$result['time'] = $when;
$results[] = $result;
return $results;
}