aboutsummaryrefslogtreecommitdiffstats
path: root/functions
diff options
context:
space:
mode:
authorJim Hu <jimhu@users.sourceforge.net>2008-12-11 23:48:39 +0000
committerJim Hu <jimhu@users.sourceforge.net>2008-12-11 23:48:39 +0000
commitb1aaa3b6ca8894ac0422fb3aeadded29c2b83972 (patch)
tree7689417eb311569ffe966c5f60aeb7a8e9ff2035 /functions
parentb8fa9f6a3a0d0bad52babec3573899ba37873477 (diff)
downloadphpicalendar-b1aaa3b6ca8894ac0422fb3aeadded29c2b83972.tar.gz
phpicalendar-b1aaa3b6ca8894ac0422fb3aeadded29c2b83972.tar.bz2
phpicalendar-b1aaa3b6ca8894ac0422fb3aeadded29c2b83972.zip
add new files
Diffstat (limited to 'functions')
-rw-r--r--functions/init/configs.php60
-rw-r--r--functions/init/cpaths.php24
-rw-r--r--functions/init/date_range.php39
-rw-r--r--functions/init/sanitize.php101
-rw-r--r--functions/init/set_error_reporting.php9
-rw-r--r--functions/parse/end_vevent.php634
-rw-r--r--functions/parse/overlapping_events.php274
-rw-r--r--functions/parse/parse_tzs.php64
8 files changed, 1205 insertions, 0 deletions
diff --git a/functions/init/configs.php b/functions/init/configs.php
new file mode 100644
index 0000000..9cea67b
--- /dev/null
+++ b/functions/init/configs.php
@@ -0,0 +1,60 @@
+<?php
+// Pull in the configuration and some functions.
+include_once(BASE.'default_config.php');
+if (is_file(BASE.'config.inc.php')){
+ include_once(BASE.'config.inc.php');
+ foreach($configs as $key=>$value) $phpiCal_config->setProperty($key, $value);
+}
+// Set the cookie URI.
+if ($phpiCal_config->cookie_uri == '') {
+ $phpiCal_config->setProperty('cookie_uri', $_SERVER['SERVER_NAME'].substr($_SERVER['PHP_SELF'],0,strpos($_SERVER['PHP_SELF'], '/') ).'phpicalendar' );
+}
+
+if (isset($_COOKIE[$phpiCal_config->cookie_uri]) && !isset($_POST['unset'])) {
+ $phpicalendar = unserialize(stripslashes($_COOKIE[$cookie_name]));
+ if (isset($phpicalendar['cookie_language'])) $phpiCal_config->setProperty('language', $phpicalendar['cookie_language']);
+ if (isset($phpicalendar['cookie_calendar'])) $phpiCal_config->setProperty('default_cal_check', $phpicalendar['cookie_calendar']);
+ if (isset($phpicalendar['cookie_cpath'])) $phpiCal_config->setProperty('default_cpath_check', $phpicalendar['cookie_cpath']);
+ if (isset($phpicalendar['cookie_view'])) $phpiCal_config->setProperty('default_view', $phpicalendar['cookie_view']);
+ if (isset($phpicalendar['cookie_style']) && is_dir(BASE.'templates/'.$phpicalendar['cookie_style'].'/')){
+ $phpiCal_config->setProperty('template', $phpicalendar['cookie_style']);
+ }
+ if (isset($phpicalendar['cookie_startday'])) $phpiCal_config->setProperty('week_start_day', $phpicalendar['cookie_startday']);
+ if (isset($phpicalendar['cookie_time'])) $phpiCal_config->setProperty('day_start', $phpicalendar['cookie_time']);
+}
+
+# language support
+# default to english and overwrite other strings as available
+unset($lang);
+include_once(BASE.'languages/english.inc.php');
+$language = strtolower($phpiCal_config->language);
+$lang_file = BASE.'languages/'.$language.'.inc.php';
+if (is_file($lang_file)) {
+ include_once($lang_file);
+}
+
+$template = $phpiCal_config->template;
+
+$fillTime = $phpiCal_config->day_start;
+$day_array = array ();
+while ($fillTime < $phpiCal_config->day_end) {
+ array_push ($day_array, $fillTime);
+ preg_match ('/([0-9]{2})([0-9]{2})/', $fillTime, $dTime);
+ $fill_h = $dTime[1];
+ $fill_min = $dTime[2];
+ $fill_min = sprintf('%02d', $fill_min + $phpiCal_config->gridLength);
+ if ($fill_min == 60) {
+ $fill_h = sprintf('%02d', ($fill_h + 1));
+ $fill_min = '00';
+ }
+ $fillTime = $fill_h . $fill_min;
+}
+
+
+/*
+echo "<pre>xx";
+print_r($configs);
+print_r($phpiCal_config);
+echo "</pre>";
+#die;
+*/ \ No newline at end of file
diff --git a/functions/init/cpaths.php b/functions/init/cpaths.php
new file mode 100644
index 0000000..fafc0ec
--- /dev/null
+++ b/functions/init/cpaths.php
@@ -0,0 +1,24 @@
+<?php
+#cpath modifies the calendar path based on the url or cookie values. This allows you to run multiple calendar subsets from a single phpicalendar installation. Operations on cpath are largely hidden from the end user.
+if ($phpiCal_config->calendar_path == '') {
+ $calendar_path = BASE.'calendars';
+}else $calendar_path = $phpiCal_config->calendar_path;
+$cpath = ''; #initialize cpath to prevent later undef warnings.
+if(isset($_REQUEST['cpath'])&& $_REQUEST['cpath'] !=''){
+ $cpath = str_replace('..','',$_REQUEST['cpath']);
+ $calendar_path .= "/$cpath";
+# $tmp_dir .= "/$cpath";
+}elseif(isset($phpiCal_config->default_cpath_check) && $phpiCal_config->default_cpath_check !='' ){
+ $cpath = str_replace('..','',$default_cpath_check);
+ $calendar_path .= "/$cpath";
+# $tmp_dir .= "/$cpath";
+}
+#these need cpath to be set
+#set up specific template folder for a particular cpath
+if (isset($user_template["$cpath"])){
+ $template = $user_template["$cpath"];
+}
+#set up specific webcals for a particular cpath
+if (isset($phpiCal_config->more_webcals) && is_array($phpiCal_config->more_webcals[$cpath])){
+ $list_webcals = array_merge($phpiCal_config->list_webcals, $phpiCal_config->more_webcals["$cpath"]);
+}
diff --git a/functions/init/date_range.php b/functions/init/date_range.php
new file mode 100644
index 0000000..565d0d1
--- /dev/null
+++ b/functions/init/date_range.php
@@ -0,0 +1,39 @@
+<?php
+if (!isset($getdate)) {
+ if (isset($_GET['getdate']) && ($_GET['getdate'] !== '')) {
+ $getdate = $_GET['getdate'];
+ } else {
+ $getdate = date('Ymd', time() + $second_offset);
+ }
+}
+
+preg_match ("/([0-9]{4})([0-9]{2})([0-9]{2})/", $getdate, $day_array2);
+$this_day = $day_array2[3];
+$this_month = $day_array2[2];
+$this_year = $day_array2[1];
+
+# set bounds on master_array
+# mktime int mktime ( [int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst]]]]]]] )
+$start_month = $this_month - 1;
+$start_year = $this_year;
+$end_month = $this_month + 1;
+$end_year = $this_year;
+if ($this_month == 1){
+ $start_month = 12;
+ $start_year--;
+}
+if ($this_month == 12){
+ $end_month = 1;
+ $end_year++;
+}
+switch ($current_view){
+ case 'month':
+ case 'week':
+ case 'day':
+ $mArray_begin = mktime (0,0,0,$start_month,21,($start_year));
+ $mArray_end = mktime (0,0,0,$end_month,12,($end_year));
+ break;
+ default:
+ $mArray_begin = mktime (0,0,0,12,21,($this_year - 1));
+ $mArray_end = mktime (0,0,0,1,12,($this_year + 1));
+}
diff --git a/functions/init/sanitize.php b/functions/init/sanitize.php
new file mode 100644
index 0000000..db21021
--- /dev/null
+++ b/functions/init/sanitize.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Sanitizes variables and arrays in a recursive manner
+ *
+ * This method was created as a result of strip_tags() happening on an array
+ * would destroy the contents of the array. Thus, in order to avoid this from
+ * happening we need checks to see if something is an array and to process
+ * it as such.
+ *
+ * The only sanitizing this method provides is stripping non-allowed tags.
+ *
+ * @author Christopher Weldon <cweldon@tamu.edu>
+ * @param mixed $value Value to be sanitized
+ * @return mixed
+ */
+function recursiveSanitize($value) {
+ if (is_array($value)) {
+ $valmod = array();
+ foreach ($value as $key => $subval) {
+ if (is_array($subval)) {
+ $subval = recursiveSanitize($subval);
+ } else {
+ $subval = strip_tags($subval);
+ }
+ $valmod[$key] = $subval;
+ }
+ $value = $valmod;
+ } else {
+ $value = strip_tags($value);
+ }
+
+ return $value;
+}
+
+if (!isset($_SERVER) && isset($HTTP_SERVER_VARS)) {
+ $_SERVER = &$HTTP_SERVER_VARS;
+}
+
+foreach ($_REQUEST as $key=>$val){
+ switch ($key){
+ case 'event_data':
+ # modify this to allow or disallow different HTML tags in event popups
+ $allowed = "<p><br><b><i><em><a><img><div><span><ul><ol><li><h1><h2><h3><h4><h5><h6><hr><em><strong><small><table><tr><td><th>";
+ $val = strip_tags($val,$allowed);
+ break;
+ default:
+ # cpath
+ $val = recursiveSanitize($val);
+ }
+
+ $_REQUEST[$key] = $val;
+}
+foreach ($_POST as $key=>$val){
+ switch ($key){
+ case 'action':
+ $actions = array('login','logout','addupdate','delete');
+ if (!in_array($val,$actions)) $val = '';
+ break;
+ case 'date':
+ case 'time':
+ if (!is_numeric($val)) $val = '';
+ break;
+ default:
+ $val = recursiveSanitize($val);
+ }
+ $_POST[$key] = $val;
+
+}
+foreach ($_GET as $key=>$val){
+ switch ($key){
+ case 'cal':
+ if (!is_array($val)){
+ $val = strip_tags($val);
+ $_GET['cal'] = strip_tags($val);
+ }else{
+ unset ($_GET['cal']);
+ foreach($val as $cal){
+ $_GET['cal'][]= strip_tags($cal);
+ }
+ }
+ break;
+ case 'getdate':
+ if (!is_numeric($val)) $val = '';
+ break;
+ default:
+ $val = recursiveSanitize($val);
+ }
+ if ($key != 'cal') $_GET[$key] = $val;
+
+}
+foreach ($_COOKIE as $key=>$val){
+ switch ($key){
+ case 'time':
+ if (!is_numeric($val)) $val = '';
+ break;
+ default:
+ $val = recursiveSanitize($val);
+ }
+ $_COOKIE[$key] = $val;
+}
+?> \ No newline at end of file
diff --git a/functions/init/set_error_reporting.php b/functions/init/set_error_reporting.php
new file mode 100644
index 0000000..91e491d
--- /dev/null
+++ b/functions/init/set_error_reporting.php
@@ -0,0 +1,9 @@
+<?php
+/* set error reporting
+config boolean $verbose_errors = false by default
+
+*/
+// uncomment when developing, comment for shipping version
+error_reporting (E_ERROR | E_WARNING | E_PARSE);
+#error_reporting(0);
+// Older versions of PHP do not define $_SERVER. Define it here instead.
diff --git a/functions/parse/end_vevent.php b/functions/parse/end_vevent.php
new file mode 100644
index 0000000..95bdd94
--- /dev/null
+++ b/functions/parse/end_vevent.php
@@ -0,0 +1,634 @@
+<?php
+/* end_vevent.php
+
+What happens in this file:
+1. Initialization
+2.
+*/
+
+if (!isset($url)) $url = '';
+if (!isset($type)) $type = '';
+
+// Handle DURATION
+if (!isset($end_unixtime)) {
+ if(!isset($the_duration)) $the_duration = 0;
+ $end_unixtime = $start_unixtime + $the_duration;
+ $end_time = date ('Hi', $end_unixtime);
+}
+
+// CLASS support
+if (isset($class)) {
+ if ($class == 'PRIVATE') {
+ $summary ='**PRIVATE**';
+ $description ='**PRIVATE**';
+ } elseif ($class == 'CONFIDENTIAL') {
+ $summary ='**CONFIDENTIAL**';
+ $description ='**CONFIDENTIAL**';
+ }
+}
+
+// make sure we have some value for $uid
+if (!isset($uid)) {
+ $uid = $uid_counter;
+ $uid_counter++;
+ $uid_valid = false;
+} else {
+ $uid_valid = true;
+}
+
+if (!isset($summary)) $summary = '';
+if (!isset($description)) $description = '';
+if (!isset($status)) $status = '';
+if (!isset($class)) $class = '';
+if (!isset($location)) $location = '';
+
+
+# adjust event start and end times
+if (isset($start_time) && isset($end_time)) {
+ // Mozilla style all-day events or just really long events
+ if (($end_time - $start_time) > 2345) {
+ $allday_start = $start_date;
+ $allday_end = ($start_date + 1);
+ }
+}
+
+# look for events that span more than one day
+if (isset($start_unixtime,$end_unixtime) && date('Ymd',$start_unixtime) != date('Ymd',$end_unixtime)) {
+ $spans_day = true;
+ $bleed_check = (($start_unixtime - $end_unixtime) < (60*60*24)) ? '-1' : '0';
+} else {
+ $spans_day = false;
+ $bleed_check = 0;
+}
+
+# get hour and minute adjusted to allowed grid times
+if (isset($start_time) && $start_time != '') {
+ preg_match ('/([0-9]{2})([0-9]{2})/', $start_time, $time);
+ preg_match ('/([0-9]{2})([0-9]{2})/', $end_time, $time2);
+ if (isset($start_unixtime) && isset($end_unixtime)) {
+ $length = $end_unixtime - $start_unixtime;
+ } else {
+ $length = ($time2[1]*60+$time2[2]) - ($time[1]*60+$time[2]);
+ }
+
+ $drawKey = drawEventTimes($start_time, $end_time);
+ preg_match ('/([0-9]{2})([0-9]{2})/', $drawKey['draw_start'], $time3);
+ $hour = $time3[1];
+ $minute = $time3[2];
+}
+
+// RECURRENCE-ID Support
+if (isset($recurrence_d)) {
+
+ $recurrence_delete["$recurrence_d"]["$recurrence_t"] = $uid;
+}
+
+
+# treat nonrepeating events as rrule events with one instance
+if (!isset($rrule_array) && $start_unixtime < $mArray_end && $end_unixtime > $mArray_begin){
+ $rrule_array['FREQ'] = 'YEARLY';
+ $rrule_array['START_DATE'] = $start_date;
+ $rrule_array['UNTIL'] = $start_date;
+ $rrule_array['END'] = 'end';
+}
+
+
+if (isset($allday_start) && $allday_start != '') {
+ $hour = '-';
+ $minute = '1';
+ $rrule_array['START_DAY'] = $allday_start;
+ # $rrule_array['END_DAY'] = $allday_end; # this doesn't seem to be used anywhere.
+ $rrule_array['END'] = 'end';
+ $recur_start = $allday_start;
+ $start_date = $allday_start;
+ if (isset($allday_end)) {
+ $diff_allday_days = dayCompare($allday_end, $allday_start);
+ } else {
+ $diff_allday_days = 1;
+ }
+} else {
+ $rrule_array['START_DATE'] = $start_date;
+ $rrule_array['START_TIME'] = $start_time;
+ $rrule_array['END_TIME'] = $end_time;
+ $rrule_array['END'] = 'end';
+}
+
+$start_date_time = strtotime($start_date);
+if (!isset($fromdate)){
+ #this should happen if not in one of the rss views
+ $this_month_start_time = strtotime($this_year.$this_month.'01');
+ if ($current_view == 'year' || ($save_parsed_cals == 'yes' && !$is_webcal)|| $current_view == 'print' && $printview == 'year') {
+ $start_range_time = strtotime($this_year.'-01-01 -2 weeks');
+ $end_range_time = strtotime($this_year.'-12-31 +2 weeks');
+ } else {
+ $start_range_time = strtotime('-1 month -2 day', $this_month_start_time);
+ $end_range_time = strtotime('+2 month +2 day', $this_month_start_time);
+ }
+}else{
+ $start_range_time = strtotime($fromdate);
+ $end_range_time = strtotime($todate)+60*60*24;
+}
+
+$freq_type = 'year';
+foreach ($rrule_array as $key => $val) {
+ switch($key) {
+ case 'FREQ':
+ switch ($val) {
+ case 'YEARLY': $freq_type = 'year'; break;
+ case 'MONTHLY': $freq_type = 'month'; break;
+ case 'WEEKLY': $freq_type = 'week'; break;
+ case 'DAILY': $freq_type = 'day'; break;
+ case 'HOURLY': $freq_type = 'hour'; break;
+ case 'MINUTELY': $freq_type = 'minute'; break;
+ case 'SECONDLY': $freq_type = 'second'; break;
+ }
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = strtolower($val);
+ break;
+ case 'COUNT':
+ $count = $val;
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $count;
+ break;
+ case 'UNTIL':
+ $until = str_replace('T', '', $val);
+ $until = str_replace('Z', '', $until);
+ if (strlen($until) == 8) $until = $until.'235959';
+ $abs_until = $until;
+ ereg ('([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})', $until, $regs);
+ $until = mktime($regs[4],$regs[5],$regs[6],$regs[2],$regs[3],$regs[1]);
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = localizeDate($dateFormat_week,$until);
+ break;
+ case 'INTERVAL':
+ if ($val > 0){
+ $number = $val;
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $number;
+ }
+ break;
+ case 'BYSECOND':
+ $bysecond = $val;
+ $bysecond = split (',', $bysecond);
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $bysecond;
+ break;
+ case 'BYMINUTE':
+ $byminute = $val;
+ $byminute = split (',', $byminute);
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byminute;
+ break;
+ case 'BYHOUR':
+ $byhour = $val;
+ $byhour = split (',', $byhour);
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byhour;
+ break;
+ case 'BYDAY':
+ $byday = $val;
+ $byday = split (',', $byday);
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byday;
+ break;
+ case 'BYMONTHDAY':
+ $bymonthday = $val;
+ $bymonthday = split (',', $bymonthday);
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $bymonthday;
+ break;
+ case 'BYYEARDAY':
+ $byyearday = $val;
+ $byyearday = split (',', $byyearday);
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byyearday;
+ break;
+ case 'BYWEEKNO':
+ $byweekno = $val;
+ $byweekno = split (',', $byweekno);
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $byweekno;
+ break;
+ case 'BYMONTH':
+ $bymonth = $val;
+ $bymonth = split (',', $bymonth);
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $bymonth;
+ break;
+ case 'BYSETPOS':
+ $bysetpos = $val;
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $bysetpos;
+ break;
+ case 'WKST':
+ $wkst = $val;
+ $recur_array[($start_date)][($hour.$minute)][$uid]['recur'][$key] = $wkst;
+ break;
+ case 'END':
+
+ $recur = $recur_array[($start_date)][($hour.$minute)][$uid]['recur'];
+
+ // Modify the COUNT based on BYDAY
+ if ((isset ($byday) && is_array($byday)) && (isset($count))) {
+ $blah = sizeof($byday);
+ $count = ($count / $blah);
+ unset ($blah);
+ }
+
+ if (!isset($number)) $number = 1;
+ // if $until isn't set yet, we set it to the end of our range we're looking at
+
+ if (!isset($until)) $until = $end_range_time;
+ if (!isset($abs_until)) $abs_until = date('YmdHis', $end_range_time);
+ $end_date_time = $until;
+ $start_range_time_tmp = $start_range_time;
+ $end_range_time_tmp = $end_range_time;
+
+ // 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_tmp >= $start_date_time && $start_range_time_tmp <= $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_tmp < $start_date_time){
+ $start_range_time_tmp = $start_date_time;
+ }
+ if ($end_range_time_tmp > $end_date_time) $end_range_time_tmp = $end_date_time;
+
+ // initialize the time we will increment
+ $next_range_time = $start_range_time_tmp;
+
+ // FIXME: This is a hack to fix repetitions with $interval > 1
+ if ($count > 1 && $number > 1) $count = 1 + ($count - 1) * $number;
+
+ $count_to = 0;
+ // start at the $start_range and go until we hit the end of our range.
+ if(!isset($wkst)) $wkst='SU';
+ $wkst3char = two2threeCharDays($wkst);
+
+ # set first instance if it's in range
+ if ($start_unixtime < $mArray_end && $end_unixtime > $mArray_begin){
+ $recur_data[] = $start_unixtime;
+ }
+ while (($next_range_time >= $start_range_time_tmp) && ($next_range_time <= $end_range_time_tmp) && ($count_to != $count)) {
+ $func = $freq_type.'Compare';
+ $diff = $func(date('Ymd',$next_range_time), $start_date);
+ if ($diff < $count) {
+ if ($diff % $number == 0) {
+ $interval = $number;
+ switch ($rrule_array['FREQ']) {
+ case 'DAILY':
+ $next_date_time = $next_range_time;
+ $recur_data[] = $next_date_time;
+ break;
+ case 'WEEKLY':
+ // Populate $byday with the default day if it's not set.
+ if (!isset($byday)) {
+ $byday[] = strtoupper(substr(date('D', $start_date_time), 0, 2));
+ }
+ if (is_array($byday)) {
+ foreach($byday as $day) {
+ $day = two2threeCharDays($day);
+ #need to find the first day of the appropriate week.
+ #dateOfweek uses weekstartday as a global variable. This has to be changed to $wkst,
+ #but then needs to be reset for other functions
+ $week_start_day_tmp = $week_start_day;
+ $week_start_day = $wkst3char;
+
+ $the_sunday = dateOfWeek(date("Ymd",$next_range_time), $wkst3char);
+ $next_date_time = strtotime($day,strtotime($the_sunday)) + (12 * 60 * 60);
+ $week_start_day = $week_start_day_tmp; #see above reset to global value
+
+ #reset $next_range_time to first instance in this week.
+ if ($next_date_time < $next_range_time){
+ $next_range_time = $next_date_time;
+ }
+ // Since this renders events from $next_range_time to $next_range_time + 1 week, I need to handle intervals
+ // as well. This checks to see if $next_date_time is after $day_start (i.e., "next week"), and thus
+ // if we need to add $interval weeks to $next_date_time.
+ if ($next_date_time > strtotime($week_start_day, $next_range_time) && $interval > 1) {
+ # $next_date_time = strtotime('+'.($interval - 1).' '.$freq_type, $next_date_time);
+ }
+ $recur_data[] = $next_date_time;
+ }
+ }
+ break;
+ case 'MONTHLY':
+ if (empty($bymonth)) $bymonth = array(1,2,3,4,5,6,7,8,9,10,11,12);
+ $next_range_time = strtotime(date('Y-m-01', $next_range_time));
+ $next_date_time = $next_date_time;
+ if (isset($bysetpos)){
+ /* bysetpos code from dustinbutler
+ start on day 1 or last day.
+ if day matches any BYDAY the count is incremented.
+ SETPOS = 4, need 4th match
+ SETPOS = -1, need 1st match
+ */
+ $year = date('Y', $next_range_time);
+ $month = date('m', $next_range_time);
+ if ($bysetpos > 0) {
+ $next_day = '+1 day';
+ $day = 1;
+ } else {
+ $next_day = '-1 day';
+ $day = $totalDays[$month];
+ }
+ $day = mktime(0, 0, 0, $month, $day, $year);
+ $countMatch = 0;
+ while ($countMatch != abs($bysetpos)) {
+ /* Does this day match a BYDAY value? */
+ $thisDay = $day;
+ $textDay = strtoupper(substr(date('D', $thisDay), 0, 2));
+ if (in_array($textDay, $byday)) {
+ $countMatch++;
+ }
+ $day = strtotime($next_day, $thisDay);
+ }
+ $recur_data[] = $thisDay;
+ }elseif ((isset($bymonthday)) && (!isset($byday))) {
+ foreach($bymonthday as $day) {
+ if ($day < 0) $day = ((date('t', $next_range_time)) + ($day)) + 1;
+ $year = date('Y', $next_range_time);
+ $month = date('m', $next_range_time);
+ if (checkdate($month,$day,$year)) {
+ $next_date_time = mktime(0,0,0,$month,$day,$year);
+ $recur_data[] = $next_date_time;
+ }
+ }
+ } elseif (is_array($byday)) {
+ foreach($byday as $day) {
+ ereg ('([-\+]{0,1})?([0-9]{1})?([A-Z]{2})', $day, $byday_arr);
+ //Added for 2.0 when no modifier is set
+ if ($byday_arr[2] != '') {
+ $nth = $byday_arr[2]-1;
+ } else {
+ $nth = 0;
+ }
+ $on_day = two2threeCharDays($byday_arr[3]);
+ $on_day_num = two2threeCharDays($byday_arr[3],false);
+ if ((isset($byday_arr[1])) && ($byday_arr[1] == '-')) {
+ $last_day_tmp = date('t',$next_range_time);
+ $next_range_time = strtotime(date('Y-m-'.$last_day_tmp, $next_range_time));
+ $last_tmp = (date('w',$next_range_time) == $on_day_num) ? '' : 'last ';
+ $next_date_time = strtotime($last_tmp.$on_day, $next_range_time) - ($nth * 604800);
+ $month = date('m', $next_date_time);
+ if (in_array($month, $bymonth)) {
+ $recur_data[] = $next_date_time;
+ }
+ #reset next_range_time to start of month
+ $next_range_time = strtotime(date('Y-m-'.'1', $next_range_time));
+
+ } elseif (isset($bymonthday) && (!empty($bymonthday))) {
+ // This supports MONTHLY where BYDAY and BYMONTH are both set
+ foreach($bymonthday as $day) {
+ $year = date('Y', $next_range_time);
+ $month = date('m', $next_range_time);
+ if (checkdate($month,$day,$year)) {
+ $next_date_time = mktime(0,0,0,$month,$day,$year);
+ $daday = strtolower(strftime("%a", $next_date_time));
+ if ($daday == $on_day && in_array($month, $bymonth)) {
+ $recur_data[] = $next_date_time;
+ }
+ }
+ }
+ } elseif ((isset($byday_arr[1])) && ($byday_arr[1] != '-')) {
+ $next_date_time = strtotime($on_day, strtotime($on_day, $next_range_time) + $nth * 604800);
+ $month = date('m', $next_date_time);
+ if (in_array($month, $bymonth)) {
+ if (isset($next_date_time) && $next_date_time != '') $recur_data[] = $next_date_time;
+ }
+ }
+ $next_date = date('Ymd', $next_date_time);
+ }
+ }
+ break;
+ case 'YEARLY':
+ if ((!isset($bymonth)) || (sizeof($bymonth) == 0)) {
+ $m = date('m', $start_date_time);
+ $bymonth = array("$m");
+ }
+
+ foreach($bymonth as $month) {
+ // Make sure the month & year used is within the start/end_range.
+ if ($month < date('m', $next_range_time)) {
+ $year = date('Y', $next_range_time);
+ } else {
+ $year = date('Y', $next_range_time);
+ }
+ if (isset($bysetpos)){
+ /* bysetpos code from dustinbutler
+ start on day 1 or last day.
+ if day matches any BYDAY the count is incremented.
+ SETPOS = 4, need 4th match
+ SETPOS = -1, need 1st match
+ */
+ if ($bysetpos > 0) {
+ $next_day = '+1 day';
+ $day = 1;
+ } else {
+ $next_day = '-1 day';
+ $day = date("t",$month);
+ }
+ $day = mktime(12, 0, 0, $month, $day, $year);
+ $countMatch = 0;
+ while ($countMatch != abs($bysetpos)) {
+ /* Does this day match a BYDAY value? */
+ $thisDay = $day;
+ $textDay = strtoupper(substr(date('D', $thisDay), 0, 2));
+ if (in_array($textDay, $byday)) {
+ $countMatch++;
+ }
+ $day = strtotime($next_day, $thisDay);
+ }
+ $recur_data[] = $thisDay;
+ }
+ if ((isset($byday)) && (is_array($byday))) {
+ $checkdate_time = mktime(0,0,0,$month,1,$year);
+ foreach($byday as $day) {
+ ereg ('([-\+]{0,1})?([0-9]{1})?([A-Z]{2})', $day, $byday_arr);
+ if ($byday_arr[2] != '') {
+ $nth = $byday_arr[2]-1;
+ } else {
+ $nth = 0;
+ }
+ $on_day = two2threeCharDays($byday_arr[3]);
+ $on_day_num = two2threeCharDays($byday_arr[3],false);
+ if ($byday_arr[1] == '-') {
+ $last_day_tmp = date('t',$checkdate_time);
+ $checkdate_time = strtotime(date('Y-m-'.$last_day_tmp, $checkdate_time));
+ $last_tmp = (date('w',$checkdate_time) == $on_day_num) ? '' : 'last ';
+ $next_date_time = strtotime($last_tmp.$on_day.' -'.$nth.' week', $checkdate_time);
+ } else {
+ $next_date_time = strtotime($on_day.' +'.$nth.' week', $checkdate_time);
+ }
+ }
+ } else {
+ $day = date('d', $start_date_time);
+ $next_date_time = mktime(0,0,0,$month,$day,$year+1);
+ //echo date('Ymd',$next_date_time).$summary.'<br>';
+ }
+ if (isset($next_date_time) && $next_date_time != '') $recur_data[] = $next_date_time;
+ }
+ if (isset($byyearday)) {
+ foreach ($byyearday as $yearday) {
+ ereg ('([-\+]{0,1})?([0-9]{1,3})', $yearday, $byyearday_arr);
+ if ($byyearday_arr[1] == '-') {
+ $ydtime = mktime(0,0,0,12,31,$this_year);
+ $yearnum = $byyearday_arr[2] - 1;
+ $next_date_time = strtotime('-'.$yearnum.' days', $ydtime);
+ } else {
+ $ydtime = mktime(0,0,0,1,1,$this_year);
+ $yearnum = $byyearday_arr[2] - 1;
+ $next_date_time = strtotime('+'.$yearnum.' days', $ydtime);
+ }
+ if (isset($next_date_time) && $next_date_time != '') $recur_data[] = $next_date_time;
+ }
+ }
+ break;
+ default:
+ // anything else we need to end the loop
+ $next_range_time = $end_range_time_tmp + 100;
+ $count_to = $count;
+ }
+ } else {
+ $interval = 1;
+ }
+ $next_range_time = strtotime('+'.$interval.' '.$freq_type, $next_range_time);
+ } else {
+ // end the loop because we aren't going to write this event anyway
+ $count_to = $count;
+ }
+ // use the same code to write the data instead of always changing it 5 times
+ if (isset($recur_data) && is_array($recur_data)) {
+ $recur_data_hour = @substr($start_time,0,2);
+ $recur_data_minute = @substr($start_time,2,2);
+ foreach($recur_data as $recur_data_time) {
+ $recur_data_year = date('Y', $recur_data_time);
+ $recur_data_month = date('m', $recur_data_time);
+ $recur_data_day = date('d', $recur_data_time);
+ $recur_data_date = $recur_data_year.$recur_data_month.$recur_data_day;
+ if (($recur_data_time >= $start_date_time) && ($recur_data_time <= $end_date_time) && ($count_to != $count) && !in_array($recur_data_date, $except_dates)) {
+ if (isset($allday_start) && $allday_start != '') {
+ $start_time2 = $recur_data_time;
+ $end_time2 = strtotime('+'.$diff_allday_days.' days', $recur_data_time);
+ while ($start_time2 < $end_time2) {
+ $start_date2 = date('Ymd', $start_time2);
+ $master_array[($start_date2)][('-1')][$uid] = array (
+ 'event_text' => $summary,
+ 'description' => $description,
+ 'location' => $location,
+ 'organizer' => serialize($organizer),
+ 'attendee' => serialize($attendee),
+ 'calnumber' => $calnumber,
+ 'calname' => $actual_calname,
+ 'url' => $url,
+ 'status' => $status,
+ 'class' => $class,
+ 'recur' => $recur );
+ $start_time2 = strtotime('+1 day', $start_time2);
+ }
+ } else {
+ $start_unixtime_tmp = mktime($recur_data_hour,$recur_data_minute,0,$recur_data_month,$recur_data_day,$recur_data_year);
+ $end_unixtime_tmp = $start_unixtime_tmp + $length;
+
+ if (($end_time >= $bleed_time) && ($bleed_check == '-1')) {
+ $start_tmp = strtotime(date('Ymd',$start_unixtime_tmp));
+ $end_date_tmp = date('Ymd',$end_unixtime_tmp);
+ while ($start_tmp < $end_unixtime_tmp) {
+ $start_date_tmp = date('Ymd',$start_tmp);
+ if ($start_date_tmp == $recur_data_year.$recur_data_month.$recur_data_day) {
+ $time_tmp = $hour.$minute;
+ $start_time_tmp = $start_time;
+ } else {
+ $time_tmp = '0000';
+ $start_time_tmp = '0000';
+ }
+ if ($start_date_tmp == $end_date_tmp) {
+ $end_time_tmp = $end_time;
+ } else {
+ $end_time_tmp = '2400';
+ $display_end_tmp = $end_time;
+ }
+
+ // Let's double check the until to not write past it
+ $until_check = $start_date_tmp.$time_tmp.'00';
+ if ($abs_until > $until_check) {
+ $master_array[$start_date_tmp][$time_tmp][$uid] = array (
+ 'event_start' => $start_time_tmp,
+ 'event_end' => $end_time_tmp,
+ 'start_unixtime' => $start_unixtime_tmp,
+ 'end_unixtime' => $end_unixtime_tmp,
+ 'event_text' => $summary,
+ 'event_length' => $length,
+ 'event_overlap' => 0,
+ 'description' => $description,
+ 'status' => $status,
+ 'class' => $class,
+ 'spans_day' => true,
+ 'location' => $location,
+ 'organizer' => serialize($organizer),
+ 'attendee' => serialize($attendee),
+ 'calnumber' => $calnumber,
+ 'calname' => $actual_calname,
+ 'url' => $url,
+ 'recur' => $recur);
+ if (isset($display_end_tmp)){
+ $master_array[$start_date_tmp][$time_tmp][$uid]['display_end'] = $display_end_tmp;
+ }
+ checkOverlap($start_date_tmp, $time_tmp, $uid);
+ }
+ $start_tmp = strtotime('+1 day',$start_tmp);
+ }
+ } else {
+ if ($bleed_check == '-1') {
+ $display_end_tmp = $end_time;
+ $end_time_tmp1 = '2400';
+
+ }
+ if (!isset($end_time_tmp1)) $end_time_tmp1 = $end_time;
+
+ // Let's double check the until to not write past it
+ $until_check = $recur_data_date.$hour.$minute.'00';
+ if ($abs_until > $until_check) {
+ $master_array[($recur_data_date)][($hour.$minute)][$uid] = array (
+ 'event_start' => $start_time,
+ 'event_end' => $end_time_tmp1,
+ 'start_unixtime' => $start_unixtime_tmp,
+ 'end_unixtime' => $end_unixtime_tmp,
+ 'event_text' => $summary,
+ 'event_length' => $length,
+ 'event_overlap' => 0,
+ 'description' => $description,
+ 'status' => $status,
+ 'class' => $class,
+ 'spans_day' => false,
+ 'location' => $location,
+ 'organizer' => serialize($organizer),
+ 'attendee' => serialize($attendee),
+ 'calnumber' => $calnumber,
+ 'calname' => $actual_calname,
+ 'url' => $url,
+ 'recur' => $recur);
+ if (isset($display_end_tmp)){
+ $master_array[($recur_data_date)][($hour.$minute)][$uid]['display_end'] = $display_end_tmp;
+ }
+ checkOverlap($recur_data_date, ($hour.$minute), $uid);
+ }
+ }
+ }
+ }
+ }
+ }
+ } #end while loop
+ } # end if time compare
+ unset($recur_data);
+ } # end switch $key (rrule type)
+} # end foreach rrule
+
+
+// This should remove any exdates that were missed.
+// Added for version 0.9.5 modified in 2.22 remove anything that doesn't have an event_start
+if (is_array($except_dates)) {
+ foreach ($except_dates as $key => $value) {
+ if (isset ($master_array[$value])){
+ foreach ($master_array[$value] as $time => $value2){
+ if (!isset($value2[$uid]['event_start'])){
+ unset($master_array[$value][$time][$uid]);
+ }
+ }
+ }
+ }
+}
+
+// Clear event data now that it's been saved.
+unset($start_time, $start_time_tmp, $end_time, $end_time_tmp, $start_unixtime, $start_unixtime_tmp, $end_unixtime, $end_unixtime_tmp, $summary, $length, $description, $status, $class, $location, $organizer, $attendee);
+
+?> \ No newline at end of file
diff --git a/functions/parse/overlapping_events.php b/functions/parse/overlapping_events.php
new file mode 100644
index 0000000..9595c83
--- /dev/null
+++ b/functions/parse/overlapping_events.php
@@ -0,0 +1,274 @@
+<?php
+// function to determine maximum necessary columns per day
+// actually an algorithm to get the smallest multiple for two numbers
+function kgv($a, $b) {
+ $x = $a;
+ $y = $b;
+ while ($x != $y) {
+ if ($x < $y) $x += $a;
+ else $y += $b;
+ }
+ return $x;
+}
+
+// merge a given range into $ol_ranges. Returns the merged $ol_ranges.
+// if count = -2, treat as a "delete" call (for removeOverlap)
+// Why -2? That way, there's less fudging of the math in the code.
+function merge_range($ol_ranges, $start, $end, $count = 0) {
+
+ foreach ($ol_ranges as $loop_range_key => $loop_range) {
+
+ if ($start < $end) {
+ // handle ranges between $start and $loop_range['start']
+ if ($start < $loop_range['start']) {
+ $new_ol_ranges[] = array('count' => $count, 'start' => $start, 'end' => min($loop_range['start'], $end));
+ $start = $loop_range['start'];
+ }
+
+ // $start is always >= $loop_range['start'] at this point.
+ // handles ranges between $loop_range['start'] and $loop_range['end']
+ if ($loop_range['start'] < $end && $start < $loop_range['end']) {
+ // handles ranges between $loop_range['start'] and $start
+ if ($loop_range['start'] < $start) {
+ $new_ol_ranges[] = array('count' => $loop_range['count'], 'start' => $loop_range['start'], 'end' => $start);
+ }
+ // handles ranges between $start and $end (where they're between $loop_range['start'] and $loop_range['end'])
+ $new_count = $loop_range['count'] + $count + 1;
+ if ($new_count >= 0) {
+ $new_ol_ranges[] = array('count' => $new_count, 'start' => $start, 'end' => min($loop_range['end'], $end));
+ }
+ // handles ranges between $end and $loop_range['end']
+ if ($loop_range['end'] > $end) {
+ $new_ol_ranges[] = array('count' => $loop_range['count'], 'start' => $end, 'end' => $loop_range['end']);
+ }
+ $start = $loop_range['end'];
+ } else {
+ $new_ol_ranges[] = $loop_range;
+ }
+ } else {
+ $new_ol_ranges[] = $loop_range;
+ }
+ }
+
+ // Catches anything left over.
+ if ($start < $end) {
+ $new_ol_ranges[] = array('count' => $count, 'start' => $start, 'end' => $end);
+ }
+
+ return $new_ol_ranges;
+}
+
+// Finds the highest value of 'count' in $ol_ranges
+function find_max_overlap($ol_ranges) {
+
+ $count = 0;
+ foreach ($ol_ranges as $loop_range) {
+ if ($count < $loop_range['count'])
+ $count = $loop_range['count'];
+ }
+
+ return $count;
+}
+
+// Merges overlapping blocks
+function flatten_ol_blocks($event_date, $ol_blocks, $new_block_key) {
+
+ global $master_array;
+
+ // Loop block = each other block in the array, the ones we're merging into new block.
+ // New block = the changed block that caused the flatten_ol_blocks call. Everything gets merged into this.
+ $new_block = $ol_blocks[$new_block_key];
+ reset($ol_blocks);
+ while ($loop_block_array = each($ol_blocks)) {
+ $loop_block_key = $loop_block_array['key'];
+ $loop_block = $loop_block_array['value'];
+ // only compare with other blocks
+ if ($loop_block_key != $new_block_key) {
+ // check if blocks overlap
+ if (($loop_block['blockStart'] < $new_block['blockEnd']) && ($loop_block['blockEnd'] > $new_block['blockStart'])) {
+ // define start and end of merged overlap block
+ if ($new_block['blockStart'] > $loop_block['blockStart']) $ol_blocks[$new_block_key]['blockStart'] = $loop_block['blockStart'];
+ if ($new_block['blockEnd'] < $loop_block['blockEnd']) $ol_blocks[$new_block_key]['blockEnd'] = $loop_block['blockEnd'];
+ $ol_blocks[$new_block_key]['events'] = array_merge($new_block['events'], $loop_block['events']);
+ $new_block['events'] = $ol_blocks[$new_block_key]['events'];
+ foreach ($loop_block['overlapRanges'] as $ol_range) {
+ $new_block['overlapRanges'] = merge_range($new_block['overlapRanges'], $ol_range['start'], $ol_range['end'], $ol_range['count']);
+ }
+ $ol_blocks[$new_block_key]['overlapRanges'] = $new_block['overlapRanges'];
+ $ol_blocks[$new_block_key]['maxOverlaps'] = find_max_overlap($new_block['overlapRanges']);
+ foreach ($ol_blocks[$new_block_key]['events'] as $event) {
+ $master_array[$event_date][$event['time']][$event['key']]['event_overlap'] = $ol_blocks[$new_block_key]['maxOverlaps'];
+ }
+ unset($ol_blocks[$loop_block_key]);
+ reset($ol_blocks);
+ }
+ }
+ }
+
+ return $ol_blocks;
+}
+
+// Builds $overlap_array structure, and updates event_overlap in $master_array for the given events.
+function checkOverlap($event_date, $event_time, $uid) {
+ global $master_array, $overlap_array;
+ if (!isset($event_date)) return;
+ $event = $master_array[$event_date][$event_time][$uid];
+ // Copy out the array - we replace this at the end.
+ $ol_day_array = $overlap_array[$event_date];
+ $drawTimes = drawEventTimes($event['event_start'], $event['event_end']);
+
+ // For a given date,
+ // - check to see if the event's already in a block, and if so, add it.
+ // - make sure the new block doesn't overlap another block, and if so, merge the blocks.
+ // - check that there aren't any events we already passed that we should handle.
+ // - "flatten" the structure again, merging the blocks.
+
+ // $overlap_array structure:
+ // array of ($event_dates)
+ // array of unique overlap blocks (no index) -
+
+ // $overlap_block structure
+ // 'blockStart' - $start_time of block - earliest $start_time of the events in the block.
+ // Shouldn't be any overlap w/ a different overlap block in that day (as if they overlap, they get merged).
+ // 'blockEnd' - $end_time of block - latest $end_time of the events in the block.
+ // 'maxOverlaps' - max number of overlaps for the whole block (highest 'count' in overlapRanges)
+ // 'events' - array of event "pointers" (no index) - each event in the block.
+ // 'time' - $start_time of event in the block
+ // 'key' - $uid of event
+ // 'overlapRanges' - array of time ranges + overlap counts (no index) - the specific overlap info.
+ // Shouldn't be any overlap w/ the overlap ranges in a given overlap_block - if there is overlap, the block should be split.
+ // 'count' - number of overlaps that time range (can be zero if that range has no overlaps).
+ // 'start' - start_time for the overlap block.
+ // 'end' - end_time for the overlap block.
+
+ $ol_day_array = $overlap_array[$event_date];
+ // Track if $event has been merged in, so we don't re-add the details to 'event' or 'overlapRanges' multiple times.
+ $already_merged_once = false;
+ // First, check the existing overlap blocks, see if the event overlaps with any.
+ if (isset($ol_day_array)) {
+ foreach ($ol_day_array as $loop_block_key => $loop_ol_block) {
+ // Should $event be in this $ol_block? If so, add it.
+ if ($loop_ol_block['blockStart'] < $drawTimes['draw_end'] && $loop_ol_block['blockEnd'] > $drawTimes['draw_start']) {
+ // ... unless it's already in the $ol_block
+ if (!in_array(array('time' => $drawTimes['draw_start'], 'key' => $uid), $loop_ol_block['events'])) {
+ $loop_ol_block['events'][] = array('time' => $drawTimes['draw_start'], 'key' => $uid);
+ if ($loop_ol_block['blockStart'] > $drawTimes['draw_start']) $loop_ol_block['blockStart'] = $drawTimes['draw_start'];
+ if ($loop_ol_block['blockEnd'] < $drawTimes['draw_end']) $loop_ol_block['blockEnd'] = $drawTimes['draw_end'];
+
+ // Merge in the new overlap range
+ $loop_ol_block['overlapRanges'] = merge_range($loop_ol_block['overlapRanges'], $drawTimes['draw_start'], $drawTimes['draw_end']);
+ $loop_ol_block['maxOverlaps'] = find_max_overlap($loop_ol_block['overlapRanges']);
+ foreach ($loop_ol_block['events'] as $max_overlap_event) {
+ $master_array[$event_date][$max_overlap_event['time']][$max_overlap_event['key']]['event_overlap'] = $loop_ol_block['maxOverlaps'];
+ }
+ $ol_day_array[$loop_block_key] = $loop_ol_block;
+ $ol_day_array = flatten_ol_blocks($event_date, $ol_day_array, $loop_block_key);
+ $already_merged_once = true;
+ break;
+ // Handle repeat calls to checkOverlap - semi-bogus since the event shouldn't be created more than once, but this makes sure we don't get an invalid event_overlap.
+ } else {
+ $master_array[$event_date][$event_time][$uid]['event_overlap'] = $loop_ol_block['maxOverlaps'];
+ }
+ }
+ }
+ }
+
+ // Then, check all the events, make sure there isn't a new overlap that we need to create.
+ foreach ($master_array[$event_date] as $time_key => $time) {
+ // Skip all-day events for overlap purposes.
+ if ($time_key != '-1') {
+ foreach ($time as $loop_event_key => $loop_event) {
+ // Make sure we haven't already dealt with the event, and we're not checking against ourself.
+ if ($loop_event['event_overlap'] == 0 && $loop_event_key != $uid) {
+ $loopDrawTimes = drawEventTimes($loop_event['event_start'], $loop_event['event_end']);
+ if ($loopDrawTimes['draw_start'] < $drawTimes['draw_end'] && $loopDrawTimes['draw_end'] > $drawTimes['draw_start']) {
+ if ($loopDrawTimes['draw_start'] < $drawTimes['draw_start']) {
+ $block_start = $loopDrawTimes['draw_start'];
+ } else {
+ $block_start = $drawTimes['draw_start'];
+ }
+ if ($loopDrawTimes['draw_end'] > $drawTimes['draw_end']) {
+ $block_end = $loopDrawTimes['draw_end'];
+ } else {
+ $block_end = $drawTimes['draw_end'];
+ }
+ $events = array(array('time' => $loopDrawTimes['draw_start'], 'key' => $loop_event_key));
+ $overlap_ranges = array(array('count' => 0, 'start' => $loopDrawTimes['draw_start'], 'end' => $loopDrawTimes['draw_end']));
+ // Only add $event if we haven't already put it in a block
+ if (!$already_merged_once) {
+ $events[] = array('time' => $drawTimes['draw_start'], 'key' => $uid);
+ $overlap_ranges = merge_range($overlap_ranges, $drawTimes['draw_start'], $drawTimes['draw_end']);
+ $already_merged_once = true;
+ }
+ $ol_day_array[] = array('blockStart' => $block_start, 'blockEnd' => $block_end, 'maxOverlaps' => 1, 'events' => $events, 'overlapRanges' => $overlap_ranges);
+
+ foreach ($events as $max_overlap_event) {
+ $master_array[$event_date][$max_overlap_event['time']][$max_overlap_event['key']]['event_overlap'] = 1;
+ }
+ // Make sure we pass in the key of the newly added item above.
+ end($ol_day_array);
+ $last_day_key = key($ol_day_array);
+ $ol_day_array = flatten_ol_blocks($event_date, $ol_day_array, $last_day_key);
+ }
+ }
+ }
+ }
+ }
+
+ $overlap_array[$event_date] = $ol_day_array;
+
+//for debugging the checkOverlap function
+//if ($event_date == '20050506') {
+//print 'Date: ' . $event_date . ' / Time: ' . $event_time . ' / Key: ' . $uid . "<br />\n";
+//print '<pre>';
+//print_r($master_array[$event_date]);
+//print_r($overlap_array[$event_date]);
+//print '</pre>';
+//}
+
+}
+
+// Remove an event from the overlap data.
+// This could be completely bogus, since overlap array is empty when this gets called in my tests, but I'm leaving it in anyways.
+function removeOverlap($ol_start_date, $ol_start_time, $ol_key) {
+ global $master_array, $overlap_array;
+ if (isset($overlap_array[$ol_start_date])) {
+ if (sizeof($overlap_array[$ol_start_date]) > 0) {
+ $ol_end_time = $master_array[$ol_start_date][$ol_start_time][$ol_key]['event_end'];
+ foreach ($overlap_array[$ol_start_date] as $block_key => $block) {
+ if (in_array(array('time' => $ol_start_time, 'key' => $ol_key), $block['events'])) {
+ // Check if this is a 2-event block (i.e., there's no block left when we remove $ol_key
+ // and if so, just unset it and move on.
+ if (count($block['events']) == 2) {
+ foreach ($block['events'] as $event) {
+ $master_array[$ol_start_date][$event['time']][$event['key']]['event_overlap'] = 0;
+ }
+ unset($overlap_array[$ol_start_date][$block_key]);
+ } else {
+ // remove $ol_key from 'events'
+ $event_key = array_search(array('time' => $ol_start_time, 'key' => $ol_key), $block['events']);
+ unset($overlap_array[$ol_start_date][$block_key]['events'][$event_key]);
+
+ // These may be bogus, since we're not using drawEventTimes.
+ // "clean up" 'overlapRanges' and calc the new maxOverlaps.
+ // use the special "-2" count to tell merge_range we're deleting.
+ $overlap_array[$ol_start_date][$block_key]['overlapRanges'] = merge_range($block['overlapRanges'], $ol_start_time, $ol_end_time, -2);
+ $overlap_array[$ol_start_date][$block_key]['maxOverlaps'] = find_max_overlap($block['overlapRanges']);
+
+ // recreate blockStart and blockEnd from the other events, and fix maxOverlap while we're at it.
+ $blockStart = $ol_end_time;
+ $blockEnd = $ol_start_time;
+ foreach ($overlap_array[$ol_start_date][$block_key]['events'] as $event) {
+ $blockStart = min($blockStart, $event['time']);
+ $blockEnd = max($blockEnd, $master_array[$ol_start_date][$event['time']][$event['key']]['event_end']);
+ $master_array[$ol_start_date][$event['time']][$event['key']]['event_overlap'] = $overlap_array[$ol_start_date][$block_key]['maxOverlaps'];
+ }
+ $overlap_array[$ol_start_date][$block_key]['blockStart'] = $blockStart;
+ $overlap_array[$ol_start_date][$block_key]['blockEnd'] = $blockEnd;
+ }
+ }
+ }
+ }
+ }
+}
+?>
diff --git a/functions/parse/parse_tzs.php b/functions/parse/parse_tzs.php
new file mode 100644
index 0000000..85ab929
--- /dev/null
+++ b/functions/parse/parse_tzs.php
@@ -0,0 +1,64 @@
+<?php
+$ifile = @fopen($filename, "r");
+if ($ifile == FALSE) exit(error($lang['l_error_cantopen'], $filename));
+$nextline = fgets($ifile, 1024);
+if (trim($nextline) != 'BEGIN:VCALENDAR') exit(error($lang['l_error_invalidcal'], $filename));
+
+// read file in line by line
+// XXX end line is skipped because of the 1-line readahead
+while (!feof($ifile)) {
+ $line = $nextline;
+ $nextline = fgets($ifile, 1024);
+ $nextline = ereg_replace("[\r\n]", "", $nextline);
+ #handle continuation lines that start with either a space or a tab (MS Outlook)
+ while (isset($nextline{0}) && ($nextline{0} == " " || $nextline{0} == "\t")) {
+ $line = $line . substr($nextline, 1);
+ $nextline = fgets($ifile, 1024);
+ $nextline = ereg_replace("[\r\n]", "", $nextline);
+ }
+ $line = trim($line);
+
+ switch ($line) {
+ case 'BEGIN:VTIMEZONE':
+ unset($tz_name, $offset_from, $offset_to, $tz_id);
+ break;
+ case 'BEGIN:STANDARD':
+ unset ($offset_s);
+ break;
+ case 'END:STANDARD':
+ $offset_s = $offset_to;
+ break;
+ case 'BEGIN:DAYLIGHT':
+ unset ($offset_d);
+ break;
+ case 'END:DAYLIGHT':
+ $offset_d = $offset_to;
+ break;
+ case 'END:VTIMEZONE':
+ $tz_array[$tz_id] = array($offset_s, $offset_d); #echo "<pre>$tz_id"; print_r($tz_array[$tz_id]);echo"</pre>";
+ break;
+ default:
+ unset ( $data, $prop_pos, $property);
+ if (ereg ("([^:]+):(.*)", $line, $line)){
+ $property = $line[1];
+ $data = $line[2];
+ $prop_pos = strpos($property,';');
+ if ($prop_pos !== false) $property = substr($property,0,$prop_pos);
+ $property = strtoupper($property);
+
+ switch ($property) {
+ case 'TZID':
+ $tz_id = $data;
+ break;
+ case 'TZOFFSETFROM':
+ $offset_from = $data;
+ break;
+ case 'TZOFFSETTO':
+ $offset_to = $data;
+ break;
+ }
+ }
+ }
+}
+
+?> \ No newline at end of file

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