* luci-0.8: merge r3607, r3608, r3611 and r3612

This commit is contained in:
Jo-Philipp Wich 2008-10-21 01:56:50 +00:00
parent 4e8af56ac1
commit 85fbb033cf
15 changed files with 1456 additions and 550 deletions

View file

@ -22,6 +22,8 @@ tinyproxy_tinyproxy_startservers = 'Servidores sobressalentes iniciar com'
tinyproxy_tinyproxy_statfile = 'Documento de estatísticas'
tinyproxy_tinyproxy_syslog = 'Escrever para syslog'
tinyproxy_tinyproxy_timeout = 'Timeout de conexão'
tinyproxy_tinyproxy_group = 'Grupo'
tinyproxy_tinyproxy_user = 'Usuário'
tinyproxy_tinyproxy_viaproxyname = 'Valor do cabeçalho "Via-Header"'
tinyproxy_tinyproxy_xtinyproxy = 'Incluir o IP do cliente'
tinyproxy_type_proxy = 'Via proxy'

View file

@ -442,9 +442,20 @@ endef
### Themes ###
define Package/luci-theme-base
$(call Package/luci/thtemplate)
DEPENDS:=+luci-web
TITLE:=Common base for all themes
endef
define Package/luci-theme-base/install
$(call Package/luci/install/template,$(1),themes/base)
endef
define Package/luci-theme-openwrt
$(call Package/luci/thtemplate)
TITLE:=OpenWRT.org (default)
DEPENDS:=+luci-theme-base
endef
define Package/luci-theme-openwrt/install
@ -454,6 +465,7 @@ endef
define Package/luci-theme-openwrtlight
$(call Package/luci/thtemplate)
TITLE:=OpenWRT.org - light variant without images
DEPENDS:=+luci-theme-base
endef
define Package/luci-theme-openwrtlight/install
@ -606,6 +618,10 @@ ifneq ($(CONFIG_PACKAGE_luci-sgi-cgi),)
PKG_SELECTED_MODULES+=libs/sgi-cgi
endif
ifneq ($(CONFIG_PACKAGE_luci-theme-base),)
PKG_SELECTED_MODULES+=themes/base
endif
ifneq ($(CONFIG_PACKAGE_luci-theme-openwrt),)
PKG_SELECTED_MODULES+=themes/openwrt.org
endif
@ -672,6 +688,7 @@ $(eval $(call BuildPackage,luci-app-initmgr))
$(eval $(call BuildPackage,luci-sgi-cgi))
$(eval $(call BuildPackage,luci-theme-base))
$(eval $(call BuildPackage,luci-theme-openwrt))
$(eval $(call BuildPackage,luci-theme-openwrtlight))

View file

@ -158,10 +158,13 @@ dhcp_dnsmasq_logqueries = 'Log das consultas'
dhcp_dnsmasq_noresolv = 'Ignorar arquivo resolv'
dhcp_dnsmasq_dnsforwardmax = 'Consultas simultâneas'
dhcp_dnsmasq_port = 'Porta do <abbr title="Sistema de Nomes de Domínios">DNS</abbr>'
dhcp_dnsmasq_ednspacket_max = 'tamanho <abbr title="máximo">max.</abbr> <abbr title="Mecanismos de Extensão do Sistema de Nomes de Domínios">EDNS0</abbr> do pacote'
dhcp_dnsmasq_dhcpleasemax = '<abbr title="máximo">max.</abbr> <abbr title="Protocolo de Configuração Dinâmica de Hosts">DHCP</abbr>-Leases'
dhcp_dnsmasq_ednspacket_max = 'tamanho <abbr title="máximo">max.</abbr> do pacote <abbr title="Mecanismos de Extensão do Sistema de Nomes de Domínios">EDNS0</abbr>'
dhcp_dnsmasq_dhcpleasemax = '<abbr title="máximo">max.</abbr> de <abbr title="Protocolo de Configuração Dinâmica de Hosts">DHCP</abbr>-Leases'
dhcp_dnsmasq_addnhosts = 'arquivo host adicional'
dhcp_dnsmasq_queryport = 'porta da consulta'
dhcp_dnsmasq_queryport = 'porta para consulta'
dhcp_dnsmasq_enabletftp = 'Ativar servidor TFTP'
dhcp_dnsmasq_tftproot = 'Diretório raiz do servidor TFTP'
dhcp_dnsmasq_dhcpboot = 'Imagem para o boot remoto'
a_n_switch = 'Switch'
a_n_conntrack = 'Conexões Ativas'
a_n_conntrack_desc = 'Esta página fornece informações sobre as conexões de rede ativas.'

View file

@ -106,24 +106,22 @@ end
</div>
<% end %>
<%- if self.addremove then -%>
<div class="cbi-section-table-row">
<td colspan="<%=count%>" class="cbi-section-table-optionals">
<div class="cbi-section-create">
<% if self.anonymous then %>
<input class="cbi-button cbi-button-add" type="submit" value="<%:cbi_add%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" title="<%:cbi_add%>" />
<% else %>
<% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
<input type="text" class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" />
<input class="cbi-button cbi-button-add" type="submit" value="<%:cbi_add%>" title="<%:cbi_add%>" />
<% if self.invalid_cts then -%>
<br /><%:cbi_invalid%></div>
<%- end %>
<% end %>
</div>
</td>
<%- if self.addremove then -%>
<% if self.template_addremove then include(self.template_addremove) else -%>
<div class="cbi-section-create cbi-tblsection-create">
<% if self.anonymous then %>
<input class="cbi-button cbi-button-add" type="submit" value="<%:cbi_add%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" title="<%:cbi_add%>" />
<% else %>
<% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
<input type="text" class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" />
<input class="cbi-button cbi-button-add" type="submit" value="<%:cbi_add%>" title="<%:cbi_add%>" />
<% if self.invalid_cts then -%>
<br /><%:cbi_invalid%></div>
<%- end %>
<% end %>
</div>
<%- end -%>
<%- end %>
<%- end -%>
</div>
</fieldset>
<!-- /tblsection -->

2
themes/base/Makefile Normal file
View file

@ -0,0 +1,2 @@
include ../../build/config.mk
include ../../build/module.mk

View file

@ -0,0 +1,120 @@
/*
Copyright (C) 2008 Alina Friedrichsen <x-alina@gmx.net>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
*/
function initDropdowns() {
var aSelects = XHTML1.getElementsByTagName("select");
var isIE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;
function showPlaceholder(sel) {
if( ! sel._ph ) {
var box = sel.getBoundingClientRect();
sel._dm = sel.currentStyle.display;
sel._ph = document.createElement('input');
sel.parentNode.insertBefore(sel._ph, sel);
sel._ph.style.width = ( box.right - box.left ) + 'px';
sel._ph.style.height = ( box.bottom - box.top ) + 'px';
sel._ph.style.margin = sel.currentStyle.margin;
}
sel._ph.value = sel.options[sel.selectedIndex].text;
sel._ph.style.display = sel._dm;
sel.style.display = 'none';
}
function hidePlaceholder(sel) {
if( sel._ph ) sel._ph.style.display = 'none';
sel.style.display = sel._dm;
}
function hideSelects() {
for(var i = 0; i < aSelects.length; i++) {
showPlaceholder(aSelects[i]);
}
}
function showSelects() {
for(var i = 0; i < aSelects.length; i++) {
hidePlaceholder(aSelects[i]);
}
}
function onmouseover(evt) {
XHTML1.addClass(evt.currentTarget, "over");
if( isIE6 ) hideSelects();
}
function onmouseout(evt) {
XHTML1.removeClass(evt.currentTarget, "over");
if( isIE6 ) showSelects();
}
function onfocus(evt) {
for(var element = evt.currentTarget; element; element = element.parentNode) {
if(XHTML1.isElement(element, "li")) {
XHTML1.addClass(element, "focus");
}
}
if( isIE6 ) hideSelects();
}
function onblur(evt) {
for(var element = evt.currentTarget; element; element = element.parentNode) {
if(XHTML1.isElement(element, "li")) {
XHTML1.removeClass(element, "focus");
}
}
if( isIE6 ) showSelects();
}
if(document.all) {
var liElements = XHTML1.getElementsByTagName("li");
for(var i = 0; i < liElements.length; i++) {
var li = liElements[i];
for(var element = li.parentNode; element; element = element.parentNode) {
if(XHTML1.isElement(element, "ul") && XHTML1.containsClass(element, "dropdowns")) {
XHTML1.addEventListener(li, "mouseover", onmouseover);
XHTML1.addEventListener(li, "mouseout", onmouseout);
break;
}
}
}
}
var aElements = XHTML1.getElementsByTagName("a");
for(var i = 0; i < aElements.length; i++) {
var a = aElements[i];
for(var element = a.parentNode; element; element = element.parentNode) {
if(XHTML1.isElement(element, "ul") && XHTML1.containsClass(element, "dropdowns")) {
XHTML1.addEventListener(a, "focus", onfocus);
XHTML1.addEventListener(a, "blur", onblur);
break;
}
}
}
}
if(XHTML1.isDOMSupported()) {
XHTML1.addEventListener(window, "load", initDropdowns);
}

View file

@ -0,0 +1,91 @@
/*
Copyright (C) 2008 Alina Friedrichsen <x-alina@gmx.net>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
*/
function VarType() {
}
VarType.isNull = function(obj) {
if(typeof obj == "undefined") return true;
if(typeof obj == "object" && (!obj)) return true;
return false;
};
VarType.toFloat = function(value) {
value = Number(value);
return value;
};
VarType.toDecimal = function(value) {
value = Number(value);
if(!isFinite(value)) value = 0.0;
return value;
};
VarType.toInt = function(value) {
value = Number(value);
if(!isFinite(value)) value = 0.0;
value = Math.floor(value);
return value;
};
VarType.toUInt = function(value) {
value = Number(value);
if(!isFinite(value)) value = 0.0;
else if(value < 0.0) value = 0.0;
value = Math.floor(value);
return value;
};
VarType.toStr = function(value) {
if(VarType.isNull(value)) value = "";
value = String(value);
return value;
};
VarType.toBool = function(value) {
value = Boolean(value);
return value;
};
VarType.needObject = function(obj) {
if(typeof obj != "object" || (!obj)) throw new TypeError();
};
VarType.needInstanceOf = function(obj, type) {
if(!(obj instanceof type)) throw new TypeError();
};
VarType.needFunction = function(obj) {
if(typeof obj != "function") throw new TypeError();
};
VarType.needNode = function(obj, type) {
VarType.needObject(obj);
if(VarType.isNull(obj.nodeType)) throw new TypeError();
if(!VarType.isNull(type)) {
type = VarType.toInt(type);
if(obj.nodeType != type) throw new TypeError();
}
};

View file

@ -0,0 +1,271 @@
/*
Copyright (C) 2007, 2008 Alina Friedrichsen <x-alina@gmx.net>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
*/
var XMLNS_XMLNS = "http://www.w3.org/2000/xmlns/";
var XMLNS_XML = "http://www.w3.org/XML/1998/namespace";
var XMLNS_XHTML = "http://www.w3.org/1999/xhtml";
function W3CDOM_Event(currentTarget) {
VarType.needObject(currentTarget);
this.currentTarget = currentTarget;
this.preventDefault = function() { window.event.returnValue = false; };
return this;
}
function XHTML1() {
}
XHTML1.isDOMSupported = function() {
if(!document.getElementById) return false;
if(!(window.addEventListener || window.attachEvent)) return false;
return true;
};
XHTML1.isXHTML = function() {
if(document.documentElement.nodeName == "HTML") return false;
return true;
};
XHTML1.addEventListener = function(target, type, listener) {
VarType.needObject(target);
type = VarType.toStr(type);
VarType.needFunction(listener);
if(target.addEventListener) {
target.addEventListener(type, listener, false);
}
else if(target.attachEvent) {
target.attachEvent("on" + type, function() { listener(new W3CDOM_Event(target)); } );
}
};
XHTML1.createElement = function(tagName) {
tagName = VarType.toStr(tagName);
if(XHTML1.isXHTML()) {
return document.createElementNS(XMLNS_XHTML, tagName.toLowerCase());
}
return document.createElement(tagName.toUpperCase());
};
XHTML1.getElementsByTagName = function(tagName) {
tagName = VarType.toStr(tagName);
if(XHTML1.isXHTML()) {
return document.getElementsByTagNameNS(XMLNS_XHTML, tagName.toLowerCase());
}
return document.getElementsByTagName(tagName.toUpperCase());
};
XHTML1.isElement = function(node, tagName) {
VarType.needNode(node);
tagName = VarType.toStr(tagName);
if(node.nodeType == 1) {
if(XHTML1.isXHTML()) {
if(node.namespaceURI == XMLNS_XHTML) {
if(node.localName == tagName.toLowerCase()) return true;
}
} else {
if(node.nodeName == tagName.toUpperCase()) return true;
}
}
return false;
};
XHTML1.getAttribute = function(element, name) {
VarType.needNode(element, 1);
name = VarType.toStr(name);
name = name.toLowerCase();
if(XHTML1.isXHTML()) {
return element.getAttributeNS(null, name);
}
if(name == "class") {
return element.className;
}
return element.getAttribute(name);
};
XHTML1.setAttribute = function(element, name, value) {
VarType.needNode(element, 1);
name = VarType.toStr(name);
value = VarType.toStr(value);
name = name.toLowerCase();
if(XHTML1.isXHTML()) {
element.setAttributeNS(null, name, value);
return;
}
if(name == "class") {
element.className = value;
return;
}
element.setAttribute(name, value);
};
XHTML1.removeAttribute = function(element, name) {
VarType.needNode(element, 1);
name = VarType.toStr(name);
name = name.toLowerCase();
if(XHTML1.isXHTML()) {
element.removeAttributeNS(null, name);
return;
}
if(name == "class") {
element.className = "";
return;
}
element.removeAttribute(name);
};
XHTML1.containsClass = function(element, className) {
VarType.needNode(element, 1);
className = VarType.toStr(className).replace(/^\s+/g, "").replace(/\s+$/g, "");
var classString = XHTML1.getAttribute(element, "class").replace(/\s+/g, " ").replace(/^\s+/g, "").replace(/\s+$/g, "");
var classArray = classString.split(" ");
for(var i = 0; i < classArray.length; i++) {
if(classArray[i] == className) return true;
}
return false;
};
XHTML1.addClass = function(element, className) {
VarType.needNode(element, 1);
className = VarType.toStr(className).replace(/^\s+/g, "").replace(/\s+$/g, "");
var classString = XHTML1.getAttribute(element, "class").replace(/\s+/g, " ").replace(/^\s+/g, "").replace(/\s+$/g, "");
var classArray = classString.split(" ");
classString = "";
for(var i = 0; i < classArray.length; i++) {
if(classArray[i] != className) {
if(classString == "") classString = classArray[i];
else classString += " " + classArray[i];
}
}
if(classString == "") classString = className;
else classString += " " + className;
XHTML1.setAttribute(element, "class", classString);
};
XHTML1.removeClass = function(element, className) {
VarType.needNode(element, 1);
className = VarType.toStr(className).replace(/^\s+/g, "").replace(/\s+$/g, "");
var classString = XHTML1.getAttribute(element, "class").replace(/\s+/g, " ").replace(/^\s+/g, "").replace(/\s+$/g, "");
var classArray = classString.split(" ");
classString = "";
for(var i = 0; i < classArray.length; i++) {
if(classArray[i] != className) {
if(classString == "") classString = classArray[i];
else classString += " " + classArray[i];
}
}
XHTML1.setAttribute(element, "class", classString);
};
XHTML1.removeAllChildren = function(node) {
VarType.needNode(node);
while(node.lastChild) {
node.removeChild(node.lastChild);
}
};
XHTML1.getTextContent = function(node) {
VarType.needNode(node);
if(typeof node.textContent != "undefined") {
return node.textContent;
}
switch(node.nodeType) {
case 1:
case 2:
case 5:
case 6:
case 11:
var textContent = "";
for(node = node.firstChild; node; node = node.nextSibling) {
if(node.nodeType == 7) continue;
if(node.nodeType == 8) continue;
textContent += VarType.toStr(XHTML1.getTextContent(node));
}
return textContent;
case 3:
case 4:
case 7:
case 8:
return node.nodeValue;
}
return null;
};
XHTML1.setTextContent = function(node, value) {
VarType.needNode(node);
value = VarType.toStr(value);
if(typeof node.textContent != "undefined") {
node.textContent = value;
}
switch(node.nodeType) {
case 1:
case 2:
case 5:
case 6:
case 11:
XHTML1.removeAllChildren(node);
if(value != "") {
node.appendChild(document.createTextNode(value));
}
break;
case 3:
case 4:
case 7:
case 8:
node.nodeValue = value;
break;
}
};

View file

@ -1,14 +1,41 @@
@charset "utf-8";
@media all {
html,
body {
background-color: #4a6b7c;
color: #ffffff;
}
body {
font-family: Verdana, Arial, sans-serif;
font-size: 101%;
line-height: 100%;
}
* {
margin: 0;
padding: 0;
}
body {
background-color: #4a6b7c;
color: #ffffff;
font-family: Verdana, Arial, sans-serif;
font-size: 100%;
line-height: 100%;
abbr,
acronym {
font-style: normal;
font-variant: normal;
}
abbr[title],
acronym[title] {
border-bottom: 1px dotted;
cursor: help;
}
a:link abbr[title],
a:visited abbr[title],
a:link acronym[title],
a:visited acronym[title] {
cursor: pointer;
}
code {
@ -16,137 +43,290 @@ code {
white-space: pre;
}
div#content ul {
#maincontent ul {
margin-left: 2em;
}
.warning {
color: red !important;
color: red;
background-color: white;
font-weight: bold;
}
.clear {
clear: both;
height: 1px;
}
.skiplink,
.navigation,
.hidden {
display: none;
position: absolute;
left: -1000px;
top: -1000px;
width: 0px;
height: 0px;
overflow: hidden;
display: inline;
}
.error {
color: #ff0000;
background-color: white;
}
#header {
background-color: #557788;
color: #ffffff;
text-align: right;
padding: 0.5em;
}
#header h1 {
display: inline;
}
#header p {
display: inline;
}
#header h1,
#header p {
font-size: 70%;
font-weight: normal;
line-height: 160%;
text-align: right;
}
#header .info {
padding: 1em 1em;
font-size: 70%;
line-height: 160%;
}
#header .title {
display: none;
}
.pathbar {
display: none;
}
.menubar {
width: 100%;
min-height: 1.8em;
background: #000000;
color: #ffffff;
}
.mainmenu {
ul.dropdowns {
float: left;
margin: 0;
padding: 0;
width: auto;
min-height: 1.8em;
background: #000000;
color: #ffffff;
list-style: none;
}
.mainmenu div {
html>body ul.dropdowns {
position: relative;
}
ul.dropdowns li,
ul.dropdowns ul {
margin: 0;
padding: 0;
list-style: none;
}
ul.dropdowns li {
float: left;
}
.mainmenu li {
position: relative;
white-space: nowrap;
}
.mainmenu div ul {
display: none;
ul.dropdowns li ul {
position: absolute;
z-index: 1000;
top: auto;
min-width: 10em;
}
ul.dropdowns li li {
float: none;
position: relative;
}
ul.dropdowns li a {
display: block;
}
ul.dropdowns ul li ul {
top: 0;
}
ul.dropdowns li ul,
ul.dropdowns li.over ul ul,
ul.dropdowns li.focus ul ul,
ul.dropdowns li:hover ul ul,
ul.dropdowns li.over ul ul ul,
ul.dropdowns li.focus ul ul ul,
ul.dropdowns li:hover ul ul ul,
ul.dropdowns li.over ul ul ul ul,
ul.dropdowns li.focus ul ul ul ul,
ul.dropdowns li:hover ul ul ul ul {
left: -3000px;
}
ul.dropdowns li.over ul,
ul.dropdowns li.focus ul,
ul.dropdowns li:hover ul {
left: 0;
}
ul.dropdowns ul li.over ul,
ul.dropdowns ul li.focus ul,
ul.dropdowns ul li:hover ul,
ul.dropdowns ul ul li.over ul,
ul.dropdowns ul ul li.focus ul,
ul.dropdowns ul ul li:hover ul,
ul.dropdowns ul ul ul li.over ul,
ul.dropdowns ul ul ul li.focus ul,
ul.dropdowns ul ul ul li:hover ul {
left: 100%;
}
#menubar {
position: relative;
width: 100%;
background: #000000;
color: #ffffff;
}
#menubar .warning {
color: red;
background-color: #557788;
}
#menubar ul.dropdowns {
min-height: 1.8em;
background: #000000;
color: #ffffff;
}
#menubar ul.dropdowns li ul {
background: #000000;
color: #ffffff;
border-width: 0 1px 1px 1px;
border-style: solid;
border-color: #444444;
list-style-type: none;
}
.mainmenu ul li:hover > ul,
.mainmenu div:hover > ul {
display: block;
}
.mainmenu ul li > ul {
left: 100%;
margin-top: -1.8em;
#menubar ul.dropdowns ul li ul {
border-width: 1px;
}
.modemenu a,
.mainmenu a {
html #menubar a:link,
html #menubar a:visited {
position: relative;
display: block;
padding: 0.5em;
background: #000000;
color: #ffffff;
text-decoration: none;
font-size: 80%;
font-weight: normal;
}
.mainmenu .active a,
.modemenu .active a {
html #menubar a:link:hover,
html #menubar a:visited:hover,
html #menubar a:link:active,
html #menubar a:visited:active,
#menubar a:link:focus,
#menubar a:visited:focus {
background: #000000;
color: #ffff00;
font-weight: bold;
}
.mainmenu li:hover > span > a,
.mainmenu div:hover > a {
font-weight: bold;
}
.modemenu a:hover,
.modemenu a:focus,
.mainmenu a:hover,
.mainmenu a:focus {
html #menubar a:link.active,
html #menubar a:visited.active,
html #menubar a:link.preactive,
html #menubar a:visited.preactive {
background: #000000;
color: #ffff00;
font-weight: bold;
}
.mainmenu div.preactive > a {
color: #ffff00;
html #menubar a:link.warning,
html #menubar a:visited.warning {
background: #000000;
color: red;
font-weight: bold;
}
.modemenu ul {
#menubar ul.dropdowns li.over>a,
#menubar ul.dropdowns li.focus>a,
#menubar ul.dropdowns li:hover>a {
font-weight: bold;
}
.lang_de #submenu_mini_system { min-width: 13.3em; }
* html .lang_de #submenu_mini_system { width: 13.3em; }
.lang_pt-br #submenu_mini_network { min-width: 14em; }
* html .lang_pt-br #submenu_mini_network { width: 14em; }
.lang_pt-br #submenu_mini_system { min-width: 11.5em; }
* html .lang_pt-br #submenu_mini_system { width: 11.5em; }
.lang_ru #submenu_mini_system { min-width: 18em; }
* html .lang_ru #submenu_mini_system { width: 18em; }
.lang_pt-br #submenu_admin_index { min-width: 11em; }
* html .lang_pt-br #submenu_admin_index { width: 11em; }
.lang_ru #submenu_admin_index { min-width: 15.5em; }
* html .lang_ru #submenu_admin_index { width: 15.5em; }
.lang_ru #submenu_admin_status { min-width: 10.5em; }
* html .lang_ru #submenu_admin_status { width: 10.5em; }
.lang_de #submenu_admin_system { min-width: 13.3em; }
* html .lang_de #submenu_admin_system { width: 13.3em; }
.lang_fr #submenu_admin_system { min-width: 14.5em; }
* html .lang_fr #submenu_admin_system { width: 14.5em; }
.lang_pt-br #submenu_admin_system { min-width: 11.5em; }
* html .lang_pt-br #submenu_admin_system { width: 11.5em; }
.lang_ru #submenu_admin_system { min-width: 18em; }
* html .lang_ru #submenu_admin_system { width: 18em; }
#submenu_admin_services_chillispot { min-width: 15.5em; }
* html #submenu_admin_services_chillispot { width: 15.5em; }
#submenu_admin_services_coovachilli { min-width: 15em; }
* html #submenu_admin_services_coovachilli { width: 15em; }
.lang_ru #submenu_admin_network_routes { min-width: 15.3em; }
* html .lang_ru #submenu_admin_network_routes { width: 15.3em; }
#submenu_admin_network_firewall { min-width: 14em; }
* html #submenu_admin_network_firewall { width: 14em; }
.lang_de #submenu_admin_network_firewall { min-width: 16.5em; }
* html .lang_de #submenu_admin_network_firewall { width: 16.5em; }
.lang_pt-br #submenu_admin_network_firewall { min-width: 15em; }
* html .lang_pt-br #submenu_admin_network_firewall { width: 15em; }
#modemenu {
width: auto;
background: #000000;
color: #ffffff;
list-style-type: none;
list-style: none;
margin-right: 1px;
}
.modemenu li {
#modemenu li {
float: right;
list-style: none;
}
#content {
#savemenu {
float: right;
margin-right: 2em;
}
.lang_de #submenu_admin_uci {
width: 12em;
}
.lang_ru #submenu_admin_uci {
width: 11.5em;
}
#maincontent {
clear: both;
width: 80%;
margin: 0 auto;
@ -159,20 +339,20 @@ div#content ul {
font-size: 80%;
}
#content h1 {
#maincontent h2 {
margin: 0.25em 0 0.5em 0;
font-size: 150%;
font-weight: normal;
}
#content h2 {
#maincontent h3 {
margin: 0.5em 0;
font-size: 120%;
font-weight: normal;
text-decoration: underline;
}
#content p {
#maincontent p {
margin-bottom: 1em;
}
@ -181,6 +361,7 @@ div#content ul {
padding: 0.5em 1em;
border: 1px dotted #555555;
background-color: #ffffff;
color: #000000;
}
.cbi-section legend {
@ -188,6 +369,7 @@ div#content ul {
font-weight: bold;
height: 1em;
padding: 0 0.25em;
background-color: transparent;
color: #555555;
}
@ -196,9 +378,11 @@ div#content ul {
}
.cbi-section h3 {
height: 1.5em;
font-size: 90%;
color: #555555;
text-decoration: none !important;
font-weight: bold !important;
color: #555555 !important;
margin: 0.25em !important;
font-size: 100% !important;
}
.cbi-section-descr {
@ -214,10 +398,13 @@ div#content ul {
background-color: inherit;
}
ul.cbi-apply {
font-size: 90%;
}
input[type=submit],
input[type=reset],
input[type=image],
label {
input[type=image] {
cursor: pointer;
}
@ -242,6 +429,7 @@ select:hover,
textarea:focus,
textarea:hover {
background-color: #ffffff;
color: #000000;
}
select,
@ -259,24 +447,28 @@ td input[type=password] {
input.cbi-input-user {
background: url('../resources/cbi/user.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-key {
input.cbi-input-password {
background: url('../resources/cbi/key.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-find {
background: url('../resources/cbi/find.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-reload {
background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
@ -284,6 +476,7 @@ input.cbi-input-add,
input.cbi-button-add {
background: url('../resources/cbi/add.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -292,6 +485,7 @@ input.cbi-input-fieldadd,
input.cbi-button-fieldadd {
background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -300,6 +494,7 @@ input.cbi-input-reset,
input.cbi-button-reset {
background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -308,6 +503,7 @@ input.cbi-input-save,
input.cbi-button-save {
background: url('../resources/cbi/save.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -316,6 +512,7 @@ input.cbi-input-apply,
input.cbi-button-apply {
background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -324,6 +521,7 @@ input.cbi-input-remove,
div.cbi-section-remove input {
background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -343,8 +541,14 @@ form > div > input[type=reset] {
margin-left: 0.5em;
}
table td,
table th {
color: #000000;
}
table.smalltext {
background: #f5f5f5;
color: #000000;
border-top: 1px solid #666666;
border-right: 1px solid #666666;
border-bottom: 1px solid #666666;
@ -357,6 +561,7 @@ table.smalltext {
table.smalltext tr:hover td {
background-color: #bbddee;
color: #000000;
}
table.smalltext tr th {
@ -371,12 +576,19 @@ table.smalltext tr td {
border-left: 1px solid #666666;
}
.cbi-rowstyle-1 {
table.cbi-section-table .cbi-rowstyle-1,
table.cbi-section-table .cbi-rowstyle-1 * {
background-color: #eeeeff;
color: #000000;
}
.cbi-section .cbi-rowstyle-1 h3 {
background-color: #eeeeff;
color: #555555;
}
.cbi-rowstyle-2 {
color: #000000;
}
div.cbi-value {
@ -388,36 +600,42 @@ div.cbi-value {
div.cbi-value:hover {
background: #f8f8f8;
}
div.cbi-value:last-child {
border: none;
color: #000000;
}
.cbi-value-title {
float: left;
width: 40%;
line-height: 1.8em;
}
div.cbi-value-field {
width: 58%;
margin: 0.25em 0 0.25em 40%;
margin-left: 40%;
padding: 0.25em 0;
}
div.cbi-value-description {
font-size: 90%;
}
div.cbi-value-field > div.cbi-value-description {
display: none;
}
div.cbi-value:hover div.cbi-value-field > div.cbi-value-description {
display: block;
display: inline;
}
div.cbi-section-create {
clear: left;
white-space: nowrap;
vertical-align: top;
}
div.cbi-tblsection-create {
border-bottom: 1px dotted #bbbbbb;
}
div.cbi-section-create .cbi-button {
margin: 0.25em;
}
input.cbi-section-create-name {
margin-right: -0.25em;
}
div.cbi-map-descr {
@ -425,8 +643,8 @@ div.cbi-map-descr {
}
div.cbi-optionals {
margin: 0.5em 0;
padding: 0 0.25em;
padding: 0.25em;
border-bottom: 1px dotted #bbbbbb;
}
div.cbi-section-remove {
@ -435,10 +653,18 @@ div.cbi-section-remove {
.cbi-section-node {
clear: both;
border: 1px dotted #bbbbbb;
border-top: 1px dotted #bbbbbb;
border-left: 1px dotted #bbbbbb;
border-right: 1px dotted #bbbbbb;
border-bottom: none;
padding-bottom: 0;
}
.cbi-section-node table div {
padding-bottom: 0;
border-bottom: none;
}
.cbi-section-node div.cbi-section-table-row {
margin: 0.25em;
}
@ -470,31 +696,29 @@ td.cbi-section-table-optionals {
div.cbi-error {
font-size: 95%;
font-weight: bold;
color: #FF0000;
color: #ff0000;
background-color: #ffffff;
}
td.cbi-value-error {
border-color: red !important;
border-color: red;
}
.cbi-value-error input,
.cbi-value-error select {
color: red !important;
background-color: #FFCCCC;
color: red;
background-color: #ffcccc;
}
.cbi-section-error {
color: red;
background-color: white;
font-size: 95%;
border: 1px dotted red;
margin: 3px;
padding: 3px;
}
ul.cbi-apply {
font-size: 90%;
}
.right {
text-align: right;
}
@ -506,7 +730,9 @@ ul.cbi-apply {
text-align: right;
}
.luci a {
.luci a:link,
.luci a:visited {
background-color: transparent;
color: #666666;
text-decoration: none;
font-size: 70%;
@ -518,85 +744,39 @@ ul.cbi-apply {
.error500 {
white-space: normal;
border: 1px dotted #FF0000;
background-color: #FFFFFF;
border: 1px dotted #ff0000;
background-color: #ffffff;
color: #000000;
padding: 0.5em;
}
#memorybar {
width:200px;
height:8px;
border:1px solid #bbb;
background-color:red
width: 200px;
height: 8px;
border: 1px solid #bbb;
color: black;
background-color: red;
}
#memfree, #membuffers, #memcached {
float:right;
border:1px solid #bbb;
height:6px;
float: right;
border: 1px solid #bbb;
height: 6px;
}
#memfree {
background-color:green;
background-color: green;
color: black;
}
#membuffers {
background-color:yellow;
background-color: yellow;
color: black;
}
#memcached {
background-color:orange;
background-color: #ffa500;
color: black;
}
/* obligatory IE6 Voodoo Code */
* html body {
padding-left: 50% !important;
}
* html div#header {
margin-left: -100% !important;
}
* html div.menubar {
margin-left: -100% !important;
width: 200% !important;
}
* html div#content {
margin-left: -80% !important;
width: 160% !important;
}
* html div.mainmenu div.hover ul,
* html div.mainmenu div li.hover ul,
* html div.mainmenu div li li.hover ul,
* html div.mainmenu div li li li.hover ul,
* html div.mainmenu div li li li li.hover ul {
display: block !important;
margin-left: 3em;
}
* html div.mainmenu div.hover ul {
margin-left: 0;
}
* html div.mainmenu .hover ul ul,
* html div.mainmenu .hover ul ul ul,
* html div.mainmenu .hover ul ul ul ul,
* html div.mainmenu .hover ul ul ul ul ul {
display: none !important;
}
* html div.mainmenu li {
height: 1em !important;
width: 10em !important;
}
* html .mainmenu {
height: 1.8em;
}
* html div.cbi-value-description {
margin-left: 40%;
}

View file

@ -0,0 +1,71 @@
/* obligatory IE6 Voodoo Code */
* html body {
padding-left: 50% !important;
}
* html div#header {
margin-left: -100% !important;
}
* html div#menubar {
margin-left: -100% !important;
width: 200% !important;
}
* html ul.dropdowns li ul {
width: 10em;
}
* html ul.dropdowns li li {
clear: both;
float: left;
}
* html ul.dropdowns li li {
width: 100%;
}
* html ul.dropdowns li li a {
height: 1%;
}
* html div#maincontent {
margin-left: -80% !important;
width: 160% !important;
}
* html div.cbi-value-description {
width: auto !important;
}
* html div.cbi-value-field {
margin-left: 0 !important;
width: 100% !important;
}
* html .cbi-input-text,
* html .cbi-input-user,
* html .cbi-input-select,
* html .cbi-input-password {
width: 50% !important;
}
* html .cbi-section legend {
background-color: #ffffff;
color: #555555;
}
* html table.cbi-section-table td .cbi-input-text,
* html table.cbi-section-table td .cbi-input-select {
width: 100% !important;
}
* html div.cbi-page-actions {
text-align: right !important;
}
* html div.cbi-value-field input,
* html div.cbi-value-field select {
font-size: 90% !important;
}

View file

@ -0,0 +1,13 @@
div.cbi-value-field {
margin-left: 0 !important;
}
.cbi-section legend {
background-color: #ffffff;
color: #555555;
}
table.cbi-section-table td .cbi-input-text,
table.cbi-section-table td .cbi-input-select {
width: 95% !important;
}

View file

@ -12,11 +12,10 @@ You may obtain a copy of the License at
$Id$
-%>
<br class="clear" />
</div>
</div></div>
<div class="clear"></div>
</div>
<div class="luci separator black whitetext bold"><a href="<%=controller%>/about">Powered by <%= luci.__appname__ .. " " .. luci.__version__%></a></div>
<p class="luci"><a href="<%=controller%>/about">Powered by <%= luci.__appname__ .. " " .. luci.__version__%></a></p>
</body>
</html>

View file

@ -31,69 +31,48 @@ for i,r in ipairs(request) do
end
require("luci.i18n").loadc("default")
require("luci.http").prepare_content("text/html")
require("luci.http").prepare_content("application/xhtml+xml")
-%>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
<head>
<link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
<% if node and node.css then %><link rel="stylesheet" type="text/css" href="<%=resource%>/<%=node.css%>" /><% end %>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
<meta http-equiv="content-script-type" content="text/javascript" />
<title><%=striptags( hostname .. ( (node and node.title) and ' - ' .. node.title or '')) %> - LuCI</title>
<!--[if lt IE 7]>
<script type="text/javascript">
function setup_hover() {
function ie_hover(e) {
e.onmouseover = function() { this.className = "hover" }
e.onmouseout = function() { this.className = null }
}
var lis = document.getElementById("mainmenu").getElementsByTagName("LI");
var divs = document.getElementById("mainmenu").getElementsByTagName("DIV");
for( var i = 0; i < lis.length; i++ ) ie_hover( lis[i] );
for( var i = 0; i < divs.length; i++ ) ie_hover( divs[i] );
}
</script>
<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
<!--[if lt IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie6.css" /><![endif]-->
<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie7.css" /><![endif]-->
<% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
<% end -%>
<script type="text/javascript" src="<%=resource%>/VarType.js"></script>
<script type="text/javascript" src="<%=resource%>/XHTML1.js"></script>
<script type="text/javascript" src="<%=resource%>/Dropdowns.js"></script>
<title><%=striptags( hostname .. ( (node and node.title) and ' - ' .. node.title or '')) %> - LuCI</title>
</head>
<body onload="window.setup_hover && setup_hover()">
<body class="lang_<%=luci.i18n.context.lang%>">
<p class="skiplink">
<span id="skiplink1"><a href="#navigation"><%:skiplink1 Skip to navigation%></a></span>
<span id="skiplink2"><a href="#content"><%:skiplink2 Skip to content%></a></span>
</p>
<div id="header">
<div class="info whitetext smalltext bold right">
<%=luci.config.brand.firmware%> (<%=luci.config.brand.distro%>) |
<%:load%>: <%=load1%> <%=load5%> <%=load15%> |
<%:hostname%>: <%=hostname%>
</div>
<div class="title">
<span class="headertitle"><%=luci.config.brand.title%></span><br />
<span class="whitetext bold"><%=luci.config.brand.subtitle%></span>
</div>
<h1><%=luci.config.brand.firmware%></h1>
<p>
(<%=luci.config.brand.distro%>) |
<%:load%>: <%=load1%> <%=load5%> <%=load15%> |
<%:hostname%>: <%=hostname%>
</p>
</div>
<div class="pathbar separator black whitetext bold">
<%:path%>: <%
local c = tree
local url = controller
for k,v in pairs(request) do
if c.nodes and c.nodes[v] then
c = c.nodes[v]
url = url .. "/" .. v
%><a href="<%=url%>"><%=c.title or v%></a> <% if k ~= #request then %>&#187; <% end
end
end
%>
</div>
<div class="menubar">
<div id="mainmenu" class="mainmenu">
<div id="menubar">
<h2 class="navigation"><a id="navigation" name="navigation"><%:navigation Navigation%></a></h2>
<ul id="mainmenu" class="dropdowns">
<%-
local function submenu(prefix, node)
if node.hidden or not node.nodes then
if not node.nodes or node.hidden then
return false
end
local index = {}
@ -109,21 +88,23 @@ local function submenu(prefix, node)
if count > 0 then
%>
<ul>
<%- for j, v in pairs(index) do
if not v.hidden and #v.name > 0 then
local nnode = node.nodes[v.name]
local href = controller .. prefix .. v.name
href = (nnode.query) and href .. luci.http.build_querystring(nnode.query) or href
%>
<li>
<span<% if nnode._menu_selected then %> class="active"<%end%>><a href="<%=luci.util.pcdata(href)%>"><%=nnode.title%></a></span>
<%- submenu(prefix .. v.name .. "/", nnode) %>
</li>
<%- end %>
<%- end %>
</ul>
<ul id="submenu_<%=string.gsub(string.gsub(prefix, "/", "_"), "^_(.-)_$", "%1")%>">
<%-
for j, v in pairs(index) do
if #v.name > 0 then
local nnode = node.nodes[v.name]
local href = controller .. prefix .. v.name .. "/"
href = (nnode.query) and href .. luci.http.build_querystring(nnode.query) or href
%>
<li><a<% if nnode._menu_selected then %> class="active"<%end%> href="<%=luci.util.pcdata(href)%>"><%=nnode.title%></a><%-
submenu(prefix .. v.name .. "/", nnode)
%></li>
<%-
end
end
%>
</ul>
<%
end
end
@ -137,50 +118,46 @@ if cattree and cattree.nodes then
for i, k in ipairs(index) do
node = cattree.nodes[k.name]
if not node.hidden and node.title and node.target then
local href = controller.."/"..category.."/"..k.name
href = (k.query) and href .. luci.http.build_querystring(k.query) or href %>
<div<% if node._menu_selected then %> class="preactive"<%end%>><a href="<%=href%>"><%=node.title%></a>
<%submenu("/" .. category .. "/" .. k.name .. "/", node)%>
</div>
<% end
if node.title and node.target and not node.hidden then
local href = controller.."/"..category.."/"..k.name.."/"
href = (k.query) and href .. luci.http.build_querystring(k.query) or href
%>
<li><a<% if node._menu_selected then %> class="preactive"<%end%> href="<%=href%>"><%=node.title%></a><%
submenu("/" .. category .. "/" .. k.name .. "/", node)
%></li><% end
end
end
%>
</div>
<div class="modemenu">
<ul><%
for k,node in pairs(tree.nodes) do
if node.title and not node.hidden then %>
<li<% if request[1] == k then %> class="active"<%end%>><a href="<%=controller%>/<%=k%>"><%=node.title%></a></li>
<% end
end%>
</ul>
</div>
</ul>
<%
if tree.nodes[category] and tree.nodes[category].ucidata then
local ucic = 0
for i, j in pairs(require("luci.model.uci").cursor():changes()) do
for k, l in pairs(j) do
for m, n in pairs(l) do
ucic = ucic + 1;
end
end
<ul id="modemenu"><%
for k,node in pairs(tree.nodes) do
if node.title and not node.hidden then %>
<li><a<% if request[1] == k then %> class="active"<%end%> href="<%=controller%>/<%=k%>/"><%=node.title%></a></li><%
end
end
%>
</ul>
<%
if tree.nodes[category] and tree.nodes[category].ucidata then
local ucic = 0
for i, j in pairs(require("luci.model.uci").cursor():changes()) do
for k, l in pairs(j) do
for m, n in pairs(l) do
ucic = ucic + 1;
end
%>
<div class="mainmenu" style="float:right; margin-right:2em">
<div>
<% if ucic > 0 then %>
<a class="warning" href="<%=controller%>/<%=category%>/uci/changes"><%:unsavedchanges%>: <%=ucic%></a>
<% submenu("/" .. category .. "/uci/", tree.nodes[category].nodes["uci"]) -%>
<% else %>
<a href="#"><%:changes%>: 0</a>
<% end %>
</div>
</div>
<% end %>
end
end
-%>
<ul id="savemenu" class="dropdowns">
<li><% if ucic > 0 then %><a class="warning" href="<%=controller%>/<%=category%>/uci/changes/"><%:unsavedchanges%>: <%=ucic%></a><%
submenu("/" .. category .. "/uci/", tree.nodes[category].nodes["uci"])
else -%>
<a href="#"><%:changes%>: 0</a><% end -%>
</li>
</ul><% end %>
<br class="clear" />
<div class="clear"></div>
</div>
<div id="content">

View file

@ -1,8 +1,8 @@
* {
margin: 0;
padding: 0;
}
@charset "utf-8";
@media all {
html,
body {
background-color: #4a6b7c;
background-image: url(bg.jpg);
@ -10,36 +10,72 @@ body {
background-attachment: fixed;
background-repeat: repeat-x;
color: #ffffff;
}
body {
font-family: Verdana, Arial, sans-serif;
font-size: 100%;
font-size: 101%;
line-height: 100%;
}
* {
margin: 0;
padding: 0;
}
abbr,
acronym {
font-style: normal;
font-variant: normal;
}
abbr[title],
acronym[title] {
border-bottom: 1px dotted;
cursor: help;
}
a:link abbr[title],
a:visited abbr[title],
a:link acronym[title],
a:visited acronym[title] {
cursor: pointer;
}
code {
font-family: monospace;
white-space: pre;
}
div#content ul {
#maincontent ul {
margin-left: 2em;
}
.warning {
color: red !important;
color: red;
background-color: white;
font-weight: bold;
}
.clear {
clear: both;
height: 1px;
}
.skiplink,
.navigation,
.hidden {
display: none;
position: absolute;
left: -1000px;
top: -1000px;
width: 0px;
height: 0px;
overflow: hidden;
display: inline;
}
.error {
color: #ff0000;
background-color: white;
}
#header {
@ -48,113 +84,256 @@ div#content ul {
background-repeat: no-repeat;
background-position: left center;
background-color: #557788;
color: #ffffff;
text-align: right;
}
#header .info {
padding: 1em 1em;
#header h1 {
padding: 1em 1em 0 1em;
}
#header p {
padding: 0 1em 1em 1em;
}
#header h1,
#header p {
font-size: 70%;
font-weight: normal;
line-height: 160%;
text-align: right;
}
#header .title {
display: none;
}
.pathbar {
display: none;
}
.menubar {
width: 100%;
min-height: 1.8em;
background: #000000;
color: #ffffff;
}
.mainmenu {
ul.dropdowns {
float: left;
margin: 0;
padding: 0;
width: auto;
min-height: 1.8em;
background: #000000;
color: #ffffff;
list-style: none;
}
.mainmenu div {
html>body ul.dropdowns {
position: relative;
}
ul.dropdowns li,
ul.dropdowns ul {
margin: 0;
padding: 0;
list-style: none;
}
ul.dropdowns li {
float: left;
}
.mainmenu li {
position: relative;
white-space: nowrap;
}
.mainmenu div ul {
display: none;
ul.dropdowns li ul {
position: absolute;
z-index: 1000;
top: auto;
min-width: 10em;
}
ul.dropdowns li li {
float: none;
position: relative;
}
ul.dropdowns li a {
display: block;
}
ul.dropdowns ul li ul {
top: 0;
}
ul.dropdowns li ul,
ul.dropdowns li.over ul ul,
ul.dropdowns li.focus ul ul,
ul.dropdowns li:hover ul ul,
ul.dropdowns li.over ul ul ul,
ul.dropdowns li.focus ul ul ul,
ul.dropdowns li:hover ul ul ul,
ul.dropdowns li.over ul ul ul ul,
ul.dropdowns li.focus ul ul ul ul,
ul.dropdowns li:hover ul ul ul ul {
left: -3000px;
}
ul.dropdowns li.over ul,
ul.dropdowns li.focus ul,
ul.dropdowns li:hover ul {
left: 0;
}
ul.dropdowns ul li.over ul,
ul.dropdowns ul li.focus ul,
ul.dropdowns ul li:hover ul,
ul.dropdowns ul ul li.over ul,
ul.dropdowns ul ul li.focus ul,
ul.dropdowns ul ul li:hover ul,
ul.dropdowns ul ul ul li.over ul,
ul.dropdowns ul ul ul li.focus ul,
ul.dropdowns ul ul ul li:hover ul {
left: 100%;
}
#menubar {
position: relative;
width: 100%;
background: #000000;
color: #ffffff;
}
#menubar .warning {
color: red;
background-color: #557788;
}
#menubar ul.dropdowns {
min-height: 1.8em;
background: #000000;
color: #ffffff;
}
#menubar ul.dropdowns li ul {
background: #000000;
color: #ffffff;
border-width: 0 1px 1px 1px;
border-style: solid;
border-color: #444444;
list-style-type: none;
}
.mainmenu ul li:hover > ul,
.mainmenu div:hover > ul {
display: block;
}
.mainmenu ul li > ul {
left: 100%;
margin-top: -1.8em;
#menubar ul.dropdowns ul li ul {
border-width: 1px;
}
.modemenu a,
.mainmenu a {
html #menubar a:link,
html #menubar a:visited {
position: relative;
display: block;
padding: 0.5em;
background: #000000;
color: #ffffff;
text-decoration: none;
font-size: 80%;
font-weight: normal;
}
.mainmenu .active a,
.modemenu .active a {
html #menubar a:link:hover,
html #menubar a:visited:hover,
html #menubar a:link:active,
html #menubar a:visited:active,
#menubar a:link:focus,
#menubar a:visited:focus {
background: #000000;
color: #ffff00;
font-weight: bold;
}
.mainmenu li:hover > span > a,
.mainmenu div:hover > a {
font-weight: bold;
}
.modemenu a:hover,
.modemenu a:focus,
.mainmenu a:hover,
.mainmenu a:focus {
html #menubar a:link.active,
html #menubar a:visited.active,
html #menubar a:link.preactive,
html #menubar a:visited.preactive {
background: #000000;
color: #ffff00;
font-weight: bold;
}
.mainmenu div.preactive > a {
color: #ffff00;
html #menubar a:link.warning,
html #menubar a:visited.warning {
background: #000000;
color: red;
font-weight: bold;
}
.modemenu ul {
#menubar ul.dropdowns li.over>a,
#menubar ul.dropdowns li.focus>a,
#menubar ul.dropdowns li:hover>a {
font-weight: bold;
}
.lang_de #submenu_mini_system { min-width: 13.3em; }
* html .lang_de #submenu_mini_system { width: 13.3em; }
.lang_pt-br #submenu_mini_network { min-width: 14em; }
* html .lang_pt-br #submenu_mini_network { width: 14em; }
.lang_pt-br #submenu_mini_system { min-width: 11.5em; }
* html .lang_pt-br #submenu_mini_system { width: 11.5em; }
.lang_ru #submenu_mini_system { min-width: 18em; }
* html .lang_ru #submenu_mini_system { width: 18em; }
.lang_pt-br #submenu_admin_index { min-width: 11em; }
* html .lang_pt-br #submenu_admin_index { width: 11em; }
.lang_ru #submenu_admin_index { min-width: 15.5em; }
* html .lang_ru #submenu_admin_index { width: 15.5em; }
.lang_ru #submenu_admin_status { min-width: 10.5em; }
* html .lang_ru #submenu_admin_status { width: 10.5em; }
.lang_de #submenu_admin_system { min-width: 13.3em; }
* html .lang_de #submenu_admin_system { width: 13.3em; }
.lang_fr #submenu_admin_system { min-width: 14.5em; }
* html .lang_fr #submenu_admin_system { width: 14.5em; }
.lang_pt-br #submenu_admin_system { min-width: 11.5em; }
* html .lang_pt-br #submenu_admin_system { width: 11.5em; }
.lang_ru #submenu_admin_system { min-width: 18em; }
* html .lang_ru #submenu_admin_system { width: 18em; }
#submenu_admin_services_chillispot { min-width: 15.5em; }
* html #submenu_admin_services_chillispot { width: 15.5em; }
#submenu_admin_services_coovachilli { min-width: 15em; }
* html #submenu_admin_services_coovachilli { width: 15em; }
.lang_ru #submenu_admin_network_routes { min-width: 15.3em; }
* html .lang_ru #submenu_admin_network_routes { width: 15.3em; }
#submenu_admin_network_firewall { min-width: 14em; }
* html #submenu_admin_network_firewall { width: 14em; }
.lang_de #submenu_admin_network_firewall { min-width: 16.5em; }
* html .lang_de #submenu_admin_network_firewall { width: 16.5em; }
.lang_pt-br #submenu_admin_network_firewall { min-width: 15em; }
* html .lang_pt-br #submenu_admin_network_firewall { width: 15em; }
#modemenu {
width: auto;
background: #000000;
color: #ffffff;
list-style-type: none;
list-style: none;
margin-right: 1px;
}
.modemenu li {
#modemenu li {
float: right;
list-style: none;
}
#content {
#savemenu {
float: right;
margin-right: 2em;
}
.lang_de #submenu_admin_uci {
width: 12em;
}
.lang_ru #submenu_admin_uci {
width: 11.5em;
}
#maincontent {
clear: both;
width: 80%;
margin: 0 auto;
@ -167,20 +346,20 @@ div#content ul {
font-size: 80%;
}
#content h1 {
#maincontent h2 {
margin: 0.25em 0 0.5em 0;
font-size: 150%;
font-weight: normal;
}
#content h2 {
#maincontent h3 {
margin: 0.5em 0;
font-size: 120%;
font-weight: normal;
text-decoration: underline;
}
#content p {
#maincontent p {
margin-bottom: 1em;
}
@ -189,6 +368,7 @@ div#content ul {
padding: 0.5em 1em;
border: 1px dotted #555555;
background-color: #ffffff;
color: #000000;
}
.cbi-section legend {
@ -196,6 +376,7 @@ div#content ul {
font-weight: bold;
height: 1em;
padding: 0 0.25em;
background-color: transparent;
color: #555555;
}
@ -204,9 +385,11 @@ div#content ul {
}
.cbi-section h3 {
height: 1.5em;
font-size: 90%;
color: #555555;
text-decoration: none !important;
font-weight: bold !important;
color: #555555 !important;
margin: 0.25em !important;
font-size: 100% !important;
}
.cbi-section-descr {
@ -228,8 +411,7 @@ ul.cbi-apply {
input[type=submit],
input[type=reset],
input[type=image],
label {
input[type=image] {
cursor: pointer;
}
@ -254,6 +436,7 @@ select:hover,
textarea:focus,
textarea:hover {
background-color: #ffffff;
color: #000000;
}
select,
@ -271,24 +454,28 @@ td input[type=password] {
input.cbi-input-user {
background: url('../resources/cbi/user.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-key {
input.cbi-input-password {
background: url('../resources/cbi/key.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-find {
background: url('../resources/cbi/find.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
input.cbi-input-reload {
background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
}
@ -296,6 +483,7 @@ input.cbi-input-add,
input.cbi-button-add {
background: url('../resources/cbi/add.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -304,6 +492,7 @@ input.cbi-input-fieldadd,
input.cbi-button-fieldadd {
background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -312,6 +501,7 @@ input.cbi-input-reset,
input.cbi-button-reset {
background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -320,6 +510,7 @@ input.cbi-input-save,
input.cbi-button-save {
background: url('../resources/cbi/save.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -328,6 +519,7 @@ input.cbi-input-apply,
input.cbi-button-apply {
background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -336,6 +528,7 @@ input.cbi-input-remove,
div.cbi-section-remove input {
background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center;
background-color: inherit;
color: #000000;
padding-left: 17px;
padding-right: 1px;
}
@ -355,8 +548,14 @@ form > div > input[type=reset] {
margin-left: 0.5em;
}
table td,
table th {
color: #000000;
}
table.smalltext {
background: #f5f5f5;
color: #000000;
border-top: 1px solid #666666;
border-right: 1px solid #666666;
border-bottom: 1px solid #666666;
@ -369,6 +568,7 @@ table.smalltext {
table.smalltext tr:hover td {
background-color: #bbddee;
color: #000000;
}
table.smalltext tr th {
@ -383,12 +583,19 @@ table.smalltext tr td {
border-left: 1px solid #666666;
}
.cbi-rowstyle-1 {
table.cbi-section-table .cbi-rowstyle-1,
table.cbi-section-table .cbi-rowstyle-1 * {
background-color: #eeeeff;
color: #000000;
}
.cbi-section .cbi-rowstyle-1 h3 {
background-color: #eeeeff;
color: #555555;
}
.cbi-rowstyle-2 {
color: #000000;
}
div.cbi-value {
@ -400,20 +607,19 @@ div.cbi-value {
div.cbi-value:hover {
background: #f8f8f8;
}
div.cbi-value:last-child {
border: none;
color: #000000;
}
.cbi-value-title {
float: left;
width: 40%;
line-height: 1.8em;
}
div.cbi-value-field {
width: 58%;
margin: 0.25em 0 0.25em 40%;
margin-left: 40%;
padding: 0.25em 0;
}
div.cbi-value-description {
@ -423,6 +629,20 @@ div.cbi-value-description {
div.cbi-section-create {
clear: left;
white-space: nowrap;
vertical-align: top;
}
div.cbi-tblsection-create {
border-bottom: 1px dotted #bbbbbb;
}
div.cbi-section-create .cbi-button {
margin: 0.25em;
}
input.cbi-section-create-name {
margin-right: -0.25em;
}
div.cbi-map-descr {
@ -430,8 +650,8 @@ div.cbi-map-descr {
}
div.cbi-optionals {
margin: 0.5em 0;
padding: 0 0.25em;
padding: 0.25em;
border-bottom: 1px dotted #bbbbbb;
}
div.cbi-section-remove {
@ -440,10 +660,18 @@ div.cbi-section-remove {
.cbi-section-node {
clear: both;
border: 1px dotted #bbbbbb;
border-top: 1px dotted #bbbbbb;
border-left: 1px dotted #bbbbbb;
border-right: 1px dotted #bbbbbb;
border-bottom: none;
padding-bottom: 0;
}
.cbi-section-node table div {
padding-bottom: 0;
border-bottom: none;
}
.cbi-section-node div.cbi-section-table-row {
margin: 0.25em;
}
@ -475,21 +703,23 @@ td.cbi-section-table-optionals {
div.cbi-error {
font-size: 95%;
font-weight: bold;
color: #FF0000;
color: #ff0000;
background-color: #ffffff;
}
td.cbi-value-error {
border-color: red !important;
border-color: red;
}
.cbi-value-error input,
.cbi-value-error select {
color: red !important;
background-color: #FFCCCC;
color: red;
background-color: #ffcccc;
}
.cbi-section-error {
color: red;
background-color: white;
font-size: 95%;
border: 1px dotted red;
margin: 3px;
@ -507,7 +737,9 @@ td.cbi-value-error {
text-align: right;
}
.luci a {
.luci a:link,
.luci a:visited {
background-color: transparent;
color: #666666;
text-decoration: none;
font-size: 70%;
@ -519,85 +751,39 @@ td.cbi-value-error {
.error500 {
white-space: normal;
border: 1px dotted #FF0000;
background-color: #FFFFFF;
border: 1px dotted #ff0000;
background-color: #ffffff;
color: #000000;
padding: 0.5em;
}
#memorybar {
width:200px;
height:8px;
border:1px solid #bbb;
background-color:red
width: 200px;
height: 8px;
border: 1px solid #bbb;
color: black;
background-color: red;
}
#memfree, #membuffers, #memcached {
float:right;
border:1px solid #bbb;
height:6px;
float: right;
border: 1px solid #bbb;
height: 6px;
}
#memfree {
background-color:green;
background-color: green;
color: black;
}
#membuffers {
background-color:yellow;
background-color: yellow;
color: black;
}
#memcached {
background-color:orange;
background-color: #ffa500;
color: black;
}
/* obligatory IE6 Voodoo Code */
* html body {
padding-left: 50% !important;
}
* html div#header {
margin-left: -100% !important;
}
* html div.menubar {
margin-left: -100% !important;
width: 200% !important;
}
* html div#content {
margin-left: -80% !important;
width: 160% !important;
}
* html div.mainmenu div.hover ul,
* html div.mainmenu div li.hover ul,
* html div.mainmenu div li li.hover ul,
* html div.mainmenu div li li li.hover ul,
* html div.mainmenu div li li li li.hover ul {
display: block !important;
margin-left: 3em;
}
* html div.mainmenu div.hover ul {
margin-left: 0;
}
* html div.mainmenu .hover ul ul,
* html div.mainmenu .hover ul ul ul,
* html div.mainmenu .hover ul ul ul ul,
* html div.mainmenu .hover ul ul ul ul ul {
display: none !important;
}
* html div.mainmenu li {
height: 1em !important;
width: 10em !important;
}
* html .mainmenu {
height: 1.8em;
}
* html div.cbi-value-description {
margin-left: 40%;
}

View file

@ -37,61 +37,39 @@ require("luci.http").prepare_content("application/xhtml+xml")
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%=luci.i18n.context.lang%>" lang="<%=luci.i18n.context.lang%>">
<head>
<link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
<% if node and node.css then %><link rel="stylesheet" type="text/css" href="<%=resource%>/<%=node.css%>" /><% end %>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
<meta http-equiv="content-script-type" content="text/javascript" />
<title><%=striptags( hostname .. ( (node and node.title) and ' - ' .. node.title or '')) %> - LuCI</title>
<!--[if lt IE 7]>
<script type="text/javascript">
function setup_hover() {
function ie_hover(e) {
e.onmouseover = function() { this.className = "hover" }
e.onmouseout = function() { this.className = null }
}
var lis = document.getElementById("mainmenu").getElementsByTagName("LI");
var divs = document.getElementById("mainmenu").getElementsByTagName("DIV");
for( var i = 0; i < lis.length; i++ ) ie_hover( lis[i] );
for( var i = 0; i < divs.length; i++ ) ie_hover( divs[i] );
}
</script>
<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
<!--[if lt IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie6.css" /><![endif]-->
<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/ie7.css" /><![endif]-->
<% if node and node.css then %><link rel="stylesheet" type="text/css" media="screen" href="<%=resource%>/<%=node.css%>" />
<% end -%>
<script type="text/javascript" src="<%=resource%>/VarType.js"></script>
<script type="text/javascript" src="<%=resource%>/XHTML1.js"></script>
<script type="text/javascript" src="<%=resource%>/Dropdowns.js"></script>
<title><%=striptags( hostname .. ( (node and node.title) and ' - ' .. node.title or '')) %> - LuCI</title>
</head>
<body onload="window.setup_hover &amp;&amp; setup_hover()">
<body class="lang_<%=luci.i18n.context.lang%>">
<p class="skiplink">
<span id="skiplink1"><a href="#navigation"><%:skiplink1 Skip to navigation%></a></span>
<span id="skiplink2"><a href="#content"><%:skiplink2 Skip to content%></a></span>
</p>
<div id="header">
<div class="info whitetext smalltext bold right">
<%=luci.config.brand.firmware%><br />
<%=luci.config.brand.distro%><br />
<%:load%>: <%=load1%> <%=load5%> <%=load15%><br />
<%:hostname%>: <%=hostname%>
</div>
<div class="title">
<span class="headertitle"><%=luci.config.brand.title%></span><br />
<span class="whitetext bold"><%=luci.config.brand.subtitle%></span>
</div>
<h1><%=luci.config.brand.firmware%></h1>
<p>
<%=luci.config.brand.distro%><br />
<%:load%>: <%=load1%> <%=load5%> <%=load15%><br />
<%:hostname%>: <%=hostname%>
</p>
</div>
<div class="pathbar separator black whitetext bold">
<%:path%>: <%
local c = tree
local url = controller
for k,v in pairs(request) do
if c.nodes and c.nodes[v] then
c = c.nodes[v]
url = url .. "/" .. v
%><a href="<%=url%>"><%=c.title or v%></a> <% if k ~= #request then %>&#187; <% end
end
end
%>
</div>
<div class="menubar">
<div id="mainmenu" class="mainmenu">
<div id="menubar">
<h2 class="navigation"><a id="navigation" name="navigation"><%:navigation Navigation%></a></h2>
<ul id="mainmenu" class="dropdowns">
<%-
local function submenu(prefix, node)
if not node.nodes or node.hidden then
@ -110,21 +88,23 @@ local function submenu(prefix, node)
if count > 0 then
%>
<ul>
<%- for j, v in pairs(index) do
if #v.name > 0 then
local nnode = node.nodes[v.name]
local href = controller .. prefix .. v.name
href = (nnode.query) and href .. luci.http.build_querystring(nnode.query) or href
%>
<li>
<span<% if nnode._menu_selected then %> class="active"<%end%>><a href="<%=luci.util.pcdata(href)%>"><%=nnode.title%></a></span>
<%- submenu(prefix .. v.name .. "/", nnode) %>
</li>
<%- end %>
<%- end %>
</ul>
<ul id="submenu_<%=string.gsub(string.gsub(prefix, "/", "_"), "^_(.-)_$", "%1")%>">
<%-
for j, v in pairs(index) do
if #v.name > 0 then
local nnode = node.nodes[v.name]
local href = controller .. prefix .. v.name .. "/"
href = (nnode.query) and href .. luci.http.build_querystring(nnode.query) or href
%>
<li><a<% if nnode._menu_selected then %> class="active"<%end%> href="<%=luci.util.pcdata(href)%>"><%=nnode.title%></a><%-
submenu(prefix .. v.name .. "/", nnode)
%></li>
<%-
end
end
%>
</ul>
<%
end
end
@ -139,49 +119,45 @@ if cattree and cattree.nodes then
for i, k in ipairs(index) do
node = cattree.nodes[k.name]
if node.title and node.target and not node.hidden then
local href = controller.."/"..category.."/"..k.name
href = (k.query) and href .. luci.http.build_querystring(k.query) or href %>
<div<% if node._menu_selected then %> class="preactive"<%end%>><a href="<%=href%>"><%=node.title%></a>
<%submenu("/" .. category .. "/" .. k.name .. "/", node)%>
</div>
<% end
local href = controller.."/"..category.."/"..k.name.."/"
href = (k.query) and href .. luci.http.build_querystring(k.query) or href
%>
<li><a<% if node._menu_selected then %> class="preactive"<%end%> href="<%=href%>"><%=node.title%></a><%
submenu("/" .. category .. "/" .. k.name .. "/", node)
%></li><% end
end
end
%>
</div>
<div class="modemenu">
<ul><%
for k,node in pairs(tree.nodes) do
if node.title and not node.hidden then %>
<li<% if request[1] == k then %> class="active"<%end%>><a href="<%=controller%>/<%=k%>"><%=node.title%></a></li>
<% end
end%>
</ul>
</div>
</ul>
<%
if tree.nodes[category] and tree.nodes[category].ucidata then
local ucic = 0
for i, j in pairs(require("luci.model.uci").cursor():changes()) do
for k, l in pairs(j) do
for m, n in pairs(l) do
ucic = ucic + 1;
end
end
<ul id="modemenu"><%
for k,node in pairs(tree.nodes) do
if node.title and not node.hidden then %>
<li><a<% if request[1] == k then %> class="active"<%end%> href="<%=controller%>/<%=k%>/"><%=node.title%></a></li><%
end
end
%>
</ul>
<%
if tree.nodes[category] and tree.nodes[category].ucidata then
local ucic = 0
for i, j in pairs(require("luci.model.uci").cursor():changes()) do
for k, l in pairs(j) do
for m, n in pairs(l) do
ucic = ucic + 1;
end
%>
<div class="mainmenu" style="float:right; margin-right:2em">
<div>
<% if ucic > 0 then %>
<a class="warning" href="<%=controller%>/<%=category%>/uci/changes"><%:unsavedchanges%>: <%=ucic%></a>
<% submenu("/" .. category .. "/uci/", tree.nodes[category].nodes["uci"]) -%>
<% else %>
<a href="#"><%:changes%>: 0</a>
<% end %>
</div>
</div>
<% end %>
end
end
-%>
<ul id="savemenu" class="dropdowns">
<li><% if ucic > 0 then %><a class="warning" href="<%=controller%>/<%=category%>/uci/changes/"><%:unsavedchanges%>: <%=ucic%></a><%
submenu("/" .. category .. "/uci/", tree.nodes[category].nodes["uci"])
else -%>
<a href="#"><%:changes%>: 0</a><% end -%>
</li>
</ul><% end %>
<br class="clear" />
<div class="clear"></div>
</div>
<div id="content">
<div id="maincontent">