/**
  * Process the form.  At this point we know that the user passes all the criteria in
  * userCanExecute(), and if the data array contains 'Username', etc, then Username
  * resets are allowed.
  *
  * @param array $data
  *
  * @return Bool|Array
  */
 public function onSubmit(array $data)
 {
     $fields = array();
     foreach ($data as $name => $value) {
         $matches = array();
         if (preg_match('/contest-(.+)/', $name, $matches)) {
             if ($matches[1] == 'end') {
                 $value = wfTimestamp(TS_MW, strtotime($value));
             }
             $fields[$matches[1]] = $value;
         }
     }
     // If no ID is set, this means it's a new contest, so set the ID to null for an insert.
     // However, the user can have hot the back button after creation of a new contest,
     // re-submitting the form. In this case, get the ID of the already existing item for an update.
     if (!array_key_exists('id', $fields) || $fields['id'] === '') {
         $contest = Contest::s()->selectRow('id', array('name' => $fields['name']));
         $fields['id'] = $contest === false ? null : $contest->getField('id');
     }
     $contest = new Contest($fields, is_null($fields['id']));
     $contest->setChallenges($this->getSubmittedChallenges());
     $success = $contest->writeAllToDB();
     $success = $this->removeDeletedChallenges($data['delete-challenges']) && $success;
     if ($success) {
         return true;
     } else {
         return array();
         // TODO
     }
 }