247228d225b47d6a3f15a88e3ecefae176153be7
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';