classStorage = array();
    $this->nclasses = 0;
    $this->scheduleName = $name;
    $this->storage = array();
    $this->title = "SlatePermutate - Scheduler";
    $this->section_format = 'numerous';
  }
  //--------------------------------------------------
  // Mutators and Accessors
  //--------------------------------------------------
  public function getName()
  {
    return $this->scheduleName;
  }    
  //--------------------------------------------------
  // Adds a new class to the schedule.
  //--------------------------------------------------
  function addClass($n)
  {
    $this->classStorage[$this->nclasses] = new Classes($n);
    $this->nclasses++;
  }
  //--------------------------------------------------
  // Adds a section to the desired class.
  //--------------------------------------------------
  function addSection($n, $l, $s, $e, $d)
  {
    $found = false;
    $counter = 0;
      
    while(!$found && ($counter < $this->nclasses))
      {
	$temp = $this->classStorage[$counter]->getName();
			
	if((strcmp($temp,$n)) == 0)
	  {
	    $found = true;
	  } else {
	  $counter++;
	}
      }
		
    if($counter == $this->nclasses)
      {
	echo "Could not find class: " . $n . "
";
      } else {
      $p = "unknown prof";
      $this->classStorage[$counter]->addSection($l, $p, $s, $e, $d);
    }
  }
  //--------------------------------------------------
  // Finds all of the possible permutations and stores
  // the results in the storage array.
  //--------------------------------------------------
  function findPossibilities()
  {
    $this->possiblePermutations = 1;
    /* special case: there is nothing entered into the schedule and thus there is one, NULL permutation */
    if (!$this->nclasses)
      {
	/* have an empty schedule */
	$this->classStorage[0] = array();
	$this->nPermutations = 1;
	return;
      }
    $position = 0;
    $counter = 0;
    for($i = 0; $i < $this->nclasses; $i++)
      {
	$this->possiblePermutations = $this->possiblePermutations * $this->classStorage[$i]->getnsections();
	$cs[$i] = 0;	// Sets the counter array to all zeroes.
      }
        
    // Checks for conflicts in given classes, stores if none found
    do
      {
	$conflict = false;
         
	// Get first class to compare
	for ($upCounter = 0;
	     $upCounter < $this->nclasses && !$conflict;
	     $upCounter ++)
	  {
	    
	    for ($downCounter = $this->nclasses - 1;
		 $downCounter > $upCounter && !$conflict;
		 $downCounter --)
	      {
		$start1 = $this->classStorage[$upCounter]->getSection($cs[$upCounter])->getStartTime();
		$end1 = $this->classStorage[$upCounter]->getSection($cs[$upCounter])->getEndTime();
		$start2 = $this->classStorage[$downCounter]->getSection($cs[$downCounter])->getStartTime();
		$end2 = $this->classStorage[$downCounter]->getSection($cs[$downCounter])->getEndTime();
					
		// If the two times overlap, then check if days overlap.
		if ((($start1 >= $start2) && ($start1 <= $end2)) || (($start2 >= $start1) && ($start2 <= $end1)))
		  {
		    // Monday
		    if(!$conflict
		       && ($this->classStorage[$upCounter]->getSection($cs[$upCounter])->getM()
			   && $this->classStorage[$downCounter]->getSection($cs[$downCounter])->getM()))
		      {
			$conflict = TRUE;
		      }
						
		    // Tuesday
		    if(!$conflict
		       && ($this->classStorage[$upCounter]->getSection($cs[$upCounter])->getTu()
			   && $this->classStorage[$downCounter]->getSection($cs[$downCounter])->getTu()))
		      {
			$conflict = TRUE;
		      }
						
		    // Wednesday
		    if(!$conflict
		       && ($this->classStorage[$upCounter]->getSection($cs[$upCounter])->getW()
			   && $this->classStorage[$downCounter]->getSection($cs[$downCounter])->getW()))
		      {
			$conflict = TRUE;
		      }
						
		    // Thursday
		    if(!$conflict
		       && ($this->classStorage[$upCounter]->getSection($cs[$upCounter])->getTh()
			   && $this->classStorage[$downCounter]->getSection($cs[$downCounter])->getTh()))
		      {
			$conflict = TRUE;
		      }
						
		    // Friday
		    if(!$conflict
		       && ($this->classStorage[$upCounter]->getSection($cs[$upCounter])->getF()
			   && $this->classStorage[$downCounter]->getSection($cs[$downCounter])->getF()))
		      {
			$conflict = TRUE;
		      }
		  }
	      }
	  }
            
	// Store to storage if no conflict is found.
	if(!$conflict)
	  {
	    for($i = 0; $i < $this->nclasses; $i++)
	      {
		$this->storage[$this->nPermutations][$i] = $cs[$i];
	      }
	    $this->nPermutations++;
	  }
			
	// Increase the counter by one to get the next combination of class sections.
	$cs[$position] = $cs[$position] + 1;
			
	// Check to make sure the counter is still valid.
	$valid = false;
	while(!$valid)
	  {
	    if($cs[$position] == $this->classStorage[$position]->getnsections())
	      {
		$cs[$position] = 0;
		$position++;
					
		// This is for the very last permutation. Even 
		// though the combination is not actually true
		// the larger while loop will end before any 
		// new combinations are performed.
		if($position == $this->nclasses)
		  {
		    $valid = true;
		  } else {
		  $cs[$position]++;
		}
	      } else {
	      $valid = true;
	      $position = 0;
	    }
	  }
            
	$counter++;
      } while($counter < $this->possiblePermutations);
  }
    
  //--------------------------------------------------
  // Prints out the possible permutations in tables.
  //--------------------------------------------------
  function writeoutTables()
  {
    $table = "";
    $header = "";
    $footer = "";
    $M = -1;
    $Tu = -1;
    $W = -1;
    $Th = -1;
    $F = -1;
    $filled = false;
    $time = array(700,730,800,830,900,930,1000,1030,1100,1130,1200,1230,1300,1330,1400,1430,1500,1530,1600,1630,1700,1730,1800,1830,1900,1930,2000,2030,2100,2130, 2200);
    // Reminder:
    // border-style:top right bottom left
    /* $header .= "
Select Schedules to Print :: Return to normal view :: Home
'; echo 'id_get() . '&print=all">Print :: Home
'; } if($this->nPermutations > 0) { $table .= "| " . ($i+1) . " | \n\t\tMonday | \n\t\tTuesday | \n\t\tWednesday | \n\t\tThursday | \n\t\tFriday | \n\t||||||||||||||||||||
| " . $this->prettyTime($time[$r]) . " | "; //---------------MONDAY--------------- for($j = 0; $j < $this->nclasses; $j++) { if($M == -1) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getM()) { if(($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() >= $time[$r]) && ($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() < $time[$r+1])) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t" . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $M = $j; $filled = true; } else { $table .= "\n\t\t" . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $filled = true; } } } } else { if($j == $M) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t"; $filled = true; } else { $table .= "\n\t\t | "; $M = -1; $filled = true; } } } } // If the cell was not filled, fill it with an empty cell. if(!$filled) { $table .= "\n\t\t | "; } $filled = false; //---------------TUESDAY--------------- for($j = 0; $j < $this->nclasses; $j++) { if($Tu == -1) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getTu()) { if(($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() >= $time[$r]) && ($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() < $time[$r+1])) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t | " . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $Tu = $j; $filled = true; } else { $table .= "\n\t\t" . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $filled = true; } } } } else { if($j == $Tu) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t"; $filled = true; } else { $table .= "\n\t\t | "; $Tu = -1; $filled = true; } } } } // If the cell was not filled, fill it with an empty cell. if(!$filled) { $table .= "\n\t\t | "; } $filled = false; //---------------WEDNESDAY--------------- for($j = 0; $j < $this->nclasses; $j++) { if($W == -1) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getW()) { if(($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() >= $time[$r]) && ($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() < $time[$r+1])) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t | " . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $W = $j; $filled = true; } else { $table .= "\n\t\t" . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $filled = true; } } } } else { if($j == $W) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t"; $filled = true; } else { $table .= "\n\t\t | "; $W = -1; $filled = true; } } } } // If the cell was not filled, fill it with an empty cell. if(!$filled) { $table .= "\n\t\t | "; } $filled = false; //---------------THURSDAY--------------- for($j = 0; $j < $this->nclasses; $j++) { if($Th == -1) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getTh()) { if(($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() >= $time[$r]) && ($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() < $time[$r+1])) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t | " . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $Th = $j; $filled = true; } else { $table .= "\n\t\t" . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $filled = true; } } } } else { if($j == $Th) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t"; $filled = true; } else { $table .= "\n\t\t | "; $Th = -1; $filled = true; } } } } // If the cell was not filled, fill it with an empty cell. if(!$filled) { $table .= "\n\t\t | "; } $filled = false; //---------------FRIDAY--------------- for($j = 0; $j < $this->nclasses; $j++) { if($F == -1) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getF()) { if(($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() >= $time[$r]) && ($this->classStorage[$j]->getSection($this->storage[$i][$j])->getStartTime() < $time[$r+1])) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t | " . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $F = $j; $filled = true; } else { $table .= "\n\t\t" . $this->classStorage[$j]->getName() . " " . $this->classStorage[$j]->getSection($this->storage[$i][$j])->getLetter() . " | "; $filled = true; } } } } else { if($j == $F) { if($this->classStorage[$j]->getSection($this->storage[$i][$j])->getEndTime() > $time[$r+1]) { $table .= "\n\t\t"; $filled = true; } else { $table .= "\n\t\t | "; $F = -1; $filled = true; } } } } // If the cell was not filled, fill it with an empty cell. if(!$filled) { $table .= "\n\t\t | "; } $filled = false; // End of row $table .= "\n\t | 
There are no possible schedules. Please try again.
'; } /* edit button */ echo ''; echo "There were a total of " . $this->possiblePermutations . " possible permutations. Only " . $this->nPermutations . " permutations had no class conflicts.
"; $outputPage->foot(); } /** * \brief * Render the input table form for editing a saved schedule in input.php. * * This function's output must be synchronized with the * associated javascript in scripts/scheduleInput.js. */ function input_form_render() { $out = ''; static $n = "\n"; foreach ($this->classStorage as $class_key => $class) $out .= $class->input_form_render($class_key); return $out; } //-------------------------------------------------- // Changes the title of the page. //-------------------------------------------------- function changeTitle($t) { $this->title = $t; } //-------------------------------------------------- // Make the time "pretty." //-------------------------------------------------- function prettyTime($t){ if($t > 1259) { $t = ($t-1200); return substr($t, 0, strlen($t)-2) . ":" . substr($t, strlen($t)-2, strlen($t)) . " PM"; } else { return substr($t, 0, strlen($t)-2) . ":" . substr($t, strlen($t)-2, strlen($t)) . " AM"; } } /** * \brief * fetch the number of classes */ function nclasses_get() { return $this->nclasses; } /* * \brief * fetch a specified class by its key */ function class_get($class_key) { return $this->classStorage[$class_key]; } /** * \brief * Set my global ID. * * Only to be called by schedule_store_store(). */ function id_set($id) { $this->id = $id; } /* * \brief * Get my global ID. */ function id_get() { return $this->id; } }