moved http strings to include, added token flags

This commit is contained in:
Shawn A
2018-01-31 13:54:54 -06:00
parent 19d533b7d5
commit a21f8cbc39
3 changed files with 97 additions and 102 deletions
+40 -65
View File
@@ -11,6 +11,7 @@
**************************************************************/
#include "WiFiManager.h"
#include "strings_en.h"
// PARAMETERS
@@ -585,7 +586,7 @@ void WiFiManager::handleWifi(boolean scan) {
DEBUG_WM("<- HTTP Wifi");
String page = FPSTR(HTTP_HEAD);
page.replace("{v}", "Config ESP");
page.replace("{v}", "Config ESP"); // @token titlewifi
page += FPSTR(HTTP_SCRIPT);
page += FPSTR(HTTP_STYLE);
page += _customHeadElement;
@@ -623,7 +624,7 @@ String WiFiManager::getScanItemOut(){
DEBUG_WM(F("Scan done"));
if (n == 0) {
DEBUG_WM(F("No networks found"));
page += F("No networks found. Refresh to scan again.");
page += F("No networks found. Refresh to scan again."); // @token scannotfound
} else {
//sort networks
@@ -720,7 +721,7 @@ String WiFiManager::getStaticOut(){
item.replace("{i}", "ip");
item.replace("{n}", "ip");
item.replace("{p}", "{t}");
item.replace("{t}", "Static IP");
item.replace("{t}", "Static IP"); // @token staticip
item.replace("{l}", "15");
item.replace("{v}", (_sta_static_ip ? _sta_static_ip.toString() : ""));
item.replace("{c}", "");
@@ -735,7 +736,7 @@ String WiFiManager::getStaticOut(){
item.replace("{i}", "gw");
item.replace("{n}", "gw");
item.replace("{p}", "{t}");
item.replace("{t}", "Static Gateway");
item.replace("{t}", "Static Gateway"); // @token staticgateway
item.replace("{l}", "15");
item.replace("{v}", (_sta_static_gw ? _sta_static_gw.toString() : ""));
item.replace("{c}", "");
@@ -750,7 +751,7 @@ String WiFiManager::getStaticOut(){
item.replace("{i}", "sn");
item.replace("{n}", "sn");
item.replace("{p}", "{t}");
item.replace("{t}", "Subnet");
item.replace("{t}", "Subnet"); // @token subnet
item.replace("{l}", "15");
item.replace("{v}", (_sta_static_sn ? _sta_static_sn.toString() : ""));
item.replace("{c}", "");
@@ -880,7 +881,7 @@ void WiFiManager::handleWifiSave() {
}
String page = FPSTR(HTTP_HEAD);
page.replace("{v}", "Credentials Saved");
page.replace("{v}", "Credentials Saved"); // @token titlewifisaved
page += FPSTR(HTTP_SCRIPT);
page += FPSTR(HTTP_STYLE);
page += _customHeadElement;
@@ -903,7 +904,7 @@ void WiFiManager::handleInfo() {
DEBUG_WM(F("<- HTTP Info"));
String page = FPSTR(HTTP_HEAD);
page.replace("{v}", "Info");
page.replace("{v}", "Info"); // @token titleinfo
page += FPSTR(HTTP_SCRIPT);
page += FPSTR(HTTP_STYLE);
page += _customHeadElement;
@@ -916,39 +917,39 @@ void WiFiManager::handleInfo() {
page += F("<h3>esp8266</h3><hr><dl>");
// subject to rollover!
page += F("<dt>Uptime</dt><dd>");
page += (String)(system_get_time() / 1000000 / 60) + " mins ";
page += (String)((system_get_time() / 1000000)%60) + " secs";
page += F("<dt>Uptime</dt><dd>"); // @token uptime
page += (String)(system_get_time() / 1000000 / 60) + " mins "; // @token mins
page += (String)((system_get_time() / 1000000)%60) + " secs"; // @token secs
page += F("<dt>Chip ID</dt><dd>");
page += F("<dt>Chip ID</dt><dd>"); // @token chipid
page += WIFI_getChipId();
page += F("</dd>");
page += F("<dt>Flash Chip ID</dt><dd>");
page += F("<dt>Flash Chip ID</dt><dd>"); // @token flashid
page += ESP.getFlashChipId();
page += F("</dd>");
page += F("<dt>IDE Flash Size</dt><dd>");
page += F("<dt>IDE Flash Size</dt><dd>"); // @token flashsize
page += ESP.getFlashChipSize();
page += F(" bytes</dd>");
page += F("<dt>Actual Flash Size</dt><dd>");
page += F("<dt>Actual Flash Size</dt><dd>"); // @token actualflashsize
page += ESP.getFlashChipRealSize();
page += F(" bytes</dd>");
page += F("<dt>SDK Version</dt><dd>");
page += F("<dt>SDK Version</dt><dd>"); // @token sdkver
page += system_get_sdk_version();
page += F("</dd>");
page += F("<dt>Core Version</dt><dd>");
page += F("<dt>Core Version</dt><dd>"); // @token corever
page += ESP.getCoreVersion();
page += F("</dd>");
page += F("<dt>Boot Version</dt><dd>");
page += F("<dt>Boot Version</dt><dd>"); // @token boot ver
page += system_get_boot_version();
page += F("</dd>");
page += F("<dt>CPU Frequency</dt><dd>");
page += F("<dt>CPU Frequency</dt><dd>"); // @token cpufreq
page += ESP.getCpuFreqMHz();
page += F("MHz</dd>");
@@ -962,12 +963,12 @@ void WiFiManager::handleInfo() {
// page += "<br/><progress value='" + (String)((heapstart)-ESP.getFreeHeap()) + "' max='" + (String)(heapstart) + "'></progress>";
// page += F("</dd>");
page += F("<dt>Memory - Free Heap</dt><dd>");
page += F("<dt>Memory - Free Heap</dt><dd>"); // @token freeheap
page += ESP.getFreeHeap();
page += F(" bytes available</dd>");
page += F(" bytes available</dd>"); // @token bytesavail
page += F("<dt>Memory - Sketch Size</dt><dd>");
page += F("Used/Total bytes<br/>");
page += F("<dt>Memory - Sketch Size</dt><dd>"); // @token sketchsize
page += F("Used/Total bytes<br/>"); // @token usedtotal
page += (ESP.getSketchSize()+ESP.getFreeSketchSpace())-ESP.getFreeSketchSpace();
page += "/";
page += (ESP.getSketchSize()+ESP.getFreeSketchSpace());
@@ -977,15 +978,15 @@ void WiFiManager::handleInfo() {
page += (String)(ESP.getSketchSize()+ESP.getFreeSketchSpace());
page += F("'></progress></dd>");
page += F("<dt>Last reset reason</dt><dd>");
page += F("<dt>Last reset reason</dt><dd>"); // @token resetreason
page += ESP.getResetReason();
page += F("</dd>");
page += F("<br/><h3>WiFi</h3><hr><dt>Access Point IP</dt><dd>");
page += F("<br/><h3>WiFi</h3><hr><dt>Access Point IP</dt><dd>"); // @token apip
page += WiFi.softAPIP().toString();
page += F("</dd>");
page += F("<dt>Access Point MAC</dt><dd>");
page += F("<dt>Access Point MAC</dt><dd>"); // @token apmac
page += WiFi.softAPmacAddress();
page += F("</dd>");
@@ -997,71 +998,45 @@ void WiFiManager::handleInfo() {
page += WiFi.BSSIDstr();
page += F("</dd>");
page += F("<dt>Station IP</dt><dd>");
page += F("<dt>Station IP</dt><dd>"); // @token staip
page += WiFi.localIP().toString();
page += F("</dd>");
page += F("<dt>Station Gateway</dt><dd>");
page += F("<dt>Station Gateway</dt><dd>"); // @token stagw
page += WiFi.gatewayIP().toString();
page += F("</dd>");
page += F("<dt>Station Subnet</dt><dd>");
page += F("<dt>Station Subnet</dt><dd>"); // @token stasub
page += WiFi.subnetMask().toString();
page += F("</dd>");
page += F("<dt>DNS Server</dt><dd>");
page += F("<dt>DNS Server</dt><dd>"); // @token dnss
page += WiFi.dnsIP().toString();
page += F("</dd>");
page += F("<dt>Hostname</dt><dd>");
page += F("<dt>Hostname</dt><dd>"); // @token hostname
page += WiFi.hostname();
page += F("</dd>");
page += F("<dt>Station MAC</dt><dd>");
page += F("<dt>Station MAC</dt><dd>"); // @stamac
page += WiFi.macAddress();
page += F("</dd>");
page += F("<dt>Connected</dt><dd>");
page += WiFi.isConnected() ? "Yes" : "No";
page += F("<dt>Connected</dt><dd>"); // @token connected
page += WiFi.isConnected() ? "Yes" : "No"; //@token Y,N
page += F("</dd>");
page += F("<dt>Autoconnect</dt><dd>");
page += WiFi.getAutoConnect() ? "Enabled" : "Disabled";
page += WiFi.getAutoConnect() ? "Enabled" : "Disabled"; // @token enabled,disabled
page += F("</dd>");
page += F("</dl>");
page += "<br/><form action='/erase' method='get'><button>Erase WiFi Config</button></form>";
page += "<br/><form action='/erase' method='get'><button>";
page += "Erase WiFi Config"; // @token erasewifi
page += "</button></form>";
page += FPSTR(HTTP_HELP);
page += F("<br/><h3>Available Pages</h3><hr>");
page += F("<table class='table'>");
page += F("<thead><tr><th>Page</th><th>Function</th></tr></thead><tbody>");
page += F("<tr><td><a href='/'>/</a></td>");
page += F("<td>Menu page.</td></tr>");
page += F("<tr><td><a href='/wifi'>/wifi</a></td>");
page += F("<td>Show WiFi scan results and enter WiFi configuration.</td></tr>");
page += F("<tr><td><a href='/wifisave'>/wifisave</a></td>");
page += F("<td>Save WiFi configuration information and configure device. Needs variables supplied.</td></tr>");
page += F("<tr><td><a href='/close'>/close</a></td>");
page += F("<td>Close the configuration server and configuration WiFi network.</td></tr>");
page += F("<tr><td><a href='/i'>/i</a></td>");
page += F("<td>Information page</td></tr>");
page += F("<tr><td><a href='/exit'>/exit</a></td>");
page += F("<td>Exit Config Portal, configportal will close</td></tr>");
page += F("<tr><td><a href='/r'>/r</a></td>");
page += F("<td>Reboot the device</td></tr>");
page += F("<tr><td><a href='/erase'>/erase</a></td>");
page += F("<td>Erase WiFi configuration and reboot Device. Device will not reconnect to a network until new WiFi configuration data is entered.</td></tr>");
// @todo add callback here
page += F("</table>");
page += F("<p/>More information about WiFiManager at <a href=\"https://github.com/tzapu/WiFiManager\">https://github.com/tzapu/WiFiManager</a>.");
page += FPSTR(HTTP_END);
server->sendHeader("Content-Length", String(page.length()));
+1 -37
View File
@@ -30,43 +30,7 @@
#define WIFI_getChipId() ESP.getChipId()
#define WIFI_AUTH_OPEN ENC_TYPE_NONE
const char HTTP_HEAD[] PROGMEM = "<!DOCTYPE html><html lang='en'><head><meta name='format-detection' content='telephone=no'><meta name='viewport' content='width=device-width, initial-scale=1, user-scalable=no'/><title>{v}</title>";
// const char HTTP_STYLE[] PROGMEM = "<style>.c{text-align: center;} div,input{padding:5px;font-size:1em;} input{width:95%;} body{text-align: center;font-family:verdana;} button{border:0;border-radius:0.3rem;background-color:#1fa3ec;color:#fff;line-height:2.4rem;font-size:1.2rem;width:100%;} .q{float: right;width: 64px;text-align: right;} .l{background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAALVBMVEX///8EBwfBwsLw8PAzNjaCg4NTVVUjJiZDRUUUFxdiZGSho6OSk5Pg4eFydHTCjaf3AAAAZElEQVQ4je2NSw7AIAhEBamKn97/uMXEGBvozkWb9C2Zx4xzWykBhFAeYp9gkLyZE0zIMno9n4g19hmdY39scwqVkOXaxph0ZCXQcqxSpgQpONa59wkRDOL93eAXvimwlbPbwwVAegLS1HGfZAAAAABJRU5ErkJggg==') no-repeat left center;background-size: 1em;}</style>";
const char HTTP_STYLE[] PROGMEM = "<style>"
".c,body{text-align:center;font-family:verdana}div,input{padding:5px;font-size:1em}input{width:95%;margin:5px 0}button{border:0;border-radius:.3rem;background-color:#1fa3ec;color:#fff;line-height:2.4rem;font-size:1.2rem;width:100%}"
".wrap {text-align:left;display:inline-block;min-width:260px}"
// links
"a{color:#000;font-weight:700;text-decoration:none}a:hover{color:#1fa3ec;text-decoration:underline}"
// quality icons
".q{height:16px;margin:0;padding:0 5px;text-align:right;min-width:38px;float:right}.q.q-0:after{background-position-x:0}.q.q-1:after{background-position-x:-16px}.q.q-2:after{background-position-x:-32px}.q.q-3:after{background-position-x:-48px}.q.q-4:after{background-position-x:-64px}.q.l:before{background-position-x:-80px;padding-right:5px}.ql .q{float:left}.qinv .q{-webkit-filter:invert(1);filter:invert(1)}.q:after,.q:before{content:'';width:16px;height:16px;display:inline-block;background-repeat:no-repeat;background-position: 16px 0;"
"background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAQCAMAAADeZIrLAAAAJFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHJj5lAAAAC3RSTlMAIjN3iJmqu8zd7vF8pzcAAABsSURBVHja7Y1BCsAwCASNSVo3/v+/BUEiXnIoXkoX5jAQMxTHzK9cVSnvDxwD8bFx8PhZ9q8FmghXBhqA1faxk92PsxvRc2CCCFdhQCbRkLoAQ3q/wWUBqG35ZxtVzW4Ed6LngPyBU2CobdIDQ5oPWI5nCUwAAAAASUVORK5CYII=');}"
// icons @2x media query (32px rescaled)
"@media (-webkit-min-device-pixel-ratio: 2),(min-resolution: 192dpi){.q:before,.q:after {"
"background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALwAAAAgCAMAAACfM+KhAAAALVBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRGZ3iJmqu8zd7gKjCLQAAACmSURBVHgB7dDBCoMwEEXRmKlVY3L//3NLhyzqIqSUggy8uxnhCR5Mo8xLt+14aZ7wwgsvvPA/ofv9+44334UXXngvb6XsFhO/VoC2RsSv9J7x8BnYLW+AjT56ud/uePMdb7IP8Bsc/e7h8Cfk912ghsNXWPpDC4hvN+D1560A1QPORyh84VKLjjdvfPFm++i9EWq0348XXnjhhT+4dIbCW+WjZim9AKk4UZMnnCEuAAAAAElFTkSuQmCC');"
"background-size: 95px 16px;}}"
// msg callouts
".msg{padding:20px;margin:20px 0;border:1px solid #eee;border-left-width:5px;border-radius:3px;border-left-color:#777}.msg h4{margin-top:0;margin-bottom:5px}.msg.P{border-left-color:#1fa3ec}.msg.P h4{color:#1fa3ec}.msg.D{border-left-color:#d9534f}.msg.D h4{color:#d9534f}"
// lists
"dt{font-weight:bold}dd{margin:0;padding:0 0 0.5em 0}"
"</style>";
const char HTTP_SCRIPT[] PROGMEM = "<script>function c(l){document.getElementById('s').value=l.innerText||l.textContent;document.getElementById('p').focus();}</script>";
const char HTTP_HEAD_END[] PROGMEM = "</head><body><div class='wrap'>";
const char HTTP_PORTAL_OPTIONS[] PROGMEM = "<form action='/wifi' method='GET'><button>Configure WiFi</button></form><br/><form action='/0wifi' method='GET'><button>Configure WiFi (No Scan)</button></form><br/><form action='/i' method='GET'><button>Info</button></form><br/><form action='/r' method='GET'><button>Restart</button></form><br/><form action='/exit' method='GET'><button>Quit</button></form>";
const char HTTP_ITEM[] PROGMEM = "<div><a href='#p' onclick='c(this)'>{v}</a><div role='img' aria-label='{r}%' title='{r}%' class='q q-{q} {i}'></div></div>";
// const char HTTP_ITEM[] PROGMEM = "<div><a href='#p' onclick='c(this)'>{v}</a> {R} {r}% {q} {e}</div>"; // test all tokens
//const char HTTP_ITEM_PADLOCK[] PROGMEM = "<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAALVBMVEX///8EBwfBwsLw8PAzNjaCg4NTVVUjJiZDRUUUFxdiZGSho6OSk5Pg4eFydHTCjaf3AAAAZElEQVQ4je2NSw7AIAhEBamKn97/uMXEGBvozkWb9C2Zx4xzWykBhFAeYp9gkLyZE0zIMno9n4g19hmdY39scwqVkOXaxph0ZCXQcqxSpgQpONa59wkRDOL93eAXvimwlbPbwwVAegLS1HGfZAAAAABJRU5ErkJggg==' width='13px'/>";
const char HTTP_FORM_START[] PROGMEM = "<form method='POST' action='wifisave'><label for='s'>SSID</label><input id='s' name='s' maxlength=32 placeholder='{v}'><br/><label for='p'>Password</label><input id='p' name='p' maxlength='64' type='password' placeholder=''><br/>";
const char HTTP_FORM_END[] PROGMEM = "<br/><button type='submit'>Save</button></form>";
const char HTTP_FORM_LABEL[] PROGMEM = "<label for='{i}'>{t}</label>";
const char HTTP_FORM_PARAM_START[] PROGMEM = "<hr>";
const char HTTP_FORM_PARAM[] PROGMEM = "<br/><input id='{i}' name='{n}' maxlength={l} placeholder='' value='{v}' {c}>";
const char HTTP_FORM_PARAM_END[] PROGMEM = "<br/>";
const char HTTP_SCAN_LINK[] PROGMEM = "<br/><form action='/wifi' method='get'><button>Refresh</button></form>";
const char HTTP_SAVED[] PROGMEM = "<div class='msg'>Saving Credentials<br/>Trying to connect ESP to network.<br />If it fails reconnect to AP to try again</div>";
const char HTTP_END[] PROGMEM = "</div></body></html>";
#define WIFI_MANAGER_MAX_PARAMS 5
#define WIFI_MANAGER_MAX_PARAMS 5 // params will autoincrement and realloc by this amount when max is reached
#define WFM_LABEL_BEFORE 1
#define WFM_LABEL_AFTER 2
+56
View File
@@ -0,0 +1,56 @@
const char HTTP_HEAD[] PROGMEM = "<!DOCTYPE html><html lang='en'><head><meta name='format-detection' content='telephone=no'><meta name='viewport' content='width=device-width, initial-scale=1, user-scalable=no'/><title>{v}</title>";
const char HTTP_SCRIPT[] PROGMEM = "<script>function c(l){document.getElementById('s').value=l.innerText||l.textContent;document.getElementById('p').focus();}</script>";
const char HTTP_HEAD_END[] PROGMEM = "</head><body><div class='wrap'>";
const char HTTP_PORTAL_OPTIONS[] PROGMEM = "<form action='/wifi' method='GET'><button>Configure WiFi</button></form><br/><form action='/0wifi' method='GET'><button>Configure WiFi (No Scan)</button></form><br/><form action='/i' method='GET'><button>Info</button></form><br/><form action='/r' method='GET'><button>Restart</button></form><br/><form action='/exit' method='GET'><button>Quit</button></form>";
const char HTTP_ITEM[] PROGMEM = "<div><a href='#p' onclick='c(this)'>{v}</a><div role='img' aria-label='{r}%' title='{r}%' class='q q-{q} {i}'></div></div>";
// const char HTTP_ITEM[] PROGMEM = "<div><a href='#p' onclick='c(this)'>{v}</a> {R} {r}% {q} {e}</div>"; // test all tokens
const char HTTP_FORM_START[] PROGMEM = "<form method='POST' action='wifisave'><label for='s'>SSID</label><input id='s' name='s' maxlength=32 placeholder='{v}'><br/><label for='p'>Password</label><input id='p' name='p' maxlength='64' type='password' placeholder=''><br/>";
const char HTTP_FORM_END[] PROGMEM = "<br/><button type='submit'>Save</button></form>";
const char HTTP_FORM_LABEL[] PROGMEM = "<label for='{i}'>{t}</label>";
const char HTTP_FORM_PARAM_START[] PROGMEM = "<hr>";
const char HTTP_FORM_PARAM[] PROGMEM = "<br/><input id='{i}' name='{n}' maxlength={l} placeholder='' value='{v}' {c}>";
const char HTTP_FORM_PARAM_END[] PROGMEM = "<br/>";
const char HTTP_SCAN_LINK[] PROGMEM = "<br/><form action='/wifi' method='get'><button>Refresh</button></form>";
const char HTTP_SAVED[] PROGMEM = "<div class='msg'>Saving Credentials<br/>Trying to connect ESP to network.<br />If it fails reconnect to AP to try again</div>";
const char HTTP_END[] PROGMEM = "</div></body></html>";
const char HTTP_STYLE[] PROGMEM = "<style>"
".c,body{text-align:center;font-family:verdana}div,input{padding:5px;font-size:1em}input{width:95%;margin:5px 0}button{cursor:pointer;border:0;border-radius:.3rem;background-color:#1fa3ec;color:#fff;line-height:2.4rem;font-size:1.2rem;width:100%}"
".wrap {text-align:left;display:inline-block;min-width:260px}"
// links
"a{color:#000;font-weight:700;text-decoration:none}a:hover{color:#1fa3ec;text-decoration:underline}"
// quality icons
".q{height:16px;margin:0;padding:0 5px;text-align:right;min-width:38px;float:right}.q.q-0:after{background-position-x:0}.q.q-1:after{background-position-x:-16px}.q.q-2:after{background-position-x:-32px}.q.q-3:after{background-position-x:-48px}.q.q-4:after{background-position-x:-64px}.q.l:before{background-position-x:-80px;padding-right:5px}.ql .q{float:left}.qinv .q{-webkit-filter:invert(1);filter:invert(1)}.q:after,.q:before{content:'';width:16px;height:16px;display:inline-block;background-repeat:no-repeat;background-position: 16px 0;"
"background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAQCAMAAADeZIrLAAAAJFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADHJj5lAAAAC3RSTlMAIjN3iJmqu8zd7vF8pzcAAABsSURBVHja7Y1BCsAwCASNSVo3/v+/BUEiXnIoXkoX5jAQMxTHzK9cVSnvDxwD8bFx8PhZ9q8FmghXBhqA1faxk92PsxvRc2CCCFdhQCbRkLoAQ3q/wWUBqG35ZxtVzW4Ed6LngPyBU2CobdIDQ5oPWI5nCUwAAAAASUVORK5CYII=');}"
// icons @2x media query (32px rescaled)
"@media (-webkit-min-device-pixel-ratio: 2),(min-resolution: 192dpi){.q:before,.q:after {"
"background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALwAAAAgCAMAAACfM+KhAAAALVBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRGZ3iJmqu8zd7gKjCLQAAACmSURBVHgB7dDBCoMwEEXRmKlVY3L//3NLhyzqIqSUggy8uxnhCR5Mo8xLt+14aZ7wwgsvvPA/ofv9+44334UXXngvb6XsFhO/VoC2RsSv9J7x8BnYLW+AjT56ud/uePMdb7IP8Bsc/e7h8Cfk912ghsNXWPpDC4hvN+D1560A1QPORyh84VKLjjdvfPFm++i9EWq0348XXnjhhT+4dIbCW+WjZim9AKk4UZMnnCEuAAAAAElFTkSuQmCC');"
"background-size: 95px 16px;}}"
// msg callouts
".msg{padding:20px;margin:20px 0;border:1px solid #eee;border-left-width:5px;border-radius:3px;border-left-color:#777}.msg h4{margin-top:0;margin-bottom:5px}.msg.P{border-left-color:#1fa3ec}.msg.P h4{color:#1fa3ec}.msg.D{border-left-color:#d9534f}.msg.D h4{color:#d9534f}"
// lists
"dt{font-weight:bold}dd{margin:0;padding:0 0 0.5em 0}"
"</style>";
const char HTTP_HELP[] PROGMEM =
"<br/><h3>Available Pages</h3><hr>"
"<table class='table'>"
"<thead><tr><th>Page</th><th>Function</th></tr></thead><tbody>"
"<tr><td><a href='/'>/</a></td>"
"<td>Menu page.</td></tr>"
"<tr><td><a href='/wifi'>/wifi</a></td>"
"<td>Show WiFi scan results and enter WiFi configuration.(/0wifi noscan)</td></tr>"
"<tr><td><a href='/wifisave'>/wifisave</a></td>"
"<td>Save WiFi configuration information and configure device. Needs variables supplied.</td></tr>"
"<tr><td><a href='/close'>/close</a></td>"
"<td>Close the configuration server and configuration WiFi network.</td></tr>"
"<tr><td><a href='/i'>/i</a></td>"
"<td>Information page</td></tr>"
"<tr><td><a href='/exit'>/exit</a></td>"
"<td>Exit Config Portal, configportal will close</td></tr>"
"<tr><td><a href='/r'>/r</a></td>"
"<td>Reboot the device</td></tr>"
"<tr><td><a href='/erase'>/erase</a></td>"
"<td>Erase WiFi configuration and reboot Device. Device will not reconnect to a network until new WiFi configuration data is entered.</td></tr>"
"</table>"
"<p/>More information about WiFiManager at <a href='https://github.com/tzapu/WiFiManager'>https://github.com/tzapu/WiFiManager</a>.";