]> git.mjollnir.org Git - moodle.git/commitdiff
formslib disabledif: MDL-18522 make it work if either end of a disabledif relationshi...
authortjhunt <tjhunt>
Mon, 16 Mar 2009 06:09:05 +0000 (06:09 +0000)
committertjhunt <tjhunt>
Mon, 16 Mar 2009 06:09:05 +0000 (06:09 +0000)
lib/javascript-static.js

index 136a36d8ab2c319d143d7e99dbde1a1d56f6527e..5f284bd274e9bd8b6935fbdaee3ba376b96aeee5 100644 (file)
@@ -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<oClassNames.length; i++){
+    if(typeof oClassNames == "object") {
+        for(var i=0; i<oClassNames.length; i++) {
             arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)"));
         }
     }
@@ -686,16 +743,16 @@ function getElementsByClassName(oElm, strTagName, oClassNames){
     }
     var oElement;
     var bMatchesAll;
-    for(var j=0; j<arrElements.length; j++){
+    for(var j=0; j<arrElements.length; j++) {
         oElement = arrElements[j];
         bMatchesAll = true;
-        for(var k=0; k<arrRegExpClassNames.length; k++){
-            if(!arrRegExpClassNames[k].test(oElement.className)){
+        for(var k=0; k<arrRegExpClassNames.length; k++) {
+            if(!arrRegExpClassNames[k].test(oElement.className)) {
                 bMatchesAll = false;
                 break;
             }
         }
-        if(bMatchesAll){
+        if(bMatchesAll) {
             arrReturnElements.push(oElement);
         }
     }