public function display($offlinequiz, $cm, $course)
 {
     global $CFG, $OUTPUT, $DB;
     $confirm = optional_param('confirm', 0, PARAM_INT);
     raise_memory_limit(MEMORY_EXTRA);
     // Print header.
     $this->print_header_and_tabs($cm, $course, $offlinequiz, 'regrade');
     offlinequiz_load_useridentification();
     $offlinequizconfig = get_config('offlinequiz');
     $letterstr = 'ABCDEFGHIJKL';
     // Print heading.
     echo $OUTPUT->box_start('linkbox');
     echo $OUTPUT->heading(format_string($offlinequiz->name));
     echo $OUTPUT->heading(get_string('regradingquiz', 'offlinequiz'));
     echo $OUTPUT->box_end('linkbox');
     // Fetch all results.
     $ressql = "SELECT res.*, u.{$offlinequizconfig->ID_field}\n                     FROM {offlinequiz_results} res\n                     JOIN {user} u on u.id = res.userid\n                    WHERE res.offlinequizid = :offlinequizid\n                      AND res.status = 'complete'";
     $resparams = array('offlinequizid' => $offlinequiz->id);
     if (!($results = $DB->get_records_sql($ressql, $resparams))) {
         $url = new moodle_url('/mod/offlinequiz/report.php', array('id' => $cm->id));
         $url->param('mode', 'overview');
         echo $OUTPUT->heading(get_string('noresults', 'offlinequiz'));
         echo $OUTPUT->box_start('linkbox');
         echo $OUTPUT->continue_button($url);
         echo $OUTPUT->box_end('linkbox');
         return true;
     }
     // If we don't have a confirmation we only display the confirm and cancel buttons.
     if (!$confirm) {
         echo $OUTPUT->box_start('linkbox');
         echo $OUTPUT->notification(get_string('regradedisplayexplanation', 'offlinequiz'), 'notifyproblem');
         echo '<br/>';
         $url = new moodle_url('/mod/offlinequiz/report.php', array('id' => $cm->id));
         $url->param('mode', 'regrade');
         $url->param('confirm', 1);
         echo $OUTPUT->single_button($url, get_string('reallyregrade', 'offlinequiz_regrade'));
         echo '<br/>';
         $url = new moodle_url('/mod/offlinequiz/report.php', array('id' => $cm->id));
         $url->param('mode', 'overview');
         echo $OUTPUT->single_button($url, get_string('cancel'));
         echo $OUTPUT->box_end('linkbox');
         return true;
     }
     // Fetch all groups.
     if ($groups = $DB->get_records('offlinequiz_groups', array('offlinequizid' => $offlinequiz->id), 'number', '*', 0, $offlinequiz->numgroups)) {
         foreach ($groups as $group) {
             $sumgrade = offlinequiz_update_sumgrades($offlinequiz, $group->id);
             $groupletter = $letterstr[$group->number - 1];
             $a = new StdClass();
             $a->letter = $groupletter;
             $a->grade = round($sumgrade, $offlinequiz->decimalpoints);
             echo $OUTPUT->notification(get_string('updatedsumgrades', 'offlinequiz', $a), 'notifysuccess');
         }
     }
     // Options for the popup_action.
     $options = array();
     $options['height'] = 1024;
     // Optional.
     $options['width'] = 860;
     // Optional.
     $options['resizable'] = false;
     $saveresult = false;
     // Loop through all results and regrade while printing progress info.
     foreach ($results as $result) {
         set_time_limit(120);
         $sql = "SELECT ogq.questionid, ogq.maxmark \n                      FROM {offlinequiz_group_questions} ogq\n                     WHERE ogq.offlinequizid = :offlinequizid\n                       AND ogq.offlinegroupid = :offlinegroupid";
         $params = array('offlinequizid' => $offlinequiz->id, 'offlinegroupid' => $result->offlinegroupid);
         if (!($questions = $DB->get_records_sql($sql, $params))) {
             print_error("Failed to get questions for regrading!");
         }
         $user = $DB->get_record('user', array('id' => $result->userid));
         echo '<strong>' . get_string('regradingresult', 'offlinequiz', $user->{$offlinequizconfig->ID_field}) . '</strong> ';
         $changed = $this->regrade_result($result, $questions);
         if ($changed) {
             $quba = question_engine::load_questions_usage_by_activity($result->usageid);
             $DB->set_field('offlinequiz_results', 'sumgrades', $quba->get_total_mark(), array('id' => $result->id));
             $url = new moodle_url($CFG->wwwroot . '/mod/offlinequiz/review.php', array('resultid' => $result->id));
             $title = get_string('changed', 'offlinequiz');
             echo $OUTPUT->action_link($url, $title, new popup_action('click', $url, 'review' . $result->id, $options));
         } else {
             echo get_string('done', 'offlinequiz');
         }
         echo '<br />';
         // The following makes sure that the output is sent immediately.
         @flush();
         @ob_flush();
     }
     // Log this action.
     $params = array('objectid' => $cm->id, 'context' => context_module::instance($cm->id), 'other' => array('numberofresults' => count($results), 'offlinequizid' => $offlinequiz->id));
     $event = \mod_offlinequiz\event\results_regraded::create($params);
     $event->trigger();
     $url = new moodle_url($CFG->wwwroot . '/mod/offlinequiz/report.php', array('q' => $offlinequiz->id, 'mode' => 'overview'));
     offlinequiz_update_grades($offlinequiz);
     echo $OUTPUT->box_start('linkbox');
     echo $OUTPUT->single_button($url, get_string('continue'), 'get');
     echo $OUTPUT->box_end('linkbox');
     return true;
 }
        list($categoryid) = explode(',', $data->category);
        $includesubcategories = !empty($data->includesubcategories);
        $returnurl->param('cat', $data->category);
    } else {
        if (!empty($data->newcategory)) {
            list($parentid, $contextid) = explode(',', $data->parent);
            $categoryid = $qcobject->add_category($data->parent, $data->name, '', true);
            $includesubcategories = 0;
            $returnurl->param('cat', $categoryid . ',' . $contextid);
        } else {
            throw new coding_exception('It seems a form was submitted without any button being pressed???');
        }
    }
    offlinequiz_add_random_questions($offlinequiz, $offlinequizgroup, $categoryid, $data->numbertoadd, $includesubcategories);
    offlinequiz_delete_template_usages($offlinequiz);
    offlinequiz_update_sumgrades($offlinequiz);
    redirect($returnurl);
}
$mform->set_data(array('addonpage' => $addonpage, 'returnurl' => $returnurl, 'cmid' => $cm->id, 'category' => $category));
// Setup $PAGE.
$streditingofflinequiz = get_string('editinga', 'moodle', get_string('modulename', 'offlinequiz'));
$PAGE->navbar->add($streditingofflinequiz);
$PAGE->set_title($streditingofflinequiz);
$PAGE->set_heading($course->fullname);
echo $OUTPUT->header();
if (!($offlinequizname = $DB->get_field($cm->modname, 'name', array('id' => $cm->instance)))) {
    print_error('invalidcoursemodule');
}
$groupletters = 'ABCDEFGHIJKL';
echo $OUTPUT->heading(get_string('addrandomquestiontoofflinequiz', 'offlinequiz', array('name' => $offlinequizname, 'group' => $groupletters[$offlinequiz->groupnumber - 1])), 2);
$mform->display();
    $rawdata = (array) data_submitted();
    foreach ($rawdata as $key => $value) {
        if (preg_match('!^g([0-9]+)$!', $key, $matches)) {
            if (is_numeric(str_replace(',', '.', $value))) {
                // Parse input for question -> grades.
                $questionid = $matches[1];
                offlinequiz_update_question_instance($offlinequiz, $questionid, unformat_float($value));
            } else {
                $bulkgradewarning = true;
            }
        }
    }
    // Redmine 983: Upgrade sumgrades for all offlinequiz groups.
    if ($groups = $DB->get_records('offlinequiz_groups', array('offlinequizid' => $offlinequiz->id), 'number', '*', 0, $offlinequiz->numgroups)) {
        foreach ($groups as $group) {
            $sumgrade = offlinequiz_update_sumgrades($offlinequiz, $group->id);
        }
    }
    offlinequiz_update_all_attempt_sumgrades($offlinequiz);
    offlinequiz_update_grades($offlinequiz, 0, true);
    redirect($afteractionurl);
}
// Get the question bank view.
$questionbank = new mod_offlinequiz\question\bank\custom_view($contexts, $thispageurl, $course, $cm, $offlinequiz);
$questionbank->set_offlinequiz_has_scanned_pages($docscreated);
$questionbank->process_actions($thispageurl, $cm);
// End of process commands =====================================================.
$PAGE->set_pagelayout('incourse');
$PAGE->set_pagetype('mod-offlinequiz-edit');
$output = $PAGE->get_renderer('mod_offlinequiz', 'edit');
$PAGE->set_title(get_string('editingofflinequizx', 'offlinequiz', format_string($offlinequiz->name)));