]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-16202 formslib show/hide advanced button does not work with strict XML headers
authortjhunt <tjhunt>
Thu, 28 Aug 2008 07:52:09 +0000 (07:52 +0000)
committertjhunt <tjhunt>
Thu, 28 Aug 2008 07:52:09 +0000 (07:52 +0000)
lib/formslib.php
lib/javascript-static.js

index 84523254e997b7a9006a331079bcf6a1cd923670..8418293c4cd82a3bb3cca41ea7871f1a4b177490 100644 (file)
@@ -1419,7 +1419,7 @@ function validate_' . $this->_formName . '_' . $elementName . '(element) {
   var _qfGroups = {};
   var _qfMsg = \'\';
   var frm = element.parentNode;
-  while (frm && frm.nodeName != "FORM") {
+  while (frm && frm.nodeName.toUpperCase() != "FORM") {
     frm = frm.parentNode;
   }
 ' . join("\n", $jsArr) . '
@@ -1925,19 +1925,17 @@ class MoodleQuickForm_Renderer extends HTML_QuickForm_Renderer_Tableless{
         }
 
         if (isset($this->_advancedElements[$name])){
+            require_js(array('yui_yahoo', 'yui_event'));
             // this is tricky - the first submit button on form is "clicked" if user presses enter
             // we do not want to "submit" using advanced button if javascript active
-            $showtext="'".get_string('showadvanced', 'form')."'";
-            $hidetext="'".get_string('hideadvanced', 'form')."'";
-            //onclick returns false so if js is on then page is not submitted.
-            $onclick = 'return showAdvancedOnClick(this, '.$hidetext.', '.$showtext.');';
-            $button_js = '<input name="'.$elementName.'" value="'.$buttonlabel.'" type="button" onclick="'.$onclick.'" />';
             $button_nojs = '<input name="'.$elementName.'" value="'.$buttonlabel.'" type="submit" />';
-            $button = '<script type="text/javascript">
-//<![CDATA[
-document.write("'.addslashes_js($button_js).'")
-//]]>
-</script><noscript><div style="display:inline">'.$button_nojs.'</div></noscript>';  // the extra div should fix xhtml validation
+
+            $buttonlabel = addslashes_js($buttonlabel);
+            $showtext = addslashes_js(get_string('showadvanced', 'form'));
+            $hidetext = addslashes_js(get_string('hideadvanced', 'form'));
+            $button = '<script id="' . $name . '_script" type="text/javascript">' . "
+showAdvancedInit('{$name}_script', '$elementName', '$buttonlabel', '$hidetext', '$showtext');
+" . '</script><noscript><div style="display:inline">'.$button_nojs.'</div></noscript>';  // the extra div should fix xhtml validation
 
             $header_html = str_replace('{button}', $button, $header_html);
         } else {
index cdc283a2456f9c0d4bd9d356639e24d1b3dd04c1..1728c58c0de02471a12cb07b34dcd60bae97411e 100644 (file)
@@ -285,16 +285,32 @@ function elementShowAdvanced(elements, show) {
     }
 }
 
-function showAdvancedOnClick(button, hidetext, showtext){
+function showAdvancedInit(addBefore, nameAttr, buttonLabel, hideText, showText) {
+    var showHideButton = document.createElement("input");
+    showHideButton.type = 'button';
+    showHideButton.value = buttonLabel;
+    showHideButton.name = nameAttr;
+    showHideButton.moodle = {
+        hideLabel: hideText,
+        showLabel: showText
+    };
+    YAHOO.util.Event.addListener(showHideButton, 'click', showAdvancedOnClick);
+    el = document.getElementById(addBefore);
+    el.parentNode.insertBefore(showHideButton, el);
+}
+
+function showAdvancedOnClick(e) {
+    var button = e.target ? e.target : e.srcElement;
+
     var toSet=findChildNodes(button.form, null, 'advanced');
     var buttontext = '';
     if (button.form.elements['mform_showadvanced_last'].value == '0' ||  button.form.elements['mform_showadvanced_last'].value == '' ) {
         elementShowAdvanced(toSet, true);
-        buttontext = hidetext;
+        buttontext = button.moodle.hideLabel;
         button.form.elements['mform_showadvanced_last'].value = '1';
     } else {
         elementShowAdvanced(toSet, false);
-        buttontext = showtext;
+        buttontext = button.moodle.showLabel;
         button.form.elements['mform_showadvanced_last'].value = '0';
     }
     var formelements = button.form.elements;