", $summary); $summary = stripslashes($summary); $description = str_replace("\\n", "
", $description); $mArray_begin = mktime (0,0,0,1,1,$this_year); $mArray_end = mktime (0,0,0,1,10,($this_year + 1)); if ($start_time != "") { ereg ("([0-9]{2})([0-9]{2})", $start_time, $time); ereg ("([0-9]{2})([0-9]{2})", $end_time, $time2); $length = ($time2[1]*60+$time2[2]) - ($time[1]*60+$time[2]); $drawKey = drawEventTimes($start_time, $end_time); ereg ("([0-9]{2})([0-9]{2})", $drawKey["draw_start"], $time3); $hour = $time3[1]; $minute = $time3[2]; } // Handling of the all day events if (($allday_start != "") && ($rrule_array == "")) { $start = strtotime("$allday_start"); $end = strtotime("$allday_end"); 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); $start = strtotime("+1 day", $start); } } } // Handling of the recurring events, RRULE // This will be quite a bit of work, thats for sure. if (is_array($rrule_array)) { if ($allday_start != "") { $rrule_array["START_DAY"] = $allday_start; $rrule_array["END_DAY"] = $allday_end; $rrule_array["END"] = "end"; $recur_start = $allday_start; } else { $rrule_array["START_DATE"] = $start_date; $rrule_array["START_TIME"] = $start_time; $rrule_array["END_TIME"] = $end_time; $rrule_array["END"] = "end"; } //print_r($rrule_array); foreach ($rrule_array as $key => $val) { if ($key == "FREQ") { if ($val == "YEARLY") { $interval = "yyyy"; } elseif ($val == "MONTHLY") { $interval = "m"; } elseif ($val == "WEEKLY") { $interval = "ww"; } elseif ($val == "DAILY") { $interval = "d"; } elseif ($val == "HOURLY") { $interval = "h"; } elseif ($val == "MINUTELY") { $interval = "n"; } elseif ($val == "SECONDLY") { $interval = "s"; } } elseif ($key == "COUNT") { $count = $val; } elseif ($key == "UNTIL") { $until = ereg_replace("T", "", $val); ereg ("([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})", $until, $regs); $year = $regs[1]; $month = $regs[2]; $day = $regs[3]; $until = strtotime("$year$month$day"); } elseif ($key == "INTERVAL") { $number = $val; } elseif ($key == "BYSECOND") { $bysecond = $val; $bysecond = split (",", $bysecond); } elseif ($key == "BYMINUTE") { $byminute = $val; $byminute = split (",", $byminute); } elseif ($key == "BYHOUR") { $byhour = $val; $byhour = split (",", $byhour); } elseif ($key == "BYDAY") { $byday = $val; $byday = split (",", $byday); } elseif ($key == "BYMONTHDAY") { $bymonthday = $val; $bymonthday = split (",", $bymonthday); //print_r ($bymonthday); } elseif ($key == "BYYEARDAY") { $byyearday = $val; $byyearday = split (",", $byyearday); } elseif ($key == "BYWEEKNO") { $byweekno = $val; $byweekno = split (",", $byweekno); } elseif ($key == "BYMONTH") { $bymonth = $val; $bymonth = split (",", $bymonth); } elseif ($key == "BYSETPOS") { $bysetpos = $val; } elseif ($key == "WKST") { $wkst = $val; } elseif ($key == "END") { if ($allday_start != "") { // Since we hit the end of the RRULE array, lets do something. // Below handles yearly, montly, weekly, daily all-day events. // $start_of_vevent is the date the recurring event starts. // $end_of_vevent is the date the recurring event stops. // $count and $count_to check for the COUNT feature // $until checks for the UNTIL feature, makes sure we don't recur past it. $start_of_vevent = strtotime("$allday_start"); $end_of_vevent = strtotime("$allday_end"); $count_to = 0; if (!$until) $until = $mArray_end; if ($start_of_vevent < $mArray_end) { do { // This steps through each day of a multiple all-day event and adds to master array // Every all day event should pass through here at least once if its recurring. $start = $start_of_vevent; $end = $end_of_vevent; while ($start != $end) { $start_date = date("Ymd", $start); if (($end > $mArray_begin) && ($end < $mArray_end)) { $master_array[($start_date)][("-1")][]= array ("event_text" => "$summary", "description" => $description); } $start = strtotime("+1 day", $start); } $start_of_vevent = DateAdd ($interval, $number, $start_of_vevent); $end_of_vevent = DateAdd ($interval, $number, $end_of_vevent); $count_to++; } while (($start_of_vevent < $mArray_end) && ($count != $count_to) && ($start_of_vevent < $until)); } // Let's take care of recurring events that are not all day events // DAILY and WEEKLY recurrences seem to work fine. Need feedback. // Known bug, doesn't look at UNTIL or COUNT yet. } else { // again, $parse_to_year is set to January 10 of the upcoming year $parse_to_year_time = mktime(0,0,0,1,10,($this_year + 1)); $start_date_time = strtotime($start_date); $this_month_start_time = strtotime("$this_year-$this_month-01"); $start_range_time = strtotime("-1 month -2 day", $this_month_start_time); $end_range_time = strtotime("+2 month +2 day", $this_month_start_time); // NOTE: This part not in use for the time being. We are choosing to fill out 3 months time. // depending on which view we're looking at, we do one month or one week // one day is more difficult, I think, so I wrapped that into the week. We'll have to // add another case for "year" once that's added. /* if ($current_view == "month") { $start_range_time = strtotime("$this_year-$this_month-01"); $end_range_time = strtotime("+1 month +1 week", $start_range_time); } else { $start_range_time = strtotime(dateOfWeek($getdate, $week_start_day)); $end_range_time = strtotime("+1 week", $start_range_time); } */ // if $until isn't set yet, we set it to the end of our range we're looking at if (!$until) $until = $end_range_time; $end_date_time = $until; // If the $end_range_time is less than the $start_date_time, or $start_range_time is greater // than $end_date_time, we may as well forget the whole thing // It doesn't do us any good to spend time adding data we aren't even looking at // this will prevent the year view from taking way longer than it needs to if ($end_range_time >= $start_date_time && $start_range_time <= $end_date_time) { // if the beginning of our range is less than the start of the item, we may as well set it equal to it if ($start_range_time < $start_date_time) $start_range_time = $start_date_time; if ($end_range_time > $end_date_time) $end_range_time = $end_date_time; // initialze the time we will increment $next_range_time = $start_range_time; $count_to = 0; // start at the $start_range and go until we hit the end of our range. while (($next_range_time >= $start_range_time) && ($next_range_time <= $end_range_time) && ($count_to != $count)) { // handling WEEKLY events here if ($rrule_array["FREQ"] == "WEEKLY") { // use weekCompare to see if we even have this event this week $diff_weeks = weekCompare(date("Ymd",$next_range_time), $start_date); if ($diff_weeks < $count) { if ($week_diff % $number == 0) { $interval = $number; // loop through the days on which this event happens foreach($byday as $day) { // use my fancy little function to get the date of each day $day = two2threeCharDays($day); $next_date = dateOfWeek(date("Ymd", $next_range_time),$day); $next_date_time = strtotime($next_date); if (($next_date_time > $start_date_time) && ($next_date_time <= $end_date_time) && ($count_to != $count) && !in_array($next_date, $except_dates)) { // add it to the array if it passes inspection, it allows the first time to be // written by the master data writer (hence the > instead of >=) otherwise we can special case these // before, the first one would get entered twice and show up twice // $next_date can fall up to a week behind $next_range_time because of how dateOfWeek works // so we have to check this again. It uses $except_dates so it doesn't add to $master_array // on days that have been deleted by the user // check for overlapping events $nbrOfOverlaps = checkOverlap(); // writes to $master array here $master_array[($next_date)][($hour.$minute)][] = array ("event_start" => $start_time, "event_text" => $summary, "event_end" => $end_time, "event_length" => $length, "event_overlap" => $nbrOfOverlaps, "description" => $description); } } } else { $interval = 1; } $next_range_time = strtotime("+$interval week", $next_range_time); } else { // end the loop because we aren't going to write this event anyway $count_to = $count; } // handling DAILY events here } elseif ($rrule_array["FREQ"] == "DAILY") { // use dayCompare to see if we even have this event this day $diff_days = dayCompare(date("Ymd",$next_range_time), $start_date); if ($diff_days < $count) { if ($diff_days % $number == 0) { $interval = $number; $next_date = date("Ymd", $next_range_time); $next_date_time = strtotime($next_date); if (($next_date_time > $start_date_time) && ($next_date_time <= $end_date_time) && ($count_to != $count) && !in_array($next_date, $except_dates)) { // same general concept as the WEEKLY recurrence // check for overlapping events $nbrOfOverlaps = checkOverlap(); // writes to $master array here $master_array[($next_date)][($hour.$minute)][] = array ("event_start" => $start_time, "event_text" => $summary, "event_end" => $end_time, "event_length" => $length, "event_overlap" => $nbrOfOverlaps, "description" => $description); } } else { $interval = 1; } $next_range_time = strtotime("+$interval day", $next_range_time); } else { // end the loop because we aren't going to write this event anyway $count_to = $count; } // handling MONTHLY events here } elseif ($rrule_array["FREQ"] == "MONTHLY") { $next_range_time = strtotime(date("Y-m-01", $next_range_time)); // use monthCompare to see if we even have this event this month $diff_months = monthCompare(date("Ymd",$next_range_time), $start_date); if ($diff_months < $count) { if ($diff_months % $number == 0) { $interval = $number; // month has two cases, either $bymonthday or $byday if (is_array($bymonthday)) { // loop through the days on which this event happens foreach($bymonthday as $day) { if ($day != "0") { $next_date_time = strtotime(date("Y-m-",$next_range_time).$day); $next_date = date("Ymd", $next_date_time); if (($next_date_time > $start_date_time) && ($next_date_time <= $end_date_time) && ($count_to != $count) && !in_array($next_date, $except_dates)) { // same general concept as the WEEKLY recurrence // check for overlapping events $nbrOfOverlaps = checkOverlap(); // writes to $master array here $master_array[($next_date)][($hour.$minute)][] = array ("event_start" => $start_time, "event_text" => $summary, "event_end" => $end_time, "event_length" => $length, "event_overlap" => $nbrOfOverlaps, "description" => $description); } } } // our other case } else { // loop through the days on which this event happens foreach($byday as $day) { ereg ("([0-9]{1})([A-Z]{2})", $day, $byday_arr); $nth = $byday_arr[1]-1; $on_day = two2threeCharDays($byday_arr[2]); $next_date_time = strtotime("$on_day +$nth week", $next_range_time); $next_date = date("Ymd", $next_date_time); if (($next_date_time > $start_date_time) && ($next_date_time <= $end_date_time) && ($count_to != $count) && !in_array($next_date, $except_dates)) { // same general concept as the WEEKLY recurrence // check for overlapping events $nbrOfOverlaps = checkOverlap(); // writes to $master array here $master_array[($next_date)][($hour.$minute)][] = array ("event_start" => $start_time, "event_text" => $summary, "event_end" => $end_time, "event_length" => $length, "event_overlap" => $nbrOfOverlaps, "description" => $description); } } } } else { $interval = 1; } $next_range_time = strtotime("+$interval month", $next_range_time); } else { // end the loop because we aren't going to write this event anyway $count_to = $count; } // anything else we need to end the loop } else { $next_range_time = $end_range_time + 100; $count_to = $count; } } } } } } } // Let's write all the data to the master array if ($start_time != "") { // check for overlapping events $nbrOfOverlaps = checkOverlap(); // writes to $master array here $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); } } else { $field = ""; $data = ""; sscanf($line, "%[^:]:%[^\n]", &$field, &$data); if(strstr($field, "DTSTART;TZID")) { $data = ereg_replace("T", "", $data); ereg ("([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})", $data, $regs); $year = $regs[1]; $month = $regs[2]; $day = $regs[3]; $hour = $regs[4]; $minute = $regs[5]; $start_date = $year . $month . $day; $start_time = $hour . $minute; } elseif (strstr($field, "DTEND;TZID")) { $data = ereg_replace("T", "", $data); ereg ("([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})", $data, $regs); $year = $regs[1]; $month = $regs[2]; $day = $regs[3]; $hour = $regs[4]; $minute = $regs[5]; $end_day = $year . $month . $day; $end_time = $hour . $minute; } elseif (strstr($field, "EXDATE;TZID")) { $data = ereg_replace("T", "", $data); ereg ("([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})", $data, $regs); $year = $regs[1]; $month = $regs[2]; $day = $regs[3]; $hour = $regs[4]; $minute = $regs[5]; $except_dates[] = $year . $month . $day; $except_times[] = $hour . $minute; } elseif (strstr($field, "SUMMARY")) { $summary = $data; } elseif (strstr($field, "DESCRIPTION")) { $description = $data; } elseif (strstr($field, "X-WR-CALNAME")) { $calendar_name = $data; } elseif (strstr($field, "DTSTART;VALUE=DATE")) { $allday_start = $data; // echo "$allday_start"; } elseif (strstr($field, "DTEND;VALUE=DATE")) { $allday_end = $data; } elseif (strstr($field, "DURATION")) { if (($first_duration = TRUE) && (!strstr($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]; } else { $days = $duration[1]; } $hours = $duration[4]; $minutes = $duration[6]; $seconds = $duration[8]; $the_duration = ($weeks * 60 * 60 * 24 * 7) + ($days * 60 * 60 * 24) + ($hours * 60 * 60) + ($minutes * 60) + ($seconds); $beginning = (strtotime($start_time) + $the_duration); $end_time = date ("Hi", $beginning); $first_duration = FALSE; } } elseif (strstr($field, "RRULE")) { // $data = "RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;BYMINUTE=30"; $data = ereg_replace ("RRULE:", "", $data); $rrule = split (";", $data); foreach ($rrule as $recur) { ereg ("(.*)=(.*)", $recur, $regs); $rrule_array[$regs[1]] = $regs[2]; } } elseif (strstr($field, "ATTENDEE")) { $attendee = $data; // echo "$attendee"; } } } // Sort the array by absolute date. if (is_array($master_array)) { ksort($master_array); reset($master_array); } // Store information in the session /*if ($use_sessions == "yes") { session_start(); session_register( "aArray", "aYear", "aLanguage", "aCalendar" ); $aArray = $master_array; $aYear = $this_year; $aLanguage = $language; $aCalendar = $cal; }*/ // End the session //} //If you want to see the values in the arrays, uncomment below. //print "
";
//print_r($master_array);
//print_r($overlap_array);
//print_r($day_array);
//print_r($rrule);			
//print "
"; ?>