]> wagnertech.de Git - kivitendo-erp.git/blobdiff - js/FormManager.js
System->Konteneinstellungen ueberarbeitet:
[kivitendo-erp.git] / js / FormManager.js
diff --git a/js/FormManager.js b/js/FormManager.js
new file mode 100644 (file)
index 0000000..ae70b58
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+       Form Manager: A simple method of constructing complex dynamic forms.
+       Written by Twey, http://www.twey.co.uk/.
+       Use, copying, and modification allowed, so long as credit
+       remains intact, under the terms of the GNU General Public License,
+       version 2 or later. See http://www.gnu.org/copyleft/gpl.html for details.
+*/
+
+
+var FORM_MANAGER_CONDITION_SEPARATOR = " AND ";
+var FORM_MANAGER_POSSIBILITY_SEPARATOR = " OR ";
+var FORM_MANAGER_NAME_VALUE_SEPARATOR = " BEING ";
+var FORM_MANAGER_DEPENDS = "DEPENDS ON ";
+var FORM_MANAGER_CONFLICTS = "CONFLICTS WITH ";
+var FORM_MANAGER_EMPTY = "EMPTY";
+
+function addEvent(el, ev, f) {
+  if(el.addEventListener)
+    el.addEventListener(ev, f, false);
+  else if(el.attachEvent) {
+    var t = function() {
+      f.apply(el);
+    };
+    addEvent.events.push({'element': el, 'event': ev, 'handler': f});
+    el.attachEvent("on" + ev, t);
+  } else
+    el['on' + ev] = f;
+}
+
+function addEvents(els, evs, f) {
+  for(var i = 0; i < els.length; ++i)
+    for(var j = 0; j < evs.length; ++j)
+      addEvent(els[i], evs[j], f);
+}
+
+addEvent.events = [];
+
+if(typeof window.event !== "undefined")
+  addEvent(window, "unload", function() {
+      for(var i = 0, e = addEvent.events; i < e.length; ++i)
+        e[i].element.detachEvent("on" + e[i].event, e[i].handler);
+    }
+  );
+
+function getRadioValue(el) {
+  if(!el.length) return null;
+  for(var i = 0; i < el.length; ++i)
+    if(el[i].checked) return el[i].value;
+  return null;
+}
+
+function getSelectValue(el) {
+  if(!el.tagName  || el.tagName.toLowerCase() !== "select")
+    return null;
+  return el.options[el.selectedIndex].value;
+}
+
+function isElementValue(el, v) {
+  if(v === FORM_MANAGER_EMPTY) v = '';
+  return (
+    getRadioValue(el) == v ||
+    getSelectValue(el) == v ||
+    (
+      el.tagName &&
+      el.tagName.toLowerCase() !== "select" &&
+      el.value == v
+    )
+  );
+}
+
+function setupDependencies() {
+  var showEl = function() {
+    this.style.display = "";
+    if(this.parentNode.tagName.toLowerCase() == "label")
+      this.parentNode.style.display = "";
+  };
+  var hideEl = function() {
+    this.style.display = "none";
+    if(typeof this.checked !== "undefined") this.checked = false;
+    else this.value = "";
+    if(this.parentNode.tagName.toLowerCase() == "label")
+      this.parentNode.style.display = "none";
+    this.hidden = true;
+  };
+  var calcDeps = function() {
+    for(var i = 0, e = this.elements; i < e.length; ++i) {
+      e[i].hidden = false;
+      for(var j = 0, f = e[i].className.split(FORM_MANAGER_CONDITION_SEPARATOR); j < f.length; ++j)
+        if(f[j].indexOf(FORM_MANAGER_DEPENDS) === 0) {
+          for(var k = 0, g = f[j].substr(FORM_MANAGER_DEPENDS.length).split(FORM_MANAGER_POSSIBILITY_SEPARATOR); k < g.length; ++k)
+            if(g[k].indexOf(FORM_MANAGER_NAME_VALUE_SEPARATOR) === -1) {
+             if(e[g[k]] && e[g[k]].checked) break;
+            else if(k + 1 == g.length)
+                e[i].hide();
+            } else {
+              var n = g[k].split(FORM_MANAGER_NAME_VALUE_SEPARATOR),
+                v = n[1];
+              n = n[0];
+             if(e[n])
+               if(isElementValue(e[n], v)) break;
+               else if(k + 1 == g.length) e[i].hide();
+           }
+        } else if(f[j].indexOf(FORM_MANAGER_CONFLICTS) === 0) {
+          if(f[j].indexOf(FORM_MANAGER_NAME_VALUE_SEPARATOR) === -1) {
+           if(e[f[j].substr(FORM_MANAGER_CONFLICTS.length)] && e[f[j].substr(FORM_MANAGER_CONFLICTS.length)].checked) {
+              e[i].hide();
+              break;
+            }
+          } else {
+            var n = f[j].substr(FORM_MANAGER_CONFLICTS.length).split(FORM_MANAGER_NAME_VALUE_SEPARATOR),
+              v = n[1];
+            n = n[0];
+            if(e[n]) {
+              if(isElementValue(e[n], v)) {
+                e[i].hide();
+                break;
+              }
+            }
+          }
+        }
+      if(!e[i].hidden) e[i].show();
+    }
+  };
+  var changeHandler = function() {
+    this.form.calculateDependencies();
+    return true;
+  };
+  for(var i = 0; i < arguments.length; ++i) {
+    for(var j = 0, e = window.document.forms[arguments[i]].elements; j < e.length; ++j) {
+      addEvents([e[j]], ["change", "keyup", "focus", "click", "keydown"], changeHandler);
+      e[j].hide = hideEl;
+      e[j].show = showEl;
+    }
+
+    (e = window.document.forms[arguments[i]]).calculateDependencies = calcDeps;
+    e.calculateDependencies();
+  }
+}