From 23206ee3c979cd22af0c7b9b97bedab6197d3852 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Wed, 24 Sep 2008 13:02:49 +0000 Subject: [PATCH] * luci/themes/openwrt.org: added usability patch thanks Alina! * luci/i18n: add additional strings needed for patch above --- i18n/english/luasrc/i18n/default.en.lua | 3 + i18n/english/luasrc/i18n/default.en.xml | 4 + i18n/german/luasrc/i18n/default.de.lua | 3 + i18n/german/luasrc/i18n/default.de.xml | 5 + .../htdocs/luci-static/openwrt.org/Dropdowns.js | 160 ++++++ .../htdocs/luci-static/openwrt.org/VarType.js | 182 +++++++ .../htdocs/luci-static/openwrt.org/XHTML1.js | 542 +++++++++++++++++++++ .../htdocs/luci-static/openwrt.org/cascade.css | 303 ++++++++---- .../luasrc/view/themes/openwrt.org/footer.htm | 7 +- .../luasrc/view/themes/openwrt.org/header.htm | 185 +++---- 10 files changed, 1191 insertions(+), 203 deletions(-) create mode 100644 themes/openwrt.org/htdocs/luci-static/openwrt.org/Dropdowns.js create mode 100644 themes/openwrt.org/htdocs/luci-static/openwrt.org/VarType.js create mode 100644 themes/openwrt.org/htdocs/luci-static/openwrt.org/XHTML1.js diff --git a/i18n/english/luasrc/i18n/default.en.lua b/i18n/english/luasrc/i18n/default.en.lua index 6b8a3c744..1ad721afe 100644 --- a/i18n/english/luasrc/i18n/default.en.lua +++ b/i18n/english/luasrc/i18n/default.en.lua @@ -1,3 +1,6 @@ +skiplink1 = 'Skip to navigation' +skiplink2 = 'Skip to content' +navigation = 'Navigation' about = 'About' add = 'Add' addresses = 'Addresses' diff --git a/i18n/english/luasrc/i18n/default.en.xml b/i18n/english/luasrc/i18n/default.en.xml index 636c628c0..93f90116a 100644 --- a/i18n/english/luasrc/i18n/default.en.xml +++ b/i18n/english/luasrc/i18n/default.en.xml @@ -2,6 +2,10 @@ +Skip to navigation +Skip to content +Navigation + About Add Addresses diff --git a/i18n/german/luasrc/i18n/default.de.lua b/i18n/german/luasrc/i18n/default.de.lua index 02f86d99f..b64bf379c 100644 --- a/i18n/german/luasrc/i18n/default.de.lua +++ b/i18n/german/luasrc/i18n/default.de.lua @@ -1,3 +1,6 @@ +skiplink1 = 'Zur Navigation springen' +skiplink2 = 'Zum Inhalt springen' +navigation = 'Navigation' about = 'Über' add = 'Hinzufügen' addresses = 'Adressen' diff --git a/i18n/german/luasrc/i18n/default.de.xml b/i18n/german/luasrc/i18n/default.de.xml index c77beb38f..6543ad3a2 100644 --- a/i18n/german/luasrc/i18n/default.de.xml +++ b/i18n/german/luasrc/i18n/default.de.xml @@ -2,6 +2,10 @@ +Zur Navigation springen +Zum Inhalt springen +Navigation + Über Hinzufügen Adressen @@ -117,4 +121,5 @@ Weboberfläche Drahtlos Zone + diff --git a/themes/openwrt.org/htdocs/luci-static/openwrt.org/Dropdowns.js b/themes/openwrt.org/htdocs/luci-static/openwrt.org/Dropdowns.js new file mode 100644 index 000000000..7d800f07b --- /dev/null +++ b/themes/openwrt.org/htdocs/luci-static/openwrt.org/Dropdowns.js @@ -0,0 +1,160 @@ +/* +Copyright (C) 2008 Alina Friedrichsen + +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() { + function onmouseover(evt) { + XHTML1.addClass(evt.currentTarget, "over"); + } + + function onmouseout(evt) { + XHTML1.removeClass(evt.currentTarget, "over"); + } + + function onfocus(evt) { + for(var element = evt.currentTarget; element; element = element.parentNode) { + if(XHTML1.isElement(element, "li")) { + XHTML1.addClass(element, "focus"); + } + } + } + + function onblur(evt) { + for(var element = evt.currentTarget; element; element = element.parentNode) { + if(XHTML1.isElement(element, "li")) { + XHTML1.removeClass(element, "focus"); + } + } + } + + 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); +} +/* +Copyright (C) 2008 Alina Friedrichsen + +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() { + function onmouseover(evt) { + XHTML1.addClass(evt.currentTarget, "over"); + } + + function onmouseout(evt) { + XHTML1.removeClass(evt.currentTarget, "over"); + } + + function onfocus(evt) { + for(var element = evt.currentTarget; element; element = element.parentNode) { + if(XHTML1.isElement(element, "li")) { + XHTML1.addClass(element, "focus"); + } + } + } + + function onblur(evt) { + for(var element = evt.currentTarget; element; element = element.parentNode) { + if(XHTML1.isElement(element, "li")) { + XHTML1.removeClass(element, "focus"); + } + } + } + + 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); +} diff --git a/themes/openwrt.org/htdocs/luci-static/openwrt.org/VarType.js b/themes/openwrt.org/htdocs/luci-static/openwrt.org/VarType.js new file mode 100644 index 000000000..12811dd4f --- /dev/null +++ b/themes/openwrt.org/htdocs/luci-static/openwrt.org/VarType.js @@ -0,0 +1,182 @@ +/* +Copyright (C) 2008 Alina Friedrichsen + +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(); + } +}; +/* +Copyright (C) 2008 Alina Friedrichsen + +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(); + } +}; diff --git a/themes/openwrt.org/htdocs/luci-static/openwrt.org/XHTML1.js b/themes/openwrt.org/htdocs/luci-static/openwrt.org/XHTML1.js new file mode 100644 index 000000000..b196f5313 --- /dev/null +++ b/themes/openwrt.org/htdocs/luci-static/openwrt.org/XHTML1.js @@ -0,0 +1,542 @@ +/* +Copyright (C) 2007, 2008 Alina Friedrichsen + +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; + } +}; +/* +Copyright (C) 2007, 2008 Alina Friedrichsen + +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; + } +}; diff --git a/themes/openwrt.org/htdocs/luci-static/openwrt.org/cascade.css b/themes/openwrt.org/htdocs/luci-static/openwrt.org/cascade.css index 3f44f202e..1deec09cf 100644 --- a/themes/openwrt.org/htdocs/luci-static/openwrt.org/cascade.css +++ b/themes/openwrt.org/htdocs/luci-static/openwrt.org/cascade.css @@ -1,7 +1,6 @@ -* { - margin: 0; - padding: 0; -} +@charset "utf-8"; + +@media all { body { background-color: #4a6b7c; @@ -15,27 +14,58 @@ body { 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; 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 { @@ -51,110 +81,220 @@ div#content ul { 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; +ul.dropdowns { + float: left; + margin: 0; + padding: 0; + width: auto; + list-style: none; } -.pathbar { - display: none; +html>body ul.dropdowns { + position: relative; } -.menubar { +ul.dropdowns li, +ul.dropdowns ul { + margin: 0; + padding: 0; + list-style: none; +} + +ul.dropdowns li { + float: left; + position: relative; + white-space: nowrap; +} + +ul.dropdowns li ul { + position: absolute; + z-index: 1000; + top: auto; + width: 10em; +} + +ul.dropdowns li li { + clear: both; + position: relative; + width: 100%; +} + +ul.dropdowns li a { + display: block; +} + +ul.dropdowns li>a { + overflow: hidden; +} + +* html ul.dropdowns li li a { + height: 1%; +} + +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 { + left: -1000px; +} + +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 { + left: 100%; +} + +#menubar { + position: relative; width: 100%; - min-height: 1.8em; background: #000000; color: #ffffff; } -.mainmenu { - float: left; - width: auto; +#menubar ul.dropdowns { min-height: 1.8em; background: #000000; color: #ffffff; } -.mainmenu div { - float: left; -} - -.mainmenu li { - white-space: nowrap; -} - -.mainmenu div ul { - display: none; - position: absolute; +#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 { 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 { +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; } -.modemenu a:hover, -.modemenu a:focus, -.mainmenu a:hover, -.mainmenu a:focus { - color: #ffff00; +html #menubar a:link.warning, +html #menubar a:visited.warning { + background: #000000; + color: red; font-weight: bold; } -.mainmenu div.preactive > a { - color: #ffff00; +#menubar ul.dropdowns li.over>a, +#menubar ul.dropdowns li.focus>a, +#menubar ul.dropdowns li:hover>a { font-weight: bold; } -.modemenu ul { +.lang_ru #submenu_admin_index { + width: 15.5em; +} + +.lang_ru #submenu_admin_status { + width: 10.5em; +} + +.lang_de #submenu_admin_system { + width: 13.3em; +} + +.lang_fr #submenu_admin_system { + width: 14.5em; +} + +.lang_ru #submenu_admin_system { + width: 18em; +} + +.lang_ru #submenu_admin_network_routes { + width: 15.3em; +} + +.lang_de #submenu_admin_network_firewall { + width: 12em; +} + +#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; +} + +#savemenu { + float: right; + margin-right: 2em; +} + +.lang_de #submenu_admin_uci { + width: 12em; } -#content { +.lang_ru #submenu_admin_uci { + width: 11.5em; +} + +#maincontent { clear: both; width: 80%; margin: 0 auto; @@ -167,20 +307,20 @@ div#content ul { font-size: 80%; } -#content h1 { +#maincontent h1 { margin: 0.25em 0 0.5em 0; font-size: 150%; font-weight: normal; } -#content h2 { +#maincontent h2 { margin: 0.5em 0; font-size: 120%; font-weight: normal; text-decoration: underline; } -#content p { +#maincontent p { margin-bottom: 1em; } @@ -508,7 +648,8 @@ td.cbi-value-error { text-align: right; } -.luci a { +.luci a:link, +.luci a:visited { color: #666666; text-decoration: none; font-size: 70%; @@ -539,19 +680,20 @@ td.cbi-value-error { } #memfree { - background-color:green; + background-color: green; } #membuffers { - background-color:yellow; + background-color: yellow; } #memcached { - background-color:orange; + background-color: orange; } /* obligatory IE6 Voodoo Code */ + * html body { padding-left: 50% !important; } @@ -560,45 +702,18 @@ td.cbi-value-error { margin-left: -100% !important; } -* html div.menubar { +* html div#menubar { margin-left: -100% !important; width: 200% !important; } -* html div#content { +* html div#maincontent { 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%; } + +} diff --git a/themes/openwrt.org/luasrc/view/themes/openwrt.org/footer.htm b/themes/openwrt.org/luasrc/view/themes/openwrt.org/footer.htm index c1d4dfccb..f8ea5ad57 100644 --- a/themes/openwrt.org/luasrc/view/themes/openwrt.org/footer.htm +++ b/themes/openwrt.org/luasrc/view/themes/openwrt.org/footer.htm @@ -12,9 +12,10 @@ You may obtain a copy of the License at $Id$ -%> -
- +
+ - +

Powered by <%= luci.__appname__ .. " " .. luci.__version__%>

+ diff --git a/themes/openwrt.org/luasrc/view/themes/openwrt.org/header.htm b/themes/openwrt.org/luasrc/view/themes/openwrt.org/header.htm index 6e460d5b0..05ee94ffb 100644 --- a/themes/openwrt.org/luasrc/view/themes/openwrt.org/header.htm +++ b/themes/openwrt.org/luasrc/view/themes/openwrt.org/header.htm @@ -34,64 +34,39 @@ require("luci.i18n").loadc("default") require("luci.http").prepare_content("application/xhtml+xml") -%> - - + - - <% if node and node.css then %><% end %> - - - <%=striptags( hostname .. ( (node and node.title) and ' - ' .. node.title or '')) %> - LuCI - - + + + +<% if node and node.css then %> +<% end -%> + + + +<%=striptags( hostname .. ( (node and node.title) and ' - ' .. node.title or '')) %> - LuCI - - + -
-<%: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 - %><%=c.title or v%> <% if k ~= #request then %>» <% end - end -end -%> + + + - -
+
-- 2.11.0