X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/2fda509c7dc417aad28ed072e91e8ffe2396314d..bd34eaeac9e09277148172dc634c0cd71bff91a8:/js/FormManager.js diff --git a/js/FormManager.js b/js/FormManager.js new file mode 100644 index 000000000..ae70b5898 --- /dev/null +++ b/js/FormManager.js @@ -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(); + } +}