aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjwangen <jwangen>2002-10-25 06:49:26 +0000
committerjwangen <jwangen>2002-10-25 06:49:26 +0000
commit2866867f12f1a8a8b58e305ba3be9c5dd08ba958 (patch)
treeaae0896bd88e142ee1dd4add3ff43b4f2ef58193
parent83508e2f18660eb68a46de17dfa3ee13a39c724a (diff)
downloadphpicalendar-2866867f12f1a8a8b58e305ba3be9c5dd08ba958.tar.gz
phpicalendar-2866867f12f1a8a8b58e305ba3be9c5dd08ba958.tar.bz2
phpicalendar-2866867f12f1a8a8b58e305ba3be9c5dd08ba958.zip
Added support for changes to single events in a recurring set
-rwxr-xr-xcalendars/Jareds32Classes.ics149
-rw-r--r--functions/ical_parser.php88
2 files changed, 209 insertions, 28 deletions
diff --git a/calendars/Jareds32Classes.ics b/calendars/Jareds32Classes.ics
index d2c02e0..0da93c0 100755
--- a/calendars/Jareds32Classes.ics
+++ b/calendars/Jareds32Classes.ics
@@ -1,74 +1,95 @@
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
+X-WR-TIMEZONE;VALUE=TEXT:US/Central
PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
X-WR-CALNAME;VALUE=TEXT:Jareds Classes
-X-WR-TIMEZONE;VALUE=TEXT:US/Central
-X-WR-RELCALID;VALUE=TEXT:C80EA507-D43F-11D6-966A-0050E4E60429
+X-WR-RELCALID;VALUE=TEXT:D573561C-E7AB-11D6-8111-0050E4E60429
VERSION:2.0
BEGIN:VEVENT
-UID:C80E5AE0-D43F-11D6-966A-0050E4E60429
-DTSTAMP:20020919T031210Z
+UID:D572BB91-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T235007Z
SUMMARY:Computer Organization
+EXDATE;TZID=US/Central:20021112T080000
+EXDATE;TZID=US/Central:20021018T080000
+EXDATE;TZID=US/Central:20021010T080000
+EXDATE;TZID=US/Central:20021128T080000
+EXDATE;TZID=US/Central:20021002T080000
+EXDATE;TZID=US/Central:20021001T080000
+EXDATE;TZID=US/Central:20021129T080000
+EXDATE;TZID=US/Central:20021021T080000
DTSTART;TZID=US/Central:20020904T080000
DTEND;TZID=US/Central:20020904T090000
RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
END:VEVENT
BEGIN:VEVENT
-UID:C80E668E-D43F-11D6-966A-0050E4E60429
-DTSTAMP:20020919T031631Z
+UID:D572C871-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T235010Z
SUMMARY:Linguistics
+EXDATE;TZID=US/Central:20021018T090000
+EXDATE;TZID=US/Central:20021002T090000
+EXDATE;TZID=US/Central:20021129T090000
+EXDATE;TZID=US/Central:20021021T090000
DTSTART;TZID=US/Central:20020904T090000
DTEND;TZID=US/Central:20020904T100000
RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,WE,FR
END:VEVENT
BEGIN:VEVENT
-UID:C80E6C16-D43F-11D6-966A-0050E4E60429
-DTSTAMP:20020919T031607Z
+UID:D572CE54-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T233307Z
SUMMARY:First Aid & CPR
+EXDATE;TZID=US/Central:20021021T103000
+EXDATE;TZID=US/Central:20021002T103000
DTSTART;TZID=US/Central:20020904T103000
DTEND;TZID=US/Central:20020904T113000
-RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,WE,FR
+RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,WE
END:VEVENT
BEGIN:VEVENT
-UID:C80E7112-D43F-11D6-966A-0050E4E60429
-DTSTAMP:20020924T125113Z
+UID:D572D3AC-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T235015Z
SUMMARY:Japanese
+EXDATE;TZID=US/Central:20021018T133000
+EXDATE;TZID=US/Central:20021002T133000
+EXDATE;TZID=US/Central:20021021T133000
+EXDATE;TZID=US/Central:20021129T133000
+EXDATE;TZID=US/Central:20021001T133000
DTSTART;TZID=US/Central:20020904T133000
DTEND;TZID=US/Central:20020904T143000
RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=MO,TU,WE,FR
END:VEVENT
BEGIN:VEVENT
-UID:C80E75E7-D43F-11D6-966A-0050E4E60429
-DTSTAMP:20020919T031625Z
+UID:D572D90B-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T235202Z
SUMMARY:The Bible
+EXDATE;TZID=US/Central:20021001T143000
+EXDATE;TZID=US/Central:20021128T143000
DTSTART;TZID=US/Central:20020905T143000
DTEND;TZID=US/Central:20020905T163000
-RRULE:FREQ=WEEKLY;UNTIL=20021214T055959;INTERVAL=1;BYDAY=TU,TH
+RRULE:FREQ=WEEKLY;UNTIL=20021216T055959;INTERVAL=1;BYDAY=TU,TH
END:VEVENT
BEGIN:VEVENT
DTEND;TZID=US/Central:20020910T163000
RECURRENCE-ID;TZID=US/Central:20020910T143000
DTSTAMP:20020911T125000Z
+UID:D572D90B-E7AB-11D6-8111-0050E4E60429
DTSTART;TZID=US/Central:20020910T143000
-UID:C80E75E7-D43F-11D6-966A-0050E4E60429
END:VEVENT
BEGIN:VEVENT
DTEND;TZID=US/Central:20020916T090000
RECURRENCE-ID;TZID=US/Central:20020916T080000
DTSTAMP:20020926T035105Z
DTSTART;TZID=US/Central:20020916T080000
-UID:C80E5AE0-D43F-11D6-966A-0050E4E60429
+UID:D572BB91-E7AB-11D6-8111-0050E4E60429
DURATION:PT1H
END:VEVENT
BEGIN:VEVENT
-UID:C80E7FF8-D43F-11D6-966A-0050E4E60429
+UID:D572E418-E7AB-11D6-8111-0050E4E60429
DTSTAMP:20020919T031814Z
SUMMARY:Reading Day
DTSTART;VALUE=DATE:20021214
DTEND;VALUE=DATE:20021215
END:VEVENT
BEGIN:VEVENT
-UID:C80E8557-D43F-11D6-966A-0050E4E60429
+UID:D572E99A-E7AB-11D6-8111-0050E4E60429
DTSTAMP:20020919T042240Z
SUMMARY:Japanese Final
DTSTART;TZID=US/Central:20021219T153000
@@ -79,7 +100,7 @@ END:VEVENT
BEGIN:VEVENT
DTSTAMP:20020919T041543Z
SUMMARY:The Bible Final
-UID:C80E8A4E-D43F-11D6-966A-0050E4E60429
+UID:D572EEED-E7AB-11D6-8111-0050E4E60429
ORGANIZER;CN=Jared Wangen:mailto:jwangen@gac.edu
DTSTART;TZID=US/Central:20021217T103000
DURATION:PT2H
@@ -88,7 +109,7 @@ END:VEVENT
BEGIN:VEVENT
DTSTAMP:20020919T033447Z
SUMMARY:Computer Organization Final
-UID:C80E8F0C-D43F-11D6-966A-0050E4E60429
+UID:D572F42C-E7AB-11D6-8111-0050E4E60429
DTSTART;TZID=US/Central:20021218T080000
DURATION:PT2H
DESCRIPTION:Olin 321 (Classroom)
@@ -96,7 +117,7 @@ END:VEVENT
BEGIN:VEVENT
DTSTAMP:20020919T033454Z
SUMMARY:Linguistics Final
-UID:C80E9392-D43F-11D6-966A-0050E4E60429
+UID:D572F976-E7AB-11D6-8111-0050E4E60429
DTSTART;TZID=US/Central:20021217T130000
DURATION:PT2H
DESCRIPTION:VH 202 (Classroom)
@@ -104,9 +125,93 @@ END:VEVENT
BEGIN:VEVENT
DTSTAMP:20020919T033438Z
SUMMARY:CPR & First Aid Final
-UID:C80E98B9-D43F-11D6-966A-0050E4E60429
+UID:D572FEBA-E7AB-11D6-8111-0050E4E60429
DTSTART;TZID=US/Central:20021217T080000
DURATION:PT2H
DESCRIPTION:Lund 109 (Classroom)
END:VEVENT
+BEGIN:VEVENT
+UID:D573040D-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T233220Z
+SUMMARY:Fall Break
+DTSTART;VALUE=DATE:20021018
+DTEND;VALUE=DATE:20021022
+END:VEVENT
+BEGIN:VEVENT
+UID:D5730958-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T233332Z
+SUMMARY:Nobel Conference
+DTSTART;VALUE=DATE:20021001
+DTEND;VALUE=DATE:20021003
+END:VEVENT
+BEGIN:VEVENT
+UID:D5730F2B-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T234504Z
+SUMMARY:CS - Lab 1 Due
+DTSTART;VALUE=DATE:20021003
+DTEND;VALUE=DATE:20021004
+END:VEVENT
+BEGIN:VEVENT
+UID:D573147E-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T234552Z
+SUMMARY:CS - HW Ch 1-4\,A\,B Due
+DTSTART;VALUE=DATE:20021008
+DTEND;VALUE=DATE:20021009
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20021024T234631Z
+SUMMARY:Computer Organization Test 1
+DTEND;TZID=US/Central:20021010T203000
+UID:D57319BE-E7AB-11D6-8111-0050E4E60429
+DTSTART;TZID=US/Central:20021010T190000
+END:VEVENT
+BEGIN:VEVENT
+UID:D5731EE8-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T234720Z
+SUMMARY:CS - Lab 2 Due
+DTSTART;VALUE=DATE:20021101
+DTEND;VALUE=DATE:20021102
+END:VEVENT
+BEGIN:VEVENT
+UID:D573241A-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T234754Z
+SUMMARY:CS - HW Ch 5-6 Due
+DTSTART;VALUE=DATE:20021111
+DTEND;VALUE=DATE:20021112
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20021024T234841Z
+SUMMARY:Computer Organization Test 2
+DTEND;TZID=US/Central:20021112T203000
+UID:D573294C-E7AB-11D6-8111-0050E4E60429
+DTSTART;TZID=US/Central:20021112T190000
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20021024T234904Z
+SUMMARY:CS - Lab 3 Due
+UID:D5733204-E7AB-11D6-8111-0050E4E60429
+DTSTART;TZID=US/Central:20021118T150000
+DURATION:PT1H45M
+END:VEVENT
+BEGIN:VEVENT
+UID:D5733792-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T235055Z
+SUMMARY:Thanksgiving Break
+DTSTART;VALUE=DATE:20021128
+DTEND;VALUE=DATE:20021202
+END:VEVENT
+BEGIN:VEVENT
+UID:D5733E36-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T235244Z
+SUMMARY:CS - Lab 4 Due
+DTSTART;VALUE=DATE:20021209
+DTEND;VALUE=DATE:20021210
+END:VEVENT
+BEGIN:VEVENT
+UID:D573446A-E7AB-11D6-8111-0050E4E60429
+DTSTAMP:20021024T235322Z
+SUMMARY:CS - HW Ch 7-9 Due
+DTSTART;VALUE=DATE:20021213
+DTEND;VALUE=DATE:20021214
+END:VEVENT
END:VCALENDAR
diff --git a/functions/ical_parser.php b/functions/ical_parser.php
index 220af9e..4bb22ae 100644
--- a/functions/ical_parser.php
+++ b/functions/ical_parser.php
@@ -69,6 +69,10 @@ if ($parse_file) {
// auxiliary array for determining overlaps of events
$overlap_array = array ();
+ // using $uid to set specific points in array, if $uid is not in the
+ // .ics file, we need to have some unique place in the array
+ $uid_counter = 0;
+
// read file in line by line
// XXX end line is skipped because of the 1-line readahead
while (!feof($ifile)) {
@@ -87,7 +91,8 @@ if ($parse_file) {
$start_time, $end_time, $start_date, $end_date, $summary,
$allday_start, $allday_end, $start, $end, $the_duration,
$beginning, $rrule_array, $start_of_vevent, $description,
- $valarm_description, $start_unixtime, $end_unixtime
+ $valarm_description, $start_unixtime, $end_unixtime,
+ $recurrence_id, $uid
);
$except_dates = array();
@@ -103,6 +108,30 @@ if ($parse_file) {
);
} elseif (stristr($line, 'END:VEVENT')) {
+ // make sure we have some value for $uid
+ if (!isset($uid)) {
+ $uid = $uid_counter;
+ $uid_counter++;
+ $uid_valid = false;
+ } else {
+ $uid_valid = true;
+ }
+
+ if ($uid_valid && isset($processed[$uid]) && isset($recurrence_id['date'])) {
+ $old_start_date = $processed[$uid][0];
+ $old_start_time = $processed[$uid][1];
+ $start_date_tmp = $recurrence_id['date'];
+ if (!isset($start_date)) $start_date = $old_start_date;
+ if (!isset($start_time)) $start_time = $master_array[$old_start_date][$old_start_time][$uid]['event_start'];
+ if (!isset($end_time)) $end_time = $master_array[$old_start_date][$old_start_time][$uid]['event_end'];
+ if (!isset($summary)) $summary = $master_array[$old_start_date][$old_start_time][$uid]['event_text'];
+ if (!isset($length)) $length = $master_array[$old_start_date][$old_start_time][$uid]['event_length'];
+ if (!isset($description)) $description = $master_array[$old_start_date][$old_start_time][$uid]['description'];
+ unset($master_array[$start_date_tmp][$old_start_time]);
+ $write_processed = false;
+ } else {
+ $write_processed = true;
+ }
$mArray_begin = mktime (0,0,0,1,1,$this_year);
$mArray_end = mktime (0,0,0,1,10,($this_year + 1));
@@ -128,6 +157,11 @@ if ($parse_file) {
$minute = $time3[2];
}
+ // handle single changes in recurring events
+ if ($uid_valid && $write_processed) {
+ $processed[$uid] = array($start_date,($hour.$minute));
+ }
+
// Handling of the all day events
if ((isset($allday_start) && $allday_start != '')) {
$start = strtotime($allday_start);
@@ -139,7 +173,7 @@ if ($parse_file) {
if (($end > $mArray_begin) && ($end < $mArray_end)) {
while ($start != $end) {
$start_date = date('Ymd', $start);
- $master_array[($start_date)][('-1')][]= array ('event_text' => $summary, 'description' => $description);
+ $master_array[($start_date)][('-1')][$uid]= array ('event_text' => $summary, 'description' => $description);
$start = strtotime('+1 day', $start);
}
}
@@ -148,7 +182,8 @@ if ($parse_file) {
// Handling regular events
if ((isset($start_time) && $start_time != '') && (!isset($allday_start) || $allday_start == '')) {
$nbrOfOverlaps = checkOverlap($start_date, $start_time, $end_time);
- $master_array[($start_date)][($hour.$minute)][] = array ('event_start' => $start_time, 'event_text' => $summary, 'event_end' => $end_time, 'event_length' => $length, 'event_overlap' => $nbrOfOverlaps, 'description' => $description);
+ $master_array[($start_date)][($hour.$minute)][$uid] = array ('event_start' => $start_time, 'event_text' => $summary, 'event_end' => $end_time, 'event_length' => $length, 'event_overlap' => $nbrOfOverlaps, 'description' => $description);
+
}
// Handling of the recurring events, RRULE
@@ -386,7 +421,7 @@ if ($parse_file) {
}
} else {
$nbrOfOverlaps = checkOverlap($recur_data_date, $start_time, $end_time);
- $master_array[($recur_data_date)][($hour.$minute)][] = array ('event_start' => $start_time, 'event_text' => $summary, 'event_end' => $end_time, 'event_length' => $length, 'event_overlap' => $nbrOfOverlaps, 'description' => $description);
+ $master_array[($recur_data_date)][($hour.$minute)][$uid] = array ('event_start' => $start_time, 'event_text' => $summary, 'event_end' => $end_time, 'event_length' => $length, 'event_overlap' => $nbrOfOverlaps, 'description' => $description);
}
}
}
@@ -507,7 +542,48 @@ if ($parse_file) {
} else {
$valarm_description = $data;
}
-
+ } elseif (preg_match("/^RECURRENCE-ID/i", $field)) {
+
+ $parts = split(';', $field);
+ foreach($parts as $part) {
+ $eachval = split('=',$part);
+ if ($eachval[0] == 'TZID') {
+ $recurrence_id['tzid'] = $eachval[1];
+ } elseif ($eachval[0] == 'RANGE') {
+ $recurrence_id['range'] = $eachval[1];
+ } elseif ($eachval[0] == 'VALUE') {
+ $recurrence_id['value'] = $eachval[1];
+ } else {
+ $recurrence_id[] = $eachval[1];
+ }
+ }
+ unset($parts, $part, $eachval);
+
+ $data = ereg_replace('T', '', $data);
+ $data = ereg_replace('Z', '', $data);
+ ereg ('([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})', $data, $regs);
+ $recurrence_id['date'] = $regs[1] . $regs[2] . $regs[3];
+ $recurrence_id['time'] = $regs[4] . $regs[5];
+
+ $recur_unixtime = mktime($regs[4], $regs[5], 0, $regs[2], $regs[3], $regs[1]);
+
+ $dlst = date('I', $recur_unixtime);
+ $server_offset_tmp = chooseOffset($recur_unixtime);
+ if (isset($recurrence_id['tzid'])) {
+ $tz_tmp = $recurrence_id['tzid'];
+ $offset_tmp = $tz_array[$tz_tmp][$dlst];
+ } elseif (isset($calendar_tz)) {
+ $offset_tmp = $tz_array[$calendar_tz][$dlst];
+ } else {
+ $offset_tmp = $server_offset_tmp;
+ }
+ $recur_unixtime = calcTime($offset_tmp, $server_offset_tmp, $recur_unixtime);
+ $recurrence_id['date'] = date('Ymd', $recur_unixtime);
+ $recurrence_id['time'] = date('Hi', $recur_unixtime);
+ unset($server_offset_tmp);
+
+ } elseif (preg_match("/^UID/i", $field)) {
+ $uid = $data;
} elseif (preg_match("/^X-WR-CALNAME/i", $field)) {
$calendar_name = $data;
$master_array['calendar_name'] = $calendar_name;
@@ -516,7 +592,7 @@ if ($parse_file) {
$master_array['calendar_tz'] = $calendar_tz;
} elseif (preg_match("/^DURATION/i", $field)) {
- if (($first_duration = TRUE) && (!stristr($field, '=DURATION'))) {
+ if (($first_duration == TRUE) && (!stristr($field, '=DURATION'))) {
ereg ('^P([0-9]{1,2})?([W,D]{0,1}[T])?([0-9]{1,2}[H])?([0-9]{1,2}[M])?([0-9]{1,2}[S])?', $data, $duration);
if ($duration[2] = 'W') {
$weeks = $duration[1];

© 2014-2024 Faster IT GmbH | imprint | privacy policy