From da7eac9e560dd89a48578e8ff522a48849cde371 Mon Sep 17 00:00:00 2001 From: YourFriendlyNeighborhoodDealer Date: Wed, 13 Mar 2019 08:23:38 +0100 Subject: [PATCH] Moving element getting to classes --- main.js | 781 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 404 insertions(+), 377 deletions(-) diff --git a/main.js b/main.js index 20a13ea..344c1d5 100644 --- a/main.js +++ b/main.js @@ -28,19 +28,19 @@ const serverAdress = "https://qmining.tk/"; // forcing pages for testing. unless you test, do not set these to true! // only one of these should be true for testing -const forceTestPage = false; +const forceTestPage = true; const forceResultPage = false; const forceDefaultPage = false; const logElementGetting = false; const log = true; -const motdShowCount = 3; +const motdShowCount = 3; /* Ammount of times to show motd */ var motd = ""; var lastestVersion = ""; -const minMatchAmmount = 55; -const minResultMatchPercent = 99; -const lengthDiffMultiplier = 10; +const minMatchAmmount = 55; /* Minimum ammount to consider that two questions match during answering */ +const minResultMatchPercent = 99; /* Minimum ammount to consider that two questions match during saving */ +const lengthDiffMultiplier = 10; /* Percent minus for length difference */ //: Class descriptions {{{ class Question { @@ -280,406 +280,422 @@ function Main() { // all dom getting stuff are in this sections, so on // moodle dom change, stuff breaks here -function GetAllQuestionsDropdown() { - if (logElementGetting) - Log("getting dropdown question"); - let items = document.getElementById("responseform").getElementsByTagName("p")[0].childNodes; - let r = ""; - items.forEach((item) => { - if (item.tagName == undefined) - r += item.nodeValue; +class QuestionsPageModell { - }); - return r; -} + GetAllQuestionsDropdown() { + if (logElementGetting) + Log("getting dropdown question"); + let items = document.getElementById("responseform").getElementsByTagName("p")[0].childNodes; + let r = ""; + items.forEach((item) => { + if (item.tagName == undefined) + r += item.nodeValue; -function GetAllQuestionsQtext() { - if (logElementGetting) - Log("getting all questions qtext"); - return document.getElementById("responseform").getElementsByClassName("qtext"); // getting questions -} - -function GetAllQuestionsP() { - if (logElementGetting) - Log("getting all questions by tag p"); - return document.getElementById("responseform").getElementsByTagName("p"); -} - -function GetFormulationClearfix() { - if (logElementGetting) - Log("getting formulation clearfix lol"); - return document.getElementsByClassName("formulation clearfix"); -} - -function GetAnswerOptions() { - if (logElementGetting) - Log("getting all answer options"); - return GetFormulationClearfix()[0].childNodes[3].innerText; -} - -function GetQuestionImages() { - if (logElementGetting) - Log("getting question images"); - return GetFormulationClearfix()[0].getElementsByTagName("img"); -} - -function GetCurrentSubjectName() { - if (logElementGetting) - Log("getting current subjects name"); - return document.getElementById("page-header").innerText.split("\n")[0]; -} - -function GetVideo() { - if (logElementGetting) - Log("getting video stuff"); - return document.getElementsByTagName("video")[0]; -} - -function GetVideoElement() { - if (logElementGetting) - Log("getting video element"); - return document.getElementById("videoElement").parentNode; -} - -function GetAllAnswer(index) { - if (logElementGetting) - Log("getting all answers, ind: " + index); - return document.getElementsByClassName("answer")[index].childNodes; -} - -function GetInputType(answers, i) { - if (logElementGetting) - Log("getting input type"); - return answers[i].getElementsByTagName("input")[0].type; -} - -function GetFormResult() { - if (logElementGetting) - Log("getting form result"); - var t = document.getElementsByTagName("form")[0].childNodes[0].childNodes; - if (t.length > 0 && t[0].tagName == undefined) // debreceni moodle - return document.getElementsByTagName("form")[1].childNodes[0].childNodes; - else - return t; -} - -function GetQText(i) { - if (logElementGetting) - Log("getting qtext by index: " + i); - var results = GetFormResult(); // getting results element - return results[i].getElementsByClassName("qtext"); -} - -function GetDropboxes(i) { - if (logElementGetting) - Log("getting dropboxes by index: " + i); - var results = GetFormResult(); // getting results element - return results[i].getElementsByTagName("select"); -} - -function GetCurrQuestion(i) { - if (logElementGetting) - Log("getting curr questions by index: " + i); - return document.getElementsByTagName("form")[0].childNodes[0].childNodes[i].childNodes[1].childNodes[ - 0].innerText; -} - -function GetCurrentAnswer(i) { - if (logElementGetting) - Log("getting curr answer by index: " + i); - var results = GetFormResult(); // getting results element - var t = results[i].getElementsByClassName("formulation clearfix")[0].getElementsByTagName("span"); - if (t.length > 2) - return t[1].innerHTML.split("
")[1]; -} - -function GetSelectAnswer() { - if (logElementGetting) - Log("getting selected answer"); - var t = document.getElementsByTagName("select"); - if (t.length > 0) - return t[0].options[document.getElementsByTagName("select")[ - 0].selectedIndex].innerText; -} - -function GetAnswerNode(i) { - if (logElementGetting) - Log("getting answer node"); - - var results = GetFormResult(); // getting results element - - var r = results[i].getElementsByClassName("answer")[0].childNodes; - var ret = []; - for (var j = 0; j < r.length; j++) - if (r[j].tagName != undefined && r[j].tagName.toLowerCase() == "div") - ret.push(r[j]); - - let qtype = DetermineQuestionType(ret); - - return { - nodes: ret, - type: qtype - }; -} - -function DetermineQuestionType(nodes) { - let qtype = ""; - let i = 0; - - while (i < nodes.length && qtype == "") { - let inps = nodes[i].getElementsByTagName("input"); - - if (inps.length > 0) { - qtype = inps[0].type; - } - - i++; - } - - return qtype; - -} - -function GetPossibleAnswers(i) { - if (logElementGetting) - Log("getting possible answers"); - var results = GetFormResult(); // getting results element - var items = GetFormResult()[i].getElementsByTagName("label"); - var r = []; - for (var j = 0; j < items.length; j++) { - - function TryGetCorrect(j) { - var cn = items[j].parentNode.className; - if (cn.includes("correct")) - return cn.includes("correct") && !cn.includes("incorrect"); - } - r.push({ - value: items[j].innerText, - iscorrect: TryGetCorrect(j) }); + return r; } - return r; -} -function GetRightAnswerIfCorrectShown(i) { - if (logElementGetting) - Log("getting right answer if correct shown"); - var results = GetFormResult(); // getting results element - return results[i].getElementsByClassName("rightanswer"); -} + GetAllQuestionsQtext() { + if (logElementGetting) + Log("getting all questions qtext"); + return document.getElementById("responseform").getElementsByClassName("qtext"); // getting questions + } -function GetWrongAnswerIfCorrectNotShown(i) { - if (logElementGetting) - Log("getting wrong answer if correct not shown"); - var results = GetFormResult(); // getting results element - var n = results[i].getElementsByTagName("i")[0].parentNode; - if (n.className.includes("incorrect")) - return results[i].getElementsByTagName("i")[0].parentNode.innerText; - else - return ""; -} + GetAllQuestionsP() { + if (logElementGetting) + Log("getting all questions by tag p"); + return document.getElementById("responseform").getElementsByTagName("p"); + } -function GetRightAnswerIfCorrectNotShown(i) { - if (logElementGetting) - Log("Getting right answer if correct not shown"); - var results = GetFormResult(); // getting results element - var n = results[i].getElementsByTagName("i")[0].parentNode; - if (n.className.includes("correct") && !n.className.includes("incorrect")) - return results[i].getElementsByTagName("i")[0].parentNode.innerText; - else - return ""; -} + GetFormulationClearfix() { + if (logElementGetting) + Log("getting formulation clearfix lol"); + return document.getElementsByClassName("formulation clearfix"); + } -function GetFormCFOfResult(result) { - if (logElementGetting) - Log("getting formulation clearfix"); - return result.getElementsByClassName("formulation clearfix")[0]; -} + GetAnswerOptions() { + if (logElementGetting) + Log("getting all answer options"); + return GetFormulationClearfix()[0].childNodes[3].innerText; + } -function GetResultText(i) { - if (logElementGetting) - Log("getting result text"); - var results = GetFormResult(); // getting results element - return GetFormCFOfResult(results[i]).getElementsByTagName("p"); -} + GetQuestionImages() { + if (logElementGetting) + Log("getting question images"); + return GetFormulationClearfix()[0].getElementsByTagName("img"); + } -function GetResultImage(i) { - if (logElementGetting) - Log("getting result image"); - var results = GetFormResult(); // getting results element - return GetFormCFOfResult(results[i]).getElementsByTagName("img"); -} - -// this function should return the question, posible answers, and image names -function GetQuestionFromTest() { - var questions; // the important questions - var allQuestions; // all questions - try // trying to get tha current questions - { - allQuestions = GetAllQuestionsQtext(); // getting questions - if (allQuestions.length == 0) // if there are no found questions + // this function should return the question, posible answers, and image names + GetQuestionFromTest() { + var questions; // the important questions + var allQuestions; // all questions + try // trying to get tha current questions { - var ddq = GetAllQuestionsDropdown(); - if (EmptyOrWhiteSpace(ddq)) { - var questionData = ""; - for (var j = 0; j < allQuestions.length; j++) { - allQuestions = GetAllQuestionsQtext()[j].childNodes; - for (var i = 0; i < allQuestions.length; i++) { - if (allQuestions[i].data != undefined && !EmptyOrWhiteSpace(allQuestions[i].data)) // if the current element has some text data to add - { - questionData += allQuestions[i].data + " "; // adding text to question data + allQuestions = this.GetAllQuestionsQtext(); // getting questions + if (allQuestions.length == 0) // if there are no found questions + { + var ddq = GetAllQuestionsDropdown(); + if (EmptyOrWhiteSpace(ddq)) { + var questionData = ""; + for (var j = 0; j < allQuestions.length; j++) { + allQuestions = this.GetAllQuestionsQtext()[j].childNodes; + for (var i = 0; i < allQuestions.length; i++) { + if (allQuestions[i].data != undefined && !EmptyOrWhiteSpace(allQuestions[i].data)) // if the current element has some text data to add + { + questionData += allQuestions[i].data + " "; // adding text to question data + } + } + } + questions = [questionData]; + } else + questions = [ddq]; + } else // if there is + { + questions = []; + for (var i = 0; i < allQuestions.length; i++) { + questions.push(allQuestions[i].innerText); + } + } + } catch (e) { + Exception(e, "script error at getting question:"); + } + var imgNodes = ""; // the image nodes for questions + try { + imgNodes = GetQuestionImages(); // getting question images, if there is any + AddImageNamesToImages(imgNodes); // adding image names to images, so its easier to search for, or even guessing + } catch (e) { + Log(e); + Log("Some error with images"); + } + + questions = questions.map((item, ind) => { + return ReplaceCharsWithSpace(item, "\n"); + }); + + return { + imgnodes: imgNodes, + allQ: allQuestions, + q: questions + }; + } + +} + +class ResultsPageModell { + + GetAllAnswer(index) { + if (logElementGetting) + Log("getting all answers, ind: " + index); + return document.getElementsByClassName("answer")[index].childNodes; + } + + GetPossibleAnswers(i) { + if (logElementGetting) + Log("getting possible answers"); + var results = GetFormResult(); // getting results element + var items = GetFormResult()[i].getElementsByTagName("label"); + var r = []; + for (var j = 0; j < items.length; j++) { + + function TryGetCorrect(j) { + var cn = items[j].parentNode.className; + if (cn.includes("correct")) + return cn.includes("correct") && !cn.includes("incorrect"); + } + r.push({ + value: items[j].innerText, + iscorrect: TryGetCorrect(j) + }); + } + return r; + } + + GetRightAnswerIfCorrectShown(i) { + if (logElementGetting) + Log("getting right answer if correct shown"); + var results = GetFormResult(); // getting results element + return results[i].getElementsByClassName("rightanswer"); + } + + GetWrongAnswerIfCorrectNotShown(i) { + if (logElementGetting) + Log("getting wrong answer if correct not shown"); + var results = GetFormResult(); // getting results element + var n = results[i].getElementsByTagName("i")[0].parentNode; + if (n.className.includes("incorrect")) + return results[i].getElementsByTagName("i")[0].parentNode.innerText; + else + return ""; + } + + GetRightAnswerIfCorrectNotShown(i) { + if (logElementGetting) + Log("Getting right answer if correct not shown"); + var results = GetFormResult(); // getting results element + var n = results[i].getElementsByTagName("i")[0].parentNode; + if (n.className.includes("correct") && !n.className.includes("incorrect")) + return results[i].getElementsByTagName("i")[0].parentNode.innerText; + else + return ""; + } + + GetFormCFOfResult(result) { + if (logElementGetting) + Log("getting formulation clearfix"); + return result.getElementsByClassName("formulation clearfix")[0]; + } + + GetResultText(i) { + if (logElementGetting) + Log("getting result text"); + var results = GetFormResult(); // getting results element + return GetFormCFOfResult(results[i]).getElementsByTagName("p"); + } + + GetResultImage(i) { + if (logElementGetting) + Log("getting result image"); + var results = GetFormResult(); // getting results element + return GetFormCFOfResult(results[i]).getElementsByTagName("img"); + } + + + // gets the question from the result page + // i is the index of the question + GetQuestionFromResult(i) { + var temp = GetQText(i); + var currQuestion = ""; + if (temp.length > 0) // if the qtext element is not 0 length + { + currQuestion = temp[0].innerText; // adding the question to curr question as .q + } else { + // this is black magic fuckery a bit + if (GetDropboxes(i).length > 0) // if there is dropdown list in the current question + { + var allNodes = GetResultText(i); + currQuestion = ""; + for (var k = 0; k < allNodes.length; k++) { + var allQuestions = GetResultText(i)[k].childNodes; + for (var j = 0; j < allQuestions.length; j++) { + if (allQuestions[j].data != undefined && !EmptyOrWhiteSpace(allQuestions[j].data)) { + currQuestion += allQuestions[j].data + " "; } } } - questions = [questionData]; - } else - questions = [ddq]; - } else // if there is - { - questions = []; - for (var i = 0; i < allQuestions.length; i++) { - questions.push(allQuestions[i].innerText); - } - } - } catch (e) { - Exception(e, "script error at getting question:"); - } - var imgNodes = ""; // the image nodes for questions - try { - imgNodes = GetQuestionImages(); // getting question images, if there is any - AddImageNamesToImages(imgNodes); // adding image names to images, so its easier to search for, or even guessing - } catch (e) { - Log(e); - Log("Some error with images"); - } - - questions = questions.map((item, ind) => { - return ReplaceCharsWithSpace(item, "\n"); - }); - - return { - imgnodes: imgNodes, - allQ: allQuestions, - q: questions - }; -} - -// gets the question from the result page -// i is the index of the question -function GetQuestionFromResult(i) { - var temp = GetQText(i); - var currQuestion = ""; - if (temp.length > 0) // if the qtext element is not 0 length - { - currQuestion = temp[0].innerText; // adding the question to curr question as .q - } else { - // this is black magic fuckery a bit - if (GetDropboxes(i).length > 0) // if there is dropdown list in the current question - { - var allNodes = GetResultText(i); - currQuestion = ""; - for (var k = 0; k < allNodes.length; k++) { - var allQuestions = GetResultText(i)[k].childNodes; - for (var j = 0; j < allQuestions.length; j++) { - if (allQuestions[j].data != undefined && !EmptyOrWhiteSpace(allQuestions[j].data)) { - currQuestion += allQuestions[j].data + " "; - } + } else { + try { + currQuestion = GetCurrQuestion(i); + } catch (e) { + currQuestion = "REEEEEEEEEEEEEEEEEEEEE"; // this shouldnt really happen sry guys } } - } else { - try { - currQuestion = GetCurrQuestion(i); - } catch (e) { - currQuestion = "REEEEEEEEEEEEEEEEEEEEE"; // this shouldnt really happen sry guys + } + return currQuestion; + } + + // tries to get right answer from result page + // i is the index of the question + GetRightAnswerFromResult(i) { + var fun = []; + + // the basic type of getting answers + fun.push(function TryGet0(i) { + var temp = GetRightAnswerIfCorrectShown(i); // getting risht answer + if (temp.length > 0) // if the rightanswer element is not 0 length + return temp[0].innerText; // adding the answer to curr question as .a + }); + + // if there is dropdown list in the current question + fun.push(function TryGet1(i) { + if (GetDropboxes(i).length > 0) + return GetCurrentAnswer(i); + }); + + // if the correct answers are not shown, and the selected answer + // is correct + fun.push(function TryGet2(i) { + return GetRightAnswerIfCorrectNotShown(i); + }); + + // if there is dropbox in the question + fun.push(function TryGet3(i) { + return GetSelectAnswer(); + }); + + // if the correct answers are not shown, and the selected answer + // is incorrect, and there are only 2 options + fun.push(function TryGet4(i) { + var possibleAnswers = GetPossibleAnswers(i); + if (possibleAnswers.length == 2) { + for (var k = 0; k < possibleAnswers.length; k++) + if (possibleAnswers[k].iscorrect == undefined) + return possibleAnswers[k].value; } + }); + + fun.push(function TryGetFinal(i) { + return undefined; + }); + + var j = 0; + var currAnswer; + while (j < fun.length && EmptyOrWhiteSpace(currAnswer)) { + currAnswer = fun[j](i); + j++; } - } - return currQuestion; -} -// tries to get right answer from result page -// i is the index of the question -function GetRightAnswerFromResult(i) { - var fun = []; - - // the basic type of getting answers - fun.push(function TryGet0(i) { - var temp = GetRightAnswerIfCorrectShown(i); // getting risht answer - if (temp.length > 0) // if the rightanswer element is not 0 length - return temp[0].innerText; // adding the answer to curr question as .a - }); - - // if there is dropdown list in the current question - fun.push(function TryGet1(i) { - if (GetDropboxes(i).length > 0) - return GetCurrentAnswer(i); - }); - - // if the correct answers are not shown, and the selected answer - // is correct - fun.push(function TryGet2(i) { - return GetRightAnswerIfCorrectNotShown(i); - }); - - // if there is dropbox in the question - fun.push(function TryGet3(i) { - return GetSelectAnswer(); - }); - - // if the correct answers are not shown, and the selected answer - // is incorrect, and there are only 2 options - fun.push(function TryGet4(i) { - var possibleAnswers = GetPossibleAnswers(i); - if (possibleAnswers.length == 2) { - for (var k = 0; k < possibleAnswers.length; k++) - if (possibleAnswers[k].iscorrect == undefined) - return possibleAnswers[k].value; - } - }); - - fun.push(function TryGetFinal(i) { - return undefined; - }); - - var j = 0; - var currAnswer; - while (j < fun.length && EmptyOrWhiteSpace(currAnswer)) { - currAnswer = fun[j](i); - j++; + return currAnswer; } - return currAnswer; -} + // version 2 of getting right answer from result page + // i is the index of the question + GetRightAnswerFromResultv2(i) { + try { + var answerNodes = GetAnswerNode(i); + let items = answerNodes.nodes; -// version 2 of getting right answer from result page -// i is the index of the question -function GetRightAnswerFromResultv2(i) { - try { - var answerNodes = GetAnswerNode(i); - let items = answerNodes.nodes; + if (answerNodes.type == "checkbox") + return GetRightAnswerFromResult(i); - if (answerNodes.type == "checkbox") - return GetRightAnswerFromResult(i); - - for (var j = 0; j < items.length; j++) { - var cn = items[j].className; - if (cn.includes("correct") && !cn.includes("incorrect")) - return items[j].innerText; - } - if (items.length == 2) { for (var j = 0; j < items.length; j++) { var cn = items[j].className; - if (!cn.includes("correct")) + if (cn.includes("correct") && !cn.includes("incorrect")) return items[j].innerText; } + if (items.length == 2) { + for (var j = 0; j < items.length; j++) { + var cn = items[j].className; + if (!cn.includes("correct")) + return items[j].innerText; + } + } + } catch (e) { + Log("error at new nodegetting, trying the oldschool way"); } - } catch (e) { - Log("error at new nodegetting, trying the oldschool way"); + } + +} + +class MiscPageModell { + + GetCurrentSubjectName() { + if (logElementGetting) + Log("getting current subjects name"); + return document.getElementById("page-header").innerText.split("\n")[0]; + } + + GetVideo() { + if (logElementGetting) + Log("getting video stuff"); + return document.getElementsByTagName("video")[0]; + } + + GetVideoElement() { + if (logElementGetting) + Log("getting video element"); + return document.getElementById("videoElement").parentNode; + } + + GetInputType(answers, i) { + if (logElementGetting) + Log("getting input type"); + return answers[i].getElementsByTagName("input")[0].type; + } + + GetFormResult() { + if (logElementGetting) + Log("getting form result"); + var t = document.getElementsByTagName("form")[0].childNodes[0].childNodes; + if (t.length > 0 && t[0].tagName == undefined) // debreceni moodle + return document.getElementsByTagName("form")[1].childNodes[0].childNodes; + else + return t; + } + + GetQText(i) { + if (logElementGetting) + Log("getting qtext by index: " + i); + var results = GetFormResult(); // getting results element + return results[i].getElementsByClassName("qtext"); + } + + GetDropboxes(i) { + if (logElementGetting) + Log("getting dropboxes by index: " + i); + var results = GetFormResult(); // getting results element + return results[i].getElementsByTagName("select"); + } + + GetCurrQuestion(i) { + if (logElementGetting) + Log("getting curr questions by index: " + i); + return document.getElementsByTagName("form")[0].childNodes[0].childNodes[i].childNodes[1].childNodes[ + 0].innerText; + } + + GetCurrentAnswer(i) { + if (logElementGetting) + Log("getting curr answer by index: " + i); + var results = GetFormResult(); // getting results element + var t = results[i].getElementsByClassName("formulation clearfix")[0].getElementsByTagName("span"); + if (t.length > 2) + return t[1].innerHTML.split("
")[1]; + } + + GetSelectAnswer() { + if (logElementGetting) + Log("getting selected answer"); + var t = document.getElementsByTagName("select"); + if (t.length > 0) + return t[0].options[document.getElementsByTagName("select")[ + 0].selectedIndex].innerText; + } + + GetAnswerNode(i) { + if (logElementGetting) + Log("getting answer node"); + + var results = GetFormResult(); // getting results element + + var r = results[i].getElementsByClassName("answer")[0].childNodes; + var ret = []; + for (var j = 0; j < r.length; j++) + if (r[j].tagName != undefined && r[j].tagName.toLowerCase() == "div") + ret.push(r[j]); + + let qtype = DetermineQuestionType(ret); + + return { + nodes: ret, + type: qtype + }; + } + + DetermineQuestionType(nodes) { + let qtype = ""; + let i = 0; + + while (i < nodes.length && qtype == "") { + let inps = nodes[i].getElementsByTagName("input"); + + if (inps.length > 0) { + qtype = inps[0].type; + } + + i++; + } + + return qtype; + } } //: }}} +var QPM = new QuestionsPageModell(); +var RPM = new ResultsPageModell(); +var MPM = new MiscPageModell(); + //: Main logic stuff {{{ //: Loading {{{ @@ -794,10 +810,14 @@ function Version161() { //: }}} +var GetFileData = () => { + return GM_getResourceText("data"); +}; + function ReadFile(cwith) { var resource = ""; try { - resource = GM_getResourceText("data"); // getting data from txt + resource = GetFileData(); // getting data from txt if (resource == undefined) { ShowMessage({ @@ -1022,8 +1042,8 @@ function NLoad(resource, cwith) { while (i < data.length && !GM_getValue("Is" + i + "Active")) { i++; } - if (i >= data.length) - document.getElementById("HelperMenuButton").style.background = "yellow"; + + AlertOnNoQuestion(i); } catch (e) { Exception(e, "script error at loading:"); @@ -1032,6 +1052,13 @@ function NLoad(resource, cwith) { cwith(count, subjCount); } +var AlertOnNoQuestion = (i) => { + try { + if (i >= data.length) + document.getElementById("HelperMenuButton").style.background = "yellow"; + } catch (e) {} +}; + //: }}} //: UI handling {{{ @@ -1059,7 +1086,7 @@ function HandleUI(url, count, subjCount) { greetMsg = "Moodle/Elearning/KMOOC segéd v. " + GM_info.script.version + ". "; if (lastestVersion != undefined && GM_info.script.version != lastestVersion) { - greetMsg += "Új verzió elérhető: " + lastestVersion + " "; + greetMsg += "Új verzió elérhető: " + lastestVersion + "\n"; timeout = undefined; } greetMsg += count + " kérdés és " + subjCount + " tárgy betöltve. (click for help)."; @@ -1129,7 +1156,7 @@ function HandleUI(url, count, subjCount) { //: Answering stuffs {{{ function HandleQuiz() { - var q = GetQuestionFromTest(); + var q = QPM.GetQuestionFromTest(); var questions = q.q; var allQuestions = q.allQ; var imgNodes = q.imgnodes;