{"version":3,"file":"919.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 // Add fieldset and legend for accessibility\n this.optsFieldSet = document.createElement(\"fieldset\")\n this.optsForm.appendChild(this.optsFieldSet);\n // generate form options\n this.renderMCFormOpts();\n this.renderMCFormButtons();\n // Append the form to the container\n let legend = document.createElement(\"legend\");\n if (this.multipleanswers) {\n legend.textContent = \"Choose all that apply\";\n } else {\n legend.textContent = \"Choose one\";\n }\n this.optsFieldSet.appendChild(legend);\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.optsFieldSet.appendChild(label);\n this.optsFieldSet.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.feedBackDiv.setAttribute(\"aria-live\", \"polite\");\n this.feedBackDiv.setAttribute(\"role\", \"status\");\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}\">${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","optsFieldSet","appendChild","renderMCFormOpts","renderMCFormButtons","legend","textContent","optionArray","input_type","indexArray","randomizeAnswers","self","answerFunc","isAnswered","k","optid","label","prefix","startsWith","slice","String","fromCharCode","charCodeAt","optObj","input","find","onclick","submitButton","class","name","type","addEventListener","processMCMASubmission","bind","ev","preventDefault","processMCMFSubmission","eBookConfig","peer","compareButton","disabled","compareAnswers","feedBackDiv","setAttribute","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":""}