function question_edit_multianswer_form(&$submiturl, &$question, &$category, &$contexts, $formeditable = true)
 {
     global $QTYPES, $SESSION, $CFG, $DB;
     $this->regenerate = true;
     if ("1" == optional_param('reload', '', PARAM_INT)) {
         $this->reload = true;
     } else {
         $this->reload = false;
     }
     // $this->question = $question;
     $this->used_in_quiz = false;
     //  echo "<p> question <pre>";print_r($question);echo "</pre></p>";
     if (isset($question->id) && $question->id != 0) {
         $this->savedquestiondisplay = fullclone($question);
         if ($list = $DB->get_records('quiz_question_instances', array('question' => $question->id))) {
             foreach ($list as $key => $li) {
                 $this->nb_of_quiz++;
                 if ($att = $DB->get_records('quiz_attempts', array('quiz' => $li->quiz, 'preview' => '0'))) {
                     $this->nb_of_attempts += count($att);
                     $this->used_in_quiz = true;
                 }
             }
         }
     }
     parent::question_edit_form($submiturl, $question, $category, $contexts, $formeditable);
 }
 function question_edit_calculatedmulti_form(&$submiturl, &$question, &$category, &$contexts, $formeditable = true)
 {
     global $QTYPES, $SESSION, $CFG, $DB;
     $this->question = $question;
     $this->qtypeobj =& $QTYPES[$this->question->qtype];
     if ("1" == optional_param('reload', '', PARAM_INT)) {
         $this->reload = true;
     } else {
         $this->reload = false;
     }
     if (!$this->reload) {
         // use database data as this is first pass
         if (isset($this->question->id)) {
             // remove prefix #{..}# if exists
             $this->initialname = $question->name;
             $regs = array();
             if (preg_match('~#\\{([^[:space:]]*)#~', $question->name, $regs)) {
                 $question->name = str_replace($regs[0], '', $question->name);
             }
         }
     } else {
     }
     parent::question_edit_form($submiturl, $question, $category, $contexts, $formeditable);
 }
 function question_edit_calculatedsimple_form(&$submiturl, &$question, &$category, &$contexts, $formeditable = true)
 {
     global $QTYPES, $SESSION, $CFG, $DB;
     $this->regenerate = true;
     $this->question = $question;
     $this->qtypeobj =& $QTYPES[$this->question->qtype];
     //get the dataset definitions for this question
     //coming here everytime even when using a NoSubmitButton
     //so this will only set the values to the actual question database content which is not what we want
     //so this should be removed from here
     // get priority to paramdatasets
     if ("1" == optional_param('reload', '', PARAM_INT)) {
         $this->reload = true;
     } else {
         $this->reload = false;
     }
     if (!$this->reload) {
         // use database data as this is first pass
         // question->id == 0 so no stored datasets
         // else get datasets
         if (!empty($question->id)) {
             if (empty($question->options)) {
                 $this->get_question_options($question);
             }
             $this->datasetdefs = $this->qtypeobj->get_dataset_definitions($question->id, array());
             if (!empty($this->datasetdefs)) {
                 foreach ($this->datasetdefs as $defid => $datasetdef) {
                     // first get the items in case their number does not correspond to itemcount
                     if (isset($datasetdef->id)) {
                         $this->datasetdefs[$defid]->items = $this->qtypeobj->get_database_dataset_items($datasetdef->id);
                         if ($this->datasetdefs[$defid]->items != '') {
                             $datasetdef->itemcount = count($this->datasetdefs[$defid]->items);
                         } else {
                             $datasetdef->itemcount = 0;
                         }
                     }
                     // Get maxnumber
                     if ($this->maxnumber == -1 || $datasetdef->itemcount < $this->maxnumber) {
                         $this->maxnumber = $datasetdef->itemcount;
                     }
                 }
             }
             $i = 0;
             foreach ($this->question->options->answers as $answer) {
                 $this->answer[$i] = $answer;
                 $i++;
             }
             $this->nonemptyanswer = $this->answer;
         }
         $datasettoremove = false;
         $newdatasetvalues = false;
         $newdataset = false;
     } else {
         // handle reload to get values from the form-elements
         // answers, datasetdefs and data_items
         // verify for the specific dataset values as the other parameters
         // unints, feeedback etc are handled elsewhere
         // handle request buttons :
         //    'analyzequestion' (Identify the wild cards {x..} present in answers)
         //    'addbutton' (create new set of datatitems)
         //    'updatedatasets' is handled automatically on each reload
         // The analyzequestion is done every time on reload
         // to detect any new wild cards so that the current display reflects
         // the mandatory (i.e. in answers) datasets
         //  to implement : don't do any changes if the question is used in a quiz.
         // If new datadef, new properties should erase items.
         $dummyform = new stdClass();
         $mandatorydatasets = array();
         if ($dummyform->answer = optional_param('answer')) {
             // there is always at least one answer...
             $fraction = optional_param('fraction');
             $feedback = optional_param('feedback');
             $tolerance = optional_param('tolerance');
             $tolerancetype = optional_param('tolerancetype');
             $correctanswerlength = optional_param('correctanswerlength');
             $correctanswerformat = optional_param('correctanswerformat');
             foreach ($dummyform->answer as $key => $answer) {
                 if (trim($answer) != '') {
                     // just look for non-empty
                     $this->answer[$key] = new stdClass();
                     $this->answer[$key]->answer = $answer;
                     $this->answer[$key]->fraction = $fraction[$key];
                     $this->answer[$key]->feedback = $feedback[$key];
                     $this->answer[$key]->tolerance = $tolerance[$key];
                     $this->answer[$key]->tolerancetype = $tolerancetype[$key];
                     $this->answer[$key]->correctanswerlength = $correctanswerlength[$key];
                     $this->answer[$key]->correctanswerformat = $correctanswerformat[$key];
                     $this->nonemptyanswer[] = $this->answer[$key];
                     $mandatorydatasets += $this->qtypeobj->find_dataset_names($answer);
                 }
             }
         }
         $this->datasetdefs = array();
         // rebuild datasetdefs from old values
         $olddef = optional_param('datasetdef');
         $oldoptions = optional_param('defoptions');
         $calcmin = optional_param('calcmin');
         $calclength = optional_param('calclength');
         $calcmax = optional_param('calcmax');
         $newdatasetvalues = false;
         for ($key = 1; $key <= sizeof($olddef); $key++) {
             $def = $olddef[$key];
             $this->datasetdefs[$def] = new stdClass();
             $this->datasetdefs[$def]->type = 1;
             $this->datasetdefs[$def]->category = 0;
             //  $this->datasets[$key]->name = $datasetname;
             $this->datasetdefs[$def]->options = $oldoptions[$key];
             $this->datasetdefs[$def]->calcmin = $calcmin[$key];
             $this->datasetdefs[$def]->calcmax = $calcmax[$key];
             $this->datasetdefs[$def]->calclength = $calclength[$key];
             //then compare with new values
             if (preg_match('~^(uniform|loguniform):([^:]*):([^:]*):([0-9]*)$~', $this->datasetdefs[$def]->options, $regs)) {
                 if ($this->datasetdefs[$def]->calcmin != $regs[2] || $this->datasetdefs[$def]->calcmax != $regs[3] || $this->datasetdefs[$def]->calclength != $regs[4]) {
                     $newdatasetvalues = true;
                 }
             }
             $this->datasetdefs[$def]->options = "uniform:" . $this->datasetdefs[$def]->calcmin . ":" . $this->datasetdefs[$def]->calcmax . ":" . $this->datasetdefs[$def]->calclength;
         }
         // detect new datasets
         $newdataset = false;
         foreach ($mandatorydatasets as $datasetname) {
             if (!isset($this->datasetdefs["1-0-{$datasetname}"])) {
                 $key = "1-0-{$datasetname}";
                 $this->datasetdefs[$key] = new stdClass();
                 //"1-0-$datasetname";
                 $this->datasetdefs[$key]->type = 1;
                 $this->datasetdefs[$key]->category = 0;
                 $this->datasetdefs[$key]->name = $datasetname;
                 $this->datasetdefs[$key]->options = "uniform:1.0:10.0:1";
                 $newdataset = true;
             } else {
                 $this->datasetdefs["1-0-{$datasetname}"]->name = $datasetname;
             }
         }
         // remove obsolete datasets
         $datasettoremove = false;
         foreach ($this->datasetdefs as $defkey => $datasetdef) {
             if (!isset($datasetdef->name)) {
                 $datasettoremove = true;
                 unset($this->datasetdefs[$defkey]);
             }
         }
     }
     // handle reload
     // create items if  $newdataset and noofitems > 0 and !$newdatasetvalues
     // eliminate any items if $newdatasetvalues
     // eliminate any items if $datasettoremove, $newdataset, $newdatasetvalues
     if ($datasettoremove || $newdataset || $newdatasetvalues) {
         foreach ($this->datasetdefs as $defkey => $datasetdef) {
             $datasetdef->itemcount = 0;
             unset($datasetdef->items);
         }
     }
     $maxnumber = -1;
     if ("" != optional_param('addbutton')) {
         $maxnumber = optional_param('selectadd');
         foreach ($this->datasetdefs as $defid => $datasetdef) {
             $datasetdef->itemcount = $maxnumber;
             unset($datasetdef->items);
             for ($numberadded = 1; $numberadded <= $maxnumber; $numberadded++) {
                 $datasetitem = new stdClass();
                 $datasetitem->itemnumber = $numberadded;
                 $datasetitem->id = 0;
                 $datasetitem->value = $this->qtypeobj->generate_dataset_item($datasetdef->options);
                 $this->datasetdefs[$defid]->items[$numberadded] = $datasetitem;
             }
             //for number added
         }
         // datasetsdefs end
         $this->maxnumber = $maxnumber;
     } else {
         // Handle reload dataset items
         if ("" != optional_param('definition') && !($datasettoremove || $newdataset || $newdatasetvalues)) {
             $i = 1;
             $fromformdefinition = optional_param('definition');
             $fromformnumber = optional_param('number');
             $fromformitemid = optional_param('itemid');
             ksort($fromformdefinition);
             foreach ($fromformdefinition as $key => $defid) {
                 $addeditem = new stdClass();
                 $addeditem->id = $fromformitemid[$i];
                 $addeditem->value = $fromformnumber[$i];
                 $addeditem->itemnumber = ceil($i / count($this->datasetdefs));
                 $this->datasetdefs[$defid]->items[$addeditem->itemnumber] = $addeditem;
                 $this->datasetdefs[$defid]->itemcount = $i;
                 $i++;
             }
         }
         if (isset($addeditem->itemnumber) && $this->maxnumber < $addeditem->itemnumber) {
             $this->maxnumber = $addeditem->itemnumber;
             if (!empty($this->datasetdefs)) {
                 foreach ($this->datasetdefs as $datasetdef) {
                     $datasetdef->itemcount = $this->maxnumber;
                 }
             }
         }
     }
     parent::question_edit_form($submiturl, $question, $category, $contexts, $formeditable);
 }