diff --git a/inc/class.section_meeting.inc b/inc/class.section_meeting.inc new file mode 100644 --- /dev/null +++ b/inc/class.section_meeting.inc @@ -0,0 +1,194 @@ +days_set($days); + + $this->time_start = $time_start; + $this->time_end = $time_end; + + $this->location = $location; + + $this->type = $type; + } + + /** + * \brief + * Take a days of week string and store it into our $days of week array. + * + * \param $days_str + * The days of the week in a string format. One char per + * day. Mon-Fri is represented with 'm', 't', 'w', 'h', 'f'. + */ + private function days_set($days_str) + { + $this->days = array(0 => FALSE, 1 => FALSE, 2 => FALSE, 3 => FALSE, 4 => FALSE); + + $days_str_strlen = strlen($days_str); + for ($i = 0; $i < $days_str_strlen; $i ++) + $this->days[self::day_atoi($days_str[$i])] = TRUE; + } + + /** + * \brief + * Convert a day letter to a day numeral. + * + * Works fine if you give the numeral as well. + */ + private static function day_atoi($day_c) + { + static $day_atoi = array('m' => 0, 't' => 1, 'w' => 2, 'h' => 3, 'f' => 4, + 'M' => 0, 'T' => 1, 'W' => 2, 'H' => 3, 'F' => 4, + 0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4); + + return $day_atoi[$day_c]; + } + + /** + * \brief + * Determine whether or not this class meeting time meets on a + * specified day of the week or not. + * + * \param $day + * The letter or numeral of the day to retrieve. + * \return + * TRUE if this section meeting meets on that day. FALSE + * otherwise. + */ + public function getDay($day) + { + return $this->days[self::day_atoi($day)]; + } + + /** + * \return + * This SectionMeeting's location or NULL if none is defined. + */ + public function getLocation() + { + return $this->location; + } + + /** + * \brief + * Get the start_time of this meeting in slate_permutate's internal format. + */ + public function getStartTime() + { + return $this->time_start; + } + + public function getEndTime() + { + return $this->time_end; + } + + /** + * \brief + * Check if this section conflicts with the given section. + * + * \param $that + * The other section for which I should check for conflicts. + * \return + * TRUE if there is a conflict, FALSE otherwise. + */ + public function conflictsWith(SectionMeeting $that) + { + /* + * The two sections meetings can't conflict if the start/end times + * don't overlap. Also, use >= or <= here so that one can say ``I + * have gym from 10 through 11 and then latin from 11 though 12''. + */ + if ($this->getStartTime() >= $that->getEndTime() + || $this->getEndTime() <= $that->getStartTime()) + { + return FALSE; + } + + /* + * Now we know that the sections meetings overlap in start/end + * times. But if they don't both meet on the same day at least + * once, they don't conflict. + */ + for ($day = 0; $day < 5; $day ++) + { + if ($this->getDay($day) && $that->getDay($day)) + return TRUE; + } + + /* + * The sections meetings don't both share a day of the week. + */ + return FALSE; + } + + /** + * \brief + * Return an array of JSON keys specific to this section meeting + * time. + * + * Currently, the AJAX UI doesn't recognize that a given section may + * have multiple meeting times. Thus, we simulate this by having + * multiple instances of the same section but just with different + * times in the UI. + */ + public function to_json_array() + { + static $daymap = array(0 => 'm', 1 => 't', 2 => 'w', 3 => 'h', 4 => 'f'); + + $json_array = array( + 'time_start' => $this->time_start, + 'time_end' => $this->time_end, + 'days' => array(), + 'location' => $this->location, + ); + + for ($day = 0; $day < 5; $day ++) + $json_array['days'][$daymap[$day]] = $this->getDay($day); + + return $json_array; + } +}