diff options
author | drei <drei> | 2002-10-07 01:41:15 +0000 |
---|---|---|
committer | drei <drei> | 2002-10-07 01:41:15 +0000 |
commit | 2dc5311afb4c78d98db72f160e0e066657e35367 (patch) | |
tree | 15124bbbe5f1261587979fa5b601676b737a5610 /functions/overlapping_events.php | |
parent | 4bb864acc4202da70651ab924658fc41c37ed190 (diff) | |
download | phpicalendar-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.php | 155 |
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; } |