AutorÃa | Ultima modificación | Ver Log |
// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>./*** JavaScript library for the quiz module.** @package mod* @subpackage questionnaire* @copyright* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*//** A workaround for MSIE versions < 10 which do not recognize classList. Answer by Paulpro at:* http://stackoverflow.com/questions/6787383/what-is-the-solution-to-remove-add-a-class-in-pure-javascript.* */function addClass(el, aclass){el.className += ' ' + aclass;}function removeClass(el, aclass){var elClass = ' ' + el.className + ' ';while(elClass.indexOf(' ' + aclass + ' ') != - 1) {elClass = elClass.replace(' ' + aclass + ' ', '');}el.className = elClass;}// End classList workaround./*** Javascript for hiding/displaying children questions on preview page of* questionnaire with conditional branching.*/function depend(children, choices) {children = children.split(',');choices = choices.split(',');var childrenlength = children.length;var choiceslength = choices.length;var child = null;var choice = null;for (var i = 0; i < childrenlength; i++) {child = children[i];var q = document.getElementById(child);if (q) {var radios = q.getElementsByTagName('input');var radiolength = radios.length;var droplists = q.getElementsByTagName('select');var droplistlength = droplists.length;var textareas = q.getElementsByTagName('textarea');var textarealength = textareas.length;for (var k = 0; k < choiceslength; k++) {var j, m, n;choice = choices[k];if (child == choice) {// If this browser version accepts classList.if (typeof document !== "undefined" && ("classList" in document.createElement("a"))) {q.classList.add('qn-container');// If this browser version DOES NOT accept classList (e.g. MSIE < 10)} else {addClass(q, 'qn-container');}for (j = 0; j < radiolength; j++) {var radio = radios[j];radio.disabled = false;}for (m = 0; m < droplistlength; m++) {var droplist = droplists[m];droplist.disabled = false;}delete children[i];} else if (children[i]){if (typeof document !== "undefined" && ("classList" in document.createElement("a"))) {q.classList.remove('qn-container');q.classList.add('hidedependquestion');} else {removeClass(q, 'qn-container');}addClass(q, 'hidedependquestion');for (j = 0; j < radiolength; j++) {var radio = radios[j];radio.disabled = true;radio.checked = false;radio.value = '';}for (m = 0; m < droplistlength; m++) {var droplist = droplists[m];droplist.selectedIndex = 0;droplist.disabled = true;droplist.checked = false;}for (n = 0; n < textarealength; n++) {var textarea = textareas[n];textarea.value = '';}}}}}}/* exported dependdrop */function dependdrop(qId, children) {var e = document.getElementById(qId);var choice = e.options[e.selectedIndex].value;depend(children, choice);}// End conditional branching functions.// When respondent enters text in !other field, corresponding// radio button OR check box is automatically checked./* exported other_check */function other_check(name) {var other = name.split("_");var other = name.slice(name.indexOf("o")+1);if (other.indexOf("]") != -1) {other = other.slice(0, other.indexOf("]"));}var f = document.getElementById("phpesp_response");for (var i = 0; i <= f.elements.length; i++) {if (f.elements[i].value == other) {f.elements[i].checked = true;break;}}}// Automatically empty an !other text input field if another Radio button is clicked./* exported other_check_empty */function other_check_empty(name, value) {var f = document.getElementById("phpesp_response");var i;for (i = 0; i < f.elements.length; i++) {if ((f.elements[i].name == name) && f.elements[i].value.substr(0, 6) == "other_") {f.elements[i].checked = true;var otherid = f.elements[i].name + "_" + f.elements[i].value.substring(6);var other = document.getElementsByName(otherid);if (value.substr(0,6) != "other_") {other[0].value = "";} else {other[0].focus();}var actualbuttons = document.getElementsByName(name);for (i = 0; i <= actualbuttons.length; i++) {if (actualbuttons[i].value == value) {actualbuttons[i].checked = true;break;}}break;}}}// In a Rate question type of sub-type Order : automatically uncheck a Radio button// when another radio button in the same column is clicked./* exported other_rate_uncheck */function other_rate_uncheck(name, value) {var col_name = name.substr(0, name.indexOf("_"));var inputbuttons = document.getElementsByTagName("input");for (var i = 0; i <= inputbuttons.length - 1; i++) {var button = inputbuttons[i];if (button.type == "radio" && button.name != name && button.value == value&& button.name.substr(0, name.indexOf("_")) == col_name) {button.checked = false;}}}// Empty an !other text input when corresponding Check Box is clicked (supposedly to empty it)./* exported checkbox_empty */function checkbox_empty(name) {var actualbuttons = document.getElementsByName(name);for (var i = 0; i <= actualbuttons.length; i++) {if (actualbuttons[i].value.substr(0, 6) == "other_") {name = name.substring(0, name.length - 2) + actualbuttons[i].value.substring(5);var othertext = document.getElementsByName(name);if (othertext[0].value == "" && actualbuttons[i].checked == true) {othertext[0].focus();} else {othertext[0].value = "";}break;}}}M.mod_questionnaire = M.mod_questionnaire || {};/* exported Y *//* exported e */M.mod_questionnaire.init_attempt_form = function(Y) {M.core_formchangechecker.init({formid: 'phpesp_response'});};M.mod_questionnaire.init_sendmessage = function(Y) {Y.on('click', function(e) {Y.all('input.usercheckbox').each(function() {this.set('checked', 'checked');});}, '#checkall');Y.on('click', function(e) {Y.all('input.usercheckbox').each(function() {this.set('checked', '');});}, '#checknone');Y.on('click', function(e) {Y.all('input.usercheckbox').each(function() {if (this.get('alt') == 0) {this.set('checked', 'checked');} else {this.set('checked', '');}});}, '#checknotstarted');Y.on('click', function(e) {Y.all('input.usercheckbox').each(function() {if (this.get('alt') == 1) {this.set('checked', 'checked');} else {this.set('checked', '');}});}, '#checkstarted');};M.mod_questionnaire.init_slider = function(Y) {const allRanges = document.querySelectorAll(".slider");allRanges.forEach(wrap => {const range = wrap.querySelector("input.questionnaire-slider");const bubble = wrap.querySelector(".bubble");range.addEventListener("input", () => {setBubble(range, bubble);});setBubble(range, bubble);});function setBubble(range, bubble) {const val = range.value;const min = range.min ? range.min : 0;const max = range.max ? range.max : 100;var newVal = Number(((val - min) * 100) / (max - min));var positiveVal = '';if (range.min && range.min < 0) {if (range.max && range.max > 0) {if (val > 0) {positiveVal = '+';}}}bubble.innerHTML = positiveVal + val;// Sorta magic numbers based on size of the native UI thumbbubble.style.left = `calc(${newVal}% + (${8 - newVal * 0.15}px))`;}};