From b51709c14cbbc603110ba44d94c79b5a447c7a27 Mon Sep 17 00:00:00 2001 From: tjhunt Date: Mon, 16 Mar 2009 06:09:05 +0000 Subject: [PATCH] formslib disabledif: MDL-18522 make it work if either end of a disabledif relationship is a set of radio buttons. --- lib/javascript-static.js | 133 ++++++++++++++++++++++++++++----------- 1 file changed, 95 insertions(+), 38 deletions(-) diff --git a/lib/javascript-static.js b/lib/javascript-static.js index 136a36d8ab..5f284bd274 100644 --- a/lib/javascript-static.js +++ b/lib/javascript-static.js @@ -60,18 +60,72 @@ function unlockoption(form,item) { } } +/** + * Get the value of the 'virtual form element' with a particular name. That is, + * abstracts away the difference between a normal form element, like a select + * which is a single HTML element with a .value property, and a set of radio + * buttons, which is several HTML elements. + * + * @param form a HTML form. + * @param master the name of an element in that form. + * @return the value of that element. + */ +function get_form_element_value(form, name) { + var element = form[name]; + if (!element) { + return null; + } + if (element.tagName) { + // Ordinarly thing like a select box. + return element.value; + } + // Array of things, like radio buttons. + for (var j = 0; j < element.length; j++) { + var el = element[j]; + if (el.checked) { + return el.value; + } + } + return null; +} + + +/** + * Set the disabled state of the 'virtual form element' with a particular name. + * This abstracts away the difference between a normal form element, like a select + * which is a single HTML element with a .value property, and a set of radio + * buttons, which is several HTML elements. + * + * @param form a HTML form. + * @param master the name of an element in that form. + * @param disabled the disabled state to set. + */ +function set_form_element_disabled(form, name, disabled) { + var element = form[name]; + if (!element) { + return; + } + if (element.tagName) { + // Ordinarly thing like a select box. + element.disabled = disabled; + } + // Array of things, like radio buttons. + for (var j = 0; j < element.length; j++) { + var el = element[j]; + el.disabled = disabled; + } +} function lockoptionsall(formid) { var form = document.forms[formid]; - var dependons = eval(formid+'items'); - var tolock = Array(); + var dependons = eval(formid + 'items'); + var tolock = []; for (var dependon in dependons) { // change for MooTools compatibility if (!dependons.propertyIsEnumerable(dependon)) { continue; } - var master = form[dependon]; - if (master === undefined) { + if (!form[dependon]) { continue; } for (var condition in dependons[dependon]) { @@ -79,15 +133,15 @@ function lockoptionsall(formid) { var lock; switch (condition) { case 'notchecked': - lock = !master.checked; break; + lock = !form[dependon].checked; break; case 'checked': - lock = master.checked; break; + lock = form[dependon].checked; break; case 'noitemselected': - lock = master.selectedIndex==-1; break; + lock = form[dependon].selectedIndex == -1; break; case 'eq': - lock = master.value==value; break; + lock = get_form_element_value(form, dependon) == value; break; default: - lock = master.value!=value; break; + lock = get_form_element_value(form, dependon) != value; break; } for (var ei in dependons[dependon][condition][value]) { // change for MooTools compatibility @@ -95,9 +149,8 @@ function lockoptionsall(formid) { continue; } var eltolock = dependons[dependon][condition][value][ei]; - if (tolock[eltolock] != null){ - tolock[eltolock] = - lock || tolock[eltolock]; + if (tolock[eltolock] != null) { + tolock[eltolock] = lock || tolock[eltolock]; } else { tolock[eltolock] = lock; } @@ -105,16 +158,12 @@ function lockoptionsall(formid) { } } } - for (var el in tolock){ + for (var el in tolock) { // change for MooTools compatibility if (!tolock.propertyIsEnumerable(el)) { continue; } - var formelement = form[el]; - if ((formelement === undefined) || (formelement.disabled === undefined)) { - continue; - } - formelement.disabled = tolock[el]; + set_form_element_disabled(form, el, tolock[el]); } return true; } @@ -127,16 +176,24 @@ function lockoptionsallsetup(formid) { if (!dependons.propertyIsEnumerable(dependon)) { continue; } - var master = form[dependon]; - if (master === undefined) { + var masters = form[dependon]; + if (!masters) { continue; } - master.formid = formid; - master.onclick = function() {return lockoptionsall(this.formid);}; - master.onblur = function() {return lockoptionsall(this.formid);}; - master.onchange = function() {return lockoptionsall(this.formid);}; + if (!masters[0]) { + // If master is radio buttons, we get an array, otherwise we don't. + // Convert both cases to an array for convinience. + masters = [masters]; + } + for (var j = 0; j < masters.length; j++) { + master = masters[j]; + master.formid = formid; + master.onclick = function() {return lockoptionsall(this.formid);}; + master.onblur = function() {return lockoptionsall(this.formid);}; + master.onchange = function() {return lockoptionsall(this.formid);}; + } } - for (var i = 0; i < form.elements.length; i++){ + for (var i = 0; i < form.elements.length; i++) { var formelement = form.elements[i]; if (formelement.type=='reset') { formelement.formid = formid; @@ -225,10 +282,10 @@ function findChildNodes(start, tagName, elementClass, elementID, elementName) { var classfound = false; var child = start.childNodes[i]; if((child.nodeType == 1) &&//element node type - (elementClass && (typeof(child.className)=='string'))){ + (elementClass && (typeof(child.className)=='string'))) { var childClasses = child.className.split(/\s+/); - for (var childClassIndex in childClasses){ - if (childClasses[childClassIndex]==elementClass){ + for (var childClassIndex in childClasses) { + if (childClasses[childClassIndex]==elementClass) { classfound = true; break; } @@ -254,7 +311,7 @@ function findChildNodes(start, tagName, elementClass, elementID, elementName) { Adds or removes the "hide" class for the specified elements depending on boolean hide. */ function elementShowAdvanced(elements, show) { - for (var elementIndex in elements){ + for (var elementIndex in elements) { element = elements[elementIndex]; element.className = element.className.replace(new RegExp(' ?hide'), '') if(!show) { @@ -293,8 +350,8 @@ function showAdvancedOnClick(e) { } var formelements = button.form.elements; // Fixed MDL-10506 - for (var i = 0; i < formelements.length; i++){ - if (formelements[i] && formelements[i].name && (formelements[i].name=='mform_showadvanced')){ + for (var i = 0; i < formelements.length; i++) { + if (formelements[i] && formelements[i].name && (formelements[i].name=='mform_showadvanced')) { formelements[i].value = buttontext; } } @@ -672,12 +729,12 @@ function addonload(fn) { } } -function getElementsByClassName(oElm, strTagName, oClassNames){ +function getElementsByClassName(oElm, strTagName, oClassNames) { var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName); var arrReturnElements = new Array(); var arrRegExpClassNames = new Array(); - if(typeof oClassNames == "object"){ - for(var i=0; i