From 8ab3e9ed14dc643d1f0192a67655b0691e083968 Mon Sep 17 00:00:00 2001 From: Erik Kristensen Date: Tue, 23 Aug 2005 01:18:28 +0000 Subject: First Step in Fixing AutoComplete and Cleaning Up Code --- usr/local/www/firewall_rules_edit.php | 888 ++++++++++-------------- usr/local/www/head.inc | 18 + usr/local/www/includes/javascript.inc.php | 18 + usr/local/www/javascript/autosuggest.js | 336 +++++++++ usr/local/www/javascript/firewall_rules_edit.js | 120 ++++ usr/local/www/javascript/suggestions.js | 33 + usr/local/www/status_graph.php | 14 +- usr/local/www/themes/_orange-flow/all.css | 257 +++---- usr/local/www/themes/metallic/all.css | 29 + usr/local/www/themes/pfsense-dropdown/all.css | 23 + usr/local/www/themes/pfsense/all.css | 25 + 11 files changed, 1083 insertions(+), 678 deletions(-) create mode 100644 usr/local/www/includes/javascript.inc.php create mode 100644 usr/local/www/javascript/autosuggest.js create mode 100644 usr/local/www/javascript/firewall_rules_edit.js create mode 100644 usr/local/www/javascript/suggestions.js (limited to 'usr/local/www') diff --git a/usr/local/www/firewall_rules_edit.php b/usr/local/www/firewall_rules_edit.php index 534db44..8465a3b 100755 --- a/usr/local/www/firewall_rules_edit.php +++ b/usr/local/www/firewall_rules_edit.php @@ -309,484 +309,361 @@ if ($_POST) { $pgtitle = "Firewall: Rules: Edit"; $closehead = false; + +$page_filename = "firewall_rules_edit.php"; include("head.inc"); ?> -

-
- - - - - - - - - - - - - - - - - - - - - - - - -
Action -
- Choose what to do with packets that match - the criteria specified below.
-Hint: the difference between block and reject is that with reject, a packet (TCP RST or ICMP port unreachable for UDP) is returned to the sender, whereas with block the packet is dropped silently. In either case, the original packet is discarded. Reject only works when the protocol is set to either TCP or UDP (but not "TCP/UDP") below.
Disabled - > - Disable this rule
- Set this option to disable this rule without - removing it from the list.
Interface -
- Choose on which interface packets must - come in to match this rule.
Protocol -
- Choose which IP protocol this rule should - match.
- Hint: in most cases, you should specify TCP  here.
ICMP type - -
- If you selected ICMP for the protocol above, you may specify an ICMP type here.
Source -> - not
- Use this option to invert the sense of the match.
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "") $gateways[]=$int['gateway']; } - ?> +?> - - + +?> + +

Leave blank for default.

+ + + + + - - - - -
Type:  
Address:   - / - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + +
Action + +
+ + Choose what to do with packets that match the criteria specified below.
+ Hint: the difference between block and reject is that with reject, a packet (TCP RST or ICMP port unreachable for UDP) is returned to the sender, whereas with block the packet is dropped silently. In either case, the original packet is discarded. Reject only works when the protocol is set to either TCP or UDP (but not "TCP/UDP") below. +
+
Disabled + > + Disable this rule
+ Set this option to disable this rule without removing it from the list. +
Interface + +
+ Choose on which interface packets must come in to match this rule. +
Protocol + +
+ Choose which IP protocol this rule should match.
Hint: in most cases, you should specify TCP  here.
+
ICMP type + +
+ If you selected ICMP for the protocol above, you may specify an ICMP type here. +
Source + > + not +
+ Use this option to invert the sense of the match. +
+
+ + + + + + + + - -
Type:   + +
Address:   + / +
Source port range - - - - - - - - - - -
from:  
to:
-
- Specify the port or port range for - the source of the packet for this rule. This is usually not equal to the destination port range (and is often "any").
- Hint: you can leave the 'to' field empty if you only - want to filter a single port
Source OSOS Type:  -
- Note: this only works for TCP rules
+
Destination - > - not
- Use this option to invert the sense of the match.
-
- - - - - - - - - -
Type:  
Address:   - / -
Destination port - range - - - - - - - - - -
from:  
to:
-
Specify the port or port range for - the destination of the packet for this rule.
- Hint: you can leave the 'to' field empty if you only - want to filter a single port
Log - > - Log packets that are handled by this rule
- Hint: the firewall has limited local log - space. Don't turn on logging for everything. If you want to - do a lot of logging, consider using a remote syslog server - (see the Diagnostics: System - logs: Settings page).
Description - -
You may enter a description here - for your reference (not parsed).
Advanced Options -
Simultaneous client connection limit

-
Maximum state entries per host

- / - -
- Maximum new connections / per second -

NOTE: Leave these fields blank to disable this feature. -

State Type -
HINT: Select which type of state tracking mechanism you would like to use. If in doubt, use keep state. -

- - - - - -
  • keep state
  • works with TCP, UDP, and ICMP.
  • modulate state
  • works only with TCP. pfSense will generate strong Initial Sequence Numbers (ISNs) for packets matching this rule.
  • synproxy state
  • proxies incoming TCP connections to help protect servers from spoofed TCP SYN floods. This option includes the functionality of keep state and modulate state combined.
  • none
  • do not use state mechanisms to keep track. this is only useful if your doing advanced queueing in certain situations. please check the faq.
    -
    -

    State Timeout - -

    Leave blank for default. Amount is in seconds. - -

    Source port range + + + + + + + + + +
    from:   + + +
    to: + + +
    +
    + Specify the port or port range for the source of the packet for this rule. This is usually not equal to the destination port range (and is often "any").
    Hint: you can leave the 'to' field empty if you only want to filter a single port
    +
    Source OSOS Type:  + +
    + Note: this only works for TCP rules +
    Destination + > + not +
    + Use this option to invert the sense of the match. +
    +
    + + + + + + + + + +
    Type:   + +
    Address:   + + / + +
    - +
    Destination port range + + + + + + + + + +
    from:   + + +
    to: + + +
    +
    + + Specify the port or port range for the destination of the packet for this rule. +
    + Hint: you can leave the 'to' field empty if you only want to filter a single port +
    +
    Log + > + Log packets that are handled by this rule +
    + Hint: the firewall has limited local log space. Don't turn on logging for everything. If you want to do a lot of logging, consider using a remote syslog server (see the Diagnostics: System logs: Settings page). +
    Description + +
    + You may enter a description here for your reference (not parsed). +
    Advanced Options +
    Simultaneous client connection limit

    +
    Maximum state entries per host

    + / + +
    + Maximum new connections / per second +

    NOTE: Leave these fields blank to disable this feature. +

    State Type +
    HINT: Select which type of state tracking mechanism you would like to use. If in doubt, use keep state. +

    + + + + + +
  • keep state
  • works with TCP, UDP, and ICMP.
  • modulate state
  • works only with TCP. pfSense will generate strong Initial Sequence Numbers (ISNs) for packets matching this rule.
  • synproxy state
  • proxies incoming TCP connections to help protect servers from spoofed TCP SYN floods. This option includes the functionality of keep state and modulate state combined.
  • none
  • do not use state mechanisms to keep track. this is only useful if your doing advanced queueing in certain situations. please check the faq.
    +

    +
    State Timeout + +

    Leave blank for default. Amount is in seconds.

    +
    Gateway - + -

    Leave blank for default. - -

      + + + + + +
      - - - - - -
    +
    - + + diff --git a/usr/local/www/head.inc b/usr/local/www/head.inc index febf1c8..3246e48 100755 --- a/usr/local/www/head.inc +++ b/usr/local/www/head.inc @@ -18,6 +18,24 @@ else +'; + } + } +?> + diff --git a/usr/local/www/includes/javascript.inc.php b/usr/local/www/includes/javascript.inc.php new file mode 100644 index 0000000..d1acf17 --- /dev/null +++ b/usr/local/www/includes/javascript.inc.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/usr/local/www/javascript/autosuggest.js b/usr/local/www/javascript/autosuggest.js new file mode 100644 index 0000000..a4ebd81 --- /dev/null +++ b/usr/local/www/javascript/autosuggest.js @@ -0,0 +1,336 @@ + +/** + * An autosuggest textbox control. + * @class + * @scope public + */ +function AutoSuggestControl(oTextbox /*:HTMLInputElement*/, + oProvider /*:SuggestionProvider*/) { + + /** + * The currently selected suggestions. + * @scope private + */ + this.cur /*:int*/ = -1; + + /** + * The dropdown list layer. + * @scope private + */ + this.layer = null; + + /** + * Suggestion provider for the autosuggest feature. + * @scope private. + */ + this.provider /*:SuggestionProvider*/ = oProvider; + + /** + * The textbox to capture. + * @scope private + */ + this.textbox /*:HTMLInputElement*/ = oTextbox; + + //initialize the control + this.init(); + +} + +/** + * Autosuggests one or more suggestions for what the user has typed. + * If no suggestions are passed in, then no autosuggest occurs. + * @scope private + * @param aSuggestions An array of suggestion strings. + * @param bTypeAhead If the control should provide a type ahead suggestion. + */ +AutoSuggestControl.prototype.autosuggest = function (aSuggestions /*:Array*/, + bTypeAhead /*:boolean*/) { + + //make sure there's at least one suggestion + if (aSuggestions.length > 0) { + if (bTypeAhead) { + this.typeAhead(aSuggestions[0]); + } + + this.showSuggestions(aSuggestions); + } else { + this.hideSuggestions(); + } +}; + +/** + * Creates the dropdown layer to display multiple suggestions. + * @scope private + */ +AutoSuggestControl.prototype.createDropDown = function () { + + var oThis = this; + + //create the layer and assign styles + this.layer = document.createElement("div"); + this.layer.className = "suggestions"; + this.layer.style.visibility = "hidden"; + this.layer.style.width = this.textbox.offsetWidth; + + //when the user clicks on the a suggestion, get the text (innerHTML) + //and place it into a textbox + this.layer.onmousedown = + this.layer.onmouseup = + this.layer.onmouseover = function (oEvent) { + oEvent = oEvent || window.event; + oTarget = oEvent.target || oEvent.srcElement; + + if (oEvent.type == "mousedown") { + oThis.textbox.value = oTarget.firstChild.nodeValue; + oThis.hideSuggestions(); + } else if (oEvent.type == "mouseover") { + oThis.highlightSuggestion(oTarget); + } else { + oThis.textbox.focus(); + } + }; + + + document.body.appendChild(this.layer); +}; + +/** + * Gets the left coordinate of the textbox. + * @scope private + * @return The left coordinate of the textbox in pixels. + */ +AutoSuggestControl.prototype.getLeft = function () /*:int*/ { + + var oNode = this.textbox; + var iLeft = 0; + + while(oNode.tagName != "BODY") { + iLeft += oNode.offsetLeft; + oNode = oNode.offsetParent; + } + + return iLeft; +}; + +/** + * Gets the top coordinate of the textbox. + * @scope private + * @return The top coordinate of the textbox in pixels. + */ +AutoSuggestControl.prototype.getTop = function () /*:int*/ { + + var oNode = this.textbox; + var iTop = 0; + + while(oNode.tagName != "BODY") { + iTop += oNode.offsetTop; + oNode = oNode.offsetParent; + } + + return iTop; +}; + +/** + * Handles three keydown events. + * @scope private + * @param oEvent The event object for the keydown event. + */ +AutoSuggestControl.prototype.handleKeyDown = function (oEvent /*:Event*/) { + + switch(oEvent.keyCode) { + case 38: //up arrow + this.previousSuggestion(); + break; + case 40: //down arrow + this.nextSuggestion(); + break; + case 13: //enter + this.hideSuggestions(); + break; + } + +}; + +/** + * Handles keyup events. + * @scope private + * @param oEvent The event object for the keyup event. + */ +AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) { + + var iKeyCode = oEvent.keyCode; + + //for backspace (8) and delete (46), shows suggestions without typeahead + if (iKeyCode == 8 || iKeyCode == 46) { + this.provider.requestSuggestions(this, false); + + //make sure not to interfere with non-character keys + } else if (iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) { + //ignore + } else { + //request suggestions from the suggestion provider with typeahead + this.provider.requestSuggestions(this, true); + } +}; + +/** + * Hides the suggestion dropdown. + * @scope private + */ +AutoSuggestControl.prototype.hideSuggestions = function () { + this.layer.style.visibility = "hidden"; +}; + +/** + * Highlights the given node in the suggestions dropdown. + * @scope private + * @param oSuggestionNode The node representing a suggestion in the dropdown. + */ +AutoSuggestControl.prototype.highlightSuggestion = function (oSuggestionNode) { + + for (var i=0; i < this.layer.childNodes.length; i++) { + var oNode = this.layer.childNodes[i]; + if (oNode == oSuggestionNode) { + oNode.className = "current" + } else if (oNode.className == "current") { + oNode.className = ""; + } + } +}; + +/** + * Initializes the textbox with event handlers for + * auto suggest functionality. + * @scope private + */ +AutoSuggestControl.prototype.init = function () { + + //save a reference to this object + var oThis = this; + + //assign the onkeyup event handler + this.textbox.onkeyup = function (oEvent) { + + //check for the proper location of the event object + if (!oEvent) { + oEvent = window.event; + } + + //call the handleKeyUp() method with the event object + oThis.handleKeyUp(oEvent); + }; + + //assign onkeydown event handler + this.textbox.onkeydown = function (oEvent) { + + //check for the proper location of the event object + if (!oEvent) { + oEvent = window.event; + } + + //call the handleKeyDown() method with the event object + oThis.handleKeyDown(oEvent); + }; + + //assign onblur event handler (hides suggestions) + this.textbox.onblur = function () { + oThis.hideSuggestions(); + }; + + //create the suggestions dropdown + this.createDropDown(); +}; + +/** + * Highlights the next suggestion in the dropdown and + * places the suggestion into the textbox. + * @scope private + */ +AutoSuggestControl.prototype.nextSuggestion = function () { + var cSuggestionNodes = this.layer.childNodes; + + if (cSuggestionNodes.length > 0 && this.cur < cSuggestionNodes.length-1) { + var oNode = cSuggestionNodes[++this.cur]; + this.highlightSuggestion(oNode); + this.textbox.value = oNode.firstChild.nodeValue; + } +}; + +/** + * Highlights the previous suggestion in the dropdown and + * places the suggestion into the textbox. + * @scope private + */ +AutoSuggestControl.prototype.previousSuggestion = function () { + var cSuggestionNodes = this.layer.childNodes; + + if (cSuggestionNodes.length > 0 && this.cur > 0) { + var oNode = cSuggestionNodes[--this.cur]; + this.highlightSuggestion(oNode); + this.textbox.value = oNode.firstChild.nodeValue; + } +}; + +/** + * Selects a range of text in the textbox. + * @scope public + * @param iStart The start index (base 0) of the selection. + * @param iLength The number of characters to select. + */ +AutoSuggestControl.prototype.selectRange = function (iStart /*:int*/, iLength /*:int*/) { + + //use text ranges for Internet Explorer + if (this.textbox.createTextRange) { + var oRange = this.textbox.createTextRange(); + oRange.moveStart("character", iStart); + oRange.moveEnd("character", iLength - this.textbox.value.length); + oRange.select(); + + //use setSelectionRange() for Mozilla + } else if (this.textbox.setSelectionRange) { + this.textbox.setSelectionRange(iStart, iLength); + } + + //set focus back to the textbox + this.textbox.focus(); +}; + +/** + * Builds the suggestion layer contents, moves it into position, + * and displays the layer. + * @scope private + * @param aSuggestions An array of suggestions for the control. + */ +AutoSuggestControl.prototype.showSuggestions = function (aSuggestions /*:Array*/) { + + var oDiv = null; + this.layer.innerHTML = ""; //clear contents of the layer + + for (var i=0; i < aSuggestions.length; i++) { + oDiv = document.createElement("div"); + oDiv.appendChild(document.createTextNode(aSuggestions[i])); + this.layer.appendChild(oDiv); + } + + this.layer.style.left = this.getLeft() + "px"; + this.layer.style.top = (this.getTop()+this.textbox.offsetHeight) + "px"; + this.layer.style.visibility = "visible"; + +}; + +/** + * Inserts a suggestion into the textbox, highlighting the + * suggested part of the text. + * @scope private + * @param sSuggestion The suggestion for the textbox. + */ +AutoSuggestControl.prototype.typeAhead = function (sSuggestion /*:String*/) { + + //check for support of typeahead functionality + if (this.textbox.createTextRange || this.textbox.setSelectionRange){ + var iLen = this.textbox.value.length; + this.textbox.value = sSuggestion; + this.selectRange(iLen, sSuggestion.length); + } +}; + diff --git a/usr/local/www/javascript/firewall_rules_edit.js b/usr/local/www/javascript/firewall_rules_edit.js new file mode 100644 index 0000000..aa38bde --- /dev/null +++ b/usr/local/www/javascript/firewall_rules_edit.js @@ -0,0 +1,120 @@ + \ No newline at end of file diff --git a/usr/local/www/javascript/suggestions.js b/usr/local/www/javascript/suggestions.js new file mode 100644 index 0000000..1b30fff --- /dev/null +++ b/usr/local/www/javascript/suggestions.js @@ -0,0 +1,33 @@ + +/** + * Provides suggestions for state names (USA). + * @class + * @scope public + */ +function StateSuggestions(text) { + this.states = text; +} + +/** + * Request suggestions for the given autosuggest control. + * @scope protected + * @param oAutoSuggestControl The autosuggest control to provide suggestions for. + */ +StateSuggestions.prototype.requestSuggestions = function (oAutoSuggestControl /*:AutoSuggestControl*/, + bTypeAhead /*:boolean*/) { + var aSuggestions = []; + var sTextboxValue = oAutoSuggestControl.textbox.value; + + if (sTextboxValue.length > 0){ + + //search for matching states + for (var i=0; i < this.states.length; i++) { + if (this.states[i].indexOf(sTextboxValue) == 0) { + aSuggestions.push(this.states[i]); + } + } + } + + //provide suggestions to the control + oAutoSuggestControl.autosuggest(aSuggestions, bTypeAhead); +}; \ No newline at end of file diff --git a/usr/local/www/status_graph.php b/usr/local/www/status_graph.php index acc88ec..470cea7 100755 --- a/usr/local/www/status_graph.php +++ b/usr/local/www/status_graph.php @@ -70,7 +70,7 @@ for ($j = 1; isset($config['interfaces']['opt' . $j]); $j++) { ?>
    Interface: - $ifd) { echo "
    -
    - -
    +

    Note: the Adobe SVG viewer is required to view the graph.

    Graph Width: Height:

    -

    Note: the Adobe SVG viewer is required to view the graph. +

    +
    + +
    + diff --git a/usr/local/www/themes/_orange-flow/all.css b/usr/local/www/themes/_orange-flow/all.css index 607b54a..3a9db7a 100644 --- a/usr/local/www/themes/_orange-flow/all.css +++ b/usr/local/www/themes/_orange-flow/all.css @@ -3,12 +3,6 @@ html, body, td, th, input, select { font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; font-size: 0.9em; } - -body { - background-color: #333333; - margin: 5px auto; -} - form { margin: 0px; } @@ -19,40 +13,42 @@ form input { font-size: 1.1em; } -iframe { - z-index: 1; - border: 1px dashed #990000; -} -.iframe { - background-color: #FFFFFF; -} + /* ID Based CSS Definitions */ -#wrapper { - width: 815px; - margin: 5px auto; + +#notices { + width: 795px; + background-color: #E1E4B8; + border: 1px solid #000000; + padding: 0px; + margin-bottom: 5px; +} +#notices ul { + margin: 0px; + padding: 5px; + padding-top: 3px; + list-style: none; } #header { - background: url('images/header.gif') no-repeat; - background-position: 4px; - height: 102px; - width: 808px; - margin-bottom: 5px; - z-index: 2; + height: 70px; + width: 840px; + background: url('/themes/_orange-flow/images/bgr_top.gif') no-repeat; } #header-left { position: relative; - /* background: url('images/logo.gif') no-repeat; */ + /* background: url('/themes/_orange-flow/images/logo.gif') no-repeat; */ background-position: center; height: 65px; width: 145px; left: 10px; float: left; + /* background-color: #fff; */ } #header-right { position: relative; - /* background: url('images/header.gif') no-repeat; */ + background: url('images/header.gif') no-repeat; height: 70px; color: #fff; left: 0px; @@ -69,22 +65,18 @@ iframe { padding-left: 27px; float: left; } -#header-right .container { - position: relative; -} + #header-right .container .left { - position: relative; - float: left; - font-size: 1.3em; - font-weight: bold; - top: 15px; - left: 4px; - display: none; + position: relative; + top: 32px; + left: 9px; + font-size: 1.8em; } + #header-right .container .right { position: relative; float: right; - top: 22px; + top: -9px; padding-right: 4px; z-index: 1; } @@ -151,171 +143,105 @@ table#marquee div#container div#scroller { + + + #content { - position: relative; - top: -15px; - left: 4px; + border-top: 1px solid #FFFFFF; margin-top: 0px; - margin-left: 5px; padding-top: 0px; width: 800px; - background: url('images/horizontal.gif') repeat-y; -} - -#left { - width: 800px; - height: 1px; -} -#right { - position: relative; - top: -10px; - width: 770px; - margin-top: 0px; - margin-left: 5px; - margin-right: 5px; - padding-top: 5px; - padding-left: 10px; - padding-right: 10px; - padding-bottom: 20px; - min-height: 400px; } #footer { position: relative; - background: url('images/footer.gif') no-repeat; - top: -18px; - left: 7px; + top: 10px; + padding: 0px; + margin: 6px; width: 800px; - height: 75px; + background-color: #990000; + text-align: center; color: #ffffff; - text-align: center;; - font-size: 0.9em; - padding-top: 17px; - margin-bottom: 20px; + font-size: 0.75em; clear: both; + margin-bottom: 20px; } #footer p { padding: 0px; margin: 0px; } -/* Style the List */ -#navigation { - /* background: url('images/menu.gif') no-repeat; */ - /* width: 693px; */ - position: relative; - top: -24px; - left: -4px; - width: 800px; - padding: 0px; - height: 28px; - z-index: 3; -} -#navigation ul { - padding: 0; - margin: 0; - list-style: none; - text-align: center; +#left { + width: 150px; + float: left; } -#navigation ul#menu { - padding-top: 3px; - padding-left: 5px; +#right { + /*margin-left: 171px;*/ + margin-left: 170px; + margin-top: 5px; + width: 620px; + background: url('/themes/_orange-flow/images/bgr_middle_right.gif') repeat-y; } -/* Style the List Elements */ -#navigation ul li { - float: left; + + +#navigation { position: relative; - /* width: 7.5em; */ - width: 8.77em; -} -#navigation ul li div { - font-size: 1em; - font-weight: bold; -} -/* Make the List inside the List Elements */ -/* initially hidden with absolute position */ -#navigation ul li ul { - display: none; - position: absolute; - top: 2em; - left: -2px; - width: 9em; - font-weight: normal; - background: transparent bottom left no-repeat; /* This is key to making the menu maintain visibility when not on a link */ - background-color: #202020; - background: url("images/menu_footer.gif") no-repeat; - background-position: bottom; - padding: 0em 0 0.4em 0; - padding-top: 0.3em; -} -/* to override top and left in browsers other than IE */ -/* which will position to the top right of the containing */ -/* li, rather than bottom left */ -#navigation ul li > ul { - top: auto; - left: auto; - left: -1px !important; -} -/* Show initial drop down upon mouse over, but do not show */ -/* nested side drop menus within listed elements */ -#navigation ul li:hover ul { - display: block; - cursor: hand; -} -#navigation ul li:hover { - cursor: hand; - cursor: pointer; -} -#navigation ul li:hover div { - text-decoration: none; + background-color: #000000; + top: 0px; + left: 5px; + width: 157px; + padding-top: 6px; + margin-left: 1px; + color: #fff; + padding-bottom: 6px; + padding-right: 0px; } -#navigation ul li { - background-color: transparent; - color: #FFF; -} -#navigation ul li ul li { - border: 1px solid #505050; - width: 8.8em; - height: 1.6em; - line-height: 1.6em; - background: url('images/metal_bgr.gif') repeat-x; - color: #FFF; -} -#navigation ul li ul li:hover { - background: url('images/metal_bgr_red.gif') repeat-x; +#navigation ul { + margin: 0px; + padding: 0px; + width: 100%; } -#navigation li li a { +#navigation ul li { display: block; padding-left: 10px; - padding-right: 10px; } -#navigation ul li ul li a.navlnk:hover { - text-decoration: none; -} -#navigation ul li.first { - border-right: 0px; -} -#navigation ul li.middle { - border-right: 0px; +#navigation ul li div { + margin-top: 2px; } -#navigation ul li.last { +#navigation ul li div { + font-weight: bold; } -#navigation ul li.dropfirst { - border-bottom: 0px; -} -#navigation ul li.dropmiddle { - border-bottom: 0px; -} -#navigation ul li.droplast { +#navigation ul li div .small, +#navigation ul li div .small:hover { + font-weight: normal; + font-size: 0.79em; } +#navigation ul li a { + padding-left: 0.5em; + padding-right: 0.5em; + padding-top: 0.2em; + padding-bottom: 0.2em; + height: 1.2em; + line-height: 1.2em; + color: #fff; + text-decoration: none; + width: 61px; + font-size: 0.9em; + text-align: center; +} +#navigation ul li a:hover { + color: #fff; + text-decoration: underline; + font-size: 0.9em; +} @@ -659,7 +585,6 @@ ul#tabnav li.tabact { } - /* Nifty Corners Crap */ .rtop,.artop{display:block} .rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px} @@ -681,4 +606,4 @@ ul#tabnav li.tabact { .rxl1,.rxl2,.rxl3,.rxl4,.rxsl1,.rxsl2,.ral1,.ral2,.ral3,.ral4,.rasl1,.rasl2{border-right-width:0} .rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0} .r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px} -.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px} +.rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px} \ No newline at end of file diff --git a/usr/local/www/themes/metallic/all.css b/usr/local/www/themes/metallic/all.css index 607b54a..adb67f8 100644 --- a/usr/local/www/themes/metallic/all.css +++ b/usr/local/www/themes/metallic/all.css @@ -317,6 +317,11 @@ table#marquee div#container div#scroller { +#graph { + position: relative; + z-index: 10; +} + /* Class Based CSS Definitions */ @@ -659,6 +664,29 @@ ul#tabnav li.tabact { } +/* Auto Complete Suggestions */ +div.suggestions { + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid black; + position: absolute; + background-color: #990000; + color: #FFF; +} + +div.suggestions div { + cursor: default; + padding: 0px 3px; + background-color: #990000; + color: #FFF; +} + +div.suggestions div.current { + background-color: #3366cc; + color: #FFF; +} +/* End Auto Complete Suggestions */ + /* Nifty Corners Crap */ .rtop,.artop{display:block} @@ -682,3 +710,4 @@ ul#tabnav li.tabact { .rxr1,.rxr2,.rxr3,.rxr4,.rxsr1,.rxsr2,.rar1,.rar2,.rar3,.rar4,.rasr1,.rasr2{border-left-width:0} .r4,.rl4,.rr4,.re4,.rel4,.rer4,.ra4,.rar4,.ral4,.rx4,.rxl4,.rxr4{height:2px} .rer1,.rel1,.re1,.res1,.resl1,.resr1{border-width:1px 0 0;height:0px !important;height /**/:1px} +/* End Nifty Corners Crap */ \ No newline at end of file diff --git a/usr/local/www/themes/pfsense-dropdown/all.css b/usr/local/www/themes/pfsense-dropdown/all.css index 7d5918b..71630bb 100644 --- a/usr/local/www/themes/pfsense-dropdown/all.css +++ b/usr/local/www/themes/pfsense-dropdown/all.css @@ -613,6 +613,29 @@ ul#tabnav li.tabact { } +/* Auto Complete Suggestions */ +div.suggestions { + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid black; + position: absolute; + background-color: #990000; + color: #FFF; +} + +div.suggestions div { + cursor: default; + padding: 0px 3px; + background-color: #990000; + color: #FFF; +} + +div.suggestions div.current { + background-color: #3366cc; + color: #FFF; +} +/* End Auto Complete Suggestions */ + /* Nifty Corners Crap */ .rtop,.artop{display:block} diff --git a/usr/local/www/themes/pfsense/all.css b/usr/local/www/themes/pfsense/all.css index 5af4192..a072f31 100644 --- a/usr/local/www/themes/pfsense/all.css +++ b/usr/local/www/themes/pfsense/all.css @@ -583,6 +583,31 @@ ul#tabnav li.tabact { } +/* Auto Complete Suggestions */ +div.suggestions { + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid black; + position: absolute; + background-color: #990000; + color: #FFF; +} + +div.suggestions div { + cursor: default; + padding: 0px 3px; + background-color: #990000; + color: #FFF; +} + +div.suggestions div.current { + background-color: #3366cc; + color: #FFF; +} +/* End Auto Complete Suggestions */ + + + /* Nifty Corners Crap */ .rtop,.artop{display:block} .rtop *,.artop *{display:block;height:1px;overflow:hidden;font-size:1px} -- cgit v1.1