{"version":3,"file":"prefix-338.457dc0d17fa61851.bundle.js","mappings":"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","sources":["webpack://WebComponents/./runestone/mchoice/js/mchoice.js","webpack://WebComponents/./runestone/mchoice/js/timedmc.js"],"sourcesContent":["/*==========================================\n======== Master mchoice.js =========\n============================================\n=== This file contains the JS for the ===\n=== Runestone multiple choice component. ===\n============================================\n=== Created By ===\n=== Isaiah Mayerchak ===\n=== and ===\n=== Kirby Olson ===\n=== 6/4/15 ===\n==========================================*/\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\n//import \"./../styles/runestone-custom-sphinx-bootstrap.css\";\nimport \"../css/mchoice.css\";\n\n// MC constructor\nexport default class MultipleChoice extends RunestoneBase {\n constructor(opts) {\n super(opts);\n opts = opts || {};\n var orig = opts.orig; // entire <ul> element\n this.origElem = orig;\n this.useRunestoneServices = opts.useRunestoneServices;\n this.multipleanswers = false;\n this.divid = orig.id;\n if ($(this.origElem).data(\"multipleanswers\") === true) {\n this.multipleanswers = true;\n }\n this.children = this.origElem.childNodes;\n this.random = false;\n if ($(this.origElem).is(\"[data-random]\")) {\n this.random = true;\n }\n this.correct = null;\n this.answerList = [];\n this.correctList = [];\n this.correctIndexList = [];\n this.feedbackList = [];\n this.question = null;\n this.caption = \"Multiple Choice\";\n this.findAnswers();\n this.findQuestion();\n this.findFeedbacks();\n this.createCorrectList();\n this.createMCForm();\n this.addCaption(\"runestone\");\n this.checkServer(\"mChoice\", true);\n // https://docs.mathjax.org/en/latest/options/startup/startup.html\n // https://docs.mathjax.org/en/latest/web/configuration.html#startup-action\n // runestoneMathReady is defined in the preamble for all PTX authored books\n this.queueMathJax(this.containerDiv);\n if (typeof Prism !== \"undefined\") {\n Prism.highlightAllUnder(this.containerDiv);\n }\n }\n\n /*====================================\n ==== Functions parsing variables ====\n ==== out of intermediate HTML ====\n ====================================*/\n findQuestion() {\n var delimiter;\n for (var i = 0; i < this.origElem.childNodes.length; i++) {\n if (this.origElem.childNodes[i].nodeName === \"LI\") {\n delimiter = this.origElem.childNodes[i].outerHTML;\n break;\n }\n }\n var fulltext = $(this.origElem).html();\n var temp = fulltext.split(delimiter);\n this.question = temp[0];\n }\n\n findAnswers() {\n // Creates answer objects and pushes them to answerList\n // format: ID, Correct bool, Content (text)\n var ChildAnswerList = [];\n for (var i = 0; i < this.children.length; i++) {\n if ($(this.children[i]).is(\"[data-component=answer]\")) {\n ChildAnswerList.push(this.children[i]);\n }\n }\n for (var j = 0; j < ChildAnswerList.length; j++) {\n var answer_id = $(ChildAnswerList[j]).attr(\"id\");\n var is_correct = false;\n if ($(ChildAnswerList[j]).is(\"[data-correct]\")) {\n // If data-correct attribute exists, answer is correct\n is_correct = true;\n }\n var answer_text = $(ChildAnswerList[j]).html();\n var answer_object = {\n id: answer_id,\n correct: is_correct,\n content: answer_text,\n };\n this.answerList.push(answer_object);\n }\n }\n\n findFeedbacks() {\n for (var i = 0; i < this.children.length; i++) {\n if ($(this.children[i]).is(\"[data-component=feedback]\")) {\n this.feedbackList.push(this.children[i].innerHTML);\n }\n }\n }\n\n createCorrectList() {\n // Creates array that holds the ID\"s of correct answers\n // Also populates an array that holds the indeces of correct answers\n for (var i = 0; i < this.answerList.length; i++) {\n if (this.answerList[i].correct) {\n this.correctList.push(this.answerList[i].id);\n this.correctIndexList.push(i);\n }\n }\n }\n\n /*===========================================\n ==== Functions generating final HTML ====\n ===========================================*/\n createMCForm() {\n this.renderMCContainer();\n this.renderMCForm(); // renders the form with options and buttons\n this.renderMCfeedbackDiv();\n // replaces intermediate HTML with rendered HTML\n $(this.origElem).replaceWith(this.containerDiv);\n }\n\n renderMCContainer() {\n this.containerDiv = document.createElement(\"div\");\n $(this.containerDiv).html(this.question);\n $(this.containerDiv).addClass(this.origElem.getAttribute(\"class\"));\n this.containerDiv.id = this.divid;\n }\n\n renderMCForm() {\n this.optsForm = document.createElement(\"form\");\n this.optsForm.id = this.divid + \"_form\";\n $(this.optsForm).attr({\n method: \"get\",\n action: \"\",\n onsubmit: \"return false;\",\n });\n // generate form options\n this.renderMCFormOpts();\n this.renderMCFormButtons();\n // Append the form to the container\n this.containerDiv.appendChild(this.optsForm);\n }\n\n renderMCFormOpts() {\n // creates input DOM elements\n this.optionArray = []; // array with an object for each option containing the input and label for that option\n var input_type = \"radio\";\n if (this.multipleanswers) {\n input_type = \"checkbox\";\n }\n // this.indexArray is used to index through the answers\n // it is just 0-n normally, but the order is shuffled if the random option is present\n this.indexArray = [];\n for (var i = 0; i < this.answerList.length; i++) {\n this.indexArray.push(i);\n }\n if (this.random) {\n this.randomizeAnswers();\n }\n let self = this;\n let answerFunc = function() {\n self.isAnswered = true;\n };\n for (var j = 0; j < this.answerList.length; j++) {\n var k = this.indexArray[j];\n var optid = this.divid + \"_opt_\" + k;\n // Create the label for the input\n var label = document.createElement(\"label\");\n // If the content begins with a ``<p>``, put the label inside of it. (Sphinx 2.0 puts all content in a ``<p>``, while Sphinx 1.8 doesn't).\n var content = this.answerList[k].content;\n var prefix = \"\";\n if (content.startsWith(\"<p>\")) {\n prefix = \"<p>\";\n content = content.slice(3);\n }\n $(label).html(\n `${prefix}<input type=\"${input_type}\" name=\"group1\" value=${k} id=${optid}>${String.fromCharCode(\n \"A\".charCodeAt(0) + j\n )}. ${content}`\n );\n // create the object to store in optionArray\n var optObj = {\n input: $(label).find(\"input\")[0],\n label: label,\n };\n optObj.input.onclick = answerFunc;\n\n this.optionArray.push(optObj);\n // add the option to the form\n this.optsForm.appendChild(label);\n this.optsForm.appendChild(document.createElement(\"br\"));\n }\n }\n\n renderMCFormButtons() {\n // submit and compare me buttons\n // Create submit button\n this.submitButton = document.createElement(\"button\");\n this.submitButton.textContent = \"Check Me\";\n $(this.submitButton).attr({\n class: \"btn btn-success\",\n name: \"do answer\",\n type: \"button\",\n });\n if (this.multipleanswers) {\n this.submitButton.addEventListener(\n \"click\",\n function() {\n this.processMCMASubmission(true);\n }.bind(this),\n false\n );\n } else {\n this.submitButton.addEventListener(\n \"click\",\n function(ev) {\n ev.preventDefault();\n this.processMCMFSubmission(true);\n }.bind(this),\n false\n );\n } // end else\n this.optsForm.appendChild(this.submitButton);\n // Create compare button\n if (this.useRunestoneServices && !eBookConfig.peer) {\n this.compareButton = document.createElement(\"button\");\n $(this.compareButton).attr({\n class: \"btn btn-default\",\n id: this.divid + \"_bcomp\",\n disabled: \"\",\n name: \"compare\",\n });\n this.compareButton.textContent = \"Compare me\";\n this.compareButton.addEventListener(\n \"click\",\n function() {\n this.compareAnswers(this.divid);\n }.bind(this),\n false\n );\n this.optsForm.appendChild(this.compareButton);\n }\n }\n\n renderMCfeedbackDiv() {\n this.feedBackDiv = document.createElement(\"div\");\n this.feedBackDiv.id = this.divid + \"_feedback\";\n this.containerDiv.appendChild(document.createElement(\"br\"));\n this.containerDiv.appendChild(this.feedBackDiv);\n }\n\n randomizeAnswers() {\n // Makes the ordering of the answer choices random\n var currentIndex = this.indexArray.length,\n temporaryValue,\n randomIndex;\n // While there remain elements to shuffle...\n while (currentIndex !== 0) {\n // Pick a remaining element...\n randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex -= 1;\n // And swap it with the current element.\n temporaryValue = this.indexArray[currentIndex];\n this.indexArray[currentIndex] = this.indexArray[randomIndex];\n this.indexArray[randomIndex] = temporaryValue;\n var temporaryFeedback = this.feedbackList[currentIndex];\n this.feedbackList[currentIndex] = this.feedbackList[randomIndex];\n this.feedbackList[randomIndex] = temporaryFeedback;\n }\n }\n\n /*===================================\n === Checking/loading from storage ===\n ===================================*/\n restoreAnswers(data) {\n // Restore answers from storage retrieval done in RunestoneBase\n // sometimes data.answer can be null\n if (!data.answer) {\n data.answer = \"\";\n }\n var answers = data.answer.split(\",\");\n for (var a = 0; a < answers.length; a++) {\n var index = answers[a];\n for (var b = 0; b < this.optionArray.length; b++) {\n if (this.optionArray[b].input.value == index) {\n $(this.optionArray[b].input).attr(\"checked\", \"true\");\n }\n }\n }\n if (this.multipleanswers) {\n this.processMCMASubmission(false);\n } else {\n this.processMCMFSubmission(false);\n }\n }\n\n checkLocalStorage() {\n // Repopulates MCMA questions with a user's previous answers,\n // which were stored into local storage.\n var storedData;\n var answers;\n if (this.graderactive) {\n return;\n }\n var len = localStorage.length;\n if (len > 0) {\n var ex = localStorage.getItem(this.localStorageKey());\n if (ex !== null) {\n try {\n storedData = JSON.parse(ex);\n answers = storedData.answer.split(\",\");\n } catch (err) {\n // error while parsing; likely due to bad value stored in storage\n console.log(err.message);\n localStorage.removeItem(this.localStorageKey());\n return;\n }\n for (var a = 0; a < answers.length; a++) {\n var index = answers[a];\n for (var b = 0; b < this.optionArray.length; b++) {\n if (this.optionArray[b].input.value == index) {\n $(this.optionArray[b].input).attr(\n \"checked\",\n \"true\"\n );\n }\n }\n }\n if (this.useRunestoneServices) {\n this.enableMCComparison();\n this.getSubmittedOpts(); // to populate givenlog for logging\n if (this.multipleanswers) {\n this.logMCMAsubmission();\n } else {\n this.logMCMFsubmission();\n }\n }\n }\n }\n }\n\n setLocalStorage(data) {\n var timeStamp = new Date();\n var storageObj = {\n answer: data.answer,\n timestamp: timeStamp,\n correct: data.correct,\n };\n localStorage.setItem(\n this.localStorageKey(),\n JSON.stringify(storageObj)\n );\n }\n\n /*===============================\n === Processing MC Submissions ===\n ===============================*/\n processMCMASubmission(logFlag) {\n // Called when the submit button is clicked\n this.getSubmittedOpts(); // make sure this.givenArray is populated\n this.scoreMCMASubmission();\n this.setLocalStorage({\n correct: this.correct ? \"T\" : \"F\",\n answer: this.givenArray.join(\",\"),\n });\n if (logFlag) {\n this.logMCMAsubmission();\n }\n if (!eBookConfig.peer || eBookConfig.isInstructor) {\n this.renderMCMAFeedBack();\n if (this.useRunestoneServices) {\n this.enableMCComparison();\n }\n } else {\n // acknowledge submission\n if (eBookConfig.peer &&\n eBookConfig.peerMode === \"async\" &&\n typeof studentVoteCount !== \"undefined\" &&\n studentVoteCount > 1) {\n this.renderMCMAFeedBack();\n } else {\n $(this.feedBackDiv).html(\"<p>Your Answer has been recorded</p>\");\n $(this.feedBackDiv).attr(\"class\", \"alert alert-info\");\n }\n }\n }\n\n getSubmittedOpts() {\n var given;\n this.singlefeedback = \"\"; // Used for MCMF questions\n this.feedbackString = \"\"; // Used for MCMA questions\n this.givenArray = [];\n this.givenlog = \"\";\n var buttonObjs = this.optsForm.elements.group1;\n for (var i = 0; i < buttonObjs.length; i++) {\n if (buttonObjs[i].checked) {\n given = buttonObjs[i].value;\n this.givenArray.push(given);\n this.feedbackString += `<li value=\"${i + 1}\">${\n this.feedbackList[i]\n }</li>`;\n this.givenlog += given + \",\";\n this.singlefeedback = this.feedbackList[i];\n }\n }\n this.givenArray.sort();\n }\n\n checkCurrentAnswer() {\n this.getSubmittedOpts();\n if (this.multipleanswers) {\n this.scoreMCMASubmission();\n } else {\n this.scoreMCMFSubmission();\n }\n }\n\n async logCurrentAnswer(sid) {\n if (this.multipleanswers) {\n await this.logMCMAsubmission(sid);\n } else {\n await this.logMCMFsubmission(sid);\n }\n }\n\n renderFeedback() {\n if (this.multipleanswers) {\n this.renderMCMAFeedBack();\n } else {\n this.renderMCMFFeedback();\n }\n }\n scoreMCMASubmission() {\n this.correctCount = 0;\n var correctIndex = 0;\n var givenIndex = 0;\n while (\n correctIndex < this.correctIndexList.length &&\n givenIndex < this.givenArray.length\n ) {\n if (\n this.givenArray[givenIndex] <\n this.correctIndexList[correctIndex]\n ) {\n givenIndex++;\n } else if (\n this.givenArray[givenIndex] ==\n this.correctIndexList[correctIndex]\n ) {\n this.correctCount++;\n givenIndex++;\n correctIndex++;\n } else {\n correctIndex++;\n }\n }\n var numGiven = this.givenArray.length;\n var numCorrect = this.correctCount;\n var numNeeded = this.correctList.length;\n this.answer = this.givenArray.join(\",\");\n this.correct = numCorrect === numNeeded && numNeeded === numGiven;\n if (numGiven === numNeeded) {\n this.percent = numCorrect / numNeeded;\n } else {\n this.percent = numCorrect / Math.max(numGiven, numNeeded);\n }\n }\n\n async logMCMAsubmission(sid) {\n var answer = this.answer || \"\";\n var correct = this.correct || \"F\";\n var logAnswer =\n \"answer:\" + answer + \":\" + (correct == \"T\" ? \"correct\" : \"no\");\n let data = {\n event: \"mChoice\",\n act: logAnswer,\n answer: answer,\n correct: correct,\n div_id: this.divid,\n };\n if (eBookConfig.peer && typeof studentVoteCount !== \"undefined\") {\n data.act = data.act + `:vote${studentVoteCount}`;\n }\n if (typeof sid !== \"undefined\") {\n data.sid = sid;\n }\n await this.logBookEvent(data);\n }\n\n renderMCMAFeedBack() {\n var answerStr = \"answers\";\n var numGiven = this.givenArray.length;\n if (numGiven === 1) {\n answerStr = \"answer\";\n }\n var numCorrect = this.correctCount;\n var numNeeded = this.correctList.length;\n var feedbackText = this.feedbackString;\n if (this.correct) {\n $(this.feedBackDiv).html(`✔️ <ol type=\"A\">${feedbackText}</ul>`);\n $(this.feedBackDiv).attr(\"class\", \"alert alert-info\");\n } else {\n $(this.feedBackDiv).html(\n `✖️ You gave ${numGiven} ${answerStr} and got ${numCorrect} correct of ${numNeeded} needed.<ol type=\"A\">${feedbackText}</ul>`\n );\n $(this.feedBackDiv).attr(\"class\", \"alert alert-danger\");\n }\n }\n\n processMCMFSubmission(logFlag) {\n // Called when the submit button is clicked\n this.getSubmittedOpts(); // make sure this.givenArray is populated\n this.scoreMCMFSubmission();\n this.setLocalStorage({\n correct: this.correct ? \"T\" : \"F\",\n answer: this.givenArray.join(\",\"),\n });\n if (logFlag) {\n this.logMCMFsubmission();\n }\n if (!eBookConfig.peer || eBookConfig.isInstructor) {\n this.renderMCMFFeedback();\n if (this.useRunestoneServices) {\n this.enableMCComparison();\n }\n } else {\n if (eBookConfig.peer &&\n eBookConfig.peerMode === \"async\" &&\n typeof studentVoteCount !== \"undefined\" &&\n studentVoteCount > 1) {\n this.renderMCMAFeedBack();\n } else {\n $(this.feedBackDiv).html(\"<p>Your Answer has been recorded</p>\");\n $(this.feedBackDiv).attr(\"class\", \"alert alert-info\");\n }\n }\n }\n\n scoreMCMFSubmission() {\n this.answer = this.givenArray[0];\n if (this.givenArray[0] == this.correctIndexList[0]) {\n this.correct = true;\n this.percent = 1.0;\n } else if (this.givenArray[0] != null) {\n // if given is null then the question wasn\"t answered and should be counted as skipped\n this.correct = false;\n this.percent = 0.0;\n }\n }\n\n async logMCMFsubmission(sid) {\n // If there's no answer provided (the array is empty), use a blank for the answer.\n var answer = this.givenArray[0] || \"\";\n var correct =\n this.givenArray[0] == this.correctIndexList[0] ? \"T\" : \"F\";\n var logAnswer =\n \"answer:\" + answer + \":\" + (correct == \"T\" ? \"correct\" : \"no\"); // backward compatible\n let data = {\n event: \"mChoice\",\n act: logAnswer,\n answer: answer,\n correct: correct,\n div_id: this.divid,\n };\n if (eBookConfig.peer && typeof studentVoteCount !== \"undefined\") {\n data.act = data.act + `:vote${studentVoteCount}`;\n }\n if (typeof sid !== \"undefined\") {\n data.sid = sid;\n }\n await this.logBookEvent(data);\n }\n\n renderMCMFFeedback() {\n let correct = this.givenArray[0] == this.correctIndexList[0];\n let feedbackText = this.singlefeedback;\n\n if (correct) {\n $(this.feedBackDiv).html(\"✔️ \" + feedbackText);\n $(this.feedBackDiv).attr(\"class\", \"alert alert-info\"); // use blue for better red/green blue color blindness\n } else {\n if (feedbackText == null) {\n feedbackText = \"\";\n }\n $(this.feedBackDiv).html(\"✖️ \" + feedbackText);\n $(this.feedBackDiv).attr(\"class\", \"alert alert-danger\");\n }\n }\n enableMCComparison() {\n if (eBookConfig.enableCompareMe) {\n this.compareButton.disabled = false;\n }\n }\n instructorMchoiceModal(data) {\n // data.reslist -- student and their answers\n // data.answerDict -- answers and count\n // data.correct - correct answer\n var res = \"<table><tr><th>Student</th><th>Answer(s)</th></tr>\";\n for (var i in data) {\n res +=\n \"<tr><td>\" +\n data[i][0] +\n \"</td><td>\" +\n data[i][1] +\n \"</td></tr>\";\n }\n res += \"</table>\";\n return res;\n }\n compareModal(data, status, whatever) {\n var datadict = data.detail;\n var answers = datadict.answerDict;\n var misc = datadict.misc;\n var kl = Object.keys(answers).sort();\n var body = \"<table>\";\n body += \"<tr><th>Answer</th><th>Percent</th></tr>\";\n var theClass = \"\";\n for (var k in kl) {\n if (kl[k] === misc.correct) {\n theClass = \"success\";\n } else {\n theClass = \"info\";\n }\n body +=\n \"<tr><td>\" + kl[k] + \"</td><td class='compare-me-progress'>\";\n var pct = answers[kl[k]] + \"%\";\n body += \"<div class='progress'>\";\n body +=\n \" <div class='progress-bar progress-bar-\" +\n theClass +\n \"' style='width:\" +\n pct +\n \";'>\" +\n pct;\n body += \" </div>\";\n body += \"</div></td></tr>\";\n }\n body += \"</table>\";\n if (misc.yourpct !== \"unavailable\") {\n body +=\n \"<br /><p>You have \" +\n misc.yourpct +\n \"% correct for all questions</p>\";\n }\n if (datadict.reslist !== undefined) {\n body += this.instructorMchoiceModal(datadict.reslist);\n }\n var html =\n \"<div class='modal fade'>\" +\n \" <div class='modal-dialog compare-modal'>\" +\n \" <div class='modal-content'>\" +\n \" <div class='modal-header'>\" +\n \" <button type='button' class='close' data-dismiss='modal' aria-hidden='true'>×</button>\" +\n \" <h4 class='modal-title'>Distribution of Answers</h4>\" +\n \" </div>\" +\n \" <div class='modal-body'>\" +\n body +\n \" </div>\" +\n \" </div>\" +\n \" </div>\" +\n \"</div>\";\n var el = $(html);\n el.modal();\n }\n // _`compareAnswers`\n compareAnswers() {\n var data = {};\n data.div_id = this.divid;\n data.course_name = eBookConfig.course;\n jQuery.get(\n `${eBookConfig.new_server_prefix}/assessment/getaggregateresults`,\n data,\n this.compareModal.bind(this)\n );\n }\n\n disableInteraction() {\n for (var i = 0; i < this.optionArray.length; i++) {\n this.optionArray[i].input.disabled = true;\n }\n }\n\n enableInteraction() {\n for (var i = 0; i < this.optionArray.length; i++) {\n this.optionArray[i].input.disabled = false;\n }\n }\n}\n\n/*=================================\n== Find the custom HTML tags and ==\n== execute our code on them ==\n=================================*/\n$(document).on(\"runestone:login-complete\", function() {\n $(\"[data-component=multiplechoice]\").each(function(index) {\n // MC\n var opts = {\n orig: this,\n useRunestoneServices: eBookConfig.useRunestoneServices,\n };\n if ($(this).closest(\"[data-component=timedAssessment]\").length == 0) {\n // If this element exists within a timed component, don't render it here\n window.componentMap[this.id] = new MultipleChoice(opts);\n }\n });\n});\n","import MultipleChoice from \"./mchoice.js\";\n\nexport default class TimedMC extends MultipleChoice {\n constructor(opts) {\n super(opts);\n $(this.containerDiv).addClass(\"runestone\");\n this.needsReinitialization = true;\n this.renderTimedIcon(this.MCContainer);\n this.hideButtons(); // Don't show per-question buttons in a timed assessment\n }\n\n renderTimedIcon(component) {\n // renders the clock icon on timed components. The component parameter\n // is the element that the icon should be appended to.\n var timeIconDiv = document.createElement(\"div\");\n var timeIcon = document.createElement(\"img\");\n $(timeIcon).attr({\n src: \"../_static/clock.png\",\n style: \"width:15px;height:15px\",\n });\n timeIconDiv.className = \"timeTip\";\n timeIconDiv.title = \"\";\n timeIconDiv.appendChild(timeIcon);\n $(component).prepend(timeIconDiv);\n }\n hideButtons() {\n //Just hiding the buttons doesn't prevent submitting the form when entering is clicked\n //We need to completely disable the buttons\n $(this.submitButton).attr(\"disabled\", \"true\");\n $(this.submitButton).hide();\n $(this.compareButton).hide();\n }\n\n // These methods override the methods in the base class. Called from renderFeedback()\n //\n renderMCMAFeedBack() {\n this.feedbackTimedMC();\n }\n renderMCMFFeedback(whatever, whateverr) {\n this.feedbackTimedMC();\n }\n feedbackTimedMC() {\n for (var i = 0; i < this.indexArray.length; i++) {\n var tmpindex = this.indexArray[i];\n $(this.feedBackEachArray[i]).html(\n String.fromCharCode(65 + i) + \". \" + this.feedbackList[i]\n );\n var tmpid = this.answerList[tmpindex].id;\n if (this.correctList.indexOf(tmpid) >= 0) {\n this.feedBackEachArray[i].classList.add(\n \"alert\",\n \"alert-success\"\n );\n } else {\n this.feedBackEachArray[i].classList.add(\n \"alert\",\n \"alert-danger\"\n );\n }\n }\n }\n renderMCFormOpts() {\n super.renderMCFormOpts();\n this.feedBackEachArray = [];\n for (var j = 0; j < this.answerList.length; j++) {\n var k = this.indexArray[j];\n var feedBackEach = document.createElement(\"div\");\n feedBackEach.id = this.divid + \"_eachFeedback_\" + k;\n feedBackEach.classList.add(\"eachFeedback\");\n this.feedBackEachArray.push(feedBackEach);\n this.optsForm.appendChild(feedBackEach);\n }\n }\n checkCorrectTimedMCMA() {\n if (\n this.correctCount === this.correctList.length &&\n this.correctList.length === this.givenArray.length\n ) {\n this.correct = true;\n } else if (this.givenArray.length !== 0) {\n this.correct = false;\n } else {\n // question was skipped\n this.correct = null;\n }\n switch (this.correct) {\n case true:\n return \"T\";\n case false:\n return \"F\";\n default:\n return null;\n }\n }\n checkCorrectTimedMCMF() {\n // Returns if the question was correct, incorrect, or skipped (return null in the last case)\n switch (this.correct) {\n case true:\n return \"T\";\n case false:\n return \"F\";\n default:\n return null;\n }\n }\n checkCorrectTimed() {\n if (this.multipleanswers) {\n return this.checkCorrectTimedMCMA();\n } else {\n return this.checkCorrectTimedMCMF();\n }\n }\n hideFeedback() {\n for (var i = 0; i < this.feedBackEachArray.length; i++) {\n $(this.feedBackEachArray[i]).hide();\n }\n }\n\n reinitializeListeners() {\n let self = this;\n let answerFunc = function () {\n self.isAnswered = true;\n };\n for (let opt of this.optionArray) {\n opt.input.onclick = answerFunc;\n }\n }\n}\n\nif (typeof window.component_factory === \"undefined\") {\n window.component_factory = {};\n}\n\nwindow.component_factory.multiplechoice = function (opts) {\n if (opts.timed) {\n return new TimedMC(opts);\n } else {\n return new MultipleChoice(opts);\n }\n};\n"],"names":["MultipleChoice","constructor","opts","super","orig","this","origElem","useRunestoneServices","multipleanswers","divid","id","$","data","children","childNodes","random","is","correct","answerList","correctList","correctIndexList","feedbackList","question","caption","findAnswers","findQuestion","findFeedbacks","createCorrectList","createMCForm","addCaption","checkServer","queueMathJax","containerDiv","Prism","highlightAllUnder","delimiter","i","length","nodeName","outerHTML","temp","html","split","ChildAnswerList","push","j","answer_id","attr","is_correct","answer_object","content","innerHTML","renderMCContainer","renderMCForm","renderMCfeedbackDiv","replaceWith","document","createElement","addClass","getAttribute","optsForm","method","action","onsubmit","renderMCFormOpts","renderMCFormButtons","appendChild","optionArray","input_type","indexArray","randomizeAnswers","self","answerFunc","isAnswered","k","optid","label","prefix","startsWith","slice","String","fromCharCode","charCodeAt","optObj","input","find","onclick","submitButton","textContent","class","name","type","addEventListener","processMCMASubmission","bind","ev","preventDefault","processMCMFSubmission","eBookConfig","peer","compareButton","disabled","compareAnswers","feedBackDiv","temporaryValue","randomIndex","currentIndex","Math","floor","temporaryFeedback","restoreAnswers","answer","answers","a","index","b","value","checkLocalStorage","graderactive","localStorage","ex","getItem","localStorageKey","JSON","parse","err","console","log","message","removeItem","enableMCComparison","getSubmittedOpts","logMCMAsubmission","logMCMFsubmission","setLocalStorage","timeStamp","Date","storageObj","timestamp","setItem","stringify","logFlag","scoreMCMASubmission","givenArray","join","isInstructor","renderMCMAFeedBack","peerMode","studentVoteCount","given","singlefeedback","feedbackString","givenlog","buttonObjs","elements","group1","checked","sort","checkCurrentAnswer","scoreMCMFSubmission","logCurrentAnswer","sid","renderFeedback","renderMCMFFeedback","correctCount","correctIndex","givenIndex","numGiven","numCorrect","numNeeded","percent","max","event","act","div_id","logBookEvent","answerStr","feedbackText","enableCompareMe","instructorMchoiceModal","res","compareModal","status","whatever","datadict","detail","answerDict","misc","kl","Object","keys","body","theClass","pct","yourpct","undefined","reslist","modal","course_name","course","jQuery","get","new_server_prefix","disableInteraction","enableInteraction","on","each","closest","window","componentMap","TimedMC","needsReinitialization","renderTimedIcon","MCContainer","hideButtons","component","timeIconDiv","timeIcon","src","style","className","title","prepend","hide","feedbackTimedMC","whateverr","tmpindex","feedBackEachArray","tmpid","indexOf","classList","add","feedBackEach","checkCorrectTimedMCMA","checkCorrectTimedMCMF","checkCorrectTimed","hideFeedback","reinitializeListeners","opt","component_factory","multiplechoice","timed"],"sourceRoot":""}