Navigation Menu

Skip to content

Commit

Permalink
formslib disabledif: MDL-18522 make it work if either end of a disabl…
Browse files Browse the repository at this point in the history
…edif relationship is a set of radio buttons.

Backport from HEAD to 1.9 stable.
  • Loading branch information
tjhunt committed Mar 18, 2009
1 parent 2113a65 commit e299d01
Showing 1 changed file with 88 additions and 31 deletions.
119 changes: 88 additions & 31 deletions lib/javascript-static.js
Expand Up @@ -82,61 +82,110 @@ 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]) {
for (var value in dependons[dependon][condition]) {
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
if (!window.webkit && (!dependons[dependon][condition][value].propertyIsEnumerable(ei))) {
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;
}
}
}
}
}
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;
}
Expand All @@ -149,16 +198,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;
Expand Down Expand Up @@ -247,10 +304,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;
}
Expand All @@ -276,7 +333,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) {
Expand Down Expand Up @@ -315,8 +372,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;
}
}
Expand Down

0 comments on commit e299d01

Please sign in to comment.