diff --git a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java index 3dd724b08d..1c21909704 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java @@ -19,6 +19,7 @@ public class CSSHelper extends HelperBase { private static final String FORCE = "classic"; public static final String PROP_REFRESH = "routerconsole.summaryRefresh"; public static final String DEFAULT_REFRESH = "60"; + public static final int MIN_REFRESH = 5; private static final String PROP_XFRAME = "routerconsole.disableXFrame"; public String getTheme(String userAgent) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java index eb8d504bb5..7a6b032c18 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java @@ -11,12 +11,12 @@ public class ConfigNavHelper extends HelperBase { /** configX.jsp */ private static final String pages[] = - {"", "net", "ui", "home", "service", "update", "tunnels", + {"", "net", "ui", "sidebar", "home", "service", "update", "tunnels", "clients", "peer", "keyring", "logging", "stats", "reseed", "advanced" }; private static final String titles[] = - {_x("Bandwidth"), _x("Network"), _x("UI"), _x("Home Page"), + {_x("Bandwidth"), _x("Network"), _x("UI"), _x("Summary Bar"), _x("Home Page"), _x("Service"), _x("Update"), _x("Tunnels"), _x("Clients"), _x("Peers"), _x("Keyring"), _x("Logging"), _x("Stats"), _x("Reseeding"), _x("Advanced") }; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java new file mode 100644 index 0000000000..1f90bc4952 --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java @@ -0,0 +1,135 @@ +package net.i2p.router.web; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +import net.i2p.data.DataHelper; + +/** + * Simple summary bar configuration. + * + * @since 0.9.1 + */ +public class ConfigSummaryHandler extends FormHandler { + + private Map _settings; + + @Override + protected void processForm() { + if (_action == null) return; + String group = getJettyString("group"); + boolean deleting = _action.equals(_("Delete selected")); + boolean adding = _action.equals(_("Add item")); + boolean saving = _action.equals(_("Save order")); + if (_action.equals(_("Save")) && "0".equals(group)) { + try { + int refreshInterval = Integer.parseInt(getJettyString("refreshInterval")); + if (refreshInterval >= CSSHelper.MIN_REFRESH) { + _context.router().saveConfig(CSSHelper.PROP_REFRESH, "" + refreshInterval); + addFormNotice(_("Refresh interval changed")); + } else + addFormError(_("Refresh interval must be at least {0} seconds", CSSHelper.MIN_REFRESH)); + } catch (java.lang.NumberFormatException e) { + addFormError(_("Refresh interval must be a number")); + return; + } + } else if ("1".equals(group)) { + if (_action.equals(_("Use full preset"))) { + _context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR, SummaryHelper.PRESET_FULL); + addFormNotice(_("Full summary bar preset selected.") + " " + + _("Summary bar will refresh shortly.")); + } else if (_action.equals(_("Use reduced preset"))) { + _context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR, SummaryHelper.PRESET_SHORT); + addFormNotice(_("Reduced summary bar preset selected.") + " " + + _("Summary bar will refresh shortly.")); + } else { + addFormError(_("Unsupported")); + } + } else if (adding || deleting || saving) { + Map sections = new TreeMap(); + for (Object o : _settings.keySet()) { + if (!(o instanceof String)) + continue; + String k = (String) o; + if (!k.startsWith("order_")) + continue; + String v = getJettyString(k); + k = k.substring(6); + k = k.substring(k.indexOf('_') + 1); + try { + int order = Integer.parseInt(v); + sections.put(order, k); + } catch (java.lang.NumberFormatException e) { + addFormError(_("Order must be an integer")); + return; + } + } + if (adding) { + String name = getJettyString("name"); + if (name == null || name.length() <= 0) { + addFormError(_("No section selected")); + return; + } + String order = getJettyString("order"); + if (order == null || order.length() <= 0) { + addFormError(_("No order entered")); + return; + } + name = DataHelper.escapeHTML(name).replace(",", ","); + order = DataHelper.escapeHTML(order).replace(",", ","); + try { + int ki = Integer.parseInt(order); + sections.put(ki, name); + addFormNotice(_("Added") + ": " + name); + } catch (java.lang.NumberFormatException e) { + addFormError(_("Order must be an integer")); + return; + } + } else if (deleting) { + Set toDelete = new HashSet(); + for (Object o : _settings.keySet()) { + if (!(o instanceof String)) + continue; + String k = (String) o; + if (!k.startsWith("delete_")) + continue; + k = k.substring(7); + try { + int ki = Integer.parseInt(k); + toDelete.add(ki); + } catch (java.lang.NumberFormatException e) { + continue; + } + } + for (Iterator iter = sections.keySet().iterator(); iter.hasNext(); ) { + int i = iter.next(); + if (toDelete.contains(i)) { + String removedName = sections.get(i); + iter.remove(); + addFormNotice(_("Removed") + ": " + removedName); + } + } + } + SummaryHelper.saveSummaryBarSections(_context, sections); + addFormError(_("Saved order of sections.") + " " + + _("Summary bar will refresh shortly.")); + } else { + addFormError(_("Unsupported")); + } + } + + public void setSettings(Map settings) { _settings = new HashMap(settings); } + + /** curses Jetty for returning arrays */ + private String getJettyString(String key) { + String[] arr = (String[]) _settings.get(key); + if (arr == null) + return null; + return arr[0].trim(); + } +} diff --git a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java index b5d54b4112..515171e331 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java @@ -191,7 +191,8 @@ public class GraphHelper extends FormHandler { } // FIXME jrobin doesn't support setting the timezone, will have to mod TimeAxis.java - _out.write("

" + _("All times are UTC.") + "

\n"); + // 0.9.1 - all graphs currently state UTC on them, so this text blurb is unnecessary, + //_out.write("

" + _("All times are UTC.") + "

\n"); } catch (IOException ioe) { ioe.printStackTrace(); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java index 709c4505ff..d5d702e8ff 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -16,7 +16,7 @@ public class NewsHelper extends ContentHelper { if (!news.exists()) _page = (new File(_context.getBaseDir(), "docs/initialNews/initialNews.xml")).getAbsolutePath(); return super.getContent(); - } + } /** @since 0.8.12 */ public boolean shouldShowNews() { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index a61e543cc8..c8d4aacc5d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -3,6 +3,10 @@ package net.i2p.router.web; import java.io.File; import java.io.IOException; import java.io.Writer; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; @@ -12,6 +16,36 @@ import net.i2p.router.RouterContext; * */ public class SummaryBarRenderer { + // Commented out because broken. Replaced by if-elseif blob below. + /*static final Map ALL_SECTIONS; + static { + Map aMap = new HashMap();; + try { + aMap.put("HelpAndFAQ", SummaryBarRenderer.class.getMethod("renderHelpAndFAQHTML")); + aMap.put("I2PServices", SummaryBarRenderer.class.getMethod("renderI2PServicesHTML")); + aMap.put("I2PInternals", SummaryBarRenderer.class.getMethod("renderI2PInternalsHTML")); + aMap.put("General", SummaryBarRenderer.class.getMethod("renderGeneralHTML")); + aMap.put("ShortGeneral", SummaryBarRenderer.class.getMethod("renderShortGeneralHTML")); + aMap.put("NetworkReachability", SummaryBarRenderer.class.getMethod("renderNetworkReachabilityHTML")); + aMap.put("UpdateStatus", SummaryBarRenderer.class.getMethod("renderUpdateStatusHTML")); + aMap.put("RestartStatus", SummaryBarRenderer.class.getMethod("renderRestartStatusHTMLHTML")); + aMap.put("Peers", SummaryBarRenderer.class.getMethod("renderPeersHTML")); + aMap.put("FirewallAndReseedStatus", SummaryBarRenderer.class.getMethod("renderFirewallAndReseedStatusHTML")); + aMap.put("Bandwidth", SummaryBarRenderer.class.getMethod("renderBandwidthHTML")); + aMap.put("Tunnels", SummaryBarRenderer.class.getMethod("renderTunnelsHTML")); + aMap.put("Congestion", SummaryBarRenderer.class.getMethod("renderCongestionHTML")); + aMap.put("TunnelStatus", SummaryBarRenderer.class.getMethod("renderTunnelStatusHTML")); + aMap.put("Destinations", SummaryBarRenderer.class.getMethod("renderDestinationsHTML")); + aMap.put("NewsHeadings", SummaryBarRenderer.class.getMethod("renderNewsHeadingsHTML")); + } catch (java.lang.NoSuchMethodException e) { + } + ALL_SECTIONS = Collections.unmodifiableMap(aMap); + }*/ + static final String ALL_SECTIONS[] = + {"HelpAndFAQ", "I2PServices", "I2PInternals", "General", "ShortGeneral", "NetworkReachability", + "UpdateStatus", "RestartStatus", "Peers", "FirewallAndReseedStatus", "Bandwidth", "Tunnels", + "Congestion", "TunnelStatus", "Destinations", "NewsHeadings" }; + private final RouterContext _context; private final SummaryHelper _helper; @@ -26,154 +60,196 @@ public class SummaryBarRenderer { */ public void renderSummaryHTML(Writer out) throws IOException { StringBuilder buf = new StringBuilder(8*1024); - String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME); - - // TODO - the bar would render more cleanly if we specified the img height and width here, - // but unfortunately the images in the different themes are different sizes. - // They range in height from 37 to 43 px. But there's a -2 bottom margin... - // So put it in a div. - buf.append("
\"")

") - - .append("

sections = _helper.getSummaryBarSections(); + for (String section : sections) { + // Commented out because broken. Replaced by if-elseif blob below. + /*try { + String section = (String)ALL_SECTIONS.get(sections[i]).invoke(this); + if (section != null && section != "") { + out.write("
" + i + "
\n" + section); + } + } catch (Exception e) { + out.write("
" +i + " - Exception
\n" + e); + }*/ + buf.setLength(0); + + buf.append("
\n"); + if ("HelpAndFAQ".equals(section)) + buf.append(renderHelpAndFAQHTML()); + else if ("I2PServices".equals(section)) + buf.append(renderI2PServicesHTML()); + else if ("I2PInternals".equals(section)) + buf.append(renderI2PInternalsHTML()); + else if ("General".equals(section)) + buf.append(renderGeneralHTML()); + else if ("ShortGeneral".equals(section)) + buf.append(renderShortGeneralHTML()); + else if ("NetworkReachability".equals(section)) + buf.append(renderNetworkReachabilityHTML()); + else if ("UpdateStatus".equals(section)) + buf.append(renderUpdateStatusHTML()); + else if ("RestartStatus".equals(section)) + buf.append(renderRestartStatusHTML()); + else if ("Peers".equals(section)) + buf.append(renderPeersHTML()); + else if ("FirewallAndReseedStatus".equals(section)) + buf.append(renderFirewallAndReseedStatusHTML()); + else if ("Bandwidth".equals(section)) + buf.append(renderBandwidthHTML()); + else if ("Tunnels".equals(section)) + buf.append(renderTunnelsHTML()); + else if ("Congestion".equals(section)) + buf.append(renderCongestionHTML()); + else if ("TunnelStatus".equals(section)) + buf.append(renderTunnelStatusHTML()); + else if ("Destinations".equals(section)) + buf.append(renderDestinationsHTML()); + else if ("NewsHeadings".equals(section)) + buf.append(renderNewsHeadingsHTML()); + + // Only output section if there's more than the
to print + if (buf.length() > 5) + out.write(buf.toString()); + } + } + + public String renderHelpAndFAQHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append("

") .append(_("Help & FAQ")) - .append("


"); + .append("

"); + return buf.toString(); + } - File lpath = new File(_context.getBaseDir(), "docs/toolbar.html"); - // you better have target="_top" for the links in there... - if (lpath.exists()) { - ContentHelper linkhelper = new ContentHelper(); - linkhelper.setPage(lpath.getAbsolutePath()); - linkhelper.setMaxLines("100"); - buf.append(linkhelper.getContent()); - } else { - buf.append("

") - .append(_("I2P Services")) - .append("

\n" + + public String renderI2PServicesHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append("

") + .append(_("I2P Services")) + .append("

\n" + - "
" + + "
" + - "") - .append(_("Email")) - .append("\n" + + "") + .append(_("Email")) + .append("\n" + - "") - .append(_("Torrents")) - .append("\n" + + "") + .append(_("Torrents")) + .append("\n" + - "") - .append(_("Website")) - .append("\n") + "") + .append(_("Website")) + .append("\n") - .append(NavHelper.getClientAppLinks(_context)) + .append(NavHelper.getClientAppLinks(_context)) - .append("
\n" + + .append("
\n"); + return buf.toString(); + } - "

") - .append(_("I2P Internals")) - .append("


\n" + + public String renderI2PInternalsHTML() { + StringBuilder buf = new StringBuilder(512); + buf.append("

") + .append(_("I2P Internals")) + .append("


\n" + - "
\n" + + "
\n" + - "") - .append(_("Tunnels")) - .append("\n" + + "") + .append(_("Tunnels")) + .append("\n" + - "") - .append(_("Peers")) - .append("\n" + + "") + .append(_("Peers")) + .append("\n" + - "") - .append(_("Profiles")) - .append("\n" + + "") + .append(_("Profiles")) + .append("\n" + - "") - .append(_("NetDB")) - .append("\n" + + "") + .append(_("NetDB")) + .append("\n" + - "") - .append(_("Logs")) - .append("\n"); + "") + .append(_("Logs")) + .append("\n"); - // "") - // .append(_("Jobs")) - // .append("\n" + + // "") + // .append(_("Jobs")) + // .append("\n" + - if (!StatSummarizer.isDisabled()) { - buf.append("") .append(_("Graphs")) .append("\n"); - } - - buf.append("") - .append(_("Stats")) - .append("\n" + - - "") - .append(_("I2PTunnel")) - .append("\n" + - - "") - .append(_("Addressbook")) - .append("\n"); - - File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html"); - if (javadoc.exists()) - buf.append("Javadoc\n"); - buf.append("
\n"); - - out.write(buf.toString()); - buf.setLength(0); } + buf.append("") + .append(_("Stats")) + .append("\n" + + "") + .append(_("I2PTunnel")) + .append("\n" + - buf.append("

") + .append(_("Addressbook")) + .append("\n"); + + File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html"); + if (javadoc.exists()) + buf.append("Javadoc\n"); + buf.append("

\n"); + return buf.toString(); + } + + public String renderGeneralHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); + buf.append("

") .append(_("General")) .append("


\n" + "" + - "" + "\n" + - "" + + "" + "" + "
") + "") .append(_("Local Identity")) .append(":" + @@ -187,7 +263,10 @@ public class SummaryBarRenderer { .append(_("show")) .append("
") + "
") .append(_("Version")) .append(":") @@ -202,24 +281,67 @@ public class SummaryBarRenderer { .append(":") .append(_helper.getUptime()) - .append("
\n" + + .append("\n"); + return buf.toString(); + } - "

" + + "" + + "") + .append(_("Version")) + .append(":" + + "") + .append(_helper.getVersion()) + .append("\n" + + + "" + + "") + .append(_("Uptime")) + .append(":" + + "") + .append(_helper.getUptime()) + .append("\n"); + return buf.toString(); + } + + public String renderNetworkReachabilityHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); + buf.append("

") .append(_("Network")) .append(": ") .append(_helper.getReachability()) - .append("


\n") + .append("

\n"); + return buf.toString(); + } + public String renderUpdateStatusHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); + buf.append(_helper.getUpdateStatus()); + return buf.toString(); + } - .append(_helper.getUpdateStatus()) + public String renderRestartStatusHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); + buf.append(_helper.getRestartStatus()); + return buf.toString(); + } - - .append(_helper.getRestartStatus()) - - - .append("

") .append(_("Peers")) @@ -227,7 +349,10 @@ public class SummaryBarRenderer { "\n" + - "" + + "\n" + - "" + + "\n" + - "" + + "\n" + - "" + + "\n" + - "" + + "\n" + - "
") + "
") .append(_("Active")) .append(":"); int active = _helper.getActivePeers(); @@ -236,38 +361,56 @@ public class SummaryBarRenderer { .append(Math.max(active, _helper.getActiveProfiles())) .append("
") + "
") .append(_("Fast")) .append(":") .append(_helper.getFastPeers()) .append("
") + "
") .append(_("High capacity")) .append(":") .append(_helper.getHighCapacityPeers()) .append("
") + "
") .append(_("Integrated")) .append(":") .append(_helper.getWellIntegratedPeers()) .append("
") + "
") .append(_("Known")) .append(":") .append(_helper.getAllPeers()) .append("

\n"); - - - out.write(buf.toString()); - buf.setLength(0); + "\n"); + return buf.toString(); + } + public String renderFirewallAndReseedStatusHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); buf.append(_helper.getFirewallAndReseedStatus()); + return buf.toString(); + } + public String renderBandwidthHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); buf.append("

") @@ -303,82 +446,182 @@ public class SummaryBarRenderer { .append(_helper.getInboundTransferred()) .append(SummaryHelper.THINSP) .append(_helper.getOutboundTransferred()) - .append("\n" + + .append("\n" + - "

\n"); + return buf.toString(); + } + + public String renderTunnelsHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); + buf.append("

") .append(_("Tunnels")) .append("


" + "\n" + - "" + + "\n" + - "" + + "\n" + - "" + + "\n" + - "" + + "\n" + - "
") + "
") .append(_("Exploratory")) .append(":") .append(_helper.getInboundTunnels() + _helper.getOutboundTunnels()) .append("
") + "
") .append(_("Client")) .append(":") .append(_helper.getInboundClientTunnels() + _helper.getOutboundClientTunnels()) .append("
") + "
") .append(_("Participating")) .append(":") .append(_helper.getParticipatingTunnels()) .append("
") + "
") .append(_("Share ratio")) .append(":") .append(_helper.getShareRatio()) .append("

\n"); + return buf.toString(); + } + + public String renderCongestionHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); + buf.append("

") .append(_("Congestion")) .append("


" + "\n" + - "" + + "\n" + - "" + + "\n"); if (!_context.getBooleanPropertyDefaultTrue("router.disableTunnelTesting")) { - buf.append("" + + "\n"); } - buf.append("" + + "\n" + - "
") + "
") .append(_("Job lag")) .append(":") .append(_helper.getJobLag()) .append("
") + "
") .append(_("Message delay")) .append(":") .append(_helper.getMessageDelay()) .append("
") + buf.append("
") .append(_("Tunnel lag")) .append(":") .append(_helper.getTunnelLag()) .append("
") + buf.append("
") .append(_("Backlog")) .append(":") .append(_helper.getInboundBacklog()) .append("

") + "\n"); + return buf.toString(); + } + + public String renderTunnelStatusHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(50); + buf.append("

") .append(_(_helper.getTunnelStatus())) - .append("


\n") + .append("

\n"); + return buf.toString(); + } - .append(_helper.getDestinations()) - .append("
\n"); + public String renderDestinationsHTML() { + if (_helper == null) return ""; + StringBuilder buf = new StringBuilder(512); + buf.append(_helper.getDestinations()); + return buf.toString(); + } - - - out.write(buf.toString()); + /** @since 0.9.1 */ + public String renderNewsHeadingsHTML() { + if (_helper == null) return ""; + NewsHelper newshelper = _helper.getNewsHelper(); + if (newshelper == null || newshelper.shouldShowNews()) return ""; + StringBuilder buf = new StringBuilder(512); + String consoleNonce = System.getProperty("router.consoleNonce"); + if (consoleNonce != null) { + // Set up title and pre-headings stuff. + buf.append("

") + .append(_("News & Updates")) + .append("


\n"); + // Get news content. + String newsContent = newshelper.getContent(); + if (newsContent != "") { + buf.append("
    \n"); + // Parse news content for headings. + int start = newsContent.indexOf("

    "); + while (start >= 0) { + // Add offset to start: + // 4 - gets rid of

    + // 16 - gets rid of the date as well (assuming form "

    yyyy-mm-dd: Foobarbaz...") + newsContent = newsContent.substring(start+16, newsContent.length()); + int end = newsContent.indexOf("

    "); + if (end >= 0) { + String heading = newsContent.substring(0, end); + buf.append("
  • ") + .append(heading) + .append("
  • \n"); + } + start = newsContent.indexOf("

    "); + } + buf.append("

\n"); + // Set up string containing to show news. + buf.append("") + .append(_("Show news")) + .append("\n"); + } else { + buf.append("
") + .append(_("none")) + .append("
"); + } + // Add post-headings stuff. + buf.append("
\n"); + } + return buf.toString(); } /** translate a string */ diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 4e7d2f23fb..882e3c5633 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -4,10 +4,13 @@ import java.io.IOException; import java.text.Collator; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.TreeSet; import net.i2p.data.DataHelper; import net.i2p.data.Destination; @@ -17,6 +20,7 @@ import net.i2p.data.RouterAddress; import net.i2p.data.RouterInfo; import net.i2p.router.CommSystemFacade; import net.i2p.router.Router; +import net.i2p.router.RouterContext; import net.i2p.router.RouterVersion; import net.i2p.router.TunnelPoolSettings; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; @@ -35,6 +39,35 @@ public class SummaryHelper extends HelperBase { // Opera 10.63 doesn't have the char, TODO check UA //static final String THINSP = " / "; static final String THINSP = " / "; + private static final char S = ','; + static final String PROP_SUMMARYBAR = "routerconsole.summaryBar"; + + static final String PRESET_FULL = + "HelpAndFAQ" + S + + "I2PServices" + S + + "I2PInternals" + S + + "General" + S + + "NetworkReachability" + S + + "UpdateStatus" + S + + "RestartStatus" + S + + "Peers" + S + + "FirewallAndReseedStatus" + S + + "Bandwidth" + S + + "Tunnels" + S + + "Congestion" + S + + "TunnelStatus" + S + + "Destinations" + S + + ""; + + static final String PRESET_SHORT = + "ShortGeneral" + S + + "NewsHeadings" + S + + "UpdateStatus" + S + + "NetworkReachability" + S + + "FirewallAndReseedStatus" + S + + "Destinations" + S + + "RestartStatus" + S + + ""; /** * Retrieve the shortened 4 character ident for the router located within @@ -375,7 +408,7 @@ public class SummaryHelper extends HelperBase { List clients = new ArrayList(_context.clientManager().listClients()); StringBuilder buf = new StringBuilder(512); - buf.append("

").append(_("Local Destinations")).append("


"); + buf.append("

").append(_("Local Destinations")).append("


"); if (!clients.isEmpty()) { Collections.sort(clients, new AlphaComparator()); buf.append(""); @@ -651,7 +684,7 @@ public class SummaryHelper extends HelperBase { .append(_("Download Unsigned
Update {0}", getUnsignedUpdateVersion())) .append("
\n"); } - buf.append("\n"); + buf.append("
\n"); } } return buf.toString(); @@ -710,6 +743,22 @@ public class SummaryHelper extends HelperBase { return buf.toString(); } + private NewsHelper _newshelper; + public void storeNewsHelper(NewsHelper n) { _newshelper = n; } + public NewsHelper getNewsHelper() { return _newshelper; } + + public List getSummaryBarSections() { + String config = _context.getProperty(PROP_SUMMARYBAR, PRESET_FULL); + return Arrays.asList(config.split("" + S)); + } + + static void saveSummaryBarSections(RouterContext ctx, Map sections) { + StringBuilder buf = new StringBuilder(512); + for(String section : sections.values()) + buf.append(section).append(S); + ctx.router().saveConfig(PROP_SUMMARYBAR, buf.toString()); + } + /** output the summary bar to _out */ public void renderSummaryBar() throws IOException { SummaryBarRenderer renderer = new SummaryBarRenderer(_context, this); @@ -733,4 +782,56 @@ public class SummaryHelper extends HelperBase { private String _requestURI; public void setRequestURI(String s) { _requestURI = s; } public String getRequestURI() { return _requestURI; } + + public String getConfigTable() { + String[] allSections = SummaryBarRenderer.ALL_SECTIONS; + List sections = getSummaryBarSections(); + TreeSet sortedSections = new TreeSet(); + + for (int i = 0; i < allSections.length; i++) { + String section = allSections[i]; + if (!sections.contains(section)) + sortedSections.add(section); + } + + StringBuilder buf = new StringBuilder(2048); + buf.append("
\n"); + for (String section : sections) { + int i = sections.indexOf(section); + buf.append("\n"); + } + buf.append("" + + "") + .append("
") + .append(_("Remove")) + .append("") + .append(_("Order")) + .append("") + .append(_("Name")) + .append("
") + .append(section) + .append("
") + .append(_("Add")).append(":" + + "" + + "
\n"); + return buf.toString(); + } } diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp index 70c0e64f00..9cc6f81a4d 100644 --- a/apps/routerconsole/jsp/config.jsp +++ b/apps/routerconsole/jsp/config.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("configure bandwidth")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configadvanced.jsp b/apps/routerconsole/jsp/configadvanced.jsp index 1dbf23e7d4..27405c0c4c 100644 --- a/apps/routerconsole/jsp/configadvanced.jsp +++ b/apps/routerconsole/jsp/configadvanced.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("config advanced")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp index c8575b490f..0662afffef 100644 --- a/apps/routerconsole/jsp/configclients.jsp +++ b/apps/routerconsole/jsp/configclients.jsp @@ -10,7 +10,14 @@ button span.hide{ display:none; } input.default { width: 1px; height: 1px; visibility: hidden; } - + + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/confighome.jsp b/apps/routerconsole/jsp/confighome.jsp index ca0dbdc6c3..5ddf6f2005 100644 --- a/apps/routerconsole/jsp/confighome.jsp +++ b/apps/routerconsole/jsp/confighome.jsp @@ -12,7 +12,13 @@ input.default { visibility: hidden; } - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Home Page Configuration")%>

diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index 7acdf1126f..2719fe3335 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config keyring")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Keyring Configuration")%>

diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index 8274fcb438..d00d34321e 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("config logging")%> - + + + " /> diff --git a/apps/routerconsole/jsp/confignet.jsp b/apps/routerconsole/jsp/confignet.jsp index 6e340a6592..e85c9e6df9 100644 --- a/apps/routerconsole/jsp/confignet.jsp +++ b/apps/routerconsole/jsp/confignet.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config networking")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp index b5968abedc..0f9b98a21b 100644 --- a/apps/routerconsole/jsp/configpeer.jsp +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config peers")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Peer Configuration")%>

diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp index 67d2334c91..c0f3faaaed 100644 --- a/apps/routerconsole/jsp/configreseed.jsp +++ b/apps/routerconsole/jsp/configreseed.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config reseeding")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp index 3ee1ef7967..21ae39a6bf 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("config service")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Service Configuration")%>

diff --git a/apps/routerconsole/jsp/configsidebar.jsp b/apps/routerconsole/jsp/configsidebar.jsp new file mode 100644 index 0000000000..dcbf1fe1e6 --- /dev/null +++ b/apps/routerconsole/jsp/configsidebar.jsp @@ -0,0 +1,74 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +<%@include file="css.jsi" %> +<%=intl.title("config summary bar")%> + + + + + +<%@include file="summary.jsi" %> +

<%=intl._("I2P Summary Bar Configuration")%>

+
+<%@include file="confignav.jsi" %> + + +<% formhandler.storeMethod(request.getMethod()); %> + +" /> + + +<% + String pageNonce = formhandler.getNewNonce(); +%> + +" /> + +

<%=intl._("Refresh Interval")%>

+
+ + + " > + <%=intl._("seconds")%> + " > +
+ +

<%=intl._("Use preset layout")%>

+

<%=intl._("Several preset layouts for the summary bar are available.")%> + <%=intl._("Note that choosing one of the presets will cause the current summary bar configuration to be lost.")%>

+
+
+ + + " > + " > +
+
+ +

<%=intl._("Customise Summary Bar")%>

+
+ + + +
+ " > + " > + " > + " > + " > +
+ +
diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index d380d77839..6d75d673cc 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -6,10 +6,17 @@ <%@include file="css.jsi" %> <%=intl.title("config stats")%> + + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp index 4a214c8524..c5b8c4d81a 100644 --- a/apps/routerconsole/jsp/configui.jsp +++ b/apps/routerconsole/jsp/configui.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("config UI")%> - + + + <%@include file="summary.jsi" %> diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index e2bd49ab27..dafac8d45e 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("config update")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Update Configuration")%>

diff --git a/apps/routerconsole/jsp/console.jsp b/apps/routerconsole/jsp/console.jsp index 74e994bbbc..b9688aa0ec 100644 --- a/apps/routerconsole/jsp/console.jsp +++ b/apps/routerconsole/jsp/console.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("home")%> - + + + <% String consoleNonce = System.getProperty("router.consoleNonce"); if (consoleNonce == null) { @@ -15,16 +21,13 @@ } %> -<%@include file="summary.jsi" %>

<%=intl._("I2P Router Console")%>

+<%@include file="summary.jsi" %> + +

<%=intl._("I2P Router Console")%>

- - " /> <% if (newshelper.shouldShowNews()) { - java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); %> - -
<% diff --git a/apps/routerconsole/jsp/debug.jsp b/apps/routerconsole/jsp/debug.jsp index b9e66345f6..191d73e185 100644 --- a/apps/routerconsole/jsp/debug.jsp +++ b/apps/routerconsole/jsp/debug.jsp @@ -9,7 +9,13 @@ %> I2P Router Console - Debug <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

Router SKM

diff --git a/apps/routerconsole/jsp/error.jsp b/apps/routerconsole/jsp/error.jsp index 69f9fbfa31..95218cc535 100644 --- a/apps/routerconsole/jsp/error.jsp +++ b/apps/routerconsole/jsp/error.jsp @@ -16,7 +16,13 @@ <%@include file="css.jsi" %> <%=intl.title("Page Not Found")%> - + + + <%@include file="summary.jsi" %>

<%=ERROR_CODE%> <%=ERROR_MESSAGE%>

diff --git a/apps/routerconsole/jsp/graph.jsp b/apps/routerconsole/jsp/graph.jsp index 6147fd96d0..4be37b3394 100644 --- a/apps/routerconsole/jsp/graph.jsp +++ b/apps/routerconsole/jsp/graph.jsp @@ -12,7 +12,13 @@ <% graphHelper.storeWriter(out); %> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Performance Graphs")%>

diff --git a/apps/routerconsole/jsp/graphs.jsp b/apps/routerconsole/jsp/graphs.jsp index 4b65cca75c..e3287e98c8 100644 --- a/apps/routerconsole/jsp/graphs.jsp +++ b/apps/routerconsole/jsp/graphs.jsp @@ -19,7 +19,13 @@ out.print(graphHelper.getRefreshMeta()); } %> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Performance Graphs")%>

diff --git a/apps/routerconsole/jsp/help.jsp b/apps/routerconsole/jsp/help.jsp index 265bbfb628..8c68cb5e9a 100644 --- a/apps/routerconsole/jsp/help.jsp +++ b/apps/routerconsole/jsp/help.jsp @@ -9,7 +9,13 @@ %> I2P Router Console - help <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

I2P Router Help & Support

diff --git a/apps/routerconsole/jsp/help_ar.jsp b/apps/routerconsole/jsp/help_ar.jsp index 4b471f594f..7e058678fa 100644 --- a/apps/routerconsole/jsp/help_ar.jsp +++ b/apps/routerconsole/jsp/help_ar.jsp @@ -9,7 +9,13 @@ %> I2P مساعدة لوحة التحكم <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

I2P مساعدة لوحة التحكم

diff --git a/apps/routerconsole/jsp/help_fr.jsp b/apps/routerconsole/jsp/help_fr.jsp index fd0f8bc268..01b000ac9b 100644 --- a/apps/routerconsole/jsp/help_fr.jsp +++ b/apps/routerconsole/jsp/help_fr.jsp @@ -9,7 +9,13 @@ %> Console du routeur I2P - Aide <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %> Traduction de mars 2011 (magma@mail.i2p)

Aide et assistance du routeur I2P

diff --git a/apps/routerconsole/jsp/help_nl.jsp b/apps/routerconsole/jsp/help_nl.jsp index 944e65e7b9..20defacaa9 100644 --- a/apps/routerconsole/jsp/help_nl.jsp +++ b/apps/routerconsole/jsp/help_nl.jsp @@ -9,7 +9,13 @@ %> I2P Router Console - help <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

I2P Router Help & Support

diff --git a/apps/routerconsole/jsp/help_ru.jsp b/apps/routerconsole/jsp/help_ru.jsp index d14da01386..55ea530c7d 100644 --- a/apps/routerconsole/jsp/help_ru.jsp +++ b/apps/routerconsole/jsp/help_ru.jsp @@ -9,7 +9,13 @@ %> Консоль маршрутизатора I2P - справка <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %>

Справка маршрутизатора I2P

diff --git a/apps/routerconsole/jsp/home.jsp b/apps/routerconsole/jsp/home.jsp index bd60d184d6..3bd3451519 100644 --- a/apps/routerconsole/jsp/home.jsp +++ b/apps/routerconsole/jsp/home.jsp @@ -6,9 +6,9 @@ <%=intl.title("home")%> <% @@ -20,6 +20,11 @@ %> " /> +<% + java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); +%> + + " /> @@ -28,19 +33,10 @@ -
<%@include file="xhr1.jsi" %>
-<% - if (!newshelper.shouldShowNews()) { -%> -

<%=intl._("News")%>


- -<% - } // !shouldShowNews() -%>
@@ -48,11 +44,8 @@ <% if (newshelper.shouldShowNews()) { - java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); %>
- -

diff --git a/apps/routerconsole/jsp/i2ptunnelmgr.jsp b/apps/routerconsole/jsp/i2ptunnelmgr.jsp new file mode 100644 index 0000000000..6ea41239ad --- /dev/null +++ b/apps/routerconsole/jsp/i2ptunnelmgr.jsp @@ -0,0 +1,41 @@ +<%@page contentType="text/html"%> +<%@page trimDirectiveWhitespaces="true"%> +<%@page pageEncoding="UTF-8"%> + +" /> +<% + // CSSHelper is also pulled in by css.jsi below... + boolean testIFrame = tester.allowIFrame(request.getHeader("User-Agent")); + if (!testIFrame) { + response.setStatus(302, "Moved"); + response.setHeader("Location", "/i2ptunnel/"); + } else { +%> + + + +<%@include file="css.jsi" %> +<%=intl.title("home")%> + + + + +<%@include file="summary.jsi" %> + +

<%=intl._("I2P Tunnel Manager")%>

+
+ +
+<% + } +%> diff --git a/apps/routerconsole/jsp/jars.jsp b/apps/routerconsole/jsp/jars.jsp index 4fa200b70b..dacd3d93fa 100644 --- a/apps/routerconsole/jsp/jars.jsp +++ b/apps/routerconsole/jsp/jars.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("Jar File Dump")%> - + + + <%@include file="summary.jsi" %>

Jar File Dump

diff --git a/apps/routerconsole/jsp/jobs.jsp b/apps/routerconsole/jsp/jobs.jsp index 2e2e712484..247fa298ef 100644 --- a/apps/routerconsole/jsp/jobs.jsp +++ b/apps/routerconsole/jsp/jobs.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("job queue")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Router Job Queue")%>

diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp index 373e386ebd..ed4b5c1216 100644 --- a/apps/routerconsole/jsp/logs.jsp +++ b/apps/routerconsole/jsp/logs.jsp @@ -5,7 +5,13 @@ <%@include file="css.jsi" %> <%=intl.title("logs")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Router Logs")%>

@@ -33,8 +39,10 @@

<%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%>

<%=intl._("Critical Logs")%>

+

<%=intl._("Router Logs")%> (<%=intl._("configure")%>)

+

<%=intl._("Service (Wrapper) Logs")%>


diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp index 1a7a429991..af661c2043 100644 --- a/apps/routerconsole/jsp/netdb.jsp +++ b/apps/routerconsole/jsp/netdb.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("network database")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Network Database")%>

diff --git a/apps/routerconsole/jsp/nowebapp.jsp b/apps/routerconsole/jsp/nowebapp.jsp index f62ae6b162..c18b8e41af 100644 --- a/apps/routerconsole/jsp/nowebapp.jsp +++ b/apps/routerconsole/jsp/nowebapp.jsp @@ -7,7 +7,13 @@ <%@include file="css.jsi" %> <%=intl.title("WebApp Not Found")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("Web Application Not Running")%>

diff --git a/apps/routerconsole/jsp/oldconsole.jsp b/apps/routerconsole/jsp/oldconsole.jsp index 7edb762409..cb0c186630 100644 --- a/apps/routerconsole/jsp/oldconsole.jsp +++ b/apps/routerconsole/jsp/oldconsole.jsp @@ -9,7 +9,13 @@ %> I2P Router Console - internals <%@include file="css.jsi" %> - + + + <%@include file="summary.jsi" %> " /> diff --git a/apps/routerconsole/jsp/peers.jsp b/apps/routerconsole/jsp/peers.jsp index 6b0ed6b67b..e23e4f73b9 100644 --- a/apps/routerconsole/jsp/peers.jsp +++ b/apps/routerconsole/jsp/peers.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("peer connections")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Network Peers")%>

diff --git a/apps/routerconsole/jsp/profiles.jsp b/apps/routerconsole/jsp/profiles.jsp index 4c33bb1fea..5f149ec243 100644 --- a/apps/routerconsole/jsp/profiles.jsp +++ b/apps/routerconsole/jsp/profiles.jsp @@ -6,7 +6,14 @@ <%@include file="css.jsi" %> <%=intl.title("peer profiles")%> -<%@include file="summary.jsi" %> + + + +<%@include file="summary.jsi" %>

<%=intl._("I2P Network Peer Profiles")%>

diff --git a/apps/routerconsole/jsp/stats.jsp b/apps/routerconsole/jsp/stats.jsp index c0596f7961..5750fae1c1 100644 --- a/apps/routerconsole/jsp/stats.jsp +++ b/apps/routerconsole/jsp/stats.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("statistics")%> - + + + <%@include file="summary.jsi" %> " /> diff --git a/apps/routerconsole/jsp/summary.jsi b/apps/routerconsole/jsp/summary.jsi index 847e42d523..0eb9d77b0b 100644 --- a/apps/routerconsole/jsp/summary.jsi +++ b/apps/routerconsole/jsp/summary.jsi @@ -1,3 +1,10 @@ + +" /> +<% + java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); +%> + +
<% // The refresh delay, 0 to disable @@ -15,7 +22,7 @@ newDelay = "?refresh=" + d; } if (!"0".equals(d)) - out.print("\n"); + out.print("
\n"); } else if (allowIFrame) { // since we don't have an iframe this will reload the base page, and // the new delay will be passed to the iframe above - out.print("
\n" + + out.print("
\n"); + "
\n"); } else { out.print("
\n"); } diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp index bdd4a8cbc1..218e78ba6a 100644 --- a/apps/routerconsole/jsp/summaryframe.jsp +++ b/apps/routerconsole/jsp/summaryframe.jsp @@ -52,11 +52,18 @@ } %>
+ +" /> +<% + java.io.File newspath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); +%> + + <%@include file="summarynoframe.jsi" %> <% // d and shutdownSoon defined above if (!shutdownSoon) { - out.print("
\n"); + out.print("
\n
\n"); if ("0".equals(d)) { out.print(""); out.print(intl._("Refresh (s)")); diff --git a/apps/routerconsole/jsp/summarynoframe.jsi b/apps/routerconsole/jsp/summarynoframe.jsi index 63c39e6e54..6fae7c9016 100644 --- a/apps/routerconsole/jsp/summarynoframe.jsi +++ b/apps/routerconsole/jsp/summarynoframe.jsi @@ -1,35 +1,17 @@ -<%@page import="net.i2p.router.web.SummaryHelper" %> <% /* - * Note: - * This is included almost 30 times, so keep whitespace etc. to a minimum. + * TODO - the bar would render more cleanly if we specified the img height and width here, + * but unfortunately the images in the different themes are different sizes. + * They range in height from 37 to 43 px. But there's a -2 bottom margin... + * So put it in a div. */ %> - -" /> -" /> -" /> -" /> - -<% helper.storeWriter(out); %> -<% -/* - * The following is required for the reseed button to work, although we probably - * only need the reseedNonce property. - */ -%> - - -<% -/* - * The following is required for the update buttons to work, although we probably - * only need the updateNonce property. - */ -%> - - -" /> -<% - // moved to java for ease of translation and to avoid 30 copies - helper.renderSummaryBar(); -%> + +
+ +<%@include file="xhr1.jsi" %> +
diff --git a/apps/routerconsole/jsp/tunnels.jsp b/apps/routerconsole/jsp/tunnels.jsp index 32f86475ae..332381a95a 100644 --- a/apps/routerconsole/jsp/tunnels.jsp +++ b/apps/routerconsole/jsp/tunnels.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("tunnel summary")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("I2P Tunnel Summary")%>

diff --git a/apps/routerconsole/jsp/viewprofile.jsp b/apps/routerconsole/jsp/viewprofile.jsp index 8747a6d88b..635aafb348 100644 --- a/apps/routerconsole/jsp/viewprofile.jsp +++ b/apps/routerconsole/jsp/viewprofile.jsp @@ -6,7 +6,13 @@ <%@include file="css.jsi" %> <%=intl.title("Peer Profile")%> - + + + <%@include file="summary.jsi" %>

<%=intl._("Peer Profile")%>

diff --git a/apps/routerconsole/jsp/xhr1.jsi b/apps/routerconsole/jsp/xhr1.jsi index a171d0c852..1362cca1f7 100644 --- a/apps/routerconsole/jsp/xhr1.jsi +++ b/apps/routerconsole/jsp/xhr1.jsi @@ -1,24 +1,41 @@ +<%@page import="net.i2p.router.web.SummaryHelper" %> +<% +/* + * Note: + * This is included on every refresh, so keep whitespace etc. to a minimum. + */ +%> " /> " /> -
<%=intl._("Version")%>: - -
<%=intl._("Uptime")%>: - -

" /> " /> <% String reqURI = request.getRequestURI(); if (reqURI != null) - reqURI = reqURI.replace("/xhr1.jsp", "/home"); + reqURI = reqURI.replace("/xhr1.jsp", "/"); helper.setRequestURI(reqURI); %> -

"><%=intl._("Network")%>: -

-
- - -
- - +<% helper.storeWriter(out); %> +<% helper.storeNewsHelper(newshelper); %> +<% +/* + * The following is required for the reseed button to work, although we probably + * only need the reseedNonce property. + */ +%> + + +<% +/* + * The following is required for the update buttons to work, although we probably + * only need the updateNonce property. + */ +%> + + +" /> +<% + // moved to java for ease of translation + helper.renderSummaryBar(); +%> diff --git a/apps/routerconsole/jsp/xhr1.jsp b/apps/routerconsole/jsp/xhr1.jsp index 95c27683b7..b48e824421 100644 --- a/apps/routerconsole/jsp/xhr1.jsp +++ b/apps/routerconsole/jsp/xhr1.jsp @@ -11,4 +11,11 @@ %> " /> + +" /> +<% + java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getRouterDir(), "docs/news.xml"); +%> + + <%@include file="xhr1.jsi" %> diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css index 5e205ed711..662a637a9c 100644 --- a/installer/resources/themes/console/dark/console.css +++ b/installer/resources/themes/console/dark/console.css @@ -1,1247 +1,1256 @@ -/* I2P Theme: Camo aka Dark */ -/* Description: Military Grade. */ -/* Comment: Thanks to Florian Kuhlmann for the hatface images. [ http://www.flickr.com/photos/floriankuhlmann/] -/* Author: dr|z3d */ - -body { - margin: 5px 0px 0 0px; - padding: 0; - text-align: center; - background: #010 url('images/camotile.png') center bottom; - color: #EE9; - font: 8.5pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - -} - -.hide { - display: none; -} - -div.clearer { - clear: left; - height: 0; - line-height: 0; -} - -img { - border: none; -} - -pre { - width: 98%; - overflow-x: scroll; - text-align: left; - font: 8.5pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; - color: #EE9; -} - -div.logo { - float: left; - padding: 10px; - text-align: center; - font-color: #EE9; - margin: 0 20px 0 20px; - border: 1px solid #494; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - background: #000; /*url("images/camotile2.png");*/ - width: 185px; - -moz-box-shadow: inset 0px 0px 1px 0px #009; - -khtml-box-shadow: inset 0px 0px 1px 0px #009; - box-shadow: inset 0px 0px 1px 0px #009; -} - -div.logo hr { - color: #494; - background: #494; - height: 1px; - border: 0px solid #494; - margin: 10px 0 5px; -} - -div.toolbar { - margin: 0; - padding: 10px; - font-weight: bold; - background: #000; - border: 1px solid #000; - display: none; -} - -div.toolbar a:link { - border: 1px outset #ddddc0; - padding: 0px 5px 1px 5px; - background: #bbf; - text-decoration: none; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - color: #000; -} - -div.toolbar a:visited { - background: #ddf; -} - -div.toolbar a:hover, button:hover{ - border: 1px solid #f60; - background: #030; - color: #f60; -} - -a:active{ - color: #900; -} - -div.routersummaryouter { - float: left; - width: 200px; - margin: 0 0 10px 5px; - padding: 0; - border: 0; - clear: left;/* fixes a bug in Opera */ - text-align: center; - display: block; - position: absolute;/* so no interference with /home app icons */ -} - -div.routersummary { - width: 173px; - padding: 10px; - text-align: center; - border: 1px solid #494; - background: #000 url(images/camotile2.png); - color: #EE9; - font-size: 8pt; - clear: left;/* fixes a bug in Opera */ - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - float: left; - -moz-box-shadow: 0 1px 5px #000; - -khtml-box-shadow: 0 1px 5px #000; - box-shadow: 0 1px 5px #000; -} - -div.routersummary input[type=text] { - text-align: right !important; - -moz-box-shadow: inset 1px 1px 1px 0px #000; - -khtml-box-shadow: inset 1px 1px 1px 0px #000; - box-shadow: inset 1px 1px 1px 0px #000; -} - -div.routersummary hr { - color: #494; - background: #494; - height: 2px; - border-bottom: 1px solid #494; - margin: 8px -10px 7px -10px; - -moz-box-shadow: inset 0px 1px 1px 1px #000; - -khtml-box-shadow: inset 0px 1px 1px 1px #000; - box-shadow: inset 0px 1px 1px 1px #000; -} - -div.routersummary h3 { - border: 0; - font-size: 9.5pt; - letter-spacing: 0.04em; - margin: -7px -10px -8px -10px; - padding: 3px 0 4px 0 !important; - text-transform: uppercase; - -moz-border-radius: 0; - -khtml-border-radius: 0; - border-radius: 0; - background: #000 url('images/header.png') center center ; - background-image: -moz-linear-gradient(top, bottom, from(#050), to(#030), color-stop(7%, #000), color-stop(100%, #050)); -} - -div.routersummary h4 { - border: 0; - border-bottom: 0 !important; - font-size: 8pt; - letter-spacing: 0.02em; - margin: -7px -9px -10px -9px !important; - padding: 6px 3px 8px 3px; - background: #000; - text-transform: capitalize; - text-decoration: none !important; - color: #2b2; - background-image: -moz-linear-gradient(top, bottom, from(#000), to(#050), color-stop(10%, #050), color-stop(100%, #004)); - line-height: 100%; -} - -div.routersummary table { - border: 0; - text-align: center !important; - margin: -5px -7px -5px -8px !important; - width: 188px !important; - overflow: hidden; - font-size: 8pt; - padding: 0 -10px; - background-image: none !important; - background-color: transparent !important; -} - -div.routersummary tr { - background-image: none !important; - background-color: transparent !important; - border: 0 !important; -} - -div.routersummary form { - margin: -5px 0 -7px; -} - -div.routersummary form:first-child { - margin: 6px 0 -5px 0 !important; -} - -div.routersummary p { - padding: 0; -} - -div.refresh { - margin-top: -10px !important; - margin-bottom: -4px !important; - padding: 2px 0 0px 0 !important; -} - -div.routersummary a:link, div.routersummary a:visited { - text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8); - text-shadow: 0px 0px 2px #101 !important; -} - -div.routersummary a:hover { - text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); - color: #f60; -} - -div.routersummary td { - padding: 0px 2px 0px 2px; - background-image: none !important; - border: 0 !important; -} - -div routersummary hr:last-child { - margin-top: 5px; - margin-bottom: -5px !important; -} - -div.tunnels { - padding-top: 3px !important; - margin-left: -4px; - text-align: center; -} - -div.tunnels table { - margin: -5px 0 -5px -3px !important; -} - -div.tunnels td { - padding: 1px 0px 1px 0px; -} - -div.tunnels td:first-child { - width: 16px; - text-align: left; - padding-right: 2px; -} - -div.tunnels td:last-child { - text-align: right; - padding-right: 1px; -} - -div.tunnels tr { -/* border: 1px solid #494 !important;*/ -} - -div.warning { - margin: 20px 20px 20px 245px; - padding: 5px 25px 20px 75px; - background: #000; - border: 1px solid #494; - text-align: left; - color: #EE9; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - text-align: justify; - background-image:url("../images/itoopie_sm.png"); - background-position:10px center; - background-repeat:no-repeat; - -moz-box-shadow: inset 0px 0px 0px 1px #f00; - -khtml-box-shadow: inset 0px 0px 0px 1px #f00; - box-shadow: inset 0px 0px 0px 1px #f00; - word-wrap: break-word; -} - -/* console error messages */ - -div.sorry { - margin: -1px 5px 10px 205px; - padding: 20px 20px 20px 75px; - background: #020; - border: 1px solid #494; - -moz-border-radius: 0 0 4px 4px; - -khtml-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; - text-align: justify; - background-image:url("images/errortriangle.png"); - background-position:15px center; - background-repeat:no-repeat; - -moz-box-shadow: inset 0px 0px 0px 1px #d00; - word-wrap: break-word; - font-weight: bold; - color: #EE9; -} - -div.sorry hr { - color: #EE9; - background: #EE9; - height: 1px; - border: 1px solid #EE9; - margin: 10px 0; -} - -div.main { - margin: -1px 5px 5px 205px; - padding: 0 15px 15px 15px; - text-align: left; - color: #EE9; - width: auto; -/* overflow-x: scroll; */ - border: 1px solid #494; - -moz-border-radius: 0 0 4px 4px; - -khtml-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; - background: #000 url(images/scarface.jpg) right bottom no-repeat !important; - min-width: 620px; - -moz-box-shadow: 0 1px 5px #000; -} - -div.main textarea { - background: #000; - color: #EE9; - font: 8pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; -} - -div.news { - margin: -1px 5px 0px 205px; - padding: 4px 30px 4px 30px; - border: 1px solid #494; - background: #000; - background: #000 url("images/news.png")no-repeat scroll bottom right; - color: #7b7; -/* border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - -khtml-border-radius: 4px 4px 0 0;*/ - font-size: 7.5pt; - text-align: right; - -moz-box-shadow: 0 1px 5px #000; - -khtml-box-shadow: 0 1px 5px #000; - box-shadow: 0 1px 5px #000; - min-width: 580px; -/* height: 164px; - overflow-y: auto;*/ -} - -div.news li { - text-align: justify; - list-style: url('images/info_dark.png'); - list-style: none; - margin: 0; - padding: 5px 5px 5px 0; - vertical-align: middle; - word-wrap: break-word; - color: #494; - font-weight: bold; - font-size: 9.5pt; - border-bottom: 1px dotted #494; - margin-bottom: 5px; - text-transform: capitalize; -} - -div.news h3 { - text-align: left !important; - font-size: 9.5pt; -} - -div.news h4 { - border-bottom: 1px; - border-bottom-style: dotted; - border-bottom-color: #494; - padding: 0 0 0px 0; - margin: 5px 0 10px 0; - font-size: 10pt; - opacity: 1; - text-transform: capitalize; -} - -div.news h4:first-child { - background: url('../images/itoopbullet.png'); - background-repeat: no-repeat; - background-position: right; -} - -div.news p { - margin-top: -5px; - font-size: 8.5pt; - color: #EE9; - margin-bottom: 0; -} - -div.news p:nth-child(n+1) { - margin-top: 5px; -} - -div.news hr { - margin: 8px 0 3px 0; -} - -div.confignav { - padding: 15px 10px !important; - margin: 15px 0; - background: #000 url('images/header.png') center center repeat-x ; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 1px solid #494; - font-size: 9.5pt !important; - font-weight: bold !important; - line-height: 160% !important; - -} - -div.configure { -/* padding: 5px 15px 0 15px; - margin: 10px 0px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 1px solid #494; */ - background: none;/* url(images/camotile2.png);*/ -} - -div.messages { - padding: 10px; - margin: 10px 0 15px 0; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 1px solid #494; - background: #000 /*url('images/infotile.png') center left no-repeat;*/ - font-weight: bold; - font-size: 9pt; - color: #4f4; -} - -div.messages span.error { - color: #d90; -} - -div.messages span.notice { - font-style: italic; -} - -div.messages li { - text-align: justify !important; - font-weight: bold; - list-style: url(images/warning_dark.png) !important; - margin: 0 5px 0 50px !important; - padding: 0 10px 0 0 !important; - border: 0px !important; -} - -div.graphspanel { - padding: 0; - margin: 15px 0px -15px 0; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; -/* border: 1px solid #494;*/ - background: none;/* url(images/camotile.png);*/ - text-align: center; -} - -div.widepanel h3 { - text-align: left !important; -} - -div.graphspanel form { - text-align: left; - padding: 0 15px 0px 15px; -} - -div.graphspanel hr { - margin: 10px -15px 10px -15px; -} - -div.graphspanel img { - border: 1px solid #494; - padding: 3px; - margin: 5px; - text-align: center !important; - background: #000; - - opacity: 0.8; -} - -div.graphspanel img:hover { - border: 1px solid #000; - padding: 3px; - margin: 5px; - text-align: center !important; - background: #000; - -moz-box-shadow: inset 0px 0px 1px 1px #f60; - -khtml-box-shadow: inset 0px 0px 1px 1px #f60; - box-shadow: inset 0px 0px 1px 1px #f60; - opacity: 1; -} - -table { - border-collapse: collapse; - width: 100%; - border: 1px solid #494; - cell-padding: 1px; - font-size: 8pt; - background: #030; - margin: 1px 0; -} - -table hr { - padding: 0px 0; - color: #494; - background: #494; - border: 0px solid #494; - margin: 0px 0px; - height: 1px; - display: none; -} - -th { - padding: 6px 2px; - color: #EE9; - text-align: center; - font-size: 9pt; - background: #000; /*url('images/tabletitledark.png') repeat-x;*/ - background: #000 url('images/header.png') center center repeat-x ; - border-top: 1px solid #494; - border-bottom: 1px solid #494 !important; - line-height: 110%; -} - -tr { - vertical-align: middle; -} - -tr:nth-child(even) { - background: #010;/* url('images/darkerbluetile.png') !important;*/ - vertical-align: middle; -} - -tr:nth-child(odd) { - background: #000800;/* url('images/darkbluetile.png') !important;*/ - vertical-align: middle; -} -/* -tr:last-child { - background: #004 url('images/lightbluetile.png') !important; - font-weight: bold; - border: 1px solid #494 !important; -} -*/ -td { - padding: 4px 6px; - color: #EE9; - vertical-align: middle; - border-top: 1px inset #494; - border-bottom: 1px outset #494; -} - -td img { - padding: 0 1px 0 2px; -} - -tt { - font: bold 8pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; - color: #FF0; - padding: 0 5px 2px 0; -} - -div.main li { - text-align: left; - list-style: square; - margin: 2px 0px 2px 30px; - padding: 2px 20px 2px 0px; -/* line-height: 150%;*/ - word-wrap: break-word; -} - - -div.main li b { - color: #b70 !important; - letter-spacing: 0.07em; - font-size: 8.5pt; - text-shadow: 0 1px 1px #700; -} - -.tidylist { - text-align: justify !important; - line-height: 150%; -} - -.tidylist:first-child { -/* padding-top: 5px;*/ -} - -.tidylist:last-child { - padding-bottom: 10px; -} - -.tidylist code { - text-align: left; - font: 8.5pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; - color: #dd0; - padding: 1px 2px; - background: #030; - margin: 0 2px; -} - -ol { - display: inline; - margin: 1px 0 0 0; - padding: 1px 0 0 20px; -} - -ul { -/* display: inline; */ - margin: 0; - padding: 0; -} - -code { - text-align: left; - font: 8.5pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; - color: #dd0; - padding: 1px 2px; -} - -a:link, h2 a:link{ - color: #494; - text-decoration: none; - font-weight: bold; - word-wrap: break-word; -} - -a:visited{ - color: #7b7; - text-decoration: none; - font-weight: bold; - word-wrap: break-word; -} - -a:hover{ - color: #f60; - text-decoration: underline; - font-weight: bold; - word-wrap: break-word; -} - -.links { - padding-bottom: -2px; - text-align: justify; - margin-top: 10px; - margin-bottom: -10px; -} - -.links li { - list-style-image: url("images/link.png") !important; -} - -.links b{ - color: #b70 !important; - letter-spacing: 0.07em; - font-size: 8.5pt; - line-height: 165%; - text-shadow: 0 1px 1px #700; -} - -p { - text-align: justify; - line-height: 160%; -} - -p img:first-child{ - display: none !important; -} - -h1 { - text-align: left; - color: #EE9; - padding: 14px 15px; - margin: 0 5px 0px 205px !important; - font-size: 17pt; - font-weight: bold; - font-style: normal; - text-transform: uppercase; - letter-spacing: 0.15em; - text-shadow: 0px 0px 2px #010; - white-space: normal; - background: #000 url("images/scope.png")no-repeat scroll right top; - background: #000 url("images/bg2.png")no-repeat scroll top right; - background: #000 url('images/header.png') center center; - background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000)); - border: 1px solid #494; - border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - -khtml-border-radius: 4px 4px 0 0; - line-height: 120%; - min-width: 620px; - -moz-box-shadow: 0 1px 5px #000; - -khtml-box-shadow: 0 1px 5px #000; - box-shadow: 0 1px 5px #000; -} - -h2 { - font-size: 12pt; - color: #EE9; - text-shadow: 0px 0px 2px #010; - letter-spacing: 0.05em; - background: #000 url(images/camotile2.png); - background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000)); - background: #000 url('images/header.png') center center ; - padding: 10px; - wordwrap: none; - border: 1px solid #494; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - vertical-align: middle; - margin: 15px 0 12px 0 !important; - text-transform: uppercase; - word-wrap: break-word; -} - -h2 a:visited { - color: #191; -} - -h2 a:hover { - color: #f60; - text-shadow: 0px 0px 1px rgba(255, 64, 0, 0.7); -} - -h3 { - border: 1px solid #494; - border-left: 5px solid #494; - padding: 5px 6px 7px; - margin: 12px 0 10px 0; - border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - -khtml-border-radius: 0 4px 4px 0; - background: #000 url(images/camotile.png); - background: #000 url('images/header.png') center center ; - text-transform: uppercase; - text-shadow: 0px 0px 2px #010; -} - -h4 { - border-bottom: 1px; - border-bottom-style: solid; - border-bottom-color: #494; - padding: 0 0 10px 0; - margin: 5px 0 10px 0; - font-size: 11pt; -} - -button, button:visited { - font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px outset #191; - padding: 1px 3px; - text-decoration: none; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - font-size: 8pt; - font-weight: bold; - margin: 2px 3px; - text-align: center; - vertical-align: middle; - min-width: 76px; - -moz-box-shadow: inset 0px 1px 1px 0px #494; - -khtml-box-shadow: inset 0px 1px 1px 0px #191; - box-shadow: inset 0px 1px 1px 0px #191; - background: #000; - color: #494; -} - -button:hover { - border: 1px solid #f60; - -moz-box-shadow: inset 0px 1px 1px 0px #EE9; - -khtml-box-shadow: inset 0px 1px 1px 0px #EE9; - box-shadow: inset 0px 1px 1px 0px #EE9; - background: #000; - color: #f60; -} - -button:active { - border: 1px inset #f60; - background: #f60; - color: #EE9; - -moz-box-shadow: inset 0px 0px 0px 0px #f60; - -khtml-box-shadow: inset 0px 0px 0px 0px #f60; - box-shadow: inset 0px 0px 0px 0px #f60; -} - -.underline { - border-bottom: 1px solid #eeeeff; - padding: 5px 0px 5px 0px; - margin: 0px 0px 10px 0px; -} - -.langbox { - margin: 5px 3px 2px 5px; - padding: 0; - color: #EE9; - font-size: 7pt; - width: 260px; - text-align: right; - float: right; - vertical-align: middle; -} - -.langbox img { - opacity: 0.5; - -moz-box-shadow: 0 0 1px #000; -} - -.langbox img:hover { - opacity: 1; - -moz-box-shadow: 0 0 1px #f60; -} - -hr { - color: #494; - background: #494; - height: 1px; - border: 0px solid #494; - margin: 20px 0 10px; -} - -hr:last-child { - margin-top: 20px; - margin-bottom: 20px; -} - -sidebarlogo { - text-align: center; -} - -input { - border: 1px outset #5f5; - -moz-box-shadow: inset 0px 1px 1px 0px #373; - -khtml-box-shadow: inset 0px 1px 1px 0px #373; - box-shadow: inset 0px 1px 1px 0px #373; - background: #000; - color: #494; - margin: 5px; - font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - padding: 1px 2px; - text-decoration: none; - min-width: 110px; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; -} - -input:hover { - background: #000; - color: #f60; - border: 1px solid #f60; - -moz-box-shadow: inset 0px 1px 1px 0px #9e9; - -khtml-box-shadow: inset 0px 1px 1px 0px #9e9; - box-shadow: inset 0px 1px 1px 0px #9e9; -} - -input:active { - background: #000; - color: #f30; - border: 1px solid #f30; -} - -input:active { - border: 1px inset #f60; - background: #f60; - color: #EE9; -} - -input[type=text] { - background: #000; - color: #EE9; - margin: 5px 10px; - padding: 4px 2px; - font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px solid #494 !important; - text-decoration: none; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - -moz-box-shadow: inset 1px 1px 1px 0px #000; - -khtml-box-shadow: inset 1px 1px 1px 0px #000; - box-shadow: inset 1px 1px 1px 0px #000; -} - -input[type=text]:active, input[type=text]:hover { - background: #000; -} - -fieldset { -overflow: hidden; -position: relative; -} - -select { - background: #000; - color: #EE9; - margin: 5px 10px; - border: 1px solid #494; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - min-width: 110px; - font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - padding: 2px; -} - -textarea { - background: #000; - color: #EE9; - padding: 5px; - margin: 10px; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - font: 8.5pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; - min-height: 100px; - min-width: 97%; - text-align: left; - border: 1px solid #494; -} - -form {} - -.proxyfooter { - margin: 0 20px 10px 240px; - padding: 20px 25px 20px 75px; - font-color: #f00; - font-size: 7pt; - text-align: right !important; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border: 1px solid #000; - display: none; -} - -.statusnotes { - font-style: italic; - font-size: 8pt; - color: #EE9; - text-align: center; - border: 1px solid #494 !important; -/* border-top: 0px !important;*/ - margin: -3px 0 5px 0; - padding: 7px; - background: #010; - -moz-box-shadow: inset 0px 0px 0px 1px #090; - -khtml-box-shadow: inset 0px 0px 0px 1px #090; - box-shadow: inset 0px 0px 0px 1px #090; -/* background: #000 url('images/header.png') repeat-x center center !important;*/ -} - -div.joblog { -/* margin: 15px 0 15px 0; - padding: 5px 20px 10px 20px !important; - border: 1px solid #494; - background-color: #000; - background: #000; url("images/camotile.png");*/ -/* color: #dfd;*/ - border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - -khtml-border-radius: 4px 4px 0 0; - text-align: justify !important; - overflow-x: auto; /* Opera fix */ - } - -div.joblog h3 { - margin-top: 10px; -} - -div.main li { - text-align: left; - list-style: square; - margin: 2px 0px 2px 30px; - padding: 2px 20px 2px 0px; -/* line-height: 150%;*/ - word-wrap: break-word; -} - -div.joblog li { - word-wrap: break-word !important; - text-align: justify !important; - line-height: 120% !important; - margin: 2px 0px 2px 30px; - padding: 2px 20px 2px 0px; -} - -div.joblog ul { - word-wrap: break-word !important; - text-align: justify; - margin: 0; -} - -div.joblog li:first-child { - margin-top: 0px; -} - -div.joblog li:last-child { - margin-bottom: -10px; -} - -div.joblog form:first-child { - margin-top: 10px; -} - -div.joblog table { - margin-top: 15px; -} - -div.joblog p { - line-height: 140%; -} - -.smallhead { - font-size: 7pt -} - -.mediumtags { - font-size: 8.5pt; -} - -.optbox { - min-width: 16px !important; - max-width: 16px !important; - width: 16px !important; - min-height: 16px; - max-height: 16px; - height: 16px; - opacity: 1.0; - border: 0; - margin: 5px 5px 5px 10px; - padding: 2px; - overflow: hidden; - position: relative; -} - -.optbox:hover { - min-width: 16px !important; - max-width: 16px !important; - width: 16px !important; - min-height: 16px; - max-height: 16px; - height: 16px; - opacity: 1.0; - border: 0; - margin: 5px 5px 5px 10px; - padding: 2px; -} - -.cells { - border: 1px inset #494; - border-left: 1px outset #494; -} - -.tablefooter tr, .tablefooter td { - background: #000 url('images/header.png') repeat-x center center !important; - border-top: 1px solid #494; - border-bottom: 1px solid #494 !important; - font-size: 7pt; - line-height: 110%; - padding: 5px 5px 10px; -} - -.formaction { - text-align: right; - margin-bottom: -5px; -} - -div.footnote { - text-align: right; - color: #494; - font-size: 7pt; - margin-bottom: -8px !important; -} - -div.footnote hr{ - margin: 10px 0 5px 0 !important; - color: #494; - background: #494; - height: 1px; - border: 0px solid #494; -} - -.topness { - font-size: 7.5pt; - text-align: right; - margin-top: -5px; - margin-bottom: -5px; - margin-right: 5px; -} - -/* begin home page */ - -/* -#appsummary { - clear: none; - float: none; - left: 10px; - margin: 0; - position: absolute; - top: 10px; -} - -#homemain { - left: 217px; - margin: 0 10px 10px 0; - position: absolute; - top: 10px; -} - -#homenews { - margin: 0 10px 5px 0; -} - -h2.app { - border-radius: 8px; - margin: 1px 10px 15px 0 !important; -} -*/ - -h4.app, h4.app2 { - background: url('images/header.png') center center repeat-x; - border: 1px solid #449944; - font-size: 10pt; - font-variant: small-caps; - letter-spacing: 2px; - margin: 12px 0 -10px 0; - padding: 7px 8px 7px; - text-transform: uppercase; - border-radius: 4px; - text-align: left; -} - -h4.app2 { - clear: left; - margin-top: 5px !important; -} - -div.ag2 { - margin: 0; -} - -div.app { - float: left; - padding: 5px 0 0 !important; - width: 137px; - border: 1px solid #494; - background: #000; - background-image: -moz-linear-gradient(center top , #000B00, #000); - border-radius: 3px; - margin: 5px; - height: 72px; - text-align: center !important; - padding-top: 5px; - opacity: 0.9; - box-shadow: 0 1px 5px #000000; -} - -div.app:hover { - opacity: 1; - border: 1px solid #f60; - background: #000; - box-shadow: none; -} - -div.app:last-child { - margin-bottom: 12px; -} - -div.appgroup { - margin: 0; - padding: 16px 8px; - width: auto; -} - -div.search { - margin: 10px 10px 0 0; - padding: 8px 8px 0 8px; - width: auto; -} - -table.search { - background: none; - padding: 8px; - width: auto; - margin-left:auto; - margin-right:auto; -} - -img.app { - height: 32px; - width: 32px; - padding: 6px 0 8px 0; - margin-bottom: 3px; -} - -img.app2p { - height: 40px; - padding: 5px 6px 0px 6px; - margin-bottom: 3px; -} - -table.app { - background: none; - border: 0; - margin: auto; - width: auto; -} - -tr.app { - background: none; - border: 0; - margin: 0; -} - -td.app { - background: none; - border: 0; - margin: 0; - padding: 3px 0 0; -} - -div.applabel { - border-radius: 3px; - border-width: 1px; - font-size: 7.5pt; - margin: 0; - padding: 3px 0; - text-align: center; - vertical-align: bottom; - line-height: 95%; - text-transform: lowercase; - border: none; -} - -/* end home page */ +/* I2P Theme: Camo aka Dark */ +/* Description: Military Grade. */ +/* Comment: Thanks to Florian Kuhlmann for the hatface images. [ http://www.flickr.com/photos/floriankuhlmann/] +/* Author: dr|z3d */ + +body { + margin: 5px 0px 0 0px; + padding: 0; + text-align: center; + background: #010 url('images/camotile.png') center bottom; + color: #EE9; + font: 8.5pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + +} + +.hide { + display: none; +} + +div.clearer { + clear: left; + height: 0; + line-height: 0; +} + +img { + border: none; +} + +pre { + width: 98%; + overflow-x: scroll; + text-align: left; + font: 8.5pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; + color: #EE9; +} + +div.logo { + float: left; + padding: 10px; + text-align: center; + font-color: #EE9; + margin: 0 20px 0 20px; + border: 1px solid #494; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + background: #000; /*url("images/camotile2.png");*/ + width: 185px; + -moz-box-shadow: inset 0px 0px 1px 0px #009; + -khtml-box-shadow: inset 0px 0px 1px 0px #009; + box-shadow: inset 0px 0px 1px 0px #009; +} + +div.logo hr { + color: #494; + background: #494; + height: 1px; + border: 0px solid #494; + margin: 10px 0 5px; +} + +div.toolbar { + margin: 0; + padding: 10px; + font-weight: bold; + background: #000; + border: 1px solid #000; + display: none; +} + +div.toolbar a:link { + border: 1px outset #ddddc0; + padding: 0px 5px 1px 5px; + background: #bbf; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + color: #000; +} + +div.toolbar a:visited { + background: #ddf; +} + +div.toolbar a:hover, button:hover{ + border: 1px solid #f60; + background: #030; + color: #f60; +} + +a:active{ + color: #900; +} + +div.routersummaryouter { + float: left; + width: 200px; + margin: 0 0 10px 5px; + padding: 0; + border: 0; + clear: left;/* fixes a bug in Opera */ + text-align: center; + display: block; + position: absolute;/* so no interference with /home app icons */ +} + +div.routersummary { + width: 173px; + padding: 10px; + text-align: center; + border: 1px solid #494; + background: #000 url(images/camotile2.png); + color: #EE9; + font-size: 8pt; + clear: left;/* fixes a bug in Opera */ + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + float: left; + -moz-box-shadow: 0 1px 5px #000; + -khtml-box-shadow: 0 1px 5px #000; + box-shadow: 0 1px 5px #000; +} + +div.routersummary input[type=text] { + text-align: right !important; + -moz-box-shadow: inset 1px 1px 1px 0px #000; + -khtml-box-shadow: inset 1px 1px 1px 0px #000; + box-shadow: inset 1px 1px 1px 0px #000; +} + +div.routersummary hr { + color: #494; + background: #494; + height: 2px; + border-bottom: 1px solid #494; + margin: 8px -10px 7px -10px; + -moz-box-shadow: inset 0px 1px 1px 1px #000; + -khtml-box-shadow: inset 0px 1px 1px 1px #000; + box-shadow: inset 0px 1px 1px 1px #000; +} + +div.routersummary h3 { + border: 0; + font-size: 9.5pt; + letter-spacing: 0.04em; + margin: -7px -10px -8px -10px; + padding: 3px 0 4px 0 !important; + text-transform: uppercase; + -moz-border-radius: 0; + -khtml-border-radius: 0; + border-radius: 0; + background: #000 url('images/header.png') center center ; + background-image: -moz-linear-gradient(top, bottom, from(#050), to(#030), color-stop(7%, #000), color-stop(100%, #050)); +} + +div.routersummary h4 { + border: 0; + border-bottom: 0 !important; + font-size: 8pt; + letter-spacing: 0.02em; + margin: -7px -9px -10px -9px !important; + padding: 6px 3px 8px 3px; + background: #000; + text-transform: capitalize; + text-decoration: none !important; + color: #2b2; + background-image: -moz-linear-gradient(top, bottom, from(#000), to(#050), color-stop(10%, #050), color-stop(100%, #004)); + line-height: 100%; +} + +div.routersummary ul { + text-align: left !important; +} + +div.routersummary table { + border: 0; + text-align: center !important; + margin: -5px -7px -5px -8px !important; + width: 188px !important; + overflow: hidden; + font-size: 8pt; + padding: 0 -10px; + background-image: none !important; + background-color: transparent !important; +} + +div.routersummary tr { + background-image: none !important; + background-color: transparent !important; + border: 0 !important; +} + +div.routersummary form { + margin: -5px 0 -7px; +} + +div.routersummary form:first-child { + margin: 6px 0 -5px 0 !important; +} + +div.routersummary p { + padding: 0; +} + +div.refresh { + margin-top: -10px !important; + margin-bottom: -4px !important; + padding: 2px 0 0px 0 !important; +} + +div.routersummary a:link, div.routersummary a:visited { + text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8); + text-shadow: 0px 0px 2px #101 !important; +} + +div.routersummary a:hover { + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); + color: #f60; +} + +div.routersummary td { + padding: 0px 2px 0px 2px; + background-image: none !important; + border: 0 !important; +} + +div routersummary hr:last-child { + margin-top: 5px; + margin-bottom: -5px !important; +} + +div.newsheadings { + text-align: right; + margin: 0 0 0 10px; +} + +div.tunnels { + padding-top: 3px !important; + margin-left: -4px; + text-align: center; +} + +div.tunnels table { + margin: -5px 0 -5px -3px !important; +} + +div.tunnels td { + padding: 1px 0px 1px 0px; +} + +div.tunnels td:first-child { + width: 16px; + text-align: left; + padding-right: 2px; +} + +div.tunnels td:last-child { + text-align: right; + padding-right: 1px; +} + +div.tunnels tr { +/* border: 1px solid #494 !important;*/ +} + +div.warning { + margin: 20px 20px 20px 245px; + padding: 5px 25px 20px 75px; + background: #000; + border: 1px solid #494; + text-align: left; + color: #EE9; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + text-align: justify; + background-image:url("../images/itoopie_sm.png"); + background-position:10px center; + background-repeat:no-repeat; + -moz-box-shadow: inset 0px 0px 0px 1px #f00; + -khtml-box-shadow: inset 0px 0px 0px 1px #f00; + box-shadow: inset 0px 0px 0px 1px #f00; + word-wrap: break-word; +} + +/* console error messages */ + +div.sorry { + margin: -1px 5px 10px 205px; + padding: 20px 20px 20px 75px; + background: #020; + border: 1px solid #494; + -moz-border-radius: 0 0 4px 4px; + -khtml-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; + text-align: justify; + background-image:url("images/errortriangle.png"); + background-position:15px center; + background-repeat:no-repeat; + -moz-box-shadow: inset 0px 0px 0px 1px #d00; + word-wrap: break-word; + font-weight: bold; + color: #EE9; +} + +div.sorry hr { + color: #EE9; + background: #EE9; + height: 1px; + border: 1px solid #EE9; + margin: 10px 0; +} + +div.main { + margin: -1px 5px 5px 205px; + padding: 0 15px 15px 15px; + text-align: left; + color: #EE9; + width: auto; +/* overflow-x: scroll; */ + border: 1px solid #494; + -moz-border-radius: 0 0 4px 4px; + -khtml-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; + background: #000 url(images/scarface.jpg) right bottom no-repeat !important; + min-width: 620px; + -moz-box-shadow: 0 1px 5px #000; +} + +div.main textarea { + background: #000; + color: #EE9; + font: 8pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; +} + +div.news { + margin: -1px 5px 0px 205px; + padding: 4px 30px 4px 30px; + border: 1px solid #494; + background: #000; + background: #000 url("images/news.png")no-repeat scroll bottom right; + color: #7b7; +/* border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + -khtml-border-radius: 4px 4px 0 0;*/ + font-size: 7.5pt; + text-align: right; + -moz-box-shadow: 0 1px 5px #000; + -khtml-box-shadow: 0 1px 5px #000; + box-shadow: 0 1px 5px #000; + min-width: 580px; +/* height: 164px; + overflow-y: auto;*/ +} + +div.news li { + text-align: justify; + list-style: url('images/info_dark.png'); + list-style: none; + margin: 0; + padding: 5px 5px 5px 0; + vertical-align: middle; + word-wrap: break-word; + color: #494; + font-weight: bold; + font-size: 9.5pt; + border-bottom: 1px dotted #494; + margin-bottom: 5px; + text-transform: capitalize; +} + +div.news h3 { + text-align: left !important; + font-size: 9.5pt; +} + +div.news h4 { + border-bottom: 1px; + border-bottom-style: dotted; + border-bottom-color: #494; + padding: 0 0 0px 0; + margin: 5px 0 10px 0; + font-size: 10pt; + opacity: 1; + text-transform: capitalize; +} + +div.news h4:first-child { + background: url('../images/itoopbullet.png'); + background-repeat: no-repeat; + background-position: right; +} + +div.news p { + margin-top: -5px; + font-size: 8.5pt; + color: #EE9; + margin-bottom: 0; +} + +div.news p:nth-child(n+1) { + margin-top: 5px; +} + +div.news hr { + margin: 8px 0 3px 0; +} + +div.confignav { + background: url('images/header.png') repeat-x scroll center center #000; + padding:5px 5px 6px !important; + margin: -1px 0 0; + -moz-border-radius: 0 0 4px 4px; + -khtml-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; + border: 1px solid #494; + font-size: 8.5pt !important; + font-weight: bold !important; + line-height: 160% !important; + +} + +div.configure { +/* padding: 5px 15px 0 15px; + margin: 10px 0px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #494; */ + background: none;/* url(images/camotile2.png);*/ +} + +div.messages { + padding: 10px; + margin: 10px 0 15px 0; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #494; + background: #000 /*url('images/infotile.png') center left no-repeat;*/ + font-weight: bold; + font-size: 9pt; + color: #4f4; +} + +div.messages span.error { + color: #d90; +} + +div.messages span.notice { + font-style: italic; +} + +div.messages li { + text-align: justify !important; + font-weight: bold; + list-style: url(images/warning_dark.png) !important; + margin: 0 5px 0 50px !important; + padding: 0 10px 0 0 !important; + border: 0px !important; +} + +div.graphspanel { + padding: 0; + margin: 15px 0px -15px 0; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +/* border: 1px solid #494;*/ + background: none;/* url(images/camotile.png);*/ + text-align: center; +} + +div.widepanel h3 { + text-align: left !important; +} + +div.graphspanel form { + text-align: left; + padding: 0 15px 0px 15px; +} + +div.graphspanel hr { + margin: 10px -15px 10px -15px; +} + +div.graphspanel img { + border: 1px solid #494; + padding: 3px; + margin: 5px; + text-align: center !important; + background: #000; + + opacity: 0.8; +} + +div.graphspanel img:hover { + border: 1px solid #000; + padding: 3px; + margin: 5px; + text-align: center !important; + background: #000; + -moz-box-shadow: inset 0px 0px 1px 1px #f60; + -khtml-box-shadow: inset 0px 0px 1px 1px #f60; + box-shadow: inset 0px 0px 1px 1px #f60; + opacity: 1; +} + +table { + border-collapse: collapse; + width: 100%; + border: 1px solid #494; + cell-padding: 1px; + font-size: 8pt; + background: #030; + margin: 1px 0; +} + +table hr { + padding: 0px 0; + color: #494; + background: #494; + border: 0px solid #494; + margin: 0px 0px; + height: 1px; + display: none; +} + +th { + padding: 6px 2px; + color: #EE9; + text-align: center; + font-size: 9pt; + background: #000; /*url('images/tabletitledark.png') repeat-x;*/ + background: #000 url('images/header.png') center center repeat-x ; + border-top: 1px solid #494; + border-bottom: 1px solid #494 !important; + line-height: 110%; +} + +tr { + vertical-align: middle; +} + +tr:nth-child(even) { + background: #010;/* url('images/darkerbluetile.png') !important;*/ + vertical-align: middle; +} + +tr:nth-child(odd) { + background: #000800;/* url('images/darkbluetile.png') !important;*/ + vertical-align: middle; +} +/* +tr:last-child { + background: #004 url('images/lightbluetile.png') !important; + font-weight: bold; + border: 1px solid #494 !important; +} +*/ +td { + padding: 4px 6px; + color: #EE9; + vertical-align: middle; + border-top: 1px inset #494; + border-bottom: 1px outset #494; +} + +td img { + padding: 0 1px 0 2px; +} + +tt { + font: bold 8pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; + color: #FF0; + padding: 0 5px 2px 0; +} + +div.main li { + text-align: left; + list-style: square; + margin: 2px 0px 2px 30px; + padding: 2px 20px 2px 0px; +/* line-height: 150%;*/ + word-wrap: break-word; +} + + +div.main li b { + color: #b70 !important; + letter-spacing: 0.07em; + font-size: 8.5pt; + text-shadow: 0 1px 1px #700; +} + +.tidylist { + text-align: justify !important; + line-height: 150%; +} + +.tidylist:first-child { +/* padding-top: 5px;*/ +} + +.tidylist:last-child { + padding-bottom: 10px; +} + +.tidylist code { + text-align: left; + font: 8.5pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; + color: #dd0; + padding: 1px 2px; + background: #030; + margin: 0 2px; +} + +ol { + display: inline; + margin: 1px 0 0 0; + padding: 1px 0 0 20px; +} + +ul { +/* display: inline; */ + margin: 0; + padding: 0; +} + +code { + text-align: left; + font: 8.5pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; + color: #dd0; + padding: 1px 2px; +} + +a:link, h2 a:link{ + color: #494; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:visited{ + color: #7b7; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:hover{ + color: #f60; + text-decoration: underline; + font-weight: bold; + word-wrap: break-word; +} + +.links { + padding-bottom: -2px; + text-align: justify; + margin-top: 10px; + margin-bottom: -10px; +} + +.links li { + list-style-image: url("images/link.png") !important; +} + +.links b{ + color: #b70 !important; + letter-spacing: 0.07em; + font-size: 8.5pt; + line-height: 165%; + text-shadow: 0 1px 1px #700; +} + +p { + text-align: justify; + line-height: 160%; +} + +p img:first-child{ + display: none !important; +} + +h1 { + text-align: left; + color: #EE9; + padding: 14px 15px; + margin: 0 5px 0px 205px !important; + font-size: 17pt; + font-weight: bold; + font-style: normal; + text-transform: uppercase; + letter-spacing: 0.15em; + text-shadow: 0px 0px 2px #010; + white-space: normal; + background: #000 url("images/scope.png")no-repeat scroll right top; + background: #000 url("images/bg2.png")no-repeat scroll top right; + background: #000 url('images/header.png') center center; + background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000)); + border: 1px solid #494; + border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + -khtml-border-radius: 4px 4px 0 0; + line-height: 120%; + min-width: 620px; + -moz-box-shadow: 0 1px 5px #000; + -khtml-box-shadow: 0 1px 5px #000; + box-shadow: 0 1px 5px #000; +} + +h2 { + font-size: 12pt; + color: #EE9; + text-shadow: 0px 0px 2px #010; + letter-spacing: 0.05em; + background: #000 url(images/camotile2.png); + background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000)); + background: #000 url('images/header.png') center center ; + padding: 10px; + wordwrap: none; + border: 1px solid #494; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + vertical-align: middle; + margin: 15px 0 12px 0 !important; + text-transform: uppercase; + word-wrap: break-word; +} + +h2 a:visited { + color: #191; +} + +h2 a:hover { + color: #f60; + text-shadow: 0px 0px 1px rgba(255, 64, 0, 0.7); +} + +h3 { + border: 1px solid #494; + border-left: 5px solid #494; + padding: 5px 6px 7px; + margin: 12px 0 10px 0; + border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + -khtml-border-radius: 0 4px 4px 0; + background: #000 url(images/camotile.png); + background: #000 url('images/header.png') center center ; + text-transform: uppercase; + text-shadow: 0px 0px 2px #010; +} + +h4 { + border-bottom: 1px; + border-bottom-style: solid; + border-bottom-color: #494; + padding: 0 0 10px 0; + margin: 5px 0 10px 0; + font-size: 11pt; +} + +button, button:visited { + font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px outset #191; + padding: 1px 3px; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + font-size: 8pt; + font-weight: bold; + margin: 2px 3px; + text-align: center; + vertical-align: middle; + min-width: 76px; + -moz-box-shadow: inset 0px 1px 1px 0px #494; + -khtml-box-shadow: inset 0px 1px 1px 0px #191; + box-shadow: inset 0px 1px 1px 0px #191; + background: #000; + color: #494; +} + +button:hover { + border: 1px solid #f60; + -moz-box-shadow: inset 0px 1px 1px 0px #EE9; + -khtml-box-shadow: inset 0px 1px 1px 0px #EE9; + box-shadow: inset 0px 1px 1px 0px #EE9; + background: #000; + color: #f60; +} + +button:active { + border: 1px inset #f60; + background: #f60; + color: #EE9; + -moz-box-shadow: inset 0px 0px 0px 0px #f60; + -khtml-box-shadow: inset 0px 0px 0px 0px #f60; + box-shadow: inset 0px 0px 0px 0px #f60; +} + +.underline { + border-bottom: 1px solid #eeeeff; + padding: 5px 0px 5px 0px; + margin: 0px 0px 10px 0px; +} + +.langbox { + margin: 5px 3px 2px 5px; + padding: 0; + color: #EE9; + font-size: 7pt; + width: 260px; + text-align: right; + float: right; + vertical-align: middle; +} + +.langbox img { + opacity: 0.5; + -moz-box-shadow: 0 0 1px #000; +} + +.langbox img:hover { + opacity: 1; + -moz-box-shadow: 0 0 1px #f60; +} + +hr { + color: #494; + background: #494; + height: 1px; + border: 0px solid #494; + margin: 20px 0 10px; +} + +hr:last-child { + margin-top: 20px; + margin-bottom: 20px; +} + +sidebarlogo { + text-align: center; +} + +input { + border: 1px outset #5f5; + -moz-box-shadow: inset 0px 1px 1px 0px #373; + -khtml-box-shadow: inset 0px 1px 1px 0px #373; + box-shadow: inset 0px 1px 1px 0px #373; + background: #000; + color: #494; + margin: 5px; + font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + padding: 1px 2px; + text-decoration: none; + min-width: 110px; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; +} + +input:hover { + background: #000; + color: #f60; + border: 1px solid #f60; + -moz-box-shadow: inset 0px 1px 1px 0px #9e9; + -khtml-box-shadow: inset 0px 1px 1px 0px #9e9; + box-shadow: inset 0px 1px 1px 0px #9e9; +} + +input:active { + background: #000; + color: #f30; + border: 1px solid #f30; +} + +input:active { + border: 1px inset #f60; + background: #f60; + color: #EE9; +} + +input[type=text] { + background: #000; + color: #EE9; + margin: 5px 10px; + padding: 4px 2px; + font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px solid #494 !important; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + -moz-box-shadow: inset 1px 1px 1px 0px #000; + -khtml-box-shadow: inset 1px 1px 1px 0px #000; + box-shadow: inset 1px 1px 1px 0px #000; +} + +input[type=text]:active, input[type=text]:hover { + background: #000; +} + +fieldset { +overflow: hidden; +position: relative; +} + +select { + background: #000; + color: #EE9; + margin: 5px 10px; + border: 1px solid #494; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + min-width: 110px; + font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + padding: 2px; +} + +textarea { + background: #000; + color: #EE9; + padding: 5px; + margin: 10px; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + font: 8.5pt "Lucida Console", "Droid Sans Mono", "DejaVu Sans Mono", Courier, mono; + min-height: 100px; + min-width: 97%; + text-align: left; + border: 1px solid #494; +} + +form {} + +.proxyfooter { + margin: 0 20px 10px 240px; + padding: 20px 25px 20px 75px; + font-color: #f00; + font-size: 7pt; + text-align: right !important; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border: 1px solid #000; + display: none; +} + +.statusnotes { + font-style: italic; + font-size: 8pt; + color: #EE9; + text-align: center; + border: 1px solid #494 !important; +/* border-top: 0px !important;*/ + margin: -3px 0 5px 0; + padding: 7px; + background: #010; + -moz-box-shadow: inset 0px 0px 0px 1px #090; + -khtml-box-shadow: inset 0px 0px 0px 1px #090; + box-shadow: inset 0px 0px 0px 1px #090; +/* background: #000 url('images/header.png') repeat-x center center !important;*/ +} + +div.joblog { +/* margin: 15px 0 15px 0; + padding: 5px 20px 10px 20px !important; + border: 1px solid #494; + background-color: #000; + background: #000; url("images/camotile.png");*/ +/* color: #dfd;*/ + border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + -khtml-border-radius: 4px 4px 0 0; + text-align: justify !important; + overflow-x: auto; /* Opera fix */ + } + +div.joblog h3 { + margin-top: 10px; +} + +div.main li { + text-align: left; + list-style: square; + margin: 2px 0px 2px 30px; + padding: 2px 20px 2px 0px; +/* line-height: 150%;*/ + word-wrap: break-word; +} + +div.joblog li { + word-wrap: break-word !important; + text-align: justify !important; + line-height: 120% !important; + margin: 2px 0px 2px 30px; + padding: 2px 20px 2px 0px; +} + +div.joblog ul { + word-wrap: break-word !important; + text-align: justify; + margin: 0; +} + +div.joblog li:first-child { + margin-top: 0px; +} + +div.joblog li:last-child { + margin-bottom: -10px; +} + +div.joblog form:first-child { + margin-top: 10px; +} + +div.joblog table { + margin-top: 15px; +} + +div.joblog p { + line-height: 140%; +} + +.smallhead { + font-size: 7pt +} + +.mediumtags { + font-size: 8.5pt; +} + +.optbox { + min-width: 16px !important; + max-width: 16px !important; + width: 16px !important; + min-height: 16px; + max-height: 16px; + height: 16px; + opacity: 1.0; + border: 0; + margin: 5px 5px 5px 10px; + padding: 2px; + overflow: hidden; + position: relative; +} + +.optbox:hover { + min-width: 16px !important; + max-width: 16px !important; + width: 16px !important; + min-height: 16px; + max-height: 16px; + height: 16px; + opacity: 1.0; + border: 0; + margin: 5px 5px 5px 10px; + padding: 2px; +} + +.cells { + border: 1px inset #494; + border-left: 1px outset #494; +} + +.tablefooter tr, .tablefooter td { + background: #000 url('images/header.png') repeat-x center center !important; + border-top: 1px solid #494; + border-bottom: 1px solid #494 !important; + font-size: 7pt; + line-height: 110%; + padding: 5px 5px 10px; +} + +.formaction { + text-align: right; + margin-bottom: -5px; +} + +div.footnote { + text-align: right; + color: #494; + font-size: 7pt; + margin-bottom: -8px !important; +} + +div.footnote hr{ + margin: 10px 0 5px 0 !important; + color: #494; + background: #494; + height: 1px; + border: 0px solid #494; +} + +.topness { + font-size: 7.5pt; + text-align: right; + margin-top: -5px; + margin-bottom: -5px; + margin-right: 5px; +} + +/* begin home page */ + +/* +#appsummary { + clear: none; + float: none; + left: 10px; + margin: 0; + position: absolute; + top: 10px; +} + +#homemain { + left: 217px; + margin: 0 10px 10px 0; + position: absolute; + top: 10px; +} + +#homenews { + margin: 0 10px 5px 0; +} + +h2.app { + border-radius: 8px; + margin: 1px 10px 15px 0 !important; +} +*/ + +h4.app, h4.app2 { + background: url('images/header.png') center center repeat-x; + border: 1px solid #449944; + font-size: 10pt; + font-variant: small-caps; + letter-spacing: 2px; + margin: 12px 0 -10px 0; + padding: 7px 8px 7px; + text-transform: uppercase; + border-radius: 4px; + text-align: left; +} + +h4.app2 { + clear: left; + margin-top: 5px !important; +} + +div.ag2 { + margin: 0; +} + +div.app { + float: left; + padding: 5px 0 0 !important; + width: 137px; + border: 1px solid #494; + background: #000; + background-image: -moz-linear-gradient(center top , #000B00, #000); + border-radius: 3px; + margin: 5px; + height: 72px; + text-align: center !important; + padding-top: 5px; + opacity: 0.9; + box-shadow: 0 1px 5px #000000; +} + +div.app:hover { + opacity: 1; + border: 1px solid #f60; + background: #000; + box-shadow: none; +} + +div.app:last-child { + margin-bottom: 12px; +} + +div.appgroup { + margin: 0; + padding: 16px 8px; + width: auto; +} + +div.search { + margin: 10px 10px 0 0; + padding: 8px 8px 0 8px; + width: auto; +} + +table.search { + background: none; + padding: 8px; + width: auto; + margin-left:auto; + margin-right:auto; +} + +img.app { + height: 32px; + width: 32px; + padding: 6px 0 8px 0; + margin-bottom: 3px; +} + +img.app2p { + height: 40px; + padding: 5px 6px 0px 6px; + margin-bottom: 3px; +} + +table.app { + background: none; + border: 0; + margin: auto; + width: auto; +} + +tr.app { + background: none; + border: 0; + margin: 0; +} + +td.app { + background: none; + border: 0; + margin: 0; + padding: 3px 0 0; +} + +div.applabel { + border-radius: 3px; + border-width: 1px; + font-size: 7.5pt; + margin: 0; + padding: 3px 0; + text-align: center; + vertical-align: bottom; + line-height: 95%; + text-transform: lowercase; + border: none; +} + +/* end home page */