Commit 75b9a952f3b61eff59ded69564ede0bfed9d3f3c
1 parent
c94a2306
Exists in
master
and in
1 other branch
Adding js class to dynamic form.
Showing
2 changed files
with
147 additions
and
0 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,138 @@ |
| 1 | +/* | |
| 2 | + Form Manager: A simple method of constructing complex dynamic forms. | |
| 3 | + Written by Twey, http://www.twey.co.uk/. | |
| 4 | + Use, copying, and modification allowed, so long as credit | |
| 5 | + remains intact, under the terms of the GNU General Public License, | |
| 6 | + version 2 or later. See http://www.gnu.org/copyleft/gpl.html for details. | |
| 7 | +*/ | |
| 8 | + | |
| 9 | + | |
| 10 | +var FORM_MANAGER_CONDITION_SEPARATOR = " AND "; | |
| 11 | +var FORM_MANAGER_POSSIBILITY_SEPARATOR = " OR "; | |
| 12 | +var FORM_MANAGER_NAME_VALUE_SEPARATOR = " BEING "; | |
| 13 | +var FORM_MANAGER_DEPENDS = "DEPENDS ON "; | |
| 14 | +var FORM_MANAGER_CONFLICTS = "CONFLICTS WITH "; | |
| 15 | +var FORM_MANAGER_EMPTY = "EMPTY"; | |
| 16 | + | |
| 17 | +function addEvent(el, ev, f) { | |
| 18 | + if(el.addEventListener) | |
| 19 | + el.addEventListener(ev, f, false); | |
| 20 | + else if(el.attachEvent) { | |
| 21 | + var t = function() { | |
| 22 | + f.apply(el); | |
| 23 | + }; | |
| 24 | + addEvent.events.push({'element': el, 'event': ev, 'handler': f}); | |
| 25 | + el.attachEvent("on" + ev, t); | |
| 26 | + } else | |
| 27 | + el['on' + ev] = f; | |
| 28 | +} | |
| 29 | + | |
| 30 | +function addEvents(els, evs, f) { | |
| 31 | + for(var i = 0; i < els.length; ++i) | |
| 32 | + for(var j = 0; j < evs.length; ++j) | |
| 33 | + addEvent(els[i], evs[j], f); | |
| 34 | +} | |
| 35 | + | |
| 36 | +addEvent.events = []; | |
| 37 | + | |
| 38 | +if(typeof window.event !== "undefined") | |
| 39 | + addEvent(window, "unload", function() { | |
| 40 | + for(var i = 0, e = addEvent.events; i < e.length; ++i) | |
| 41 | + e[i].element.detachEvent("on" + e[i].event, e[i].handler); | |
| 42 | + } | |
| 43 | + ); | |
| 44 | + | |
| 45 | +function getRadioValue(el) { | |
| 46 | + if(!el.length) return null; | |
| 47 | + for(var i = 0; i < el.length; ++i) | |
| 48 | + if(el[i].checked) return el[i].value; | |
| 49 | + return null; | |
| 50 | +} | |
| 51 | + | |
| 52 | +function getSelectValue(el) { | |
| 53 | + if(!el.tagName || el.tagName.toLowerCase() !== "select") | |
| 54 | + return null; | |
| 55 | + return el.options[el.selectedIndex].value; | |
| 56 | +} | |
| 57 | + | |
| 58 | +function isElementValue(el, v) { | |
| 59 | + if(v === FORM_MANAGER_EMPTY) v = ''; | |
| 60 | + return ( | |
| 61 | + getRadioValue(el) == v || | |
| 62 | + getSelectValue(el) == v || | |
| 63 | + ( | |
| 64 | + el.tagName && | |
| 65 | + el.tagName.toLowerCase() !== "select" && | |
| 66 | + el.value == v | |
| 67 | + ) | |
| 68 | + ); | |
| 69 | +} | |
| 70 | + | |
| 71 | +function setupDependencies() { | |
| 72 | + var showEl = function() { | |
| 73 | + this.style.display = ""; | |
| 74 | + if(this.parentNode.tagName.toLowerCase() == "label") | |
| 75 | + this.parentNode.style.display = ""; | |
| 76 | + }; | |
| 77 | + var hideEl = function() { | |
| 78 | + this.style.display = "none"; | |
| 79 | + if(typeof this.checked !== "undefined") this.checked = false; | |
| 80 | + else this.value = ""; | |
| 81 | + if(this.parentNode.tagName.toLowerCase() == "label") | |
| 82 | + this.parentNode.style.display = "none"; | |
| 83 | + this.hidden = true; | |
| 84 | + }; | |
| 85 | + var calcDeps = function() { | |
| 86 | + for(var i = 0, e = this.elements; i < e.length; ++i) { | |
| 87 | + e[i].hidden = false; | |
| 88 | + for(var j = 0, f = e[i].className.split(FORM_MANAGER_CONDITION_SEPARATOR); j < f.length; ++j) | |
| 89 | + if(f[j].indexOf(FORM_MANAGER_DEPENDS) === 0) { | |
| 90 | + for(var k = 0, g = f[j].substr(FORM_MANAGER_DEPENDS.length).split(FORM_MANAGER_POSSIBILITY_SEPARATOR); k < g.length; ++k) | |
| 91 | + if(g[k].indexOf(FORM_MANAGER_NAME_VALUE_SEPARATOR) === -1) { | |
| 92 | + if(e[g[k]] && e[g[k]].checked) break; | |
| 93 | + else if(k + 1 == g.length) | |
| 94 | + e[i].hide(); | |
| 95 | + } else { | |
| 96 | + var n = g[k].split(FORM_MANAGER_NAME_VALUE_SEPARATOR), | |
| 97 | + v = n[1]; | |
| 98 | + n = n[0]; | |
| 99 | + if(e[n]) | |
| 100 | + if(isElementValue(e[n], v)) break; | |
| 101 | + else if(k + 1 == g.length) e[i].hide(); | |
| 102 | + } | |
| 103 | + } else if(f[j].indexOf(FORM_MANAGER_CONFLICTS) === 0) { | |
| 104 | + if(f[j].indexOf(FORM_MANAGER_NAME_VALUE_SEPARATOR) === -1) { | |
| 105 | + if(e[f[j].substr(FORM_MANAGER_CONFLICTS.length)] && e[f[j].substr(FORM_MANAGER_CONFLICTS.length)].checked) { | |
| 106 | + e[i].hide(); | |
| 107 | + break; | |
| 108 | + } | |
| 109 | + } else { | |
| 110 | + var n = f[j].substr(FORM_MANAGER_CONFLICTS.length).split(FORM_MANAGER_NAME_VALUE_SEPARATOR), | |
| 111 | + v = n[1]; | |
| 112 | + n = n[0]; | |
| 113 | + if(e[n]) { | |
| 114 | + if(isElementValue(e[n], v)) { | |
| 115 | + e[i].hide(); | |
| 116 | + break; | |
| 117 | + } | |
| 118 | + } | |
| 119 | + } | |
| 120 | + } | |
| 121 | + if(!e[i].hidden) e[i].show(); | |
| 122 | + } | |
| 123 | + }; | |
| 124 | + var changeHandler = function() { | |
| 125 | + this.form.calculateDependencies(); | |
| 126 | + return true; | |
| 127 | + }; | |
| 128 | + for(var i = 0; i < arguments.length; ++i) { | |
| 129 | + for(var j = 0, e = window.document.forms[arguments[i]].elements; j < e.length; ++j) { | |
| 130 | + addEvents([e[j]], ["change", "keyup", "focus", "click", "keydown"], changeHandler); | |
| 131 | + e[j].hide = hideEl; | |
| 132 | + e[j].show = showEl; | |
| 133 | + } | |
| 134 | + | |
| 135 | + (e = window.document.forms[arguments[i]]).calculateDependencies = calcDeps; | |
| 136 | + e.calculateDependencies(); | |
| 137 | + } | |
| 138 | +} | ... | ... |
src/web/templates/layout.html
| ... | ... | @@ -26,6 +26,15 @@ $ url_base = "http://localhost:8080/" |
| 26 | 26 | |
| 27 | 27 | <script type="text/javascript" src="/static/js/jquery.livequery.js"></script> |
| 28 | 28 | |
| 29 | + <script type="text/javascript" src="/static/js/FormManager.js"></script> | |
| 30 | + | |
| 31 | +<!-- Dynamic form --> | |
| 32 | +<script type="text/javascript"> | |
| 33 | +window.onload = function() { | |
| 34 | + setupDependencies('weboptions'); //name of form(s). Seperate each with a comma (ie: 'weboptions', 'myotherform' ) | |
| 35 | + }; | |
| 36 | +</script> | |
| 37 | + | |
| 29 | 38 | <script type="text/javascript"> |
| 30 | 39 | $$(document).ready(function() { |
| 31 | 40 | $$('.like_button').mouseenter(function(e) { | ... | ... |