{"version":3,"file":"724.dff5eb7362a91bd9.bundle.js","mappings":"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","sources":["webpack://WebComponents/./runestone/fitb/js/fitb-i18n.en.js","webpack://WebComponents/./runestone/fitb/js/fitb-i18n.pt-br.js","webpack://WebComponents/./runestone/fitb/js/fitb.js","webpack://WebComponents/./runestone/fitb/js/timedfitb.js","webpack://WebComponents/./runestone/shortanswer/js/shortanswer.js","webpack://WebComponents/./runestone/shortanswer/js/timed_shortanswer.js","webpack://WebComponents/./runestone/timed/js/timed.js"],"sourcesContent":["$.i18n().load({\n en: {\n msg_no_answer: \"No answer provided.\",\n msg_fitb_check_me: \"Check me\",\n msg_fitb_compare_me: \"Compare me\",\n },\n});\n","$.i18n().load({\n \"pt-br\": {\n msg_no_answer: \"Nenhuma resposta dada.\",\n msg_fitb_check_me: \"Verificar\",\n msg_fitb_compare_me: \"Comparar\"\n },\n});\n","// *********\n// |docname|\n// *********\n// This file contains the JS for the Runestone fillintheblank component. It was created By Isaiah Mayerchak and Kirby Olson, 6/4/15 then revised by Brad Miller, 2/7/20.\n\"use strict\";\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\nimport \"./fitb-i18n.en.js\";\nimport \"./fitb-i18n.pt-br.js\";\nimport \"../css/fitb.css\";\n\nexport var FITBList = {}; // Object containing all instances of FITB that aren't a child of a timed assessment.\n\n// FITB constructor\nexport default class FITB extends RunestoneBase {\n constructor(opts) {\n super(opts);\n var orig = opts.orig; // entire

element\n this.useRunestoneServices = opts.useRunestoneServices;\n this.origElem = orig;\n this.divid = orig.id;\n this.correct = null;\n // See comments in fitb.py for the format of ``feedbackArray`` (which is identical in both files).\n //\n // Find the script tag containing JSON and parse it. See `SO `_. If this parses to ``false``, then no feedback is available; server-side grading will be performed.\n this.feedbackArray = JSON.parse(\n this.scriptSelector(this.origElem).html()\n );\n this.createFITBElement();\n this.caption = \"Fill in the Blank\";\n this.addCaption(\"runestone\");\n this.checkServer(\"fillb\", true);\n }\n // Find the script tag containing JSON in a given root DOM node.\n scriptSelector(root_node) {\n return $(root_node).find(`script[type=\"application/json\"]`);\n }\n /*===========================================\n ==== Functions generating final HTML ====\n ===========================================*/\n createFITBElement() {\n this.renderFITBInput();\n this.renderFITBButtons();\n this.renderFITBFeedbackDiv();\n // replaces the intermediate HTML for this component with the rendered HTML of this component\n $(this.origElem).replaceWith(this.containerDiv);\n }\n renderFITBInput() {\n // The text [input] elements are created by the template.\n this.containerDiv = document.createElement(\"div\");\n this.containerDiv.id = this.divid;\n // Copy the original elements to the container holding what the user will see.\n $(this.origElem).children().clone().appendTo(this.containerDiv);\n // Remove the script tag.\n this.scriptSelector(this.containerDiv).remove();\n // Set the class for the text inputs, then store references to them.\n let ba = $(this.containerDiv).find(\":input\");\n ba.attr(\"class\", \"form form-control selectwidthauto\");\n ba.attr(\"aria-label\", \"input area\");\n this.blankArray = ba.toArray();\n // When a blank is changed mark this component as interacted with.\n // And set a class on the component in case we want to render components that have been used\n // differently\n for (let blank of this.blankArray) {\n $(blank).change(this.recordAnswered.bind(this));\n }\n }\n\n recordAnswered() {\n this.isAnswered = true;\n //let rcontainer = this.containerDiv.closest(\".runestone\");\n //rcontainer.addClass(\"answered\");\n }\n\n renderFITBButtons() {\n // \"submit\" button and \"compare me\" button\n this.submitButton = document.createElement(\"button\");\n this.submitButton.textContent = $.i18n(\"msg_fitb_check_me\");\n $(this.submitButton).attr({\n class: \"btn btn-success\",\n name: \"do answer\",\n type: \"button\",\n });\n this.submitButton.addEventListener(\n \"click\",\n function () {\n this.checkCurrentAnswer();\n this.logCurrentAnswer();\n }.bind(this),\n false\n );\n this.containerDiv.appendChild(document.createElement(\"br\"));\n this.containerDiv.appendChild(document.createElement(\"br\"));\n this.containerDiv.appendChild(this.submitButton);\n if (this.useRunestoneServices) {\n this.compareButton = document.createElement(\"button\");\n $(this.compareButton).attr({\n class: \"btn btn-default\",\n id: this.origElem.id + \"_bcomp\",\n disabled: \"\",\n name: \"compare\",\n });\n this.compareButton.textContent = $.i18n(\"msg_fitb_compare_me\");\n this.compareButton.addEventListener(\n \"click\",\n function () {\n this.compareFITBAnswers();\n }.bind(this),\n false\n );\n this.containerDiv.appendChild(this.compareButton);\n }\n this.containerDiv.appendChild(document.createElement(\"div\"));\n }\n renderFITBFeedbackDiv() {\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 === Checking/loading from storage ===\n ===================================*/\n restoreAnswers(data) {\n var arr;\n // Restore answers from storage retrieval done in RunestoneBase.\n try {\n // The newer format encodes data as a JSON object.\n arr = JSON.parse(data.answer);\n // The result should be an array. If not, try comma parsing instead.\n if (!Array.isArray(arr)) {\n throw new Error();\n }\n } catch (err) {\n // The old format didn't.\n arr = data.answer.split(\",\");\n }\n for (var i = 0; i < this.blankArray.length; i++) {\n $(this.blankArray[i]).attr(\"value\", arr[i]);\n }\n // Use the feedback from the server, or recompute it locally.\n if (!this.feedbackArray) {\n this.displayFeed = data.displayFeed;\n this.correct = data.correct;\n this.isCorrectArray = data.isCorrectArray;\n // Only render if all the data is present; local storage might have old data missing some of these items.\n if (\n typeof this.displayFeed !== \"undefined\" &&\n typeof this.correct !== \"undefined\" &&\n typeof this.isCorrectArray !== \"undefined\"\n ) {\n this.renderFeedback();\n }\n } else {\n this.checkCurrentAnswer();\n }\n }\n checkLocalStorage() {\n // Loads previous answers from local storage if they exist\n var storedData;\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 var arr = storedData.answer;\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 this.restoreAnswers(storedData);\n }\n }\n }\n setLocalStorage(data) {\n let key = this.localStorageKey();\n localStorage.setItem(key, JSON.stringify(data));\n }\n\n checkCurrentAnswer() {\n // Start of the evaluation chain\n this.isCorrectArray = [];\n this.displayFeed = [];\n this.given_arr = [];\n for (var i = 0; i < this.blankArray.length; i++)\n this.given_arr.push(this.blankArray[i].value);\n if (this.useRunestoneServices) {\n if (eBookConfig.enableCompareMe) {\n this.enableCompareButton();\n }\n }\n // Grade locally if we can't ask the server to grade.\n if (this.feedbackArray) {\n this.evaluateAnswers();\n if (!this.isTimed) {\n this.renderFeedback();\n }\n }\n }\n\n async logCurrentAnswer(sid) {\n let answer = JSON.stringify(this.given_arr);\n // Save the answer locally.\n let feedback = true;\n this.setLocalStorage({\n answer: answer,\n timestamp: new Date(),\n });\n let data = {\n event: \"fillb\",\n act: answer || \"\",\n answer: answer || \"\",\n correct: this.correct ? \"T\" : \"F\",\n div_id: this.divid,\n };\n if (typeof sid !== \"undefined\") {\n data.sid = sid;\n feedback = false;\n }\n // Per `logBookEvent `, the result is undefined if there's no server. Otherwise, the server provides the endpoint-specific results in ``data.details``; see `make_json_response`.\n data = await this.logBookEvent(data);\n let detail = data && data.detail;\n if (!feedback) return;\n if (!this.feedbackArray) {\n // On success, update the feedback from the server's grade.\n this.setLocalStorage({\n answer: answer,\n timestamp: detail.timestamp,\n });\n this.correct = detail.correct;\n this.displayFeed = detail.displayFeed;\n this.isCorrectArray = detail.isCorrectArray;\n if (!this.isTimed) {\n this.renderFeedback();\n }\n }\n return detail;\n }\n\n /*==============================\n === Evaluation of answer and ===\n === display feedback ===\n ==============================*/\n // Inputs:\n //\n // - Strings entered by the student in ``this.blankArray[i].value``.\n // - Feedback in ``this.feedbackArray``.\n //\n // Outputs:\n //\n // - ``this.displayFeed`` is an array of HTML feedback.\n // - ``this.isCorrectArray`` is an array of true, false, or null (the question wasn't answered).\n // - ``this.correct`` is true, false, or null (the question wasn't answered).\n evaluateAnswers() {\n // Keep track if all answers are correct or not.\n this.correct = true;\n for (var i = 0; i < this.blankArray.length; i++) {\n var given = this.blankArray[i].value;\n // If this blank is empty, provide no feedback for it.\n if (given === \"\") {\n this.isCorrectArray.push(null);\n this.displayFeed.push($.i18n(\"msg_no_answer\"));\n this.correct = false;\n } else {\n // Look through all feedback for this blank. The last element in the array always matches. If no feedback for this blank exists, use an empty list.\n var fbl = this.feedbackArray[i] || [];\n for (var j = 0; j < fbl.length; j++) {\n // The last item of feedback always matches.\n if (j === fbl.length - 1) {\n this.displayFeed.push(fbl[j][\"feedback\"]);\n break;\n }\n // If this is a regexp...\n if (\"regex\" in fbl[j]) {\n var patt = RegExp(\n fbl[j][\"regex\"],\n fbl[j][\"regexFlags\"]\n );\n if (patt.test(given)) {\n this.displayFeed.push(fbl[j][\"feedback\"]);\n break;\n }\n } else {\n // This is a number.\n console.assert(\"number\" in fbl[j]);\n var [min, max] = fbl[j][\"number\"];\n // Convert the given string to a number. While there are `lots of ways `_ to do this; this version supports other bases (hex/binary/octal) as well as floats.\n var actual = +given;\n if (actual >= min && actual <= max) {\n this.displayFeed.push(fbl[j][\"feedback\"]);\n break;\n }\n }\n }\n // The answer is correct if it matched the first element in the array. A special case: if only one answer is provided, count it wrong; this is a misformed problem.\n let is_correct = j === 0 && fbl.length > 1;\n this.isCorrectArray.push(is_correct);\n if (!is_correct) {\n this.correct = false;\n }\n }\n }\n this.percent =\n this.isCorrectArray.filter(Boolean).length / this.blankArray.length;\n }\n\n renderFeedback() {\n if (this.correct) {\n $(this.feedBackDiv).attr(\"class\", \"alert alert-info\");\n for (let j = 0; j < this.blankArray.length; j++) {\n $(this.blankArray[j]).removeClass(\"input-validation-error\");\n }\n } else {\n if (this.displayFeed === null) {\n this.displayFeed = \"\";\n }\n for (let j = 0; j < this.blankArray.length; j++) {\n if (this.isCorrectArray[j] !== true) {\n $(this.blankArray[j]).addClass(\"input-validation-error\");\n } else {\n $(this.blankArray[j]).removeClass(\"input-validation-error\");\n }\n }\n $(this.feedBackDiv).attr(\"class\", \"alert alert-danger\");\n }\n var feedback_html = \"

\";\n // Remove the list if it's just one element.\n if (this.displayFeed.length == 1) {\n feedback_html = feedback_html.slice(\n \"\".length\n );\n }\n this.feedBackDiv.innerHTML = feedback_html;\n if (typeof MathJax !== \"undefined\") {\n this.queueMathJax(document.body);\n }\n }\n\n /*==================================\n === Functions for compare button ===\n ==================================*/\n enableCompareButton() {\n this.compareButton.disabled = false;\n }\n // _`compareFITBAnswers`\n compareFITBAnswers() {\n var data = {};\n data.div_id = this.divid;\n data.course = eBookConfig.course;\n jQuery.get(\n `${eBookConfig.new_server_prefix}/assessment/gettop10Answers`,\n data,\n this.compareFITB\n );\n }\n compareFITB(data, status, whatever) {\n var answers = data.detail.res;\n var misc = data.detail.miscdata;\n var body = \"\";\n body += \"\";\n for (var row in answers) {\n body +=\n \"\";\n }\n body += \"
AnswerCount
\" +\n answers[row].answer +\n \"\" +\n answers[row].count +\n \" times
\";\n var html =\n \"\";\n var el = $(html);\n el.modal();\n }\n\n disableInteraction() {\n for (var i = 0; i < this.blankArray.length; i++) {\n this.blankArray[i].disabled = true;\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=fillintheblank]\").each(function (index) {\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 try {\n FITBList[this.id] = new FITB(opts);\n } catch (err) {\n console.log(\n `Error rendering Fill in the Blank Problem ${this.id}\n Details: ${err}`\n );\n }\n }\n });\n});\n","import FITB from \"./fitb.js\";\nexport default class TimedFITB extends FITB {\n constructor(opts) {\n super(opts);\n this.renderTimedIcon(this.inputDiv);\n this.hideButtons();\n this.needsReinitialization = true;\n }\n hideButtons() {\n $(this.submitButton).hide();\n $(this.compareButton).hide();\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 checkCorrectTimed() {\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 hideFeedback() {\n for (var i = 0; i < this.blankArray.length; i++) {\n $(this.blankArray[i]).removeClass(\"input-validation-error\");\n }\n this.feedBackDiv.style.display = \"none\";\n }\n\n reinitializeListeners() {\n for (let blank of this.blankArray) {\n $(blank).change(this.recordAnswered.bind(this));\n }\n }\n}\n\nif (typeof window.component_factory === \"undefined\") {\n window.component_factory = {};\n}\nwindow.component_factory.fillintheblank = function (opts) {\n if (opts.timed) {\n return new TimedFITB(opts);\n }\n return new FITB(opts);\n};\n","/*==========================================\n======= Master shortanswer.js ========\n============================================\n=== This file contains the JS for ===\n=== the Runestone shortanswer component. ===\n============================================\n=== Created by ===\n=== Isaiah Mayerchak ===\n=== 7/2/15 ===\n=== Brad Miller ===\n=== 2019 ===\n==========================================*/\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\nimport \"./../css/shortanswer.css\";\n\nexport var saList;\nif (saList === undefined) saList = {}; // Dictionary that contains all instances of shortanswer objects\n\nexport default class ShortAnswer extends RunestoneBase {\n constructor(opts) {\n super(opts);\n if (opts) {\n var orig = opts.orig; // entire

element that will be replaced by new HTML\n this.useRunestoneServices =\n opts.useRunestoneServices || eBookConfig.useRunestoneServices;\n this.origElem = orig;\n this.divid = orig.id;\n this.question = this.origElem.innerHTML;\n this.optional = false;\n if ($(this.origElem).is(\"[data-optional]\")) {\n this.optional = true;\n }\n if ($(this.origElem).is(\"[data-mathjax]\")) {\n this.mathjax = true;\n }\n this.renderHTML();\n this.caption = \"shortanswer\";\n this.addCaption(\"runestone\");\n this.checkServer(\"shortanswer\", true);\n }\n }\n\n renderHTML() {\n this.containerDiv = document.createElement(\"div\");\n this.containerDiv.id = this.divid;\n $(this.containerDiv).addClass(this.origElem.getAttribute(\"class\"));\n this.newForm = document.createElement(\"form\");\n this.newForm.id = this.divid + \"_journal\";\n this.newForm.name = this.newForm.id;\n this.newForm.action = \"\";\n this.containerDiv.appendChild(this.newForm);\n this.fieldSet = document.createElement(\"fieldset\");\n this.newForm.appendChild(this.fieldSet);\n this.legend = document.createElement(\"legend\");\n this.legend.innerHTML = \"Short Answer\";\n this.fieldSet.appendChild(this.legend);\n this.firstLegendDiv = document.createElement(\"div\");\n this.firstLegendDiv.innerHTML = this.question;\n $(this.firstLegendDiv).addClass(\"journal-question\");\n this.fieldSet.appendChild(this.firstLegendDiv);\n this.jInputDiv = document.createElement(\"div\");\n this.jInputDiv.id = this.divid + \"_journal_input\";\n this.fieldSet.appendChild(this.jInputDiv);\n this.jOptionsDiv = document.createElement(\"div\");\n $(this.jOptionsDiv).addClass(\"journal-options\");\n this.jInputDiv.appendChild(this.jOptionsDiv);\n this.jLabel = document.createElement(\"label\");\n $(this.jLabel).addClass(\"radio-inline\");\n this.jOptionsDiv.appendChild(this.jLabel);\n this.jTextArea = document.createElement(\"textarea\");\n let self = this;\n this.jTextArea.onchange = function () {\n self.isAnswered = true;\n };\n this.jTextArea.id = this.divid + \"_solution\";\n $(this.jTextArea).attr(\"aria-label\", \"textarea\");\n $(this.jTextArea).css(\"display:inline, width:530px\");\n $(this.jTextArea).addClass(\"form-control\");\n this.jTextArea.rows = 4;\n this.jTextArea.cols = 50;\n this.jLabel.appendChild(this.jTextArea);\n this.jTextArea.onchange = function () {\n this.feedbackDiv.innerHTML = \"Your answer has not been saved yet!\";\n $(this.feedbackDiv).removeClass(\"alert-success\");\n $(this.feedbackDiv).addClass(\"alert alert-danger\");\n }.bind(this);\n this.fieldSet.appendChild(document.createElement(\"br\"));\n if (this.mathjax) {\n this.renderedAnswer = document.createElement(\"div\");\n $(this.renderedAnswer).addClass(\"latexoutput\");\n this.fieldSet.appendChild(this.renderedAnswer);\n }\n this.buttonDiv = document.createElement(\"div\");\n this.fieldSet.appendChild(this.buttonDiv);\n this.submitButton = document.createElement(\"button\");\n $(this.submitButton).addClass(\"btn btn-success\");\n this.submitButton.type = \"button\";\n this.submitButton.textContent = \"Save\";\n this.submitButton.onclick = function () {\n this.checkCurrentAnswer();\n this.logCurrentAnswer();\n this.renderFeedback();\n }.bind(this);\n this.buttonDiv.appendChild(this.submitButton);\n this.randomSpan = document.createElement(\"span\");\n this.randomSpan.innerHTML = \"Instructor's Feedback\";\n this.fieldSet.appendChild(this.randomSpan);\n this.otherOptionsDiv = document.createElement(\"div\");\n $(this.otherOptionsDiv).css(\"padding-left:20px\");\n $(this.otherOptionsDiv).addClass(\"journal-options\");\n this.fieldSet.appendChild(this.otherOptionsDiv);\n // add a feedback div to give user feedback\n this.feedbackDiv = document.createElement(\"div\");\n //$(this.feedbackDiv).addClass(\"bg-info form-control\");\n //$(this.feedbackDiv).css(\"width:530px, background-color:#eee, font-style:italic\");\n $(this.feedbackDiv).css(\"width:530px, font-style:italic\");\n this.feedbackDiv.id = this.divid + \"_feedback\";\n this.feedbackDiv.innerHTML = \"You have not answered this question yet.\";\n $(this.feedbackDiv).addClass(\"alert alert-danger\");\n //this.otherOptionsDiv.appendChild(this.feedbackDiv);\n this.fieldSet.appendChild(this.feedbackDiv);\n //this.fieldSet.appendChild(document.createElement(\"br\"));\n $(this.origElem).replaceWith(this.containerDiv);\n // This is a stopgap measure for when MathJax is not loaded at all. There is another\n // more difficult case that when MathJax is loaded asynchronously we will get here\n // before MathJax is loaded. In that case we will need to implement something\n // like `the solution described here `_\n if (typeof MathJax !== \"undefined\") {\n this.queueMathJax(this.containerDiv);\n }\n }\n\n renderMath(value) {\n if (this.mathjax) {\n value = value.replace(/\\$\\$(.*?)\\$\\$/g, \"\\\\[ $1 \\\\]\");\n value = value.replace(/\\$(.*?)\\$/g, \"\\\\( $1 \\\\)\");\n $(this.renderedAnswer).text(value);\n this.queueMathJax(this.renderedAnswer);\n }\n }\n\n checkCurrentAnswer() {}\n\n async logCurrentAnswer(sid) {\n let value = $(document.getElementById(this.divid + \"_solution\")).val();\n this.renderMath(value);\n this.setLocalStorage({\n answer: value,\n timestamp: new Date(),\n });\n let data = {\n event: \"shortanswer\",\n act: value,\n answer: value,\n div_id: this.divid,\n };\n if (typeof sid !== \"undefined\") {\n data.sid = sid;\n }\n await this.logBookEvent(data);\n }\n\n renderFeedback() {\n this.feedbackDiv.innerHTML = \"Your answer has been saved.\";\n $(this.feedbackDiv).removeClass(\"alert-danger\");\n $(this.feedbackDiv).addClass(\"alert alert-success\");\n }\n setLocalStorage(data) {\n if (!this.graderactive) {\n let key = this.localStorageKey();\n localStorage.setItem(key, JSON.stringify(data));\n }\n }\n checkLocalStorage() {\n // Repopulates the short answer text\n // which was stored into local storage.\n var answer = \"\";\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 var storedData = JSON.parse(ex);\n answer = storedData.answer;\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 let solution = $(\"#\" + this.divid + \"_solution\");\n solution.text(answer);\n this.renderMath(answer);\n this.feedbackDiv.innerHTML =\n \"Your current saved answer is shown above.\";\n $(this.feedbackDiv).removeClass(\"alert-danger\");\n $(this.feedbackDiv).addClass(\"alert alert-success\");\n }\n }\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 this.answer = data.answer;\n this.jTextArea.value = this.answer;\n this.renderMath(this.answer);\n\n let p = document.createElement(\"p\");\n this.jInputDiv.appendChild(p);\n var tsString = \"\";\n if (data.timestamp) {\n tsString = new Date(data.timestamp).toLocaleString();\n } else {\n tsString = \"\";\n }\n $(p).text(tsString);\n if (data.last_answer) {\n this.current_answer = \"ontime\";\n let toggle_answer_button = document.createElement(\"button\");\n toggle_answer_button.type = \"button\";\n $(toggle_answer_button).text(\"Show Late Answer\");\n $(toggle_answer_button).addClass(\"btn btn-warning\");\n $(toggle_answer_button).css(\"margin-left\", \"5px\");\n\n $(toggle_answer_button).click(\n function () {\n var display_timestamp, button_text;\n if (this.current_answer === \"ontime\") {\n this.jTextArea.value = data.last_answer;\n this.answer = data.last_answer;\n display_timestamp = new Date(\n data.last_timestamp\n ).toLocaleString();\n button_text = \"Show on-Time Answer\";\n this.current_answer = \"late\";\n } else {\n this.jTextArea.value = data.answer;\n this.answer = data.answer;\n display_timestamp = tsString;\n button_text = \"Show Late Answer\";\n this.current_answer = \"ontime\";\n }\n this.renderMath(this.answer);\n $(p).text(`Submitted: ${display_timestamp}`);\n $(toggle_answer_button).text(button_text);\n }.bind(this)\n );\n\n this.buttonDiv.appendChild(toggle_answer_button);\n }\n let feedbackStr = \"Your current saved answer is shown above.\";\n if (typeof data.score !== \"undefined\") {\n feedbackStr = `Score: ${data.score}`;\n }\n if (data.comment) {\n feedbackStr += ` -- ${data.comment}`;\n }\n this.feedbackDiv.innerHTML = feedbackStr;\n\n $(this.feedbackDiv).removeClass(\"alert-danger\");\n $(this.feedbackDiv).addClass(\"alert alert-success\");\n }\n\n disableInteraction() {\n this.jTextArea.disabled = true;\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=shortanswer]\").each(function () {\n if ($(this).closest(\"[data-component=timedAssessment]\").length == 0) {\n // If this element exists within a timed component, don't render it here\n try {\n saList[this.id] = new ShortAnswer({\n orig: this,\n useRunestoneServices: eBookConfig.useRunestoneServices,\n });\n } catch (err) {\n console.log(`Error rendering ShortAnswer Problem ${this.id}\n Details: ${err}`);\n }\n }\n });\n});\n","import ShortAnswer from \"./shortanswer.js\";\n\nexport default class TimedShortAnswer extends ShortAnswer {\n constructor(opts) {\n super(opts);\n this.renderTimedIcon(this.containerDiv);\n this.hideButtons();\n }\n hideButtons() {\n $(this.submitButton).hide();\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 checkCorrectTimed() {\n return \"I\"; // we ignore this in the grading\n }\n hideFeedback() {\n $(this.feedbackDiv).hide();\n }\n}\n\nif (typeof window.component_factory === \"undefined\") {\n window.component_factory = {};\n}\n\nwindow.component_factory.shortanswer = function (opts) {\n if (opts.timed) {\n return new TimedShortAnswer(opts);\n }\n return new ShortAnswer(opts);\n};\n","/*==========================================\n======== Master timed.js =========\n============================================\n=== This file contains the JS for ===\n=== the Runestone timed component. ===\n============================================\n=== Created By ===\n=== Kirby Olson ===\n=== 6/11/15 ===\n==========================================*/\n\"use strict\";\n\nimport RunestoneBase from \"../../common/js/runestonebase.js\";\nimport TimedFITB from \"../../fitb/js/timedfitb.js\";\nimport TimedMC from \"../../mchoice/js/timedmc.js\";\nimport TimedShortAnswer from \"../../shortanswer/js/timed_shortanswer.js\";\nimport ACFactory from \"../../activecode/js/acfactory.js\";\nimport TimedClickableArea from \"../../clickableArea/js/timedclickable\";\nimport TimedDragNDrop from \"../../dragndrop/js/timeddnd.js\";\nimport TimedParsons from \"../../parsons/js/timedparsons.js\";\nimport SelectOne from \"../../selectquestion/js/selectone\";\nimport \"../css/timed.css\";\n\nexport var TimedList = {}; // Timed dictionary\n\n// Timed constructor\nexport default class Timed extends RunestoneBase {\n constructor(opts) {\n super(opts);\n var orig = opts.orig;\n this.origElem = orig; // the entire element of this timed assessment and all of its children\n this.divid = orig.id;\n this.children = this.origElem.childNodes;\n this.visited = [];\n this.timeLimit = 0;\n this.limitedTime = false;\n if (!isNaN($(this.origElem).data(\"time\"))) {\n this.timeLimit = parseInt($(this.origElem).data(\"time\"), 10) * 60; // time in seconds to complete the exam\n this.startingTime = this.timeLimit;\n this.limitedTime = true;\n }\n this.showFeedback = true;\n if ($(this.origElem).is(\"[data-no-feedback]\")) {\n this.showFeedback = false;\n }\n this.showResults = true;\n if ($(this.origElem).is(\"[data-no-result]\")) {\n this.showResults = false;\n }\n this.random = false;\n if ($(this.origElem).is(\"[data-random]\")) {\n this.random = true;\n }\n this.showTimer = true;\n if ($(this.origElem).is(\"[data-no-timer]\")) {\n this.showTimer = false;\n }\n this.fullwidth = false;\n if ($(this.origElem).is(\"[data-fullwidth]\")) {\n this.fullwidth = true;\n }\n this.nopause = false;\n if ($(this.origElem).is(\"[data-no-pause]\")) {\n this.nopause = true;\n }\n eBookConfig.enableScratchAC = false;\n this.running = 0;\n this.paused = 0;\n this.done = 0;\n this.taken = 0;\n this.score = 0;\n this.incorrect = 0;\n this.correctStr = \"\";\n this.incorrectStr = \"\";\n this.skippedStr = \"\";\n this.skipped = 0;\n this.currentQuestionIndex = 0; // Which question is currently displaying on the page\n this.renderedQuestionArray = []; // list of all problems\n this.getNewChildren();\n // One small step to eliminate students from doing view source\n // this won't stop anyone with determination but may prevent casual peeking\n if (!eBookConfig.enableDebug) {\n document.body.oncontextmenu = function () {\n return false;\n };\n }\n this.checkAssessmentStatus().then(\n function () {\n this.renderTimedAssess();\n }.bind(this)\n );\n }\n\n getNewChildren() {\n this.newChildren = [];\n let runestoneChildren = this.origElem.querySelectorAll(\".runestone\")\n for (var i = 0; i < runestoneChildren.length; i++) {\n this.newChildren.push(runestoneChildren[i]);\n }\n }\n\n async checkAssessmentStatus() {\n // Has the user taken this exam? Inquiring minds want to know\n // If a user has not taken this exam then we want to make sure\n // that if a question has been seen by the student before we do\n // not populate previous answers.\n let sendInfo = {\n div_id: this.divid,\n course_name: eBookConfig.course,\n };\n console.log(sendInfo);\n if (eBookConfig.useRunestoneServices) {\n let request = new Request(\n `${eBookConfig.new_server_prefix}/assessment/tookTimedAssessment`,\n {\n method: \"POST\",\n headers: this.jsonHeaders,\n body: JSON.stringify(sendInfo),\n }\n );\n let response = await fetch(request);\n let data = await response.json();\n data = data.detail;\n this.taken = data.tookAssessment;\n this.assessmentTaken = this.taken;\n if (!this.taken) {\n localStorage.clear();\n }\n console.log(\"done with check status\");\n return response;\n } else {\n this.taken = false;\n this.assessmentTaken = false;\n return Promise.resolve();\n }\n }\n\n /*===============================\n === Generating new Timed HTML ===\n ===============================*/\n async renderTimedAssess() {\n console.log(\"rendering timed \");\n // create renderedQuestionArray returns a promise\n //\n this.createRenderedQuestionArray();\n if (this.random) {\n this.randomizeRQA();\n }\n this.renderContainer();\n this.renderTimer();\n await this.renderControlButtons();\n this.containerDiv.appendChild(this.timedDiv); // This can't be appended in renderContainer because then it renders above the timer and control buttons.\n if (this.renderedQuestionArray.length > 1) this.renderNavControls();\n this.renderSubmitButton();\n this.renderFeedbackContainer();\n this.useRunestoneServices = eBookConfig.useRunestoneServices;\n // Replace intermediate HTML with rendered HTML\n $(this.origElem).replaceWith(this.containerDiv);\n // check if already taken and if so show results\n this.styleExamElements(); // rename to renderPossibleResults\n this.checkServer(\"timedExam\", true);\n }\n\n renderContainer() {\n this.containerDiv = document.createElement(\"div\"); // container for the entire Timed Component\n if (this.fullwidth) {\n // allow the container to fill the width - barb\n $(this.containerDiv).attr({\n style: \"max-width:none\",\n });\n }\n this.containerDiv.id = this.divid;\n this.timedDiv = document.createElement(\"div\"); // div that will hold the questions for the timed assessment\n this.navDiv = document.createElement(\"div\"); // For navigation control\n $(this.navDiv).attr({\n style: \"text-align:center\",\n });\n this.flagDiv = document.createElement(\"div\"); // div that will hold the \"Flag Question\" button\n $(this.flagDiv).attr({\n style: \"text-align: center\",\n });\n this.switchContainer = document.createElement(\"div\");\n this.switchContainer.classList.add(\"switchcontainer\");\n this.switchDiv = document.createElement(\"div\"); // is replaced by the questions\n this.timedDiv.appendChild(this.navDiv);\n this.timedDiv.appendChild(this.flagDiv); // add flagDiv to timedDiv, which holds components for navigation and questions for timed assessment\n this.timedDiv.appendChild(this.switchContainer);\n this.switchContainer.appendChild(this.switchDiv);\n $(this.timedDiv).attr({\n id: \"timed_Test\",\n style: \"display:none\",\n });\n }\n\n renderTimer() {\n this.wrapperDiv = document.createElement(\"div\");\n this.timerContainer = document.createElement(\"P\");\n this.wrapperDiv.id = this.divid + \"-startWrapper\";\n this.timerContainer.id = this.divid + \"-output\";\n this.wrapperDiv.appendChild(this.timerContainer);\n this.showTime();\n }\n\n renderControlButtons() {\n this.controlDiv = document.createElement(\"div\");\n $(this.controlDiv).attr({\n id: \"controls\",\n style: \"text-align: center\",\n });\n this.startBtn = document.createElement(\"button\");\n this.pauseBtn = document.createElement(\"button\");\n $(this.startBtn).attr({\n class: \"btn btn-success\",\n id: \"start\",\n tabindex: \"0\",\n role: \"button\",\n });\n this.startBtn.textContent = \"Start\";\n this.startBtn.addEventListener(\n \"click\",\n async function () {\n $(this.finishButton).hide(); // hide the finish button for now\n $(this.flagButton).show();\n let mess = document.createElement(\"p\");\n mess.innerHTML =\n \"Warning: You will not be able to continue the exam if you close this tab, close the window, or navigate away from this page! Make sure you click the Finish Exam button when you are done to submit your work!\";\n this.controlDiv.appendChild(mess);\n mess.classList.add(\"examwarning\");\n await this.renderTimedQuestion();\n this.startAssessment();\n }.bind(this),\n false\n );\n $(this.pauseBtn).attr({\n class: \"btn btn-default\",\n id: \"pause\",\n disabled: \"true\",\n tabindex: \"0\",\n role: \"button\",\n });\n this.pauseBtn.textContent = \"Pause\";\n this.pauseBtn.addEventListener(\n \"click\",\n function () {\n this.pauseAssessment();\n }.bind(this),\n false\n );\n if (!this.taken) {\n this.controlDiv.appendChild(this.startBtn);\n }\n if (!this.nopause) {\n this.controlDiv.appendChild(this.pauseBtn);\n }\n this.containerDiv.appendChild(this.wrapperDiv);\n this.containerDiv.appendChild(this.controlDiv);\n }\n\n renderNavControls() {\n // making \"Prev\" button\n this.pagNavList = document.createElement(\"ul\");\n $(this.pagNavList).addClass(\"pagination\");\n this.leftContainer = document.createElement(\"li\");\n this.leftNavButton = document.createElement(\"button\");\n this.leftNavButton.innerHTML = \"‹ Prev\";\n $(this.leftNavButton).attr(\"aria-label\", \"Previous\");\n $(this.leftNavButton).attr(\"tabindex\", \"0\");\n $(this.leftNavButton).attr(\"role\", \"button\");\n $(this.rightNavButton).attr(\"id\", \"prev\");\n $(this.leftNavButton).css(\"cursor\", \"pointer\");\n this.leftContainer.appendChild(this.leftNavButton);\n this.pagNavList.appendChild(this.leftContainer);\n // making \"Flag Question\" button\n this.flaggingPlace = document.createElement(\"ul\");\n $(this.flaggingPlace).addClass(\"pagination\");\n this.flagContainer = document.createElement(\"li\");\n this.flagButton = document.createElement(\"button\");\n $(this.flagButton).addClass(\"flagBtn\");\n this.flagButton.innerHTML = \"Flag Question\"; // name on button\n $(this.flagButton).attr(\"aria-labelledby\", \"Flag\");\n $(this.flagButton).attr(\"tabindex\", \"5\");\n $(this.flagButton).attr(\"role\", \"button\");\n $(this.flagButton).attr(\"id\", \"flag\");\n $(this.flagButton).css(\"cursor\", \"pointer\");\n this.flagContainer.appendChild(this.flagButton); // adding button to container\n this.flaggingPlace.appendChild(this.flagContainer); // adding container to flaggingPlace\n // making \"Next\" button\n this.rightContainer = document.createElement(\"li\");\n this.rightNavButton = document.createElement(\"button\");\n $(this.rightNavButton).attr(\"aria-label\", \"Next\");\n $(this.rightNavButton).attr(\"tabindex\", \"0\");\n $(this.rightNavButton).attr(\"role\", \"button\");\n $(this.rightNavButton).attr(\"id\", \"next\");\n this.rightNavButton.innerHTML = \"Next ›\";\n $(this.rightNavButton).css(\"cursor\", \"pointer\");\n this.rightContainer.appendChild(this.rightNavButton);\n this.pagNavList.appendChild(this.rightContainer);\n this.ensureButtonSafety();\n this.navDiv.appendChild(this.pagNavList);\n this.flagDiv.appendChild(this.flaggingPlace); // adds flaggingPlace to the flagDiv\n this.break = document.createElement(\"br\");\n this.navDiv.appendChild(this.break);\n // render the question number jump buttons\n this.qNumList = document.createElement(\"ul\");\n $(this.qNumList).attr(\"id\", \"pageNums\");\n this.qNumWrapperList = document.createElement(\"ul\");\n $(this.qNumWrapperList).addClass(\"pagination\");\n var tmpLi, tmpA;\n for (var i = 0; i < this.renderedQuestionArray.length; i++) {\n tmpLi = document.createElement(\"li\");\n tmpA = document.createElement(\"a\");\n tmpA.innerHTML = i + 1;\n $(tmpA).css(\"cursor\", \"pointer\");\n if (i === 0) {\n $(tmpLi).addClass(\"active\");\n }\n tmpLi.appendChild(tmpA);\n this.qNumWrapperList.appendChild(tmpLi);\n }\n this.qNumList.appendChild(this.qNumWrapperList);\n this.navDiv.appendChild(this.qNumList);\n this.navBtnListeners();\n this.flagBtnListener(); // listens for click on flag button\n $(this.flagButton).hide();\n }\n\n // when moving off of a question in an active exam:\n // 1. show that the question has been seen, or mark it broken if it is in error.\n // 2. check and log the current answer\n async navigateAway() {\n if (\n this.renderedQuestionArray[this.currentQuestionIndex].state ==\n \"broken_exam\"\n ) {\n $(\n \"ul#pageNums > ul > li:eq(\" + this.currentQuestionIndex + \")\"\n ).addClass(\"broken\");\n }\n if (\n this.renderedQuestionArray[this.currentQuestionIndex].state ==\n \"exam_ended\"\n ) {\n $(\n \"ul#pageNums > ul > li:eq(\" + this.currentQuestionIndex + \")\"\n ).addClass(\"toolate\");\n }\n if (\n this.renderedQuestionArray[this.currentQuestionIndex].question\n .isAnswered\n ) {\n $(\n \"ul#pageNums > ul > li:eq(\" + this.currentQuestionIndex + \")\"\n ).addClass(\"answered\");\n await this.renderedQuestionArray[\n this.currentQuestionIndex\n ].question.checkCurrentAnswer();\n if (!this.done) {\n await this.renderedQuestionArray[\n this.currentQuestionIndex\n ].question.logCurrentAnswer();\n }\n }\n }\n async handleNextPrev(event) {\n if (!this.taken) {\n await this.navigateAway();\n }\n var target = $(event.target).text();\n if (target.match(/Next/)) {\n // checks given text to match \"Next\"\n if ($(this.rightContainer).hasClass(\"disabled\")) {\n return;\n }\n this.currentQuestionIndex++;\n } else if (target.match(/Prev/)) {\n // checks given text to match \"Prev\"\n if ($(this.leftContainer).hasClass(\"disabled\")) {\n return;\n }\n this.currentQuestionIndex--;\n }\n await this.renderTimedQuestion();\n this.ensureButtonSafety();\n for (var i = 0; i < this.qNumList.childNodes.length; i++) {\n for (\n var j = 0;\n j < this.qNumList.childNodes[i].childNodes.length;\n j++\n ) {\n $(this.qNumList.childNodes[i].childNodes[j]).removeClass(\n \"active\"\n );\n }\n }\n $(\n \"ul#pageNums > ul > li:eq(\" + this.currentQuestionIndex + \")\"\n ).addClass(\"active\");\n if (\n $(\n \"ul#pageNums > ul > li:eq(\" + this.currentQuestionIndex + \")\"\n ).hasClass(\"flagcolor\")\n ) {\n // checking for class\n this.flagButton.innerHTML = \"Unflag Question\"; // changes text on button\n } else {\n this.flagButton.innerHTML = \"Flag Question\"; // changes text on button\n }\n }\n\n async handleFlag(event) {\n // called when flag button is clicked\n var target = $(event.target).text();\n if (target.match(/Flag Question/)) {\n $(\n \"ul#pageNums > ul > li:eq(\" + this.currentQuestionIndex + \")\"\n ).addClass(\"flagcolor\"); // class will change color of question block\n this.flagButton.innerHTML = \"Unflag Question\";\n } else {\n $(\n \"ul#pageNums > ul > li:eq(\" + this.currentQuestionIndex + \")\"\n ).removeClass(\"flagcolor\"); // will restore current color of question block\n this.flagButton.innerHTML = \"Flag Question\"; // also sets name back\n }\n }\n\n async handleNumberedNav(event) {\n if (!this.taken) {\n await this.navigateAway();\n }\n for (var i = 0; i < this.qNumList.childNodes.length; i++) {\n for (\n var j = 0;\n j < this.qNumList.childNodes[i].childNodes.length;\n j++\n ) {\n $(this.qNumList.childNodes[i].childNodes[j]).removeClass(\n \"active\"\n );\n }\n }\n\n var target = $(event.target).text();\n let oldIndex = this.currentQuestionIndex;\n this.currentQuestionIndex = parseInt(target) - 1;\n if (this.currentQuestionIndex > this.renderedQuestionArray.length) {\n console.log(`Error: bad index for ${target}`);\n this.currentQuestionIndex = oldIndex;\n }\n $(\n \"ul#pageNums > ul > li:eq(\" + this.currentQuestionIndex + \")\"\n ).addClass(\"active\");\n if (\n $(\n \"ul#pageNums > ul > li:eq(\" + this.currentQuestionIndex + \")\" // checking for flagcolor class\n ).hasClass(\"flagcolor\")\n ) {\n this.flagButton.innerHTML = \"Unflag Question\";\n } else {\n this.flagButton.innerHTML = \"Flag Question\";\n }\n await this.renderTimedQuestion();\n this.ensureButtonSafety();\n }\n\n // set up events for navigation\n navBtnListeners() {\n // Next and Prev Listener\n this.pagNavList.addEventListener(\n \"click\",\n this.handleNextPrev.bind(this),\n false\n );\n\n // Numbered Listener\n this.qNumList.addEventListener(\n \"click\",\n this.handleNumberedNav.bind(this),\n false\n );\n }\n\n // set up event for flag\n flagBtnListener() {\n this.flaggingPlace.addEventListener(\n \"click\",\n this.handleFlag.bind(this), // calls this to take action\n false\n );\n }\n\n renderSubmitButton() {\n this.buttonContainer = document.createElement(\"div\");\n $(this.buttonContainer).attr({\n style: \"text-align:center\",\n });\n this.finishButton = document.createElement(\"button\");\n $(this.finishButton).attr({\n id: \"finish\",\n class: \"btn btn-primary\",\n });\n this.finishButton.textContent = \"Finish Exam\";\n this.finishButton.addEventListener(\n \"click\",\n async function () {\n if (\n window.confirm(\n \"Clicking OK means you are ready to submit your answers and are finished with this assessment.\"\n )\n ) {\n await this.finishAssessment();\n $(this.flagButton).hide();\n }\n }.bind(this),\n false\n );\n this.controlDiv.appendChild(this.finishButton);\n $(this.finishButton).hide();\n this.timedDiv.appendChild(this.buttonContainer);\n }\n ensureButtonSafety() {\n if (this.currentQuestionIndex === 0) {\n if (this.renderedQuestionArray.length != 1) {\n $(this.rightContainer).removeClass(\"disabled\");\n }\n $(this.leftContainer).addClass(\"disabled\");\n }\n if (\n this.currentQuestionIndex >=\n this.renderedQuestionArray.length - 1\n ) {\n if (this.renderedQuestionArray.length != 1) {\n $(this.leftContainer).removeClass(\"disabled\");\n }\n $(this.rightContainer).addClass(\"disabled\");\n }\n if (\n this.currentQuestionIndex > 0 &&\n this.currentQuestionIndex < this.renderedQuestionArray.length - 1\n ) {\n $(this.rightContainer).removeClass(\"disabled\");\n $(this.leftContainer).removeClass(\"disabled\");\n }\n }\n renderFeedbackContainer() {\n this.scoreDiv = document.createElement(\"P\");\n this.scoreDiv.id = this.divid + \"results\";\n this.scoreDiv.style.display = \"none\";\n this.containerDiv.appendChild(this.scoreDiv);\n }\n\n createRenderedQuestionArray() {\n // this finds all the assess questions in this timed assessment\n // We need to make a list of all the questions up front so we can set up navigation\n // but we do not want to render the questions until the student has navigated\n // Also adds them to this.renderedQuestionArray\n\n // todo: This needs to be updated to account for the runestone div wrapper.\n\n // To accommodate the selectquestion type -- which is async! we need to wrap\n // all of this in a promise, so that we don't continue to render the timed\n // exam until all of the questions have been realized.\n var opts;\n for (var i = 0; i < this.newChildren.length; i++) {\n var tmpChild = this.newChildren[i];\n opts = {\n state: \"prepared\",\n orig: tmpChild,\n question: {},\n useRunestoneServices: eBookConfig.useRunestoneServices,\n timed: true,\n assessmentTaken: this.taken,\n timedWrapper: this.divid,\n initAttempts: 0,\n };\n if ($(tmpChild).children(\"[data-component]\").length > 0) {\n tmpChild = $(tmpChild).children(\"[data-component]\")[0];\n opts.orig = tmpChild;\n }\n if ($(tmpChild).is(\"[data-component]\")) {\n this.renderedQuestionArray.push(opts);\n }\n }\n }\n\n randomizeRQA() {\n var currentIndex = this.renderedQuestionArray.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.renderedQuestionArray[currentIndex];\n this.renderedQuestionArray[currentIndex] =\n this.renderedQuestionArray[randomIndex];\n this.renderedQuestionArray[randomIndex] = temporaryValue;\n }\n }\n\n async renderTimedQuestion() {\n if (this.currentQuestionIndex >= this.renderedQuestionArray.length) {\n // sometimes the user clicks in the event area for the qNumList\n // But misses a number in that case the text is the concatenation\n // of all the numbers in the list!\n return;\n }\n // check the renderedQuestionArray to see if it has been rendered.\n let opts = this.renderedQuestionArray[this.currentQuestionIndex];\n let currentQuestion;\n if (\n opts.state === \"prepared\" ||\n opts.state === \"forreview\" ||\n (opts.state === \"broken_exam\" && opts.initAttempts < 3)\n ) {\n let tmpChild = opts.orig;\n if ($(tmpChild).is(\"[data-component=selectquestion]\")) {\n if (this.done && opts.state == \"prepared\") {\n this.renderedQuestionArray[\n this.currentQuestionIndex\n ].state = \"exam_ended\";\n } else {\n // SelectOne is async and will replace itself in this array with\n // the actual selected question\n opts.rqa = this.renderedQuestionArray;\n let newq = new SelectOne(opts);\n this.renderedQuestionArray[this.currentQuestionIndex] = {\n question: newq,\n };\n try {\n await newq.initialize();\n if (opts.state == \"broken_exam\") {\n // remove the broken class from this question if we get here.\n $(\n `ul#pageNums > ul > li:eq(${this.currentQuestionIndex})`\n ).removeClass(\"broken\");\n }\n } catch (e) {\n opts.state = \"broken_exam\";\n this.renderedQuestionArray[this.currentQuestionIndex] =\n opts;\n console.log(\n `Error initializing question: Details ${e}`\n );\n }\n }\n } else if ($(tmpChild).is(\"[data-component]\")) {\n let componentKind = $(tmpChild).data(\"component\");\n this.renderedQuestionArray[this.currentQuestionIndex] = {\n question: window.component_factory[componentKind](opts),\n };\n }\n } else if (opts.state === \"broken_exam\") {\n return;\n }\n\n currentQuestion =\n this.renderedQuestionArray[this.currentQuestionIndex].question;\n if (opts.state === \"forreview\") {\n await currentQuestion.checkCurrentAnswer();\n currentQuestion.renderFeedback();\n currentQuestion.disableInteraction();\n }\n\n if (!this.visited.includes(this.currentQuestionIndex)) {\n this.visited.push(this.currentQuestionIndex);\n if (\n this.visited.length === this.renderedQuestionArray.length &&\n !this.done\n ) {\n $(this.finishButton).show();\n }\n }\n\n if (currentQuestion.containerDiv) {\n $(this.switchDiv).replaceWith(currentQuestion.containerDiv);\n this.switchDiv = currentQuestion.containerDiv;\n }\n\n // If the timed component has listeners, those might need to be reinitialized\n // This flag will only be set in the elements that need it--it will be undefined in the others and thus evaluate to false\n if (currentQuestion.needsReinitialization) {\n currentQuestion.reinitializeListeners(this.taken);\n }\n }\n\n /*=================================\n === Timer and control Functions ===\n =================================*/\n handlePrevAssessment() {\n $(this.startBtn).hide();\n $(this.pauseBtn).attr(\"disabled\", true);\n $(this.finishButton).attr(\"disabled\", true);\n this.running = 0;\n this.done = 1;\n // showFeedback sand showResults should both be true before we show the\n // questions and their state of correctness.\n if (this.showResults && this.showFeedback) {\n $(this.timedDiv).show();\n this.restoreAnsweredQuestions(); // do not log these results\n } else {\n $(this.pauseBtn).hide();\n $(this.timerContainer).hide();\n }\n }\n startAssessment() {\n if (!this.taken) {\n $(\"#relations-next\").hide(); // hide the next page button for now\n $(\"#relations-prev\").hide(); // hide the previous button for now\n $(this.startBtn).hide();\n $(this.pauseBtn).attr(\"disabled\", false);\n if (this.running === 0 && this.paused === 0) {\n this.running = 1;\n this.lastTime = Date.now();\n $(this.timedDiv).show();\n this.increment();\n this.logBookEvent({\n event: \"timedExam\",\n act: \"start\",\n div_id: this.divid,\n });\n var timeStamp = new Date();\n var storageObj = {\n answer: [0, 0, this.renderedQuestionArray.length, 0],\n timestamp: timeStamp,\n };\n localStorage.setItem(\n this.localStorageKey(),\n JSON.stringify(storageObj)\n );\n }\n $(window).on(\n \"beforeunload\",\n function (event) {\n // this actual value gets ignored by newer browsers\n if (this.done) {\n return;\n }\n event.preventDefault();\n event.returnValue =\n \"Are you sure you want to leave? Your work will be lost! And you will need your instructor to reset the exam!\";\n return \"Are you sure you want to leave? Your work will be lost!\";\n }.bind(this)\n );\n window.addEventListener(\n \"pagehide\",\n async function (event) {\n if (!this.done) {\n await this.finishAssessment();\n console.log(\"Exam exited by leaving page\");\n }\n }.bind(this)\n );\n } else {\n this.handlePrevAssessment();\n }\n }\n pauseAssessment() {\n if (this.done === 0) {\n if (this.running === 1) {\n this.logBookEvent({\n event: \"timedExam\",\n act: \"pause\",\n div_id: this.divid,\n });\n this.running = 0;\n this.paused = 1;\n this.pauseBtn.innerHTML = \"Resume\";\n $(this.timedDiv).hide();\n } else {\n this.logBookEvent({\n event: \"timedExam\",\n act: \"resume\",\n div_id: this.divid,\n });\n this.running = 1;\n this.paused = 0;\n this.increment();\n this.pauseBtn.innerHTML = \"Pause\";\n $(this.timedDiv).show();\n }\n }\n }\n\n showTime() {\n if (this.showTimer) {\n var mins = Math.floor(this.timeLimit / 60);\n var secs = Math.floor(this.timeLimit) % 60;\n var minsString = mins;\n var secsString = secs;\n if (mins < 10) {\n minsString = \"0\" + mins;\n }\n if (secs < 10) {\n secsString = \"0\" + secs;\n }\n var beginning = \"Time Remaining \";\n if (!this.limitedTime) {\n beginning = \"Time Taken \";\n }\n var timeString = beginning + minsString + \":\" + secsString;\n if (this.done || this.taken) {\n var minutes = Math.floor(this.timeTaken / 60);\n var seconds = Math.floor(this.timeTaken % 60);\n if (minutes < 10) {\n minutes = \"0\" + minutes;\n }\n if (seconds < 10) {\n seconds = \"0\" + seconds;\n }\n timeString = \"Time taken: \" + minutes + \":\" + seconds;\n }\n this.timerContainer.innerHTML = timeString;\n var timeTips = document.getElementsByClassName(\"timeTip\");\n for (var i = 0; i <= timeTips.length - 1; i++) {\n timeTips[i].title = timeString;\n }\n } else {\n $(this.timerContainer).hide();\n }\n }\n\n increment() {\n // if running (not paused) and not taken\n if (this.running === 1 && !this.taken) {\n setTimeout(\n function () {\n // When a browser loses focus, setTimeout may not be called on the\n // schedule expected. Browsers are free to save power by lengthening\n // the interval to some longer time. So we cannot just subtract 1\n // from the timeLimit we need to measure the elapsed time from the last\n // call to the current call and subtract that number of seconds.\n let currentTime = Date.now();\n if (this.limitedTime) {\n // If there's a time limit, count down to 0\n this.timeLimit =\n this.timeLimit -\n Math.floor((currentTime - this.lastTime) / 1000);\n } else {\n // Else count up to keep track of how long it took to complete\n this.timeLimit =\n this.timeLimit +\n Math.floor((currentTime - this.lastTime) / 1000);\n }\n this.lastTime = currentTime;\n localStorage.setItem(\n eBookConfig.email + \":\" + this.divid + \"-time\",\n this.timeLimit\n );\n this.showTime();\n if (this.timeLimit > 0) {\n this.increment();\n // ran out of time\n } else {\n $(this.startBtn).attr({\n disabled: \"true\",\n });\n $(this.finishButton).attr({\n disabled: \"true\",\n });\n this.running = 0;\n this.done = 1;\n if (!this.taken) {\n this.taken = true;\n // embed the message in the page -- an alert actually prevents\n // the answers from being submitted and if a student closes their\n // laptop then the answers will not be submitted ever! Even when they\n // reopen the laptop their session cookie is likely invalid.\n let mess = document.createElement(\"h1\");\n mess.innerHTML =\n \"Sorry but you ran out of time. Your answers are being submitted\";\n this.controlDiv.appendChild(mess);\n this.finishAssessment();\n }\n }\n }.bind(this),\n 1000\n );\n }\n }\n\n styleExamElements() {\n // Checks if this exam has been taken before\n $(this.timerContainer).css({\n width: \"50%\",\n margin: \"0 auto\",\n \"background-color\": \"#DFF0D8\",\n \"text-align\": \"center\",\n border: \"2px solid #DFF0D8\",\n \"border-radius\": \"25px\",\n });\n $(this.scoreDiv).css({\n width: \"50%\",\n margin: \"0 auto\",\n \"background-color\": \"#DFF0D8\",\n \"text-align\": \"center\",\n border: \"2px solid #DFF0D8\",\n \"border-radius\": \"25px\",\n });\n $(\".tooltipTime\").css({\n margin: \"0\",\n padding: \"0\",\n \"background-color\": \"black\",\n color: \"white\",\n });\n }\n\n async finishAssessment() {\n $(\"#relations-next\").show(); // show the next page button for now\n $(\"#relations-prev\").show(); // show the previous button for now\n if (!this.showFeedback) {\n // bje - changed from showResults\n $(this.timedDiv).hide();\n $(this.pauseBtn).hide();\n $(this.timerContainer).hide();\n }\n this.findTimeTaken();\n this.running = 0;\n this.done = 1;\n this.taken = 1;\n await this.finalizeProblems();\n this.checkScore();\n this.displayScore();\n this.storeScore();\n this.logScore();\n $(this.pauseBtn).attr(\"disabled\", true);\n this.finishButton.disabled = true;\n $(window).off(\"beforeunload\");\n // turn off the pagehide listener\n let assignment_id = this.divid;\n setTimeout(function () {\n jQuery.ajax({\n url: eBookConfig.app + \"/assignments/student_autograde\",\n type: \"POST\",\n dataType: \"JSON\",\n data: {\n assignment_id: assignment_id,\n is_timed: true,\n },\n success: function (retdata) {\n if (retdata.success == false) {\n console.log(retdata.message);\n } else {\n console.log(\"Autograder completed\");\n }\n },\n });\n }, 2000);\n }\n\n // finalizeProblems\n // ----------------\n async finalizeProblems() {\n // Because we have submitted each question as we navigate we only need to\n // send the final version of the question the student is on when they press the\n // finish exam button.\n\n var currentQuestion =\n this.renderedQuestionArray[this.currentQuestionIndex].question;\n await currentQuestion.checkCurrentAnswer();\n await currentQuestion.logCurrentAnswer();\n currentQuestion.renderFeedback();\n currentQuestion.disableInteraction();\n\n for (var i = 0; i < this.renderedQuestionArray.length; i++) {\n let currentQuestion = this.renderedQuestionArray[i];\n // set the state to forreview so we know that feedback may be appropriate\n if (currentQuestion.state !== \"broken_exam\") {\n currentQuestion.state = \"forreview\";\n currentQuestion.question.disableInteraction();\n }\n }\n\n if (!this.showFeedback) {\n this.hideTimedFeedback();\n }\n }\n\n // restoreAnsweredQuestions\n // ------------------------\n restoreAnsweredQuestions() {\n for (var i = 0; i < this.renderedQuestionArray.length; i++) {\n var currentQuestion = this.renderedQuestionArray[i];\n if (currentQuestion.state === \"prepared\") {\n currentQuestion.state = \"forreview\";\n }\n }\n }\n\n // hideTimedFeedback\n // -----------------\n hideTimedFeedback() {\n for (var i = 0; i < this.renderedQuestionArray.length; i++) {\n var currentQuestion = this.renderedQuestionArray[i].question;\n currentQuestion.hideFeedback();\n }\n }\n\n // checkScore\n // ----------\n // This is a simple all or nothing score of one point per question for\n // that includes our best guess if a question was skipped.\n checkScore() {\n this.correctStr = \"\";\n this.skippedStr = \"\";\n this.incorrectStr = \"\";\n // Gets the score of each problem\n for (var i = 0; i < this.renderedQuestionArray.length; i++) {\n var correct =\n this.renderedQuestionArray[i].question.checkCorrectTimed();\n if (correct == \"T\") {\n this.score++;\n this.correctStr = this.correctStr + (i + 1) + \", \";\n } else if (correct == \"F\") {\n this.incorrect++;\n this.incorrectStr = this.incorrectStr + (i + 1) + \", \";\n } else if (correct === null || correct === \"I\") {\n this.skipped++;\n this.skippedStr = this.skippedStr + (i + 1) + \", \";\n } else {\n // ignored question; just do nothing\n }\n }\n // remove extra comma and space at end if any\n if (this.correctStr.length > 0)\n this.correctStr = this.correctStr.substring(\n 0,\n this.correctStr.length - 2\n );\n else this.correctStr = \"None\";\n if (this.skippedStr.length > 0)\n this.skippedStr = this.skippedStr.substring(\n 0,\n this.skippedStr.length - 2\n );\n else this.skippedStr = \"None\";\n if (this.incorrectStr.length > 0)\n this.incorrectStr = this.incorrectStr.substring(\n 0,\n this.incorrectStr.length - 2\n );\n else this.incorrectStr = \"None\";\n }\n findTimeTaken() {\n if (this.limitedTime) {\n this.timeTaken = this.startingTime - this.timeLimit;\n } else {\n this.timeTaken = this.timeLimit;\n }\n }\n storeScore() {\n var storage_arr = [];\n storage_arr.push(\n this.score,\n this.correctStr,\n this.incorrect,\n this.incorrectStr,\n this.skipped,\n this.skippedStr,\n this.timeTaken\n );\n var timeStamp = new Date();\n var storageObj = JSON.stringify({\n answer: storage_arr,\n timestamp: timeStamp,\n });\n localStorage.setItem(this.localStorageKey(), storageObj);\n }\n // _`timed exam endpoint parameters`\n //----------------------------------\n logScore() {\n this.logBookEvent({\n event: \"timedExam\",\n act: \"finish\",\n div_id: this.divid,\n correct: this.score,\n incorrect: this.incorrect,\n skipped: this.skipped,\n time_taken: this.timeTaken,\n });\n }\n shouldUseServer(data) {\n // We override the RunestoneBase version because there is no \"correct\" attribute, and there are 2 possible localStorage schemas\n // --we also want to default to local storage because it contains more information specifically which questions are correct, incorrect, and skipped.\n var storageDate;\n if (localStorage.length === 0) return true;\n var storageObj = localStorage.getItem(this.localStorageKey());\n if (storageObj === null) return true;\n try {\n var storedData = JSON.parse(storageObj).answer;\n if (storedData.length == 4) {\n if (\n data.correct == storedData[0] &&\n data.incorrect == storedData[1] &&\n data.skipped == storedData[2] &&\n data.timeTaken == storedData[3]\n )\n return true;\n } else if (storedData.length == 7) {\n if (\n data.correct == storedData[0] &&\n data.incorrect == storedData[2] &&\n data.skipped == storedData[4] &&\n data.timeTaken == storedData[6]\n ) {\n return false; // In this case, because local storage has more info, we want to use that if it's consistent\n }\n }\n storageDate = new Date(JSON.parse(storageObj[1]).timestamp);\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 true;\n }\n var serverDate = new Date(data.timestamp);\n if (serverDate < storageDate) {\n this.logScore();\n return false;\n }\n return true;\n }\n\n checkLocalStorage() {\n var len = localStorage.length;\n if (len > 0) {\n if (localStorage.getItem(this.localStorageKey()) !== null) {\n this.taken = 1;\n this.restoreAnswers(\"\");\n } else {\n this.taken = 0;\n }\n } else {\n this.taken = 0;\n }\n }\n async restoreAnswers(data) {\n this.taken = 1;\n var tmpArr;\n if (data === \"\") {\n try {\n tmpArr = JSON.parse(\n localStorage.getItem(this.localStorageKey())\n ).answer;\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 this.taken = 0;\n return;\n }\n } else {\n // Parse results from the database\n tmpArr = [\n parseInt(data.correct),\n parseInt(data.incorrect),\n parseInt(data.skipped),\n parseInt(data.timeTaken),\n data.reset,\n ];\n this.setLocalStorage(tmpArr);\n }\n if (tmpArr.length == 1) {\n // Exam was previously reset\n this.reset = true;\n this.taken = 0;\n return;\n }\n if (tmpArr.length == 4) {\n // Accidental Reload OR Database Entry\n this.score = tmpArr[0];\n this.incorrect = tmpArr[1];\n this.skipped = tmpArr[2];\n this.timeTaken = tmpArr[3];\n } else if (tmpArr.length == 7) {\n // Loaded Completed Exam\n this.score = tmpArr[0];\n this.correctStr = tmpArr[1];\n this.incorrect = tmpArr[2];\n this.incorrectStr = tmpArr[3];\n this.skipped = tmpArr[4];\n this.skippedStr = tmpArr[5];\n this.timeTaken = tmpArr[6];\n } else {\n // Set localStorage in case of \"accidental\" reload\n this.score = 0;\n this.incorrect = 0;\n this.skipped = this.renderedQuestionArray.length;\n this.timeTaken = 0;\n }\n if (this.taken) {\n if (this.skipped === this.renderedQuestionArray.length) {\n this.showFeedback = false;\n }\n this.handlePrevAssessment();\n }\n await this.renderTimedQuestion();\n this.displayScore();\n this.showTime();\n }\n setLocalStorage(parsedData) {\n var timeStamp = new Date();\n var storageObj = {\n answer: parsedData,\n timestamp: timeStamp,\n };\n localStorage.setItem(\n this.localStorageKey(),\n JSON.stringify(storageObj)\n );\n }\n displayScore() {\n if (this.showResults) {\n var scoreString = \"\";\n var numQuestions;\n var percentCorrect;\n // if we have some information\n if (\n this.correctStr.length > 0 ||\n this.incorrectStr.length > 0 ||\n this.skippedStr.length > 0\n ) {\n scoreString = `Num Correct: ${this.score}. Questions: ${this.correctStr}
Num Wrong: ${this.incorrect}. Questions: ${this.incorrectStr}
Num Skipped: ${this.skipped}. Questions: ${this.skippedStr}
`;\n numQuestions = this.score + this.incorrect + this.skipped;\n percentCorrect = (this.score / numQuestions) * 100;\n scoreString += \"Percent Correct: \" + percentCorrect + \"%\";\n $(this.scoreDiv).html(scoreString);\n this.scoreDiv.style.display = \"block\";\n } else {\n scoreString = `Num Correct: ${this.score}
Num Wrong: ${this.incorrect}
Num Skipped: ${this.skipped}
`;\n numQuestions = this.score + this.incorrect + this.skipped;\n percentCorrect = (this.score / numQuestions) * 100;\n scoreString += \"Percent Correct: \" + percentCorrect + \"%\";\n $(this.scoreDiv).html(scoreString);\n this.scoreDiv.style.display = \"block\";\n }\n this.highlightNumberedList();\n } else {\n $(this.scoreDiv).html(\n \"Thank you for taking the exam. Your answers have been recorded.\"\n );\n this.scoreDiv.style.display = \"block\";\n }\n }\n highlightNumberedList() {\n var correctCount = this.correctStr;\n var incorrectCount = this.incorrectStr;\n var skippedCount = this.skippedStr;\n correctCount = correctCount.replace(/ /g, \"\").split(\",\");\n incorrectCount = incorrectCount.replace(/ /g, \"\").split(\",\");\n skippedCount = skippedCount.replace(/ /g, \"\").split(\",\");\n $(function () {\n var numberedBtns = $(\"ul#pageNums > ul > li\");\n if (numberedBtns.hasClass(\"answered\")) {\n numberedBtns.removeClass(\"answered\");\n }\n for (var i = 0; i < correctCount.length; i++) {\n var test = parseInt(correctCount[i]) - 1;\n numberedBtns\n .eq(parseInt(correctCount[i]) - 1)\n .addClass(\"correctCount\");\n }\n for (var j = 0; j < incorrectCount.length; j++) {\n numberedBtns\n .eq(parseInt(incorrectCount[j]) - 1)\n .addClass(\"incorrectCount\");\n }\n for (var k = 0; k < skippedCount.length; k++) {\n numberedBtns\n .eq(parseInt(skippedCount[k]) - 1)\n .addClass(\"skippedCount\");\n }\n });\n }\n}\n\n/*=======================================================\n=== Function that calls the constructors on page load ===\n=======================================================*/\n$(document).on(\"runestone:login-complete\", function () {\n $(\"[data-component=timedAssessment]\").each(function (index) {\n TimedList[this.id] = new Timed({\n orig: this,\n useRunestoneServices: eBookConfig.useRunestoneServices,\n });\n });\n});\n"],"names":["$","i18n","load","en","msg_no_answer","msg_fitb_check_me","msg_fitb_compare_me","FITBList","FITB","constructor","opts","super","orig","this","useRunestoneServices","origElem","divid","id","correct","feedbackArray","JSON","parse","scriptSelector","html","createFITBElement","caption","addCaption","checkServer","root_node","find","renderFITBInput","renderFITBButtons","renderFITBFeedbackDiv","replaceWith","containerDiv","document","createElement","children","clone","appendTo","remove","ba","attr","blankArray","toArray","blank","change","recordAnswered","bind","isAnswered","submitButton","textContent","class","name","type","addEventListener","checkCurrentAnswer","logCurrentAnswer","appendChild","compareButton","disabled","compareFITBAnswers","feedBackDiv","restoreAnswers","data","arr","answer","Array","isArray","Error","err","split","i","length","displayFeed","isCorrectArray","renderFeedback","checkLocalStorage","storedData","graderactive","localStorage","ex","getItem","localStorageKey","console","log","message","removeItem","setLocalStorage","key","setItem","stringify","given_arr","push","value","eBookConfig","enableCompareMe","enableCompareButton","evaluateAnswers","isTimed","async","sid","feedback","timestamp","Date","event","act","div_id","logBookEvent","detail","given","fbl","j","RegExp","test","assert","min","max","actual","is_correct","percent","filter","Boolean","removeClass","addClass","feedback_html","slice","innerHTML","MathJax","queueMathJax","body","course","jQuery","get","new_server_prefix","compareFITB","status","whatever","answers","res","miscdata","row","count","modal","disableInteraction","on","each","index","closest","TimedFITB","renderTimedIcon","inputDiv","hideButtons","needsReinitialization","hide","component","timeIconDiv","timeIcon","src","style","className","title","prepend","checkCorrectTimed","hideFeedback","display","reinitializeListeners","window","component_factory","fillintheblank","timed","saList","undefined","ShortAnswer","question","optional","is","mathjax","renderHTML","getAttribute","newForm","action","fieldSet","legend","firstLegendDiv","jInputDiv","jOptionsDiv","jLabel","jTextArea","self","onchange","css","rows","cols","feedbackDiv","renderedAnswer","buttonDiv","onclick","randomSpan","otherOptionsDiv","renderMath","replace","text","getElementById","val","p","tsString","toLocaleString","last_answer","current_answer","toggle_answer_button","click","display_timestamp","button_text","last_timestamp","feedbackStr","score","comment","TimedShortAnswer","shortanswer","TimedList","Timed","childNodes","visited","timeLimit","limitedTime","isNaN","parseInt","startingTime","showFeedback","showResults","random","showTimer","fullwidth","nopause","enableScratchAC","running","paused","done","taken","incorrect","correctStr","incorrectStr","skippedStr","skipped","currentQuestionIndex","renderedQuestionArray","getNewChildren","enableDebug","oncontextmenu","checkAssessmentStatus","then","renderTimedAssess","newChildren","runestoneChildren","querySelectorAll","sendInfo","course_name","request","Request","method","headers","jsonHeaders","response","fetch","json","tookAssessment","assessmentTaken","clear","Promise","resolve","createRenderedQuestionArray","randomizeRQA","renderContainer","renderTimer","renderControlButtons","timedDiv","renderNavControls","renderSubmitButton","renderFeedbackContainer","styleExamElements","navDiv","flagDiv","switchContainer","classList","add","switchDiv","wrapperDiv","timerContainer","showTime","controlDiv","startBtn","pauseBtn","tabindex","role","finishButton","flagButton","show","mess","renderTimedQuestion","startAssessment","pauseAssessment","tmpLi","tmpA","pagNavList","leftContainer","leftNavButton","rightNavButton","flaggingPlace","flagContainer","rightContainer","ensureButtonSafety","break","qNumList","qNumWrapperList","navBtnListeners","flagBtnListener","state","navigateAway","target","match","hasClass","oldIndex","handleNextPrev","handleNumberedNav","handleFlag","buttonContainer","confirm","finishAssessment","scoreDiv","tmpChild","timedWrapper","initAttempts","temporaryValue","randomIndex","currentIndex","Math","floor","currentQuestion","rqa","newq","initialize","e","componentKind","includes","handlePrevAssessment","restoreAnsweredQuestions","lastTime","now","increment","timeStamp","storageObj","preventDefault","returnValue","mins","secs","minsString","secsString","beginning","timeString","minutes","timeTaken","seconds","timeTips","getElementsByClassName","setTimeout","currentTime","email","width","margin","border","padding","color","findTimeTaken","finalizeProblems","checkScore","displayScore","storeScore","logScore","off","assignment_id","ajax","url","app","dataType","is_timed","success","retdata","hideTimedFeedback","substring","storage_arr","time_taken","shouldUseServer","storageDate","tmpArr","reset","parsedData","numQuestions","scoreString","highlightNumberedList","correctCount","incorrectCount","skippedCount","numberedBtns","eq","k"],"sourceRoot":""}