2 LuCI - Lua Configuration Interface
4 Copyright 2008 Steven Barth <steven@midlink.org>
5 Copyright 2008-2009 Jo-Philipp Wich <xm@subsignal.org>
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
11 http://www.apache.org/licenses/LICENSE-2.0
20 function cbi_d_add(field, dep, next) {
21 var obj = document.getElementById(field);
24 for (var i=0; i<cbi_d.length; i++) {
25 if (cbi_d[i].id == field) {
34 "parent": obj.parentNode.id,
44 function cbi_d_checkvalue(target, ref) {
45 var t = document.getElementById(target);
49 var tl = document.getElementsByName(target);
51 if( tl.length > 0 && tl[0].type == 'radio' )
52 for( var i = 0; i < tl.length; i++ )
58 value = value ? value : "";
59 } else if (!t.value) {
64 if (t.type == "checkbox") {
65 value = t.checked ? value : "";
72 function cbi_d_check(deps) {
75 for (var i=0; i<deps.length; i++) {
78 for (var j in deps[i]) {
79 if (j == "!reverse") {
81 } else if (j == "!default") {
85 istat = (istat && cbi_d_checkvalue(j, deps[i][j]))
95 function cbi_d_update() {
97 for (var i=0; i<cbi_d.length; i++) {
99 var next = document.getElementById(entry.next)
100 var node = document.getElementById(entry.id)
101 var parent = document.getElementById(entry.parent)
103 if (node && node.parentNode && !cbi_d_check(entry.deps)) {
104 node.parentNode.removeChild(node);
107 cbi_c[entry.parent]--;
108 } else if ((!node || !node.parentNode) && cbi_d_check(entry.deps)) {
110 parent.appendChild(entry.node);
112 next.parentNode.insertBefore(entry.node, next);
116 cbi_c[entry.parent]++;
129 function cbi_bind(obj, type, callback, mode) {
130 if (typeof mode == "undefined") {
133 if (!obj.addEventListener) {
134 ieCallback = function(){
135 var e = window.event;
136 if (!e.target && e.srcElement) {
137 e.target = e.srcElement;
139 e.target['_eCB' + type + callback] = callback;
140 e.target['_eCB' + type + callback](e);
141 e.target['_eCB' + type + callback] = null;
143 obj.attachEvent('on' + type, ieCallback);
145 obj.addEventListener(type, callback, mode);
150 function cbi_combobox(id, values, def, man) {
151 var selid = "cbi.combobox." + id;
152 if (document.getElementById(selid)) {
156 var obj = document.getElementById(id)
157 var sel = document.createElement("select");
159 sel.className = 'cbi-input-select';
160 if (obj.nextSibling) {
161 obj.parentNode.insertBefore(sel, obj.nextSibling);
163 obj.parentNode.appendChild(sel);
166 if (!values[obj.value]) {
167 if (obj.value == "") {
168 var optdef = document.createElement("option");
170 optdef.appendChild(document.createTextNode(def));
171 sel.appendChild(optdef);
173 var opt = document.createElement("option");
174 opt.value = obj.value;
175 opt.selected = "selected";
176 opt.appendChild(document.createTextNode(obj.value));
177 sel.appendChild(opt);
181 for (var i in values) {
182 var opt = document.createElement("option");
185 if (obj.value == i) {
186 opt.selected = "selected";
189 opt.appendChild(document.createTextNode(values[i]));
190 sel.appendChild(opt);
193 var optman = document.createElement("option");
195 optman.appendChild(document.createTextNode(man));
196 sel.appendChild(optman);
198 obj.style.display = "none";
200 cbi_bind(sel, "change", function() {
201 if (sel.selectedIndex == sel.options.length - 1) {
202 obj.style.display = "inline";
203 sel.parentNode.removeChild(sel);
206 obj.value = sel.options[sel.selectedIndex].value;
217 function cbi_combobox_init(id, values, def, man) {
218 var obj = document.getElementById(id);
219 cbi_bind(obj, "blur", function() {
220 cbi_combobox(id, values, def, man)
222 cbi_combobox(id, values, def, man);
225 function cbi_filebrowser(id, url, defpath) {
226 var field = document.getElementById(id);
227 var browser = window.open(
228 url + ( field.value || defpath || '' ) + '?field=' + id,
229 "luci_filebrowser", "width=300,height=400,left=100,top=200,scrollbars=yes"
235 //Hijacks the CBI form to send via XHR (requires Prototype)
236 function cbi_hijack_forms(layer, win, fail, load) {
237 var forms = layer.getElementsByTagName('form');
238 for (var i=0; i<forms.length; i++) {
239 $(forms[i]).observe('submit', function(event) {
240 // Prevent the form from also submitting the regular way
244 event.element().request({
257 function cbi_t_add(section, tab) {
258 var t = document.getElementById('tab.' + section + '.' + tab);
259 var c = document.getElementById('container.' + section + '.' + tab);
262 cbi_t[section] = (cbi_t[section] || [ ]);
263 cbi_t[section][tab] = { 'tab': t, 'container': c, 'cid': c.id };
267 function cbi_t_switch(section, tab) {
268 if( cbi_t[section] && cbi_t[section][tab] ) {
269 var o = cbi_t[section][tab];
270 var h = document.getElementById('tab.' + section);
271 for( var tid in cbi_t[section] ) {
272 var o2 = cbi_t[section][tid];
273 if( o.tab.id != o2.tab.id ) {
274 o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab( |$)/, " cbi-tab-disabled ");
275 o2.container.style.display = 'none';
279 o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab-disabled( |$)/, " cbi-tab ");
280 o2.container.style.display = 'block';
287 function cbi_t_update() {
288 for( var sid in cbi_t )
289 for( var tid in cbi_t[sid] )
290 if( cbi_c[cbi_t[sid][tid].cid] == 0 ) {
291 cbi_t[sid][tid].tab.style.display = 'none';
293 else if( cbi_t[sid][tid].tab && cbi_t[sid][tid].tab.style.display == 'none' ) {
294 cbi_t[sid][tid].tab.style.display = '';
296 var t = cbi_t[sid][tid].tab;
297 window.setTimeout(function() { t.className = t.className.replace(/ cbi-tab-highlighted/g, '') }, 750);
298 cbi_t[sid][tid].tab.className += ' cbi-tab-highlighted';