home *** CD-ROM | disk | FTP | other *** search
/ linuxmafia.com 2016 / linuxmafia.com.tar / linuxmafia.com / calendar-2010-08-23.tar.gz / calendar-2010-08-23.tar / calendar / functions / overlapping_events.php < prev    next >
PHP Script  |  2003-10-12  |  12KB  |  190 lines

  1. <?php
  2. // function to determine maximum necessary columns per day
  3. // actually an algorithm to get the smallest multiple for two numbers
  4. function kgv($a, $b) {
  5.     $x = $a;
  6.     $y = $b;
  7.     while ($x != $y) {
  8.         if ($x < $y) $x += $a;
  9.         else $y += $b;
  10.     }
  11.     return $x;
  12. }
  13.  
  14.  
  15. // drei 20020921: function for checking and counting overlapping events
  16. // drei 20020212: added parameter uid to function call
  17. function checkOverlap($ol_start_date, $ol_start_time, $ol_end_time, $ol_uid) {
  18.     global $master_array, $overlap_array;
  19.  
  20.         $drawTimes = drawEventTimes($ol_start_time, $ol_end_time);
  21.         $newMasterTime = $drawTimes["draw_start"];
  22.         // if (isset($master_array[($ol_start_date)][($newMasterTime)])) $newMasterEventKey = sizeof($master_array[($ol_start_date)][($newMasterTime)]);
  23.         // else $newMasterEventKey = 0;
  24.         
  25.         $maxOverlaps = 0;
  26.         $newEventAdded = FALSE;
  27.         if (isset($overlap_array[($ol_start_date)])) {
  28.             foreach ($overlap_array[($ol_start_date)] as $loopBlockKey => $loopBlock) {
  29.                 // check for overlap with existing overlap block
  30.                 if (($loopBlock["blockStart"] < $drawTimes["draw_end"]) and ($loopBlock["blockEnd"] > $drawTimes["draw_start"])) {
  31.                     $newOverlapBlock = FALSE;
  32.                     // if necessary adjust start and end times of overlap block
  33.                     if ($loopBlock["blockStart"] > $drawTimes["draw_start"]) $overlap_array[($ol_start_date)][($loopBlockKey)]["blockStart"] = $drawTimes["draw_start"];
  34.                     if ($loopBlock["blockEnd"] < $drawTimes["draw_end"]) $overlap_array[($ol_start_date)][($loopBlockKey)]["blockEnd"] = $drawTimes["draw_end"];
  35.                     // add the new event to the array of events
  36.                     // $overlap_array[($ol_start_date)][($loopBlockKey)]["events"][] = array ("time" => $newMasterTime, "key" => $newMasterEventKey);
  37.                     $overlap_array[($ol_start_date)][($loopBlockKey)]["events"][] = array ("time" => $newMasterTime, "key" => $ol_uid);
  38.                     // check if the adjusted overlap block must be merged with an existing overlap block
  39.                     reset($overlap_array[($ol_start_date)]);
  40.                     do {
  41.                         $compBlockKey = key(current($overlap_array[($ol_start_date)]));
  42.                         // only compare with other blocks
  43.                         if ($compBlockKey != $loopBlockKey) {
  44.                             // check if blocks overlap
  45.                             if (($overlap_array[($ol_start_date)][($compBlockKey)]["blockStart"] < $overlap_array[($ol_start_date)][($loopBlockKey)]["blockEnd"]) and ($overlap_array[($ol_start_date)][($compBlockKey)]["blockEnd"] > $overlap_array[($ol_start_date)][($loopBlockKey)]["blockStart"])) {
  46.                                 // define start and end of merged overlap block
  47.                                 if ($loopBlock["blockStart"] > $overlap_array[($ol_start_date)][($compBlockKey)]["blockStart"]) $overlap_array[($ol_start_date)][($loopBlockKey)]["blockStart"] = $overlap_array[($ol_start_date)][($compBlockKey)]["blockStart"];
  48.                                 if ($loopBlock["blockEnd"] < $overlap_array[($ol_start_date)][($compBlockKey)]["blockEnd"]) $overlap_array[($ol_start_date)][($loopBlockKey)]["blockEnd"] = $overlap_array[($ol_start_date)][($compBlockKey)]["blockEnd"];
  49.                                 $overlap_array[($ol_start_date)][($loopBlockKey)]["events"] = array_merge($overlap_array[($ol_start_date)][($loopBlockKey)]["events"],$overlap_array[($ol_start_date)][($compBlockKey)]["events"]);
  50.                                 $overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"] = array_merge($overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"],$overlap_array[($ol_start_date)][($compBlockKey)]["overlapRanges"]);
  51.                                 unset($overlap_array[($ol_start_date)][($compBlockKey)]);
  52.                                 reset($overlap_array[($ol_start_date)]);
  53.                             }
  54.                         } 
  55.                     } while (next($overlap_array[($ol_start_date)]));
  56.                     // insert new event to appropriate overlap range
  57.  
  58.                     $newOverlapRange = TRUE;
  59.                     foreach ($overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"] as $keyOverlap => $overlapRange) {
  60.                         if (($overlapRange["start"] < $drawTimes["draw_end"]) and ($overlapRange["end"] > $drawTimes["draw_start"])) {
  61.                             $overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["count"]++;
  62.                             if ($overlapRange["start"] < $drawTimes["draw_start"]) $overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["start"] = $drawTimes["draw_start"];
  63.                             if ($overlapRange["end"] > $drawTimes["draw_end"]) $overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["end"] = $drawTimes["draw_end"];
  64.                             $newOverlapRange = FALSE;
  65.         //                    break;
  66.                         }
  67.                     }
  68.                     if ($newOverlapRange) {
  69.                         foreach ($loopBlock["events"] as $blockEvents) {
  70.                             $eventDrawTimes = drawEventTimes($master_array[($ol_start_date)][($blockEvents["time"])][($blockEvents["key"])]["event_start"], $master_array[($ol_start_date)][($blockEvents["time"])][($blockEvents["key"])]["event_end"]);
  71.                             if ((isset($eventDrawTimes["draw_start"]) && isset($eventDrawTimes["draw_end"]) && isset($drawTimes["draw_end"]) && isset($drawTimes["draw_start"])) && ($eventDrawTimes["draw_start"] < $drawTimes["draw_end"]) and ($eventDrawTimes["draw_end"] > $drawTimes["draw_start"])) {
  72.                                 // define start time of overlap range and overlap block
  73.                                 if ($eventDrawTimes["draw_start"] < $drawTimes["draw_start"]) $overlap_start = $drawTimes["draw_start"];
  74.                                 else $overlap_start = $eventDrawTimes["draw_start"];
  75.                                 // define end time of overlap range and overlap block
  76.                                 if ($eventDrawTimes["draw_end"] > $drawTimes["draw_end"]) $overlap_end = $drawTimes["draw_end"];
  77.                                 else $overlap_end = $eventDrawTimes["draw_end"];
  78.                                 
  79.                                 $newOverlapRange2 = TRUE;
  80.                                 foreach ($overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"] as $keyOverlap => $overlapRange) {
  81.                                     if (($overlapRange["start"] < $overlap_end) and ($overlapRange["end"] > $overlap_start)) {
  82.                                         $overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["count"]++;
  83.                                         if ($overlapRange["start"] < $overlap_start) $overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["start"] = $overlap_start;
  84.                                         if ($overlapRange["end"] > $overlap_end) $overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"][($keyOverlap)]["end"] = $overlap_end;
  85.                                         $newOverlapRange2 = FALSE;
  86.             //                            break;
  87.                                     }
  88.                                 }
  89.                                 if ($newOverlapRange2) {
  90.                                     array_push($overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"], array ("count" => 1,"start" => $overlap_start, "end" => $overlap_end));
  91.                                 }
  92.                             }
  93.                         }
  94.                     }
  95.                     // determine the maximum overlaps for the current overlap block
  96.                     foreach ($overlap_array[($ol_start_date)][($loopBlockKey)]["overlapRanges"] as $overlapRange) {
  97.                         if ($overlapRange["count"] > $maxOverlaps) $maxOverlaps = $overlapRange["count"];
  98.                     }
  99.                     $overlap_array[($ol_start_date)][($loopBlockKey)]["maxOverlaps"] = $maxOverlaps;
  100.                     foreach ($overlap_array[($ol_start_date)][($loopBlockKey)]["events"] as $updMasterEvent) {
  101.                         //if (($updMasterEvent["time"] != $newMasterTime) or ($updMasterEvent["key"] != $newMasterEventKey)) {
  102.                         if (($updMasterEvent["time"] != $newMasterTime) or ($updMasterEvent["key"] != $ol_uid)) {
  103.                             $master_array[($ol_start_date)][($updMasterEvent["time"])][($updMasterEvent["key"])]["event_overlap"] = $maxOverlaps;
  104.                         }
  105.                     }
  106.                     $newEventAdded = TRUE;
  107.                     break;
  108.                 }
  109.             }
  110.         }
  111.         if (!$newEventAdded) {
  112.             if (isset($master_array[($ol_start_date)])) {
  113.                 foreach ($master_array[($ol_start_date)] as $keyTime => $eventTime) {
  114.                     foreach ($eventTime as $keyEvent => $event) {
  115.                         if ($keyTime != '-1') $entryDrawTimes =  drawEventTimes($event["event_start"], $event["event_end"]);
  116.                         if ((isset($entryDrawTimes["draw_start"]) && isset($entryDrawTimes["draw_end"]) && isset($drawTimes["draw_end"]) && isset($drawTimes["draw_start"])) && ($entryDrawTimes["draw_start"] < $drawTimes["draw_end"]) and ($entryDrawTimes["draw_end"] > $drawTimes["draw_start"])) {
  117.                             // define start time of overlap range and overlap block
  118.                             if ($entryDrawTimes["draw_start"] < $drawTimes["draw_start"]) {
  119.                                 $overlap_start = $drawTimes["draw_start"];
  120.                                 $overlapBlock_start = $entryDrawTimes["draw_start"];
  121.                             } else {
  122.                                 $overlap_start = $entryDrawTimes["draw_start"];
  123.                                 $overlapBlock_start = $drawTimes["draw_start"];
  124.                             }
  125.                             // define end time of overlap range and overlap block
  126.                             if ($entryDrawTimes["draw_end"] > $drawTimes["draw_end"]) {
  127.                                 $overlap_end = $drawTimes["draw_end"];
  128.                                 $overlapBlock_end = $entryDrawTimes["draw_end"];
  129.                             } else {
  130.                                 $overlap_end = $entryDrawTimes["draw_end"];
  131.                                 $overlapBlock_end = $drawTimes["draw_end"];
  132.                             }
  133.                             if (!isset($newBlockKey)) {
  134.                                 // $overlap_array[($ol_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)));
  135.                                 $overlap_array[($ol_start_date)][] = array ("blockStart" => $overlapBlock_start, "blockEnd" => $overlapBlock_end, "maxOverlaps" => 1, "events" => array (array ("time" => $keyTime, "key" => $keyEvent), array ("time" => $newMasterTime, "key" => $ol_uid)), "overlapRanges" => array (array ("count" => 1, "start" => $overlap_start, "end" => $overlap_end)));
  136.                                 $maxOverlaps = 1;
  137.                                 end($overlap_array[($ol_start_date)]);
  138.                                 $newBlockKey = key($overlap_array[($ol_start_date)]);
  139.                             } else {
  140.                                 if ($overlap_array[($ol_start_date)][($newBlockKey)]["blockStart"] > $overlapBlock_start) $overlap_array[($ol_start_date)][($newBlockKey)]["blockStart"] = $overlapBlock_start;
  141.                                 if ($overlap_array[($ol_start_date)][($newBlockKey)]["blockEnd"] < $overlapBlock_end) $overlap_array[($ol_start_date)][($newBlockKey)]["blockEnd"] = $overlapBlock_end;
  142.                                 $overlap_array[($ol_start_date)][($newBlockKey)]["events"][] = array ("time" => $keyTime, "key" => $keyEvent);
  143.                                 $overlap_array[($ol_start_date)][($newBlockKey)]["overlapRanges"][] = array ("count" => 1, "start" => $overlap_start, "end" => $overlap_end);
  144.                             }
  145.                             // update master_array
  146.                             $master_array[($ol_start_date)][($keyTime)][($keyEvent)]["event_overlap"] = $maxOverlaps;
  147.                         }
  148.                     }
  149.                 }
  150.             }
  151.         }
  152.  
  153. // for debugging the checkOverlap function
  154. //print 'Date: ' . $ol_start_date . ' / New Time: ' . $newMasterTime . ' / New Key: ' . $newMasterEventKey . '<br />';
  155. //print '<pre>';
  156. //print_r($overlap_array);
  157. //print '</pre>';
  158.  
  159.     return $maxOverlaps;
  160. }
  161.  
  162. // drei 20021126: function for checking and removing overlapping events
  163. //function removeOverlap($ol_start_date, $ol_start_time, $ol_key = 0) {
  164. function removeOverlap($ol_start_date, $ol_start_time, $ol_key) {
  165.     global $master_array, $overlap_array;
  166.     if (isset($overlap_array[$ol_start_date])) {
  167.         if (sizeof($overlap_array[$ol_start_date]) > 0) {
  168.             $ol_end_time = $master_array[$ol_start_date][$ol_start_time][$ol_key]["event_end"];
  169.             foreach ($overlap_array[$ol_start_date] as $keyBlock => $blockId) {
  170. //                if (($blockId["blockStart"] <= $ol_start_time) or ($blockId["blockEnd"] >= $ol_start_time)) {
  171.                 if (($blockId["blockStart"] <= $ol_start_time) and ($blockId["blockEnd"] > $ol_start_time)) {
  172.                     foreach ($blockId["events"] as $keyEvent => $ol_event) {
  173.                         $master_array[$ol_start_date][$ol_event["time"]][$ol_event["key"]]["event_overlap"] -= 1;
  174.                         if (($ol_event["time"] == $ol_start_time) and ($ol_event["key"] == $ol_key)) {
  175.                             unset ($overlap_array[$ol_start_date][$keyBlock]["events"][$keyEvent]);
  176.                         }
  177.                     }
  178.                     if ($blockId["maxOverlaps"] == 1) {
  179.                         unset ($overlap_array[$ol_start_date][$keyBlock]);
  180.                     } else {
  181.                         $overlap_array[$ol_start_date][$keyBlock]["maxOverlaps"] -= 1;
  182.                         //$blockId["maxOverlaps"] -= 1;
  183.                         // SJBO: Shouldn't something be done with [overlapRanges] as well?
  184.                     }
  185.                 }
  186.             }
  187.         }
  188.     }
  189. }
  190. ?>