/* LuCI - Lua Configuration Interface Copyright 2008 Steven Barth <steven@midlink.org> Copyright 2008-2009 Jo-Philipp Wich <xm@subsignal.org> Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 $Id$ */ var cbi_d = []; var cbi_t = []; var cbi_c = []; function cbi_d_add(field, dep, next) { var obj = document.getElementById(field); if (obj) { var entry for (var i=0; i<cbi_d.length; i++) { if (cbi_d[i].id == field) { entry = cbi_d[i]; break; } } if (!entry) { entry = { "node": obj, "id": field, "parent": obj.parentNode.id, "next": next, "deps": [] }; cbi_d.unshift(entry); } entry.deps.push(dep) } } function cbi_d_checkvalue(target, ref) { var t = document.getElementById(target); var value; if (!t || !t.value) { value = ""; } else { value = t.value; if (t.type == "checkbox") { value = t.checked ? value : ""; } } return (value == ref) } function cbi_d_check(deps) { for (var i=0; i<deps.length; i++) { var istat = true for (var j in deps[i]) { istat = (istat && cbi_d_checkvalue(j, deps[i][j])) } if (istat) { return true } } } function cbi_d_update() { var state = false; for (var i=0; i<cbi_d.length; i++) { var entry = cbi_d[i]; var next = document.getElementById(entry.next) var node = document.getElementById(entry.id) var parent = document.getElementById(entry.parent) if (node && node.parentNode && !cbi_d_check(entry.deps)) { node.parentNode.removeChild(node); state = (state || !node.parentNode); if( entry.parent ) cbi_c[entry.parent]--; } else if ((!node || !node.parentNode) && cbi_d_check(entry.deps)) { if (!next) { parent.appendChild(entry.node); } else { next.parentNode.insertBefore(entry.node, next); } state = (state || (node && node.parentNode)) if( entry.parent ) cbi_c[entry.parent]++; } } if (entry.parent) { cbi_t_update(); } if (state) { cbi_d_update(); } } function cbi_bind(obj, type, callback, mode) { if (typeof mode == "undefined") { mode = false; } if (!obj.addEventListener) { ieCallback = function(){ var e = window.event; if (!e.target && e.srcElement) { e.target = e.srcElement; }; e.target['_eCB' + type + callback] = callback; e.target['_eCB' + type + callback](e); e.target['_eCB' + type + callback] = null; }; obj.attachEvent('on' + type, ieCallback); } else { obj.addEventListener(type, callback, mode); } return obj; } function cbi_combobox(id, values, def, man) { var selid = "cbi.combobox." + id; if (document.getElementById(selid)) { return } var obj = document.getElementById(id) var sel = document.createElement("select"); sel.id = selid; sel.className = 'cbi-input-select'; if (obj.nextSibling) { obj.parentNode.insertBefore(sel, obj.nextSibling); } else { obj.parentNode.appendChild(sel); } if (!values[obj.value]) { if (obj.value == "") { var optdef = document.createElement("option"); optdef.value = ""; optdef.appendChild(document.createTextNode(def)); sel.appendChild(optdef); } else { var opt = document.createElement("option"); opt.value = obj.value; opt.selected = "selected"; opt.appendChild(document.createTextNode(obj.value)); sel.appendChild(opt); } } for (var i in values) { var opt = document.createElement("option"); opt.value = i; if (obj.value == i) { opt.selected = "selected"; } opt.appendChild(document.createTextNode(values[i])); sel.appendChild(opt); } var optman = document.createElement("option"); optman.value = ""; optman.appendChild(document.createTextNode(man)); sel.appendChild(optman); obj.style.display = "none"; cbi_bind(sel, "change", function() { if (sel.selectedIndex == sel.options.length - 1) { obj.style.display = "inline"; sel.parentNode.removeChild(sel); obj.focus(); } else { obj.value = sel.options[sel.selectedIndex].value; } try { cbi_d_update(); } catch (e) { //Do nothing } }) } function cbi_combobox_init(id, values, def, man) { var obj = document.getElementById(id); cbi_bind(obj, "blur", function() { cbi_combobox(id, values, def, man) }); cbi_combobox(id, values, def, man); } function cbi_filebrowser(id, url, defpath) { var field = document.getElementById(id); var browser = window.open( url + ( field.value || defpath || '' ) + '?field=' + id, "luci_filebrowser", "width=300,height=400,left=100,top=200,scrollbars=yes" ); browser.focus(); } //Hijacks the CBI form to send via XHR (requires Prototype) function cbi_hijack_forms(layer, win, fail, load) { var forms = layer.getElementsByTagName('form'); for (var i=0; i<forms.length; i++) { $(forms[i]).observe('submit', function(event) { // Prevent the form from also submitting the regular way event.stop(); // Submit via XHR event.element().request({ onSuccess: win, onFailure: fail }); if (load) { load(); } }); } } function cbi_t_add(section, tab) { var t = document.getElementById('tab.' + section + '.' + tab); var c = document.getElementById('container.' + section + '.' + tab); if( t && c ) { cbi_t[section] = (cbi_t[section] || [ ]); cbi_t[section][tab] = { 'tab': t, 'container': c, 'cid': c.id }; } } function cbi_t_switch(section, tab) { if( cbi_t[section] && cbi_t[section][tab] ) { var o = cbi_t[section][tab]; var h = document.getElementById('tab.' + section); for( var tid in cbi_t[section] ) { var o2 = cbi_t[section][tid]; if( o.tab.id != o2.tab.id ) { o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab( |$)/, " cbi-tab-disabled "); o2.container.style.display = 'none'; } else { if(h) h.value = tab; o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab-disabled( |$)/, " cbi-tab "); o2.container.style.display = 'block'; } } } return false } function cbi_t_update() { for( var sid in cbi_t ) for( var tid in cbi_t[sid] ) if( cbi_c[cbi_t[sid][tid].cid] == 0 ) { cbi_t[sid][tid].tab.style.display = 'none'; } else if( cbi_t[sid][tid].tab && cbi_t[sid][tid].tab.style.display == 'none' ) { cbi_t[sid][tid].tab.style.display = ''; var t = cbi_t[sid][tid].tab; window.setTimeout(function() { t.className = t.className.replace(/ cbi-tab-highlighted/g, '') }, 750); cbi_t[sid][tid].tab.className += ' cbi-tab-highlighted'; } }