aboutsummaryrefslogtreecommitdiffstats
path: root/functions/overlapping_events.php
diff options
context:
space:
mode:
authordrei <drei>2002-10-07 01:41:15 +0000
committerdrei <drei>2002-10-07 01:41:15 +0000
commit2dc5311afb4c78d98db72f160e0e066657e35367 (patch)
tree15124bbbe5f1261587979fa5b601676b737a5610 /functions/overlapping_events.php
parent4bb864acc4202da70651ab924658fc41c37ed190 (diff)
downloadphpicalendar-2dc5311afb4c78d98db72f160e0e066657e35367.tar.gz
phpicalendar-2dc5311afb4c78d98db72f160e0e066657e35367.tar.bz2
phpicalendar-2dc5311afb4c78d98db72f160e0e066657e35367.zip
Rewrote the logic, things are based now on blocks of events rather than just overlaps of events.
Diffstat (limited to 'functions/overlapping_events.php')
-rw-r--r--functions/overlapping_events.php155
1 files changed, 125 insertions, 30 deletions
diff --git a/functions/overlapping_events.php b/functions/overlapping_events.php
index cd043a8..eb69c45 100644
--- a/functions/overlapping_events.php
+++ b/functions/overlapping_events.php
@@ -17,46 +17,141 @@ function checkOverlap() {
global $master_array, $overlap_array, $start_date, $start_time, $end_time;
$drawTimes = drawEventTimes($start_time, $end_time);
+ $newMasterTime = $drawTimes["draw_start"];
+ if (isset($master_array[($start_date)][($newMasterTime)])) $newMasterEventKey = sizeof($master_array[($start_date)][($newMasterTime)]);
+ else $newMasterEventKey = 0;
+
$maxOverlaps = 0;
- if (isset($master_array[($start_date)]) && sizeof($master_array[($start_date)]) > 0) {
- foreach ($master_array[($start_date)] as $keyTime => $eventTime) {
- foreach ($eventTime as $keyEvent => $event) {
- if (isset($event["event_start"], $drawTimes["draw_end"], $event["event_end"], $drawTimes["draw_start"]) && ($event["event_start"] < $drawTimes["draw_end"]) and ($event["event_end"] > $drawTimes["draw_start"])) {
+ $newEventAdded = FALSE;
+ if (isset($overlap_array[($start_date)])) {
+ foreach ($overlap_array[($start_date)] as $loopBlockKey => $loopBlock) {
+ // check for overlap with existing overlap block
+ if (($loopBlock["blockStart"] < $drawTimes["draw_end"]) and ($loopBlock["blockEnd"] > $drawTimes["draw_start"])) {
+ $newOverlapBlock = FALSE;
+ // if necessary adjust start and end times of overlap block
+ if ($loopBlock["blockStart"] > $drawTimes["draw_start"]) $overlap_array[($start_date)][($loopBlockKey)]["blockStart"] = $drawTimes["draw_start"];
+ if ($loopBlock["blockEnd"] < $drawTimes["draw_end"]) $overlap_array[($start_date)][($loopBlockKey)]["blockEnd"] = $drawTimes["draw_end"];
+ // add the new event to the array of events
+ $overlap_array[($start_date)][($loopBlockKey)]["events"][] = array ("time" => $newMasterTime, "key" => $newMasterEventKey);
+ // check if the adjusted overlap block must be merged with an existing overlap block
+ reset($overlap_array[($start_date)]);
+ do {
+ $compBlockKey = key(current($overlap_array[($start_date)]));
+ // only compare with other blocks
+ if ($compBlockKey != $loopBlockKey) {
+ // check if blocks overlap
+ if (($overlap_array[($start_date)][($compBlockKey)]["blockStart"] < $overlap_array[($start_date)][($loopBlockKey)]["blockEnd"]) and ($overlap_array[($start_date)][($compBlockKey)]["blockEnd"] > $overlap_array[($start_date)][($loopBlockKey)]["blockStart"])) {
+ // define start and end of merged overlap block
+ if ($loopBlock["blockStart"] > $overlap_array[($start_date)][($compBlockKey)]["blockStart"]) $overlap_array[($start_date)][($loopBlockKey)]["blockStart"] = $overlap_array[($start_date)][($compBlockKey)]["blockStart"];
+ if ($loopBlock["blockEnd"] < $overlap_array[($start_date)][($compBlockKey)]["blockEnd"]) $overlap_array[($start_date)][($loopBlockKey)]["blockEnd"] = $overlap_array[($start_date)][($compBlockKey)]["blockEnd"];
+ $overlap_array[($start_date)][($loopBlockKey)]["events"] = array_merge($overlap_array[($start_date)][($loopBlockKey)]["events"],$overlap_array[($start_date)][($compBlockKey)]["events"]);
+ $overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"] = array_merge($overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"],$overlap_array[($start_date)][($compBlockKey)]["overlapRanges"]);
+ unset($overlap_array[($start_date)][($compBlockKey)]);
+ reset($overlap_array[($start_date)]);
+ }
+ }
+ } while (next($overlap_array[($start_date)]));
+ // insert new event to appropriate overlap range
- if ($event["event_start"] < $drawTimes["draw_start"]) $overlap_start = $drawTimes["draw_start"];
- else $overlap_start = $event["event_start"];
- if ($event["event_end"] < $drawTimes["draw_end"]) $overlap_end = $event["event_end"];
- else $overlap_end = $drawTimes["draw_end"];
-
- if (isset($overlap_array[($start_date)][($keyTime)][($keyEvent)]) && sizeof($overlap_array[($start_date)][($keyTime)][($keyEvent)]) > 0) {
- $newOverlapEntry = TRUE;
- foreach ($overlap_array[($start_date)][($keyTime)][($keyEvent)] as $keyOverlap => $overlapEntry) {
- if (($overlapEntry["start"] < $overlap_end) and ($overlapEntry["end"] > $overlap_start)) {
- $overlap_array[($start_date)][($keyTime)][($keyEvent)][($keyOverlap)]["count"]++;
- if ($overlapEntry["start"] < $overlap_start) {
- $overlap_array[($start_date)][($keyTime)][($keyEvent)][($keyOverlap)]["start"] = $overlap_start;
- }
- if ($overlapEntry["end"] > $overlap_end) {
- $overlap_array[($start_date)][($keyTime)][($keyEvent)][($keyOverlap)]["end"] = $overlap_end;
+ $newOverlapRange = TRUE;
+ foreach ($overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"] as $keyOverlap => $overlapRange) {
+ if (($overlapRange["start"] < $drawTimes["draw_end"]) and ($overlapRange["end"] > $drawTimes["draw_start"])) {
+ $overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["count"]++;
+ if ($overlapRange["start"] < $drawTimes["draw_start"]) $overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["start"] = $drawTimes["draw_start"];
+ if ($overlapRange["end"] > $drawTimes["draw_end"]) $overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["end"] = $drawTimes["draw_end"];
+ $newOverlapRange = FALSE;
+ break;
+ }
+ }
+ if ($newOverlapRange) {
+ foreach ($loopBlock["events"] as $blockEvents) {
+ $eventDrawTimes = drawEventTimes($master_array[($start_date)][($blockEvents["time"])][($blockEvents["key"])]["event_start"], $master_array[($start_date)][($blockEvents["time"])][($blockEvents["key"])]["event_end"]);
+ if (isset($eventDrawTimes["draw_start"], $eventDrawTimes["draw_end"], $drawTimes["draw_end"], $drawTimes["draw_start"]) && ($eventDrawTimes["draw_start"] < $drawTimes["draw_end"]) and ($eventDrawTimes["draw_end"] > $drawTimes["draw_start"])) {
+ // define start time of overlap range and overlap block
+ if ($eventDrawTimes["draw_start"] < $drawTimes["draw_start"]) $overlap_start = $drawTimes["draw_start"];
+ else $overlap_start = $eventDrawTimes["draw_start"];
+ // define end time of overlap range and overlap block
+ if ($eventDrawTimes["draw_end"] > $drawTimes["draw_end"]) $overlap_end = $drawTimes["draw_end"];
+ else $overlap_end = $eventDrawTimes["draw_end"];
+
+ $newOverlapRange2 = TRUE;
+ foreach ($overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"] as $keyOverlap => $overlapRange) {
+ if (($overlapRange["start"] < $overlap_end) and ($overlapRange["end"] > $overlap_start)) {
+ $overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["count"]++;
+ if ($overlapRange["start"] < $overlap_start) $overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["start"] = $overlap_start;
+ if ($overlapRange["end"] > $overlap_end) $overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["end"] = $overlap_end;
+ $newOverlapRange2 = FALSE;
+ break;
}
- $newOverlapEntry = FALSE;
- break;
+ }
+ if ($newOverlapRange2) {
+ array_push($overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"], array ("count" => 1,"start" => $overlap_start, "end" => $overlap_end));
}
}
- if ($newOverlapEntry) {
- array_push($overlap_array[($start_date)][($keyTime)][($keyEvent)], array ("count" => 1,"start" => $overlap_start, "end" => $overlap_end));
- }
- } else {
- $overlap_array[($start_date)][($keyTime)][($keyEvent)][] = array ("count" => 1,"start" => $overlap_start, "end" => $overlap_end);
}
- foreach ($overlap_array[($start_date)][($keyTime)][($keyEvent)] as $keyOverlap => $overlapEntry) {
- if ($overlapEntry["count"] > $maxOverlaps) $maxOverlaps = $overlapEntry["count"];
+ }
+ // determine the maximum overlaps for the current overlap block
+ foreach ($overlap_array[($start_date)][($loopBlockKey)]["overlapRanges"] as $overlapRange) {
+ if ($overlapRange["count"] > $maxOverlaps) $maxOverlaps = $overlapRange["count"];
+ }
+ $overlap_array[($start_date)][($loopBlockKey)]["maxOverlaps"] = $maxOverlaps;
+ foreach ($overlap_array[($start_date)][($loopBlockKey)]["events"] as $updMasterEvent) {
+ if (($updMasterEvent["time"] != $newMasterTime) or ($updMasterEvent["key"] != $newMasterEventKey)) {
+ $master_array[($start_date)][($updMasterEvent["time"])][($updMasterEvent["key"])]["event_overlap"] = $maxOverlaps;
+ }
+ }
+ $newEventAdded = TRUE;
+ break;
+ }
+ }
+ }
+ if (!$newEventAdded) {
+ if (isset($master_array[($start_date)])) {
+ $newBlockKey = "";
+ foreach ($master_array[($start_date)] as $keyTime => $eventTime) {
+ foreach ($eventTime as $keyEvent => $event) {
+ $entryDrawTimes = drawEventTimes($event["event_start"], $event["event_end"]);
+ if (isset($entryDrawTimes["draw_start"], $entryDrawTimes["draw_end"], $drawTimes["draw_end"], $drawTimes["draw_start"]) && ($entryDrawTimes["draw_start"] < $drawTimes["draw_end"]) and ($entryDrawTimes["draw_end"] > $drawTimes["draw_start"])) {
+ // define start time of overlap range and overlap block
+ if ($entryDrawTimes["draw_start"] < $drawTimes["draw_start"]) {
+ $overlap_start = $drawTimes["draw_start"];
+ $overlapBlock_start = $entryDrawTimes["draw_start"];
+ } else {
+ $overlap_start = $entryDrawTimes["draw_start"];
+ $overlapBlock_start = $drawTimes["draw_start"];
+ }
+ // define end time of overlap range and overlap block
+ if ($entryDrawTimes["draw_end"] > $drawTimes["draw_end"]) {
+ $overlap_end = $drawTimes["draw_end"];
+ $overlapBlock_end = $entryDrawTimes["draw_end"];
+ } else {
+ $overlap_end = $entryDrawTimes["draw_end"];
+ $overlapBlock_end = $drawTimes["draw_end"];
+ }
+ if ($newBlockKey == "") {
+ $overlap_array[($start_date)][] = array ("blockStart" => $overlapBlock_start, "blockEnd" => $overlapBlock_end, "maxOverlaps" => 1, "events" => array (array ("time" => $keyTime, "key" => $keyEvent), array ("time" => $newMasterTime, "key" => $newMasterEventKey)), "overlapRanges" => array (array ("count" => 1, "start" => $overlap_start, "end" => $overlap_end)));
+ $maxOverlaps = 1;
+ end($overlap_array[($start_date)]);
+ $newBlockKey = key($overlap_array[($start_date)]);
+ } else {
+ if ($overlap_array[($start_date)][($newBlockKey)]["blockStart"] > $overlapBlock_start) $overlap_array[($start_date)][($newBlockKey)]["blockStart"] = $overlapBlock_start;
+ if ($overlap_array[($start_date)][($newBlockKey)]["blockEnd"] < $overlapBlock_end) $overlap_array[($start_date)][($newBlockKey)]["blockEnd"] = $overlapBlock_end;
+ $overlap_array[($start_date)][($newBlockKey)]["events"][] = array ("time" => $keyTime, "key" => $keyEvent);
+ $overlap_array[($start_date)][($newBlockKey)]["overlapRanges"][] = array ("count" => 1, "start" => $overlap_start, "end" => $overlap_end);
+ }
+ // update master_array
+ $master_array[($start_date)][($keyTime)][($keyEvent)]["event_overlap"] = $maxOverlaps;
}
- $master_array[($start_date)][($keyTime)][($keyEvent)]["event_overlap"] = $maxOverlaps;
}
}
}
- }
+ }
+
+// for debugging the checkOverlap function
+//print 'Date: ' . $start_date . ' / New Time: ' . $newMasterTime . ' / New Key: ' . $newMasterEventKey . '<br />';
+//print '<pre>';
+//print_r($overlap_array);
+//print '</pre>';
return $maxOverlaps;
}

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