diff --git a/html_orig/.gitignore b/html_orig/.gitignore index 0a0f73a..21ff81d 100644 --- a/html_orig/.gitignore +++ b/html_orig/.gitignore @@ -1 +1,4 @@ pages/_test_env.php +js/* +css/* +!.gitkeep diff --git a/html_orig/css/.gitkeep b/html_orig/css/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/html_orig/css/app.css b/html_orig/css/app.css deleted file mode 100644 index a25946a..0000000 --- a/html_orig/css/app.css +++ /dev/null @@ -1,1810 +0,0 @@ -@charset "UTF-8"; -/* normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS and IE text size adjust after device orientation change, - * without disabling user zoom. - */ -*, *:before, *:after { - box-sizing: border-box; } - -html { - font-family: sans-serif; - /* 1 */ - -ms-text-size-adjust: 100%; - /* 2 */ - -webkit-text-size-adjust: 100%; - /* 2 */ } - -/** - * Remove default margin. - */ -body { - margin: 0; } - -/* HTML5 display definitions - ========================================================================== */ -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ -figure, -nav - { - display: block; } - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ -canvas, -progress - { - display: inline-block; - /* 1 */ - vertical-align: baseline; - /* 2 */ } - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. - */ -[hidden] - { - display: none; } - -/* Links - ========================================================================== */ -/** - * Remove the gray background color from active links in IE 10. - */ -a { - background-color: transparent; } - -/** - * Improve readability of focused elements when they are also in an - * active/hover state. - */ -a:active, -a:hover { - outline: 0; } - -/* Text-level semantics - ========================================================================== */ -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ -b - { - font-weight: bold; } - -/** - * Address styling not present in Safari and Chrome. - */ -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ -h1 { - font-size: 2em; - margin: 0.67em 0; } - -h2 { - font-size: 2em; - margin: 0.67em 0; } - -/** - * Address styling not present in IE 8/9. - */ -/** - * Address inconsistent and variable font size in all browsers. - */ -small { - font-size: 80%; } - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sup { - top: -0.5em; } - -sub { - bottom: -0.25em; } - -/* Embedded content - ========================================================================== */ -/** - * Remove border when inside `a` element in IE 8/9/10. - */ -img { - border: 0; } - -/** - * Correct overflow not hidden in IE 9/10/11. - */ -svg:not(:root) { - overflow: hidden; } - -/* Grouping content - ========================================================================== */ -/** - * Address margin not present in IE 8/9 and Safari. - */ -/** - * Address differences between Firefox and other browsers. - */ -hr { - box-sizing: content-box; - height: 0; } - -/** - * Contain overflow in all browsers. - */ -pre { - overflow: auto; } - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ -code, -pre - { - font-family: "DejaVu Sans Mono", "Inconsolata", monospace; - font-size: 1em; } - -/* Forms - ========================================================================== */ -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ -button, -input, -select, -textarea { - color: inherit; - /* 1 */ - font: inherit; - /* 2 */ - margin: 0; - /* 3 */ } - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ -button { - overflow: visible; } - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ -button, -select { - text-transform: none; } - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ -button, -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - /* 2 */ - cursor: pointer; - /* 3 */ } - -/** - * Re-set default cursor for disabled elements. - */ -button[disabled], -html input[disabled] { - cursor: default; } - -/** - * Remove inner padding and border in Firefox 4+. - */ -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; } - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ -input { - line-height: normal; } - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. - */ -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ -/** - * Define consistent border, margin, and padding. - */ -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ -legend { - border: 0; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ -textarea { - overflow: auto; } - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ -/* Tables - ========================================================================== */ -/** - * Remove most spacing between table cells. - */ -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - -/* Fontello data, processed by the unpack script. */ -@font-face { - font-family: 'fontello'; - src: url("data:application/octet-stream;base64,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") format("woff"); } -[class^="icn-"]::before, [class*=" icn-"]::before { - font-family: "fontello"; - font-style: normal; - font-weight: normal; - speak: none; - display: inline-block; - text-decoration: inherit; - width: 1em; - margin-right: .2em; - text-align: center; - /* opacity: .8; */ - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - /* fix buttons height, for twitter bootstrap */ - line-height: 1em; - /* Animation center compensation - margins should be symmetric */ - /* remove if not needed */ - margin-left: .2em; - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - /* Font smoothing. That was taken from TWBS */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } - -/* Fontello icon codes */ -/* Fontello classes */ -.icn-keyboard::before { - content: '\2328'; } - -.icn-about::before { - content: '\2605'; } - -.icn-restore::before { - content: '\267c'; } - -.icn-configure::before { - content: '\2699'; } - -.icn-ok::before { - content: '\2714'; } - -.icn-help::before { - content: '\2753'; } - -.icn-donate::before { - content: '\2764'; } - -.icn-back::before { - content: '\276e'; } - -.icn-cancel::before { - content: '\e801'; } - -.icn-paste::before { - content: '\f0ea'; } - -.icn-network::before { - content: '🌍'; } - -.icn-github::before { - content: '🐱'; } - -.icn-persist::before { - content: '💾'; } - -.icn-download::before { - content: '📥'; } - -.icn-wifi::before { - content: '📶'; } - -.icn-terminal::before { - content: '🖳'; } - -html { - box-sizing: border-box; } - -*, *::after, *::before { - box-sizing: inherit; } - -html { - font-family: Arial, sans-serif; - color: #D0D0D0; - background: #131315; } - -html, body { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; - width: 100%; - height: 100%; - overflow: hidden; } - -a, a:visited, a:link { - cursor: pointer; - color: #5abfff; - text-decoration: none; } - -a:hover { - color: #5abfff; - text-decoration: underline; } - -.hidden { - display: none !important; } - -[onclick] { - cursor: pointer; } - -ul > * { - padding-top: .3em; - padding-bottom: .3em; } - -ul { - margin-top: 0; - margin-bottom: 0; } - -/* Main outer container */ -#outer { - display: flex; - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - top: 0; - bottom: 0; - overflow: hidden; - flex-direction: row; } - -@media screen and (max-width: 544px) { - #outer { - display: block; - overflow-y: scroll; } } -#menu { - flex: 0 0 15rem; - background: #3983CD; } - #menu > * { - display: block; - text-decoration: none; - padding: 0.61805rem 1rem; - white-space: nowrap; - word-wrap: normal; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - #menu #brand { - cursor: pointer; - color: white; - background: #2b6aa8; - font-size: 120%; - text-align: center; - position: relative; - transition: none; - font-weight: bold; - margin-bottom: 1rem; } - @media screen and (max-width: 544px) { - #menu #brand { - background: #3983CD; - cursor: pointer; - margin-bottom: 0.38198rem; } - #menu #brand::after { - position: absolute; - color: rgba(0, 0, 0, 0.4); - right: 1rem; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } } - #menu.expanded #brand { - background: #2b6aa8; } - @media screen and (max-width: 544px) { - #menu.expanded #brand:after { - transform: translate(-25%, -50%) rotate(-90deg); } } - #menu a { - font-size: 130%; - color: white; - transition: background-color 0.2s; - text-shadow: 0 0 5px rgba(0, 0, 0, 0.4); } - #menu a:hover, #menu a.selected { - background: #5badff; - text-shadow: 0 0 5px rgba(0, 0, 0, 0.6); } - #menu a.selected { - position: relative; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); } - #menu a:focus { - outline-color: #ff0099; } - #menu a::before { - vertical-align: -2px; - margin-left: 0; - margin-right: 15px; } - @media screen and (max-width: 544px) { - #menu a { - display: none; } - #menu a::before { - margin-left: 10px; } } - #menu.expanded a { - display: block; } - @media screen and (min-width: 545px) and (max-width: 1000px) { - #menu { - flex-basis: 10rem; } - #menu #brand { - font-size: 95%; - margin-bottom: 0.61805rem; } - #menu a { - font-size: 105%; } - #menu > * { - padding: 0.38198rem 0.61805rem; } } - -#content { - flex-grow: 1; - position: relative; - padding: 1rem; - overflow-y: auto; } - @media screen and (max-width: 544px) { - #content { - padding: 0.61805rem; } } - #content > * { - margin-left: auto; - margin-right: auto; } - #content h1 { - text-align: center; - font-size: 2.2807em; - margin-top: 0; - margin-bottom: 1rem; } - #content h2 { - font-size: 1.42383em; - margin-bottom: 0.61805rem; } - @media screen and (max-width: 544px) { - #content h1 { - font-size: 1.80203em; - margin-bottom: 0.61805rem; } - #content h2 { - font-size: 1.26563em; - margin-bottom: 0.61805rem; } } - #content td, #content th { - padding: 0.38198rem; } - #content tbody th { - text-align: right; - width: 160px; - color: white; } - -#content { - opacity: 0; - transition: opacity 0.15s ease-in; } - -#content.load { - opacity: 1; } - -#loader { - position: absolute; - right: 1.618rem; - top: 1.618rem; - transition: opacity .2s; - opacity: 0; } - @media screen and (max-width: 544px) { - #loader { - top: 1rem; - right: 1rem; } } - #loader.show { - opacity: 1; } - -.botpad { - display: block; - height: 5em; } - -.Box { - display: block; - max-width: 900px; - margin-top: 1rem; - padding: 0.61805rem 1rem; - border-radius: 3px; - background-color: rgba(255, 255, 255, 0.07); - box-shadow: 0 0 4px black; - border: 1px solid #4f4f4f; } - .Box::after { - content: ''; - display: block; - clear: both; } - @media screen and (max-width: 544px) { - .Box { - margin-top: 0.61805rem; } } - .Box h1, .Box h2 { - overflow: hidden; } - h1 + .Box { - margin-top: 0; } - .Box h2 { - margin-top: 0; - margin-bottom: 0 !important; } - .Box p:last-child { - margin-bottom: 0.5em; } - .Box.wide { - width: initial; - max-width: initial; } - .Box.medium { - max-width: 1200px; } - .Box.str { - position: relative; } - .Box.str .Row.buttons { - position: absolute; } - @media screen and (max-width: 544px) { - .Box.str .Row.buttons { - right: 1rem; - top: 1.8em; - margin: 1rem auto; } } - @media screen and (min-width: 545px) { - .Box.str .Row.buttons { - right: 0; - top: 0; - margin-top: 0.61805rem; } } - .Box.str.mobopen .Row.buttons { - top: 0; - margin-top: 0.61805rem; } - .Box .Row.explain { - display: block; - max-width: 600px; - margin-left: 0; - line-height: 1.2; } - @media screen and (max-width: 544px) { - .Box .Row.explain { - margin-top: 60px; } } - .Box .Row.explain.nomargintop { - margin-top: 12px !important; } - .Box.mobopen .Row.explain { - margin-top: 12px; } - @media screen and (max-width: 544px) { - .Box.mobopen .Row.explain { - margin-top: 18px; } } - -.Box.fold h2 { - position: relative; - cursor: pointer; - padding: 2px 1.3rem 2px 5px; - margin: 0 -5px 0 -5px; } - .Box.fold h2::after { - position: absolute; - right: 4px; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } -.Box.fold.expanded h2::after { - transform: translate(-25%, -50%) rotate(-90deg); - margin-bottom: 1rem; } -.Box.fold .Row { - display: none; } -.Box.fold.expanded .Row { - display: flex; } - .Box.fold.expanded .Row.v { - display: block; } - -@media screen and (max-width: 544px) { - .Box.fold h2, .Box.mobcol h2 { - padding: 2px 1.3rem 2px 5px; - margin: 0 -5px 0 -5px; } - .Box.fold.expanded h2::after, .Box.mobcol.expanded h2::after { - margin-bottom: 1rem; } - - .Box.mobcol h2 { - position: relative; - cursor: pointer; - padding: 2px 1.3rem 2px 5px; - margin: 0 -5px 0 -5px; } - .Box.mobcol h2::after { - position: absolute; - right: 4px; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } - .Box.mobcol.expanded h2::after { - transform: translate(-25%, -50%) rotate(-90deg); - margin-bottom: 1rem; } - .Box.mobcol .Row { - display: none; } - .Box.mobcol.expanded .Row { - display: flex; } - .Box.mobcol.expanded .Row.v { - display: block; } - .Box.mobcol #ap-box { - display: none; } - .Box.mobcol.expanded #ap-box { - display: block; } } -.Modal { - z-index: 100; - position: fixed; - width: 100%; - height: 100%; - left: 0; - top: 0; - right: 0; - bottom: 0; - display: flex; - justify-content: center; - align-items: center; - transition: opacity .5s; - background: rgba(0, 0, 0, 0.65); - opacity: 0; } - .Modal.visible { - opacity: 1; } - .Modal.hidden { - display: none; } - .Modal.light { - background: rgba(0, 0, 0, 0.25); } - @media screen and (max-width: 544px) { - .Modal { - flex-direction: column; - justify-content: flex-start; - overflow-y: auto; } - .Modal .Dialog { - margin-top: 0.61805rem !important; - flex-basis: unset; - flex-shrink: 0; } } - -.Dialog { - margin: 0.61805rem; - padding: 1rem; - overflow: hidden; - flex-basis: 35rem; - background: #242426; - border-left: 6px solid #2972ba; - border-right: 6px solid #2972ba; - box-shadow: 0 0 6px 0 black; - border-radius: 6px; } - .Dialog h1, .Dialog h2 { - margin-top: 0; } - .Dialog p:last-child { - margin-bottom: 0; } - -.NotifyMsg { - position: fixed; - top: 1.618rem; - right: 2.61792rem; - padding: 0.61805rem 1rem; - -webkit-font-smoothing: subpixel-antialiased; - -webkit-transform: translateZ(0) scale(1, 1); - background: #3887d0; - color: white; - text-shadow: 0 0 2px black; - box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.6); - border-radius: 5px; - max-width: 80%; - transition: opacity .5s; - opacity: 0; } - .NotifyMsg.error { - background: #d03e42; } - @media screen and (max-width: 544px) { - .NotifyMsg { - width: calc(100% - 1rem); } } - .NotifyMsg.visible { - opacity: 1; } - .NotifyMsg.hidden { - display: none; } - -button, input[type=submit], .button { - text-align: center; - cursor: pointer; - display: inline-block; - border-radius: 2px; - padding: 0 0.6em; - border: 0 none; - line-height: 1.8em; - font-size: 1.1em; - margin-bottom: 3px; - min-width: 5em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - text-shadow: 1.5px 1.5px 2px rgba(0, 0, 0, 0.4); - background-color: #3983cd; - box-shadow: 0 3px 0 #265f98; - text-decoration: none !important; } - button:active, input[type=submit]:active, .button:active { - position: relative; - top: 2px; } - button.narrow, input[type=submit].narrow, .button.narrow { - min-width: initial; } - button::before, input[type=submit]::before, .button::before { - vertical-align: -1px; - margin-left: 0; } - button, button:link, button:visited, input[type=submit], input[type=submit]:link, input[type=submit]:visited, .button, .button:link, .button:visited { - color: #FEFEFE; } - button:hover, button:active, button.active, button.selected, input[type=submit]:hover, input[type=submit]:active, input[type=submit].active, input[type=submit].selected, .button:hover, .button:active, .button.active, .button.selected { - background-color: #2076C6; - color: #FEFEFE; } - button:hover, button.selected, button.active, input[type=submit]:hover, input[type=submit].selected, input[type=submit].active, .button:hover, .button.selected, .button.active { - box-shadow: 0 3px 0 #154c80; } - button:active, input[type=submit]:active, .button:active { - box-shadow: 0 1px 0 #154c80; } - button:focus, input[type=submit]:focus, .button:focus { - outline-color: #ff0099; } - -button, input[type=submit], .button { - text-align: center; - cursor: pointer; - display: inline-block; - border-radius: 2px; - padding: 0 0.6em; - border: 0 none; - line-height: 1.8em; - font-size: 1.1em; - margin-bottom: 3px; - min-width: 5em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - text-shadow: 1.5px 1.5px 2px rgba(0, 0, 0, 0.4); - background-color: #3983cd; - box-shadow: 0 3px 0 #265f98; - text-decoration: none !important; } - button:active, input[type=submit]:active, .button:active { - position: relative; - top: 2px; } - button.narrow, input[type=submit].narrow, .button.narrow { - min-width: initial; } - button::before, input[type=submit]::before, .button::before { - vertical-align: -1px; - margin-left: 0; } - button, button:link, button:visited, input[type=submit], input[type=submit]:link, input[type=submit]:visited, .button, .button:link, .button:visited { - color: #FEFEFE; } - button:hover, button:active, button.active, button.selected, input[type=submit]:hover, input[type=submit]:active, input[type=submit].active, input[type=submit].selected, .button:hover, .button:active, .button.active, .button.selected { - background-color: #2076C6; - color: #FEFEFE; } - button:hover, button.selected, button.active, input[type=submit]:hover, input[type=submit].selected, input[type=submit].active, .button:hover, .button.selected, .button.active { - box-shadow: 0 3px 0 #154c80; } - button:active, input[type=submit]:active, .button:active { - box-shadow: 0 1px 0 #154c80; } - button:focus, input[type=submit]:focus, .button:focus { - outline-color: #ff0099; } - -input[type="number"], input[type="password"], input[type="text"], textarea, select, label.select-wrap { - width: 250px; } - -input[type="number"], input.short, select.short { - width: 125px; } - -input[type="number"], input[type="password"], input[type="text"], textarea, select { - border: 0 none; - border-bottom: 2px solid #2972ba; - background-color: #3c3c3c; - color: white; - padding: 6px; - line-height: 1em; - font-weight: normal; } - input[type="number"]:focus, input[type="number"]:hover, input[type="password"]:focus, input[type="password"]:hover, input[type="text"]:focus, input[type="text"]:hover, textarea:focus, textarea:hover, select:focus, select:hover { - border-bottom-color: #2ea1f9; } - -.Row.checkbox { - line-height: 27px; } - .Row.checkbox .box { - overflow: hidden; - width: 27px; - height: 27px; - border: 1px solid #808080; - border-radius: 3px; - background: #3c3c3c; - display: inline-block; - position: relative; - cursor: pointer; - color: #2ea1f9; } - .Row.checkbox .box::before { - font-family: "fontello"; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - line-height: 25px; - text-align: center; - font-size: 20px; - vertical-align: middle; - display: none; } - .Row.checkbox .box::before { - content: "✔"; } - .Row.checkbox .box.checked::before { - display: block; } - -.Row.range .display { - margin-left: 1ex; } -.Row.range label .display { - font-weight: normal; } - -#psk-modal form > *, #wificonfbox form > * { - margin-right: 0.38198rem; } - #psk-modal form > *:last-child, #wificonfbox form > *:last-child { - margin-right: 0; } - -form { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; } - -.Box.errors .list { - color: crimson; - font-weight: bold; } -.Box.errors .lead { - color: white; } - -.Row { - vertical-align: middle; - margin: 12px auto; - text-align: left; - line-height: 1.35em; - display: flex; - flex-direction: row; - align-items: center; } - .Row:first-child { - margin-top: 0; } - .Row:last-child { - margin-bottom: 0; } - .Row.v { - display: block; } - .Row .aside { - float: right; - margin-left: 5px; - margin-bottom: 5px; } - @media screen and (max-width: 544px) { - .Row .aside { - margin: 0; - float: none; } } - .Row .spacer { - width: 160px; } - @media screen and (max-width: 544px) { - .Row .spacer { - display: none; } } - .Row.buttons, .Row.buttons2 { - margin: 16px auto; } - .Row.buttons input, .Row.buttons .button, .Row.buttons2 input, .Row.buttons2 .button { - margin-right: 0.61805rem; } - .Row.centered { - justify-content: center; } - .Row.message { - font-size: 1em; - text-shadow: 1px 1px 3px black; - text-align: center; } - .Row.message.error { - color: crimson; } - .Row.message.ok { - color: #0fe851; } - .Row.separator { - padding-top: 14px; - border-top: 2px solid rgba(255, 255, 255, 0.1); } - .Row textarea { - display: inline-block; - vertical-align: top; - min-height: 10rem; - flex-grow: 1; - resize: vertical; } - .Row label { - font-weight: bold; - color: white; - display: inline-block; - width: 160px; - text-align: right; - text-shadow: 1px 1px 3px black; - padding: 8px; - align-self: flex-start; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - white-space: nowrap; - word-wrap: normal; } - .Row label.error { - color: crimson; } - .Row input[type="range"] { - width: 200px; } - @media screen and (max-width: 544px) { - .Row { - flex-direction: column; - margin: 6px auto; } - .Row.buttons, .Row.centered, .Row.checkbox { - flex-direction: row; } - .Row.buttons { - justify-content: center; } - .Row.buttons :last-child { - margin-right: 0; } - .Row label { - padding-left: 0; - text-align: left; - width: auto; } - .Row .checkbox-wrap { - order: 1; - text-align: left; - padding-bottom: 0; - border-radius: .4px; - width: auto; } - .Row .checkbox-wrap + label { - width: auto; } - .Row input[type="number"], .Row input[type="password"], .Row input[type="text"], .Row textarea, .Row input[type="range"], .Row textarea, .Row select { - width: 100%; } } - -form span.required { - color: red; } - -.RadioGroup { - display: inline-block; - line-height: 1.5em; - vertical-align: middle; } - .RadioGroup label { - width: auto; - text-align: left; - cursor: pointer; - font-weight: normal; } - .RadioGroup input[type="radio"] { - vertical-align: middle; - margin: 0 0 0 5px; } - -#ap-list { - column-count: 3; - column-gap: 0; - margin: 0 -0.23608rem; } - @media screen and (min-width: 545px) and (max-width: 1000px) { - #ap-list { - column-count: 2; } } - @media screen and (max-width: 544px) { - #ap-list { - column-count: 1; } } - -#ap-loader, #ap-noscan, #ap-scan { - background: rgba(255, 255, 255, 0.1); - border-radius: 5px; - padding: 0.38198rem; - margin-bottom: 0.38198rem; - margin-top: 0.38198rem; - font-size: 110%; } - -#ap-noscan { - font-weight: bold; } - -#ap-box { - padding-top: 0.38198rem; } - #ap-box label { - display: block; - color: white; - font-weight: bold; - margin-bottom: 0.23608rem; } - -#psk-modal form { - display: flex; - align-items: center; - margin: 0.38198rem; } - #psk-modal form input[type=password] { - min-width: 5rem; } - -.AP .inner, .AP-preview .wrap { - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - position: relative; - border-radius: 3px; - color: #222; - background: #afafaf; - transition: background-color 0.5s; - display: flex; } - .AP .inner:active, .AP-preview .wrap:active { - left: 0; - top: 1px; } - .AP .inner:hover, .AP-preview .wrap:hover { - background: white; } - .AP .inner .rssi, .AP-preview .wrap .rssi { - min-width: 2.5rem; - flex: 0 0 15%; - text-align: right; } - .AP .inner .rssi:after, .AP-preview .wrap .rssi:after { - padding-left: 0.09018rem; - content: '%'; - font-size: 0.88889em; } - .AP .inner .essid, .AP-preview .wrap .essid { - flex: 1 1 70%; - min-width: 0; - text-overflow: ellipsis; - overflow: hidden; - font-weight: bold; } - .AP .inner .auth, .AP-preview .wrap .auth { - flex: 0 0 15%; } - -.AP { - break-inside: avoid-column; - max-width: 500px; - padding: 0.23608rem; } - .AP.selected .inner { - background: #42a6f9 !important; - cursor: default; - top: 0 !important; } - .AP .inner > * { - padding: 0.61805rem; - white-space: nowrap; - word-wrap: normal; } - -.AP-preview-nil { - padding: 8px; - border-radius: 5px; - border: 1px dashed #ddd; - width: 250px; - height: 94px; } - -.AP-preview .wrap { - flex-direction: row; - background: #ddd !important; - cursor: default; - top: 0 !important; - overflow: hidden; } - .AP-preview .wrap .inner { - display: flex; - flex-direction: column; } - .AP-preview .wrap .inner > * { - padding: 0.61805rem; - white-space: nowrap; - word-wrap: normal; } - .AP-preview .wrap .forget { - align-self: stretch; - line-height: 100%; - padding: 0.61805rem; - border-left: 1px solid #bbb; - display: flex; - align-items: center; - font-size: 28px; } - .AP-preview .wrap .forget, .AP-preview .wrap .forget:hover { - color: black; - text-decoration: none; } - .AP-preview .wrap .forget:hover { - background: #dc4a6a; - color: white; - border-left: 1px solid #666; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - .AP-preview .wrap .forget:active { - position: relative; - padding-top: calc(0.61805rem + 1px); } - .AP-preview .wrap .essid, .AP-preview .wrap .passwd, .AP-preview .wrap .nopasswd { - padding-bottom: 0; } - .AP-preview .wrap .x-passwd { - font-family: monospace; } - -body.term #content { - padding-left: 0; - padding-right: 0; - transition: opacity 0.25s ease-in; } - body.term #content h1 { - font-size: 1.80203em; } - @media screen and (max-width: 544px) { - body.term #content h1 { - font-size: 1.42383em; } } - -#screen { - white-space: nowrap; - background: #111213; - padding: 6px; - display: inline-block; - border: 2px solid #3983CD; - font-size: 20px; - font-family: "DejaVu Sans Mono", "Liberation Mono", "Inconsolata", monospace; } - #screen span { - white-space: pre; } - #screen > span { - position: relative; - cursor: pointer; } - #screen > span::before { - content: " "; } - #screen > span > span { - position: absolute; - left: 0; - z-index: 1; } - #screen.noselect { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -#action-buttons { - margin-top: 10px; - white-space: nowrap; } - #action-buttons button { - margin: 0 3px; - padding: 8px 5px; - min-width: 62px; - cursor: pointer; - font-weight: bold; } - #action-buttons button:focus { - outline: 0 none !important; } - -#term-nav { - padding-top: 1.5em; - text-align: center; } - #term-nav a { - text-decoration: none; - padding: 5px 5px; - border-radius: 2px; - position: relative; } - #term-nav a, #term-nav a:visited, #term-nav a:link { - color: #336085; } - #term-nav a:hover { - color: #5abfff; - background: #1b273c; } - #term-nav a:active { - top: 1px; } - #term-nav a i::before { - display: inline; } - #term-nav a span { - margin-left: .2em; } - @media screen and (max-width: 544px) { - #term-nav a { - font-size: 130%; - padding: 6px; } - #term-nav a span { - display: none; } } - #term-nav .icn-keyboard { - text-decoration: none; - font-size: 130%; - vertical-align: middle; } - -#term-wrap { - text-align: center; } - -#softkb-input { - position: absolute; - top: -9999px; } - -#fu_modal { - align-items: flex-start; } - -#fu_form { - padding: 1rem; - margin-top: 100px; - z-index: 1000; } - #fu_form label { - width: 8em; - display: inline-block; } - #fu_form input[type="number"], #fu_form select { - width: 10em; } - #fu_form textarea { - width: 100%; - min-height: 8em; - margin-top: 0.61805rem; - resize: vertical; } - #fu_form .fu-buttons { - text-align: center; - padding: 0.38198rem; - margin-top: 0.38198rem; - border-radius: 3px; } - #fu_form .fu-prog-box { - display: none; } - #fu_form.busy { - background: rgba(36, 36, 38, 0.3); - border-left-color: rgba(41, 114, 186, 0.3); - border-right-color: rgba(41, 114, 186, 0.3); } - #fu_form.busy .fu-content { - pointer-events: none; - opacity: .3; } - #fu_form.busy .fu-buttons { - text-align: left; - background: #242426; - border: 1px solid #2972ba; } - #fu_form.busy .fu-prog-box { - display: inline-block; } - -.theme-0 .fg0 { - color: #111213; } -.theme-0 .bg0 { - background-color: #111213; } -.theme-0 .fg1 { - color: #CC0000; } -.theme-0 .bg1 { - background-color: #CC0000; } -.theme-0 .fg2 { - color: #4E9A06; } -.theme-0 .bg2 { - background-color: #4E9A06; } -.theme-0 .fg3 { - color: #C4A000; } -.theme-0 .bg3 { - background-color: #C4A000; } -.theme-0 .fg4 { - color: #3465A4; } -.theme-0 .bg4 { - background-color: #3465A4; } -.theme-0 .fg5 { - color: #75507B; } -.theme-0 .bg5 { - background-color: #75507B; } -.theme-0 .fg6 { - color: #06989A; } -.theme-0 .bg6 { - background-color: #06989A; } -.theme-0 .fg7 { - color: #D3D7CF; } -.theme-0 .bg7 { - background-color: #D3D7CF; } -.theme-0 .fg8 { - color: #555753; } -.theme-0 .bg8 { - background-color: #555753; } -.theme-0 .fg9 { - color: #EF2929; } -.theme-0 .bg9 { - background-color: #EF2929; } -.theme-0 .fg10 { - color: #8AE234; } -.theme-0 .bg10 { - background-color: #8AE234; } -.theme-0 .fg11 { - color: #FCE94F; } -.theme-0 .bg11 { - background-color: #FCE94F; } -.theme-0 .fg12 { - color: #729FCF; } -.theme-0 .bg12 { - background-color: #729FCF; } -.theme-0 .fg13 { - color: #AD7FA8; } -.theme-0 .bg13 { - background-color: #AD7FA8; } -.theme-0 .fg14 { - color: #34E2E2; } -.theme-0 .bg14 { - background-color: #34E2E2; } -.theme-0 .fg15 { - color: #EEEEEC; } -.theme-0 .bg15 { - background-color: #EEEEEC; } - -.theme-1 .fg0 { - color: #000000; } -.theme-1 .bg0 { - background-color: #000000; } -.theme-1 .fg1 { - color: #aa0000; } -.theme-1 .bg1 { - background-color: #aa0000; } -.theme-1 .fg2 { - color: #00aa00; } -.theme-1 .bg2 { - background-color: #00aa00; } -.theme-1 .fg3 { - color: #aa5500; } -.theme-1 .bg3 { - background-color: #aa5500; } -.theme-1 .fg4 { - color: #0000aa; } -.theme-1 .bg4 { - background-color: #0000aa; } -.theme-1 .fg5 { - color: #aa00aa; } -.theme-1 .bg5 { - background-color: #aa00aa; } -.theme-1 .fg6 { - color: #00aaaa; } -.theme-1 .bg6 { - background-color: #00aaaa; } -.theme-1 .fg7 { - color: #aaaaaa; } -.theme-1 .bg7 { - background-color: #aaaaaa; } -.theme-1 .fg8 { - color: #555555; } -.theme-1 .bg8 { - background-color: #555555; } -.theme-1 .fg9 { - color: #ff5555; } -.theme-1 .bg9 { - background-color: #ff5555; } -.theme-1 .fg10 { - color: #55ff55; } -.theme-1 .bg10 { - background-color: #55ff55; } -.theme-1 .fg11 { - color: #ffff55; } -.theme-1 .bg11 { - background-color: #ffff55; } -.theme-1 .fg12 { - color: #5555ff; } -.theme-1 .bg12 { - background-color: #5555ff; } -.theme-1 .fg13 { - color: #ff55ff; } -.theme-1 .bg13 { - background-color: #ff55ff; } -.theme-1 .fg14 { - color: #55ffff; } -.theme-1 .bg14 { - background-color: #55ffff; } -.theme-1 .fg15 { - color: #ffffff; } -.theme-1 .bg15 { - background-color: #ffffff; } - -.theme-2 .fg0 { - color: #000000; } -.theme-2 .bg0 { - background-color: #000000; } -.theme-2 .fg1 { - color: #cd0000; } -.theme-2 .bg1 { - background-color: #cd0000; } -.theme-2 .fg2 { - color: #00cd00; } -.theme-2 .bg2 { - background-color: #00cd00; } -.theme-2 .fg3 { - color: #cdcd00; } -.theme-2 .bg3 { - background-color: #cdcd00; } -.theme-2 .fg4 { - color: #0000ee; } -.theme-2 .bg4 { - background-color: #0000ee; } -.theme-2 .fg5 { - color: #cd00cd; } -.theme-2 .bg5 { - background-color: #cd00cd; } -.theme-2 .fg6 { - color: #00cdcd; } -.theme-2 .bg6 { - background-color: #00cdcd; } -.theme-2 .fg7 { - color: #e5e5e5; } -.theme-2 .bg7 { - background-color: #e5e5e5; } -.theme-2 .fg8 { - color: #7f7f7f; } -.theme-2 .bg8 { - background-color: #7f7f7f; } -.theme-2 .fg9 { - color: #ff0000; } -.theme-2 .bg9 { - background-color: #ff0000; } -.theme-2 .fg10 { - color: #00ff00; } -.theme-2 .bg10 { - background-color: #00ff00; } -.theme-2 .fg11 { - color: #ffff00; } -.theme-2 .bg11 { - background-color: #ffff00; } -.theme-2 .fg12 { - color: #5c5cff; } -.theme-2 .bg12 { - background-color: #5c5cff; } -.theme-2 .fg13 { - color: #ff00ff; } -.theme-2 .bg13 { - background-color: #ff00ff; } -.theme-2 .fg14 { - color: #00ffff; } -.theme-2 .bg14 { - background-color: #00ffff; } -.theme-2 .fg15 { - color: #ffffff; } -.theme-2 .bg15 { - background-color: #ffffff; } - -.theme-3 .fg0 { - color: #000000; } -.theme-3 .bg0 { - background-color: #000000; } -.theme-3 .fg1 { - color: #cd0000; } -.theme-3 .bg1 { - background-color: #cd0000; } -.theme-3 .fg2 { - color: #00cd00; } -.theme-3 .bg2 { - background-color: #00cd00; } -.theme-3 .fg3 { - color: #cdcd00; } -.theme-3 .bg3 { - background-color: #cdcd00; } -.theme-3 .fg4 { - color: #0000cd; } -.theme-3 .bg4 { - background-color: #0000cd; } -.theme-3 .fg5 { - color: #cd00cd; } -.theme-3 .bg5 { - background-color: #cd00cd; } -.theme-3 .fg6 { - color: #00cdcd; } -.theme-3 .bg6 { - background-color: #00cdcd; } -.theme-3 .fg7 { - color: #faebd7; } -.theme-3 .bg7 { - background-color: #faebd7; } -.theme-3 .fg8 { - color: #404040; } -.theme-3 .bg8 { - background-color: #404040; } -.theme-3 .fg9 { - color: #ff0000; } -.theme-3 .bg9 { - background-color: #ff0000; } -.theme-3 .fg10 { - color: #00ff00; } -.theme-3 .bg10 { - background-color: #00ff00; } -.theme-3 .fg11 { - color: #ffff00; } -.theme-3 .bg11 { - background-color: #ffff00; } -.theme-3 .fg12 { - color: #0000ff; } -.theme-3 .bg12 { - background-color: #0000ff; } -.theme-3 .fg13 { - color: #ff00ff; } -.theme-3 .bg13 { - background-color: #ff00ff; } -.theme-3 .fg14 { - color: #00ffff; } -.theme-3 .bg14 { - background-color: #00ffff; } -.theme-3 .fg15 { - color: #ffffff; } -.theme-3 .bg15 { - background-color: #ffffff; } - -.theme-4 .fg0 { - color: #2e3436; } -.theme-4 .bg0 { - background-color: #2e3436; } -.theme-4 .fg1 { - color: #cc0000; } -.theme-4 .bg1 { - background-color: #cc0000; } -.theme-4 .fg2 { - color: #4e9a06; } -.theme-4 .bg2 { - background-color: #4e9a06; } -.theme-4 .fg3 { - color: #c4a000; } -.theme-4 .bg3 { - background-color: #c4a000; } -.theme-4 .fg4 { - color: #3465a4; } -.theme-4 .bg4 { - background-color: #3465a4; } -.theme-4 .fg5 { - color: #75507b; } -.theme-4 .bg5 { - background-color: #75507b; } -.theme-4 .fg6 { - color: #06989a; } -.theme-4 .bg6 { - background-color: #06989a; } -.theme-4 .fg7 { - color: #d3d7cf; } -.theme-4 .bg7 { - background-color: #d3d7cf; } -.theme-4 .fg8 { - color: #555753; } -.theme-4 .bg8 { - background-color: #555753; } -.theme-4 .fg9 { - color: #ef2929; } -.theme-4 .bg9 { - background-color: #ef2929; } -.theme-4 .fg10 { - color: #8ae234; } -.theme-4 .bg10 { - background-color: #8ae234; } -.theme-4 .fg11 { - color: #fce94f; } -.theme-4 .bg11 { - background-color: #fce94f; } -.theme-4 .fg12 { - color: #729fcf; } -.theme-4 .bg12 { - background-color: #729fcf; } -.theme-4 .fg13 { - color: #ad7fa8; } -.theme-4 .bg13 { - background-color: #ad7fa8; } -.theme-4 .fg14 { - color: #34e2e2; } -.theme-4 .bg14 { - background-color: #34e2e2; } -.theme-4 .fg15 { - color: #eeeeec; } -.theme-4 .bg15 { - background-color: #eeeeec; } - -.theme-5 .fg0 { - color: #073642; } -.theme-5 .bg0 { - background-color: #073642; } -.theme-5 .fg1 { - color: #dc322f; } -.theme-5 .bg1 { - background-color: #dc322f; } -.theme-5 .fg2 { - color: #859900; } -.theme-5 .bg2 { - background-color: #859900; } -.theme-5 .fg3 { - color: #b58900; } -.theme-5 .bg3 { - background-color: #b58900; } -.theme-5 .fg4 { - color: #268bd2; } -.theme-5 .bg4 { - background-color: #268bd2; } -.theme-5 .fg5 { - color: #d33682; } -.theme-5 .bg5 { - background-color: #d33682; } -.theme-5 .fg6 { - color: #2aa198; } -.theme-5 .bg6 { - background-color: #2aa198; } -.theme-5 .fg7 { - color: #eee8d5; } -.theme-5 .bg7 { - background-color: #eee8d5; } -.theme-5 .fg8 { - color: #002b36; } -.theme-5 .bg8 { - background-color: #002b36; } -.theme-5 .fg9 { - color: #cb4b16; } -.theme-5 .bg9 { - background-color: #cb4b16; } -.theme-5 .fg10 { - color: #586e75; } -.theme-5 .bg10 { - background-color: #586e75; } -.theme-5 .fg11 { - color: #657b83; } -.theme-5 .bg11 { - background-color: #657b83; } -.theme-5 .fg12 { - color: #839496; } -.theme-5 .bg12 { - background-color: #839496; } -.theme-5 .fg13 { - color: #6c71c4; } -.theme-5 .bg13 { - background-color: #6c71c4; } -.theme-5 .fg14 { - color: #93a1a1; } -.theme-5 .bg14 { - background-color: #93a1a1; } -.theme-5 .fg15 { - color: #fdf6e3; } -.theme-5 .bg15 { - background-color: #fdf6e3; } - -.bold { - font-weight: bold !important; } - -.faint span { - opacity: 0.6; } - -.italic { - font-style: italic; } - -.under { - text-decoration: underline; } - -.strike { - text-decoration: line-through; } - -.underline.strike { - text-decoration: underline line-through; } - -.blink-hide .blink { - color: transparent; } - -.Row.color-preview { - font-family: monospace; - font-size: 16pt; - display: block; - margin-bottom: 0; - padding-left: 160px; } - @media screen and (max-width: 544px) { - .Row.color-preview { - padding-left: 0; - font-size: 14pt; } } - .Row.color-preview .colorprev { - display: block; - margin: 0; - cursor: pointer; } - -#color-example { - display: inline-block; - padding: 5px; } - -.page-about .Box { - padding-left: 1rem; - padding-right: 1rem; } - .page-about .Box a { - font-weight: bold; } -.page-about #logo { - float: right; - height: 130px; } -.page-about #logo2 { - max-width: 100%; - margin: 1rem; } -.page-about td { - white-space: normal; } - -.page-help code { - background: rgba(33, 97, 109, 0.31); - border-radius: 1px; - padding: 0 2px; } - -.colorprev { - margin-top: 0.38198rem; - margin-bottom: 0.38198rem; } - .colorprev span { - display: inline-block; - width: 2em; - padding: 0.38198rem 0; - text-align: center; } - -.Row table, .Row table td, .Row table th { - border: 1px solid #666; } -.Row table th, .Row table td { - white-space: normal; } -.Row table th { - background-color: rgba(255, 255, 255, 0.1); } - -.ansiref.w100 { - width: 100%; } - .ansiref.w100 td:nth-child(1) { - width: 8em; } - -.nomen { - width: 100%; } - .nomen code { - white-space: nowrap; } - .nomen td:last-child { - min-width: 15em; } - -.tscroll { - overflow-x: auto; } - -.charset { - line-height: 1; } - .charset div { - display: inline-block; - width: 2.7em; - border: 1px solid #666; - height: 3em; - margin: 1px; - position: relative; } - .charset div span { - display: block; - position: absolute; } - .charset div span:nth-child(1) { - left: .2em; - top: .2em; - height: 1em; - font-size: 85%; - color: #999; } - .charset div span:nth-child(2) { - right: .2em; - top: .2em; - height: 1em; - font-size: 85%; - color: #999; } - .charset div span:nth-child(3) { - width: 100%; - font-size: 105%; - text-align: center; - bottom: .4em; - font-family: "DejaVu Sans Mono", "Liberation Mono", "Inconsolata", monospace; } - .charset div.none { - opacity: .4; } - -@media screen and (min-width: 545px) { - .mq-phone { - display: none !important; } } -@media screen and (max-width: 544px) { - .mq-tablet-min, .mq-no-phone { - display: none !important; } } -@media screen and (min-width: 1001px) { - .mq-tablet-max { - display: none !important; } } -@media screen and (max-width: 1000px) { - .mq-normal-min { - display: none !important; } } - -/*# sourceMappingURL=app.css.map */ diff --git a/html_orig/css/app.css.bak b/html_orig/css/app.css.bak deleted file mode 100644 index 5baf098..0000000 --- a/html_orig/css/app.css.bak +++ /dev/null @@ -1,1284 +0,0 @@ -@charset "UTF-8"; -/* normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS and IE text size adjust after device orientation change, - * without disabling user zoom. - */ -*, *:before, *:after { - box-sizing: border-box; } - -html { - font-family: sans-serif; - /* 1 */ - -ms-text-size-adjust: 100%; - /* 2 */ - -webkit-text-size-adjust: 100%; - /* 2 */ } - -/** - * Remove default margin. - */ -body { - margin: 0; } - -/* HTML5 display definitions - ========================================================================== */ -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ -figure, -nav - { - display: block; } - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ -canvas, -progress - { - display: inline-block; - /* 1 */ - vertical-align: baseline; - /* 2 */ } - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. - */ -[hidden] - { - display: none; } - -/* Links - ========================================================================== */ -/** - * Remove the gray background color from active links in IE 10. - */ -a { - background-color: transparent; } - -/** - * Improve readability of focused elements when they are also in an - * active/hover state. - */ -a:active, -a:hover { - outline: 0; } - -/* Text-level semantics - ========================================================================== */ -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ -b - { - font-weight: bold; } - -/** - * Address styling not present in Safari and Chrome. - */ -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ -h1 { - font-size: 2em; - margin: 0.67em 0; } - -h2 { - font-size: 2em; - margin: 0.67em 0; } - -/** - * Address styling not present in IE 8/9. - */ -/** - * Address inconsistent and variable font size in all browsers. - */ -small { - font-size: 80%; } - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sup { - top: -0.5em; } - -sub { - bottom: -0.25em; } - -/* Embedded content - ========================================================================== */ -/** - * Remove border when inside `a` element in IE 8/9/10. - */ -img { - border: 0; } - -/** - * Correct overflow not hidden in IE 9/10/11. - */ -svg:not(:root) { - overflow: hidden; } - -/* Grouping content - ========================================================================== */ -/** - * Address margin not present in IE 8/9 and Safari. - */ -/** - * Address differences between Firefox and other browsers. - */ -hr { - box-sizing: content-box; - height: 0; } - -/** - * Contain overflow in all browsers. - */ -pre { - overflow: auto; } - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ -code, -pre - { - font-family: monospace; - font-size: 1em; } - -/* Forms - ========================================================================== */ -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ -button, -input, -select, -textarea { - color: inherit; - /* 1 */ - font: inherit; - /* 2 */ - margin: 0; - /* 3 */ } - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ -button { - overflow: visible; } - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ -button, -select { - text-transform: none; } - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ -button, -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - /* 2 */ - cursor: pointer; - /* 3 */ } - -/** - * Re-set default cursor for disabled elements. - */ -button[disabled], -html input[disabled] { - cursor: default; } - -/** - * Remove inner padding and border in Firefox 4+. - */ -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; } - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ -input { - line-height: normal; } - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. - */ -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ -/** - * Define consistent border, margin, and padding. - */ -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ -legend { - border: 0; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ -textarea { - overflow: auto; } - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ -/* Tables - ========================================================================== */ -/** - * Remove most spacing between table cells. - */ -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - -@font-face { - font-family: 'fontello'; - src: url("data:application/octet-stream;base64,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") format("woff"), url("data:application/octet-stream;base64,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I7AEQ2CwASuwBSVhsAUlsAJiILAAUFiwQGBZZrABY7AEJmEgsAQlYGQjsAMlYGRQWCEbIyFZIyAgsAQmI0ZhOFktsDcssAAWICAgsAUmIC5HI0cjYSM8OC2wOCywABYgsAgjQiAgIEYjR7ABKyNhOC2wOSywABawAyWwAiVHI0cjYbAAVFguIDwjIRuwAiWwAiVHI0cjYSCwBSWwBCVHI0cjYbAGJbAFJUmwAiVhuQgACABjYyMgWGIbIVljuAQAYiCwAFBYsEBgWWawAWNgIy4jICA8ijgjIVktsDossAAWILAIQyAuRyNHI2EgYLAgYGawAmIgsABQWLBAYFlmsAFjIyAgPIo4LbA7LCMgLkawAiVGUlggPFkusSsBFCstsDwsIyAuRrACJUZQWCA8WS6xKwEUKy2wPSwjIC5GsAIlRlJYIDxZIyAuRrACJUZQWCA8WS6xKwEUKy2wPiywNSsjIC5GsAIlRlJYIDxZLrErARQrLbA/LLA2K4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrErARQrsARDLrArKy2wQCywABawBCWwBCYgLkcjRyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=") format("truetype"); } -/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ -/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ -/* -@media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: 'fontello'; - src: url('../font/fontello.svg?60007293#fontello') format('svg'); - } -} -*/ -[class^="icn-"]:before, [class*=" icn-"]:before { - font-family: "fontello"; - font-style: normal; - font-weight: normal; - speak: none; - display: inline-block; - text-decoration: inherit; - width: 1em; - margin-right: .2em; - text-align: center; - /* opacity: .8; */ - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - /* fix buttons height, for twitter bootstrap */ - line-height: 1em; - /* Animation center compensation - margins should be symmetric */ - /* remove if not needed */ - margin-left: .2em; - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } - -.icn-persist:before { - content: '\e800'; } - -/* '' */ -.icn-ok:before { - content: '\e801'; } - -/* '' */ -.icn-donate:before { - content: '\e802'; } - -/* '' */ -.icn-back:before { - content: '\e80b'; } - -/* '' */ -.icn-about:before { - content: '\e81f'; } - -/* '' */ -.icn-help:before { - content: '\e826'; } - -/* '' */ -.icn-network:before { - content: '\e82e'; } - -/* '' */ -.icn-restore:before { - content: '\e836'; } - -/* '' */ -.icn-terminal:before { - content: '\f108'; } - -/* '' */ -.icn-github:before { - content: '\f113'; } - -/* '' */ -.icn-wifi:before { - content: '\f1eb'; } - -/* '' */ -html { - box-sizing: border-box; } - -*, *::after, *::before { - box-sizing: inherit; } - -html { - font-family: Arial, sans-serif; - color: #D0D0D0; - background: #131315; } - -html, body { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; - width: 100%; - height: 100%; - overflow: hidden; } - -a, a:visited, a:link { - cursor: pointer; - color: #5abfff; - text-decoration: none; } - -a:hover { - color: #5abfff; - text-decoration: underline; } - -.hidden { - display: none !important; } - -[onclick] { - cursor: pointer; } - -ul > * { - padding-top: .2em; - padding-bottom: .2em; } - -/* Main outer container */ -#outer { - display: flex; - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - top: 0; - bottom: 0; - overflow: hidden; - flex-direction: row; } - -@media screen and (max-width: 544px) { - #outer { - display: block; - overflow-y: scroll; } } -#menu { - flex: 0 0 15rem; - background: #3983CD; } - #menu > * { - display: block; - text-decoration: none; - padding: 0.61805rem 1rem; - white-space: nowrap; - word-wrap: normal; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - #menu #brand { - color: white; - background: #2b6aa8; - font-size: 120%; - text-align: center; - position: relative; - transition: none; - font-weight: bold; - margin-bottom: 1rem; } - @media screen and (max-width: 544px) { - #menu #brand { - background: #3983CD; - cursor: pointer; - margin-bottom: 0.38198rem; } - #menu #brand::after { - position: absolute; - color: rgba(0, 0, 0, 0.4); - right: 1rem; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } } - #menu.expanded #brand { - background: #2b6aa8; } - @media screen and (max-width: 544px) { - #menu.expanded #brand:after { - transform: translate(-25%, -50%) rotate(-90deg); } } - #menu a { - font-size: 130%; - color: white; - transition: background-color 0.2s; - text-shadow: 0 0 5px rgba(0, 0, 0, 0.4); } - #menu a:hover, #menu a.selected { - background: #5badff; - text-shadow: 0 0 5px rgba(0, 0, 0, 0.6); } - #menu a.selected { - position: relative; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); } - #menu a:focus { - outline-color: #ff0099; } - #menu a::before { - vertical-align: -2px; - margin-left: 0; - margin-right: 15px; } - @media screen and (max-width: 544px) { - #menu a { - display: none; } - #menu a::before { - margin-left: 10px; } } - #menu.expanded a { - display: block; } - @media screen and (min-width: 545px) and (max-width: 1000px) { - #menu { - flex-basis: 10rem; } - #menu #brand { - font-size: 95%; - margin-bottom: 0.61805rem; } - #menu a { - font-size: 105%; } - #menu > * { - padding: 0.38198rem 0.61805rem; } } - -#content { - flex-grow: 1; - position: relative; - padding: 1rem; - overflow-y: auto; } - @media screen and (max-width: 544px) { - #content { - padding: 0.61805rem; } } - #content > * { - margin-left: auto; - margin-right: auto; } - #content h1 { - text-align: center; - font-size: 2.2807em; - margin-top: 0; - margin-bottom: 1rem; } - #content h2 { - font-size: 1.42383em; - margin-bottom: 0.61805rem; } - @media screen and (max-width: 544px) { - #content h1 { - font-size: 1.80203em; - margin-bottom: 0.61805rem; } - #content h2 { - font-size: 1.26563em; - margin-bottom: 0.61805rem; } } - #content td, #content th { - padding: 0.38198rem; } - #content tbody th { - text-align: right; - width: 160px; - color: white; } - -#loader { - position: absolute; - right: 1.618rem; - top: 1.618rem; - transition: opacity .2s; - opacity: 0; } - @media screen and (max-width: 544px) { - #loader { - top: 1rem; - right: 1rem; } } - #loader.show { - opacity: 1; } - -.Box { - display: block; - max-width: 900px; - margin-top: 1rem; - padding: 0.61805rem 1rem; - border-radius: 3px; - background-color: rgba(255, 255, 255, 0.07); - box-shadow: 0 0 4px black; - border: 1px solid #4f4f4f; } - @media screen and (max-width: 544px) { - .Box { - margin-top: 0.61805rem; } } - .Box h1, .Box h2 { - overflow: hidden; } - h1 + .Box { - margin-top: 0; } - .Box h2 { - margin-top: 0; - margin-bottom: 0 !important; } - .Box.wide { - width: initial; - max-width: initial; } - .Box.medium { - max-width: 1200px; } - .Box.str { - position: relative; } - .Box.str .Row.buttons { - position: absolute; } - @media screen and (max-width: 544px) { - .Box.str .Row.buttons { - right: 1rem; - top: 1.8em; - margin: 1rem auto; } } - @media screen and (min-width: 545px) { - .Box.str .Row.buttons { - right: 0; - top: 0; - margin-top: 0.61805rem; } } - .Box.str.mobopen .Row.buttons { - top: 0; - margin-top: 0.61805rem; } - .Box .Row.explain { - max-width: 600px; - margin-left: 0; } - @media screen and (max-width: 544px) { - .Box .Row.explain { - margin-top: 60px; } } - .Box.mobopen .Row.explain { - margin-top: 12px; } - @media screen and (max-width: 544px) { - .Box.mobopen .Row.explain { - margin-top: 18px; } } - -@media screen and (max-width: 544px) { - .Box.mobcol h2 { - position: relative; - cursor: pointer; - padding-right: 1.3rem; } - .Box.mobcol h2::after { - position: absolute; - right: 0; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } - .Box.mobcol.expanded h2::after { - transform: translate(-25%, -50%) rotate(-90deg); - margin-bottom: 1rem; } - .Box.mobcol .Row { - display: none; } - .Box.mobcol #ap-box { - display: none; } - .Box.mobcol.expanded .Row { - display: flex; } - .Box.mobcol.expanded #ap-box { - display: block; } } -.Modal { - position: fixed; - width: 100%; - height: 100%; - left: 0; - top: 0; - right: 0; - bottom: 0; - display: flex; - justify-content: center; - align-items: center; - transition: opacity .5s; - background: rgba(0, 0, 0, 0.65); - opacity: 0; } - .Modal.visible { - opacity: 1; } - .Modal.hidden { - display: none; } - -.Dialog { - margin: 0.61805rem; - padding: 1rem; - overflow: hidden; - max-width: 100%; - max-height: 100%; - flex: 0 1 30rem; - background: #1c1c1e; - border-left: 6px solid #2972ba; - border-right: 6px solid #2972ba; - border-top: 1px solid #2972ba; - border-bottom: 1px solid #2972ba; - box-shadow: 0 0 6px 0 black; - border-radius: 6px; } - .Dialog h1, .Dialog h2 { - margin-top: 0; } - .Dialog p:last-child { - margin-bottom: 0; } - -.NotifyMsg { - position: fixed; - top: 1.618rem; - right: 2.61792rem; - padding: 0.61805rem 1rem; - -webkit-font-smoothing: subpixel-antialiased; - -webkit-transform: translateZ(0) scale(1, 1); - background: #3887d0; - color: white; - text-shadow: 0 0 2px black; - box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.6); - border-radius: 5px; - max-width: 80%; - transition: opacity .5s; - opacity: 0; } - .NotifyMsg.error { - background: #d03e42; } - @media screen and (max-width: 544px) { - .NotifyMsg { - width: calc(100% - 1rem); } } - .NotifyMsg.visible { - opacity: 1; } - .NotifyMsg.hidden { - display: none; } - -button, input[type=submit], .button { - text-align: center; - cursor: pointer; - display: inline-block; - border-radius: 2px; - padding: 0 0.6em; - border: 0 none; - line-height: 1.8em; - font-size: 1.1em; - margin-bottom: 3px; - min-width: 5em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - text-shadow: 1.5px 1.5px 2px rgba(0, 0, 0, 0.4); - background-color: #3983cd; - box-shadow: 0 3px 0 #265f98; - text-decoration: none !important; } - button:active, input[type=submit]:active, .button:active { - position: relative; - top: 2px; } - button.narrow, input[type=submit].narrow, .button.narrow { - min-width: initial; } - button::before, input[type=submit]::before, .button::before { - vertical-align: -1px; - margin-left: 0; } - button, button:link, button:visited, input[type=submit], input[type=submit]:link, input[type=submit]:visited, .button, .button:link, .button:visited { - color: #FEFEFE; } - button:hover, button:active, button.active, button.selected, input[type=submit]:hover, input[type=submit]:active, input[type=submit].active, input[type=submit].selected, .button:hover, .button:active, .button.active, .button.selected { - background-color: #2076C6; - color: #FEFEFE; } - button:hover, button.selected, button.active, input[type=submit]:hover, input[type=submit].selected, input[type=submit].active, .button:hover, .button.selected, .button.active { - box-shadow: 0 3px 0 #154c80; } - button:active, input[type=submit]:active, .button:active { - box-shadow: 0 1px 0 #154c80; } - button:focus, input[type=submit]:focus, .button:focus { - outline-color: #ff0099; } - -button, input[type=submit], .button { - text-align: center; - cursor: pointer; - display: inline-block; - border-radius: 2px; - padding: 0 0.6em; - border: 0 none; - line-height: 1.8em; - font-size: 1.1em; - margin-bottom: 3px; - min-width: 5em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - text-shadow: 1.5px 1.5px 2px rgba(0, 0, 0, 0.4); - background-color: #3983cd; - box-shadow: 0 3px 0 #265f98; - text-decoration: none !important; } - button:active, input[type=submit]:active, .button:active { - position: relative; - top: 2px; } - button.narrow, input[type=submit].narrow, .button.narrow { - min-width: initial; } - button::before, input[type=submit]::before, .button::before { - vertical-align: -1px; - margin-left: 0; } - button, button:link, button:visited, input[type=submit], input[type=submit]:link, input[type=submit]:visited, .button, .button:link, .button:visited { - color: #FEFEFE; } - button:hover, button:active, button.active, button.selected, input[type=submit]:hover, input[type=submit]:active, input[type=submit].active, input[type=submit].selected, .button:hover, .button:active, .button.active, .button.selected { - background-color: #2076C6; - color: #FEFEFE; } - button:hover, button.selected, button.active, input[type=submit]:hover, input[type=submit].selected, input[type=submit].active, .button:hover, .button.selected, .button.active { - box-shadow: 0 3px 0 #154c80; } - button:active, input[type=submit]:active, .button:active { - box-shadow: 0 1px 0 #154c80; } - button:focus, input[type=submit]:focus, .button:focus { - outline-color: #ff0099; } - -input[type="number"], input[type="password"], input[type="text"], textarea, select { - border: 0 none; - border-bottom: 2px solid #2972ba; - background-color: #3c3c3c; - color: white; - padding: 6px; - line-height: 1em; - font-weight: normal; } - input[type="number"]:focus, input[type="number"]:hover, input[type="password"]:focus, input[type="password"]:hover, input[type="text"]:focus, input[type="text"]:hover, textarea:focus, textarea:hover, select:focus, select:hover { - border-bottom-color: #2ea1f9; } - -.Row.checkbox { - line-height: 27px; } - .Row.checkbox .box { - overflow: hidden; - width: 27px; - height: 27px; - border: 1px solid #808080; - border-radius: 3px; - background: #3c3c3c; - display: inline-block; - position: relative; - cursor: pointer; - color: #2ea1f9; } - .Row.checkbox .box::before { - font-weight: bold; - position: absolute; - content: '×'; - left: 0; - top: 0; - right: 0; - bottom: 0; - line-height: 26px; - text-align: center; - font-size: 27px; - vertical-align: middle; - display: none; } - .Row.checkbox .box.checked::before { - display: block; } - -.Row.range .display { - margin-left: 1ex; } -.Row.range label .display { - font-weight: normal; } - -#psk-modal form > *, #wificonfbox form > * { - margin-right: 0.38198rem; } - #psk-modal form > *:last-child, #wificonfbox form > *:last-child { - margin-right: 0; } - -form { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; } - -input[type="number"], input[type="password"], input[type="text"], textarea, select, label.select-wrap { - width: 250px; } - -input[type="number"], input.short { - width: 125px; } - -.Box.errors .list { - color: crimson; - font-weight: bold; } -.Box.errors .lead { - color: white; } - -.Row { - vertical-align: middle; - margin: 12px auto; - text-align: left; - display: flex; - flex-direction: row; - align-items: center; } - .Row:first-child { - margin-top: 0; } - .Row:last-child { - margin-bottom: 0; } - .Row .spacer { - width: 160px; } - @media screen and (max-width: 544px) { - .Row .spacer { - display: none; } } - .Row.buttons { - margin: 16px auto; } - .Row.buttons input, .Row.buttons .button { - margin-right: 0.61805rem; } - .Row.centered { - justify-content: center; } - .Row.message { - font-size: 1em; - text-shadow: 1px 1px 3px black; - text-align: center; } - .Row.message.error { - color: crimson; } - .Row.message.ok { - color: #0fe851; } - .Row.separator { - padding-top: 14px; - border-top: 2px solid rgba(255, 255, 255, 0.1); } - .Row textarea { - display: inline-block; - vertical-align: top; - min-height: 10rem; - flex-grow: 1; - resize: vertical; } - .Row label { - font-weight: bold; - color: white; - display: inline-block; - width: 160px; - text-align: right; - text-shadow: 1px 1px 3px black; - padding: 8px; - align-self: flex-start; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - white-space: nowrap; - word-wrap: normal; } - .Row label.error { - color: crimson; } - .Row input[type="range"] { - width: 200px; } - @media screen and (max-width: 544px) { - .Row { - flex-direction: column; - margin: 6px auto; } - .Row.buttons, .Row.centered, .Row.checkbox { - flex-direction: row; } - .Row.buttons { - justify-content: center; } - .Row.buttons :last-child { - margin-right: 0; } - .Row label { - padding-left: 0; - text-align: left; - width: auto; } - .Row .checkbox-wrap { - order: 1; - text-align: left; - padding-bottom: 0; - border-radius: .4px; - width: auto; } - .Row .checkbox-wrap + label { - width: auto; } - .Row input[type="number"], .Row input[type="password"], .Row input[type="text"], .Row textarea, .Row input[type="range"], .Row textarea, .Row select { - width: 100%; } } - -form span.required { - color: red; } - -.RadioGroup { - display: inline-block; - line-height: 1.5em; - vertical-align: middle; } - .RadioGroup label { - width: auto; - text-align: left; - cursor: pointer; - font-weight: normal; } - .RadioGroup input[type="radio"] { - vertical-align: middle; - margin: 0 0 0 5px; } - -#ap-list { - column-count: 3; - column-gap: 0; - margin: 0 -0.23608rem; } - @media screen and (min-width: 545px) and (max-width: 1000px) { - #ap-list { - column-count: 2; } } - @media screen and (max-width: 544px) { - #ap-list { - column-count: 1; } } - -#ap-loader, #ap-noscan, #ap-scan { - background: rgba(255, 255, 255, 0.1); - border-radius: 5px; - padding: 0.38198rem; - margin-bottom: 0.38198rem; } - -#ap-noscan { - font-weight: bold; } - -#ap-box { - padding-top: 0.38198rem; } - #ap-box label { - display: block; - color: white; - font-weight: bold; - margin-bottom: 0.23608rem; } - -#psk-modal form { - display: flex; - align-items: center; - margin: 0.38198rem; } - #psk-modal form input[type=password] { - min-width: 5rem; } - -.AP .inner, .AP-preview .wrap { - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - position: relative; - border-radius: 3px; - color: #222; - background: #afafaf; - transition: background-color 0.5s; - display: flex; } - .AP .inner:active, .AP-preview .wrap:active { - left: 0; - top: 1px; } - .AP .inner:hover, .AP-preview .wrap:hover { - background: white; } - .AP .inner .rssi, .AP-preview .wrap .rssi { - min-width: 2.5rem; - flex: 0 0 15%; - text-align: right; } - .AP .inner .rssi:after, .AP-preview .wrap .rssi:after { - padding-left: 0.09018rem; - content: '%'; - font-size: 0.88889em; } - .AP .inner .essid, .AP-preview .wrap .essid { - flex: 1 1 70%; - min-width: 0; - text-overflow: ellipsis; - overflow: hidden; - font-weight: bold; } - .AP .inner .auth, .AP-preview .wrap .auth { - flex: 0 0 15%; } - -.AP { - break-inside: avoid-column; - max-width: 500px; - padding: 0.23608rem; } - .AP.selected .inner { - background: #42a6f9 !important; - cursor: default; - top: 0 !important; } - .AP .inner > * { - padding: 0.61805rem; - white-space: nowrap; - word-wrap: normal; } - -.AP-preview-nil { - padding: 8px; - border-radius: 5px; - border: 1px dashed #ddd; - width: 250px; - height: 94px; } - -.AP-preview .wrap { - flex-direction: row; - background: #ddd !important; - cursor: default; - top: 0 !important; - overflow: hidden; } - .AP-preview .wrap .inner { - display: flex; - flex-direction: column; } - .AP-preview .wrap .inner > * { - padding: 0.61805rem; - white-space: nowrap; - word-wrap: normal; } - .AP-preview .wrap .forget { - align-self: stretch; - line-height: 100%; - padding: 0.61805rem; - border-left: 1px solid #bbb; - display: flex; - align-items: center; - font-size: 28px; } - .AP-preview .wrap .forget, .AP-preview .wrap .forget:hover { - color: black; - text-decoration: none; } - .AP-preview .wrap .forget:hover { - background: #dc4a6a; - color: white; - border-left: 1px solid #666; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - .AP-preview .wrap .forget:active { - position: relative; - padding-top: calc(0.61805rem + 1px); } - .AP-preview .wrap .essid, .AP-preview .wrap .passwd, .AP-preview .wrap .nopasswd { - padding-bottom: 0; } - .AP-preview .wrap .x-passwd { - font-family: monospace; } - -body.term h1 { - font-size: 1.80203em; } - @media screen and (max-width: 544px) { - body.term h1 { - font-size: 1.42383em; } } -body.term #screen { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - font-family: monospace; - font-size: 16pt; - white-space: nowrap; - background: #111213; - padding: 6px; - display: inline-block; - border: 2px solid #3983CD; } - body.term #screen span { - white-space: pre; - cursor: pointer; } - body.term #screen span:hover { - outline: 1px solid rgba(255, 255, 255, 0.4); } - @media screen and (max-width: 544px) { - body.term #screen span:hover { - outline: 0 none; } } -body.term #buttons { - margin-top: 10px; - white-space: nowrap; } - body.term #buttons button { - margin: 0 3px; - padding: 10px 0; - width: 18%; - max-width: 65px; - min-width: initial; - cursor: pointer; - font-weight: bold; } -body.term #botnav { - padding-top: 1.5em; - text-align: center; } - body.term #botnav a { - padding: 0 0.38198rem; - text-decoration: underline; } - body.term #botnav a, body.term #botnav a:visited, body.term #botnav a:link { - color: #2e4d6e; } - body.term #botnav a:hover { - color: #5abfff; } - -#termwrap { - text-align: center; } - -.page-about .Box { - padding-left: 1rem; - padding-right: 1rem; } - .page-about .Box a { - font-weight: bold; } -.page-about #logo { - float: right; - height: 130px; } -.page-about #logo2 { - max-width: 100%; } -.page-about td { - white-space: normal; } - -.colorprev { - margin-top: 0.38198rem; - margin-bottom: 0.38198rem; } - .colorprev span { - display: inline-block; - width: 2em; - padding: 0.38198rem 0; - text-align: center; } - -.ansiref, .ansiref td, .ansiref th { - border: 1px solid #666; } -.ansiref th, .ansiref td { - white-space: normal; } -.ansiref th { - background-color: rgba(255, 255, 255, 0.1); } -.ansiref td:nth-child(1) { - font-family: monospace; } -.ansiref.w100 { - width: 100%; } - .ansiref.w100 td:nth-child(1) { - width: 9em; } - .ansiref.w100 td:nth-child(2) { - width: 8em; } - -.fg0 { - color: #111213; } - -.bg0 { - background-color: #111213; } - -.fg1 { - color: #CC0000; } - -.bg1 { - background-color: #CC0000; } - -.fg2 { - color: #4E9A06; } - -.bg2 { - background-color: #4E9A06; } - -.fg3 { - color: #C4A000; } - -.bg3 { - background-color: #C4A000; } - -.fg4 { - color: #3465A4; } - -.bg4 { - background-color: #3465A4; } - -.fg5 { - color: #75507B; } - -.bg5 { - background-color: #75507B; } - -.fg6 { - color: #06989A; } - -.bg6 { - background-color: #06989A; } - -.fg7 { - color: #D3D7CF; } - -.bg7 { - background-color: #D3D7CF; } - -.fg8 { - color: #555753; } - -.bg8 { - background-color: #555753; } - -.fg9 { - color: #EF2929; } - -.bg9 { - background-color: #EF2929; } - -.fg10 { - color: #8AE234; } - -.bg10 { - background-color: #8AE234; } - -.fg11 { - color: #FCE94F; } - -.bg11 { - background-color: #FCE94F; } - -.fg12 { - color: #729FCF; } - -.bg12 { - background-color: #729FCF; } - -.fg13 { - color: #AD7FA8; } - -.bg13 { - background-color: #AD7FA8; } - -.fg14 { - color: #34E2E2; } - -.bg14 { - background-color: #34E2E2; } - -.fg15 { - color: #EEEEEC; } - -.bg15 { - background-color: #EEEEEC; } - -.fg8, .fg9, .fg10, .fg11, .fg12, .fg13, .fg14, .fg15 { - font-weight: bold; } - -.nb { - font-weight: normal !important; } - -@media screen and (min-width: 545px) { - .mq-phone { - display: none !important; } } -@media screen and (max-width: 544px) { - .mq-tablet-min, .mq-no-phone { - display: none !important; } } -@media screen and (min-width: 1001px) { - .mq-tablet-max { - display: none !important; } } -@media screen and (max-width: 1000px) { - .mq-normal-min { - display: none !important; } } - -/*# sourceMappingURL=app.css.map */ diff --git a/html_orig/js/.gitkeep b/html_orig/js/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/html_orig/js/app.js b/html_orig/js/app.js deleted file mode 100644 index 1d828bd..0000000 --- a/html_orig/js/app.js +++ /dev/null @@ -1,2536 +0,0 @@ -/*!chibi 3.0.7, Copyright 2012-2016 Kyle Barrow, released under MIT license */ - -// MODIFIED VERSION. -(function () { - 'use strict'; - - var readyfn = [], - loadedfn = [], - domready = false, - pageloaded = false, - d = document, - w = window; - - // Fire any function calls on ready event - function fireReady() { - var i; - domready = true; - for (i = 0; i < readyfn.length; i += 1) { - readyfn[i](); - } - readyfn = []; - } - - // Fire any function calls on loaded event - function fireLoaded() { - var i; - pageloaded = true; - // For browsers with no DOM loaded support - if (!domready) { - fireReady(); - } - for (i = 0; i < loadedfn.length; i += 1) { - loadedfn[i](); - } - loadedfn = []; - } - - // Check DOM ready, page loaded - if (d.addEventListener) { - // Standards - d.addEventListener('DOMContentLoaded', fireReady, false); - w.addEventListener('load', fireLoaded, false); - } else if (d.attachEvent) { - // IE - d.attachEvent('onreadystatechange', fireReady); - // IE < 9 - w.attachEvent('onload', fireLoaded); - } else { - // Anything else - w.onload = fireLoaded; - } - - // Utility functions - - // Loop through node array - function nodeLoop(fn, nodes) { - var i; - // Good idea to walk up the DOM - for (i = nodes.length - 1; i >= 0; i -= 1) { - fn(nodes[i]); - } - } - - // Convert to camel case - function cssCamel(property) { - return property.replace(/-\w/g, function (result) { - return result.charAt(1).toUpperCase(); - }); - } - - // Get computed style - function computeStyle(elm, property) { - // IE, everything else or null - return (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null; - - } - - // Returns URI encoded query string pair - function queryPair(name, value) { - return encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+'); - } - - // Set CSS, important to wrap in try to prevent error thown on unsupported property - function setCss(elm, property, value) { - try { - elm.style[cssCamel(property)] = value; - } catch (e) { - } - } - - // Show CSS - function showCss(elm) { - elm.style.display = ''; - // For elements still hidden by style block - if (computeStyle(elm, 'display') === 'none') { - elm.style.display = 'block'; - } - } - - // Serialize form & JSON values - function serializeData(nodes) { - var querystring = '', subelm, i, j; - if (nodes.constructor === Object) { // Serialize JSON data - for (subelm in nodes) { - if (nodes.hasOwnProperty(subelm)) { - if (nodes[subelm].constructor === Array) { - for (i = 0; i < nodes[subelm].length; i += 1) { - querystring += '&' + queryPair(subelm, nodes[subelm][i]); - } - } else { - querystring += '&' + queryPair(subelm, nodes[subelm]); - } - } - } - } else { // Serialize node data - nodeLoop(function (elm) { - if (elm.nodeName === 'FORM') { - for (i = 0; i < elm.elements.length; i += 1) { - subelm = elm.elements[i]; - - if (!subelm.disabled) { - switch (subelm.type) { - // Ignore buttons, unsupported XHR 1 form fields - case 'button': - case 'image': - case 'file': - case 'submit': - case 'reset': - break; - - case 'select-one': - if (subelm.length > 0) { - querystring += '&' + queryPair(subelm.name, subelm.value); - } - break; - - case 'select-multiple': - for (j = 0; j < subelm.length; j += 1) { - if (subelm[j].selected) { - querystring += '&' + queryPair(subelm.name, subelm[j].value); - } - } - break; - - case 'checkbox': - case 'radio': - if (subelm.checked) { - querystring += '&' + queryPair(subelm.name, subelm.value); - } - break; - - // Everything else including shinny new HTML5 input types - default: - querystring += '&' + queryPair(subelm.name, subelm.value); - } - } - } - } - }, nodes); - } - // Tidy up first & - return (querystring.length > 0) ? querystring.substring(1) : ''; - } - - // Class helper - function classHelper(classes, action, nodes) { - var classarray, search, i, replace, has = false; - if (classes) { - // Trim any whitespace - classarray = classes.split(/\s+/); - nodeLoop(function (elm) { - for (i = 0; i < classarray.length; i += 1) { - var clz = classarray[i]; - if (action === 'remove') { - elm.classList.remove(clz); - } - else if (action === 'add') { - elm.classList.add(clz); - } - else if (action === 'toggle') { - elm.classList.toggle(clz); - } - else if (action === 'has') { - if (elm.classList.contains(clz)) { - has = true; - break; - } - } - - // search = new RegExp('\\b' + classarray[i] + '\\b', 'g'); - // replace = new RegExp(' *' + classarray[i] + '\\b', 'g'); - // if (action === 'remove') { - // elm.className = elm.className.replace(search, ''); - // } else if (action === 'toggle') { - // elm.className = (elm.className.match(search)) ? elm.className.replace(replace, '') : elm.className + ' ' + classarray[i]; - // } else if (action === 'has') { - // if (elm.className.match(search)) { - // has = true; - // break; - // } - // } - } - }, nodes); - } - return has; - } - - // HTML insertion helper - function insertHtml(value, position, nodes) { - var tmpnodes, tmpnode; - if (value) { - nodeLoop(function (elm) { - // No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead - // Convert string to node. We can't innerHTML on a document fragment - tmpnodes = d.createElement('div'); - tmpnodes.innerHTML = value; - while ((tmpnode = tmpnodes.lastChild) !== null) { - // Catch error in unlikely case elm has been removed - try { - if (position === 'before') { - elm.parentNode.insertBefore(tmpnode, elm); - } else if (position === 'after') { - elm.parentNode.insertBefore(tmpnode, elm.nextSibling); - } else if (position === 'append') { - elm.appendChild(tmpnode); - } else if (position === 'prepend') { - elm.insertBefore(tmpnode, elm.firstChild); - } - } catch (e) { - break; - } - } - }, nodes); - } - } - - // Get nodes and return chibi - function chibi(selector) { - var cb, nodes = [], json = false, nodelist, i; - - if (selector) { - - // Element node, would prefer to use (selector instanceof HTMLElement) but no IE support - if (selector.nodeType && selector.nodeType === 1) { - nodes = [selector]; // return element as node list - } else if (typeof selector === 'object') { - // JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support - json = (typeof selector.length !== 'number'); - nodes = selector; - } else if (typeof selector === 'string') { - nodelist = d.querySelectorAll(selector); - - // Convert node list to array so results have full access to array methods - // Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway - for (i = 0; i < nodelist.length; i += 1) { - nodes[i] = nodelist[i]; - } - } - } - - // Only attach nodes if not JSON - cb = json ? {} : nodes; - - // Public functions - - // Executes a function on nodes - cb.each = function (fn) { - if (typeof fn === 'function') { - nodeLoop(function (elm) { - // <= IE 8 loses scope so need to apply - return fn.apply(elm, arguments); - }, nodes); - } - return cb; - }; - // Find first - cb.first = function () { - return chibi(nodes.shift()); - }; - // Find last - cb.last = function () { - return chibi(nodes.pop()); - }; - // Find odd - cb.odd = function () { - var odds = [], i; - for (i = 0; i < nodes.length; i += 2) { - odds.push(nodes[i]); - } - return chibi(odds); - }; - // Find even - cb.even = function () { - var evens = [], i; - for (i = 1; i < nodes.length; i += 2) { - evens.push(nodes[i]); - } - return chibi(evens); - }; - // Hide node - cb.hide = function () { - nodeLoop(function (elm) { - elm.style.display = 'none'; - }, nodes); - return cb; - }; - // Show node - cb.show = function () { - nodeLoop(function (elm) { - showCss(elm); - }, nodes); - return cb; - }; - // Toggle node display - cb.toggle = function (state) { - if (typeof state != 'undefined') { // ADDED - if (state) - cb.show(); - else - cb.hide(); - } else { - nodeLoop(function (elm) { - // computeStyle instead of style.display == 'none' catches elements that are hidden via style block - if (computeStyle(elm, 'display') === 'none') { - showCss(elm); - } else { - elm.style.display = 'none'; - } - - }, nodes); - } - return cb; - }; - // Remove node - cb.remove = function () { - nodeLoop(function (elm) { - // Catch error in unlikely case elm has been removed - try { - elm.parentNode.removeChild(elm); - } catch (e) { - } - }, nodes); - return chibi(); - }; - // Get/Set CSS - cb.css = function (property, value) { - if (property) { - if (value || value === '') { - nodeLoop(function (elm) { - setCss(elm, property, value); - }, nodes); - return cb; - } - if (nodes[0]) { - if (nodes[0].style[cssCamel(property)]) { - return nodes[0].style[cssCamel(property)]; - } - if (computeStyle(nodes[0], property)) { - return computeStyle(nodes[0], property); - } - } - } - }; - // Get class(es) - cb.getClass = function () { - if (nodes[0] && nodes[0].className.length > 0) { - // Weak IE trim support - return nodes[0].className.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '').replace(/\s+/, ' '); - } - }; - // Set (replaces) classes - cb.setClass = function (classes) { - if (classes || classes === '') { - nodeLoop(function (elm) { - elm.className = classes; - }, nodes); - } - return cb; - }; - // Add class - cb.addClass = function (classes) { - classHelper(classes, 'add', nodes); - // if (classes) { - // nodeLoop(function (elm) { - // elm.className += ' ' + classes; - // }, nodes); - // } - return cb; - }; - // Remove class - cb.removeClass = function (classes) { - classHelper(classes, 'remove', nodes); - return cb; - }; - // Toggle class - cb.toggleClass = function (classes, set) { - var method = ((typeof set === 'undefined') ? 'toggle' : (+set ? 'add' : 'remove')); - classHelper(classes, method, nodes); - return cb; - }; - // Has class - cb.hasClass = function (classes) { - return classHelper(classes, 'has', nodes); - }; - // Get/set HTML - cb.html = function (value) { - if (value || value === '') { - nodeLoop(function (elm) { - elm.innerHTML = value; - }, nodes); - return cb; - } - if (nodes[0]) { - return nodes[0].innerHTML; - } - }; - // Insert HTML before selector - cb.htmlBefore = function (value) { - insertHtml(value, 'before', nodes); - return cb; - }; - // Insert HTML after selector - cb.htmlAfter = function (value) { - insertHtml(value, 'after', nodes); - return cb; - }; - // Insert HTML after selector innerHTML - cb.htmlAppend = function (value) { - insertHtml(value, 'append', nodes); - return cb; - }; - // Insert HTML before selector innerHTML - cb.htmlPrepend = function (value) { - insertHtml(value, 'prepend', nodes); - return cb; - }; - // Get/Set HTML attributes - cb.attr = function (property, value) { - if (property) { - property = property.toLowerCase(); - // IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway - if (typeof value !== 'undefined') {//FIXED BUG HERE - nodeLoop(function (elm) { - if (property === 'style') { - elm.style.cssText = value; - } else if (property === 'class') { - elm.className = value; - } else { - elm.setAttribute(property, value); - } - }, nodes); - return cb; - } - if (nodes[0]) { - if (property === 'style') { - if (nodes[0].style.cssText) { - return nodes[0].style.cssText; - } - } else if (property === 'class') { - if (nodes[0].className) { - return nodes[0].className; - } - } else { - if (nodes[0].getAttribute(property)) { - return nodes[0].getAttribute(property); - } - } - } - } - }; - // Get/Set HTML data property - cb.data = function (key, value) { - if (key) { - return cb.attr('data-' + key, value); - } - }; - // Get/Set form element values - cb.val = function (value) { - var values, i, j; - if (typeof value != 'undefined') { // FIXED A BUG HERE - nodeLoop(function (elm) { - switch (elm.nodeName) { - case 'SELECT': - if (typeof value === 'string' || typeof value === 'number') { - value = [value]; - } - for (i = 0; i < elm.length; i += 1) { - // Multiple select - for (j = 0; j < value.length; j += 1) { - elm[i].selected = ''; - if (elm[i].value === ""+value[j]) { - elm[i].selected = 'selected'; - break; - } - } - } - break; - case 'INPUT': - case 'TEXTAREA': - case 'BUTTON': - elm.value = value; - break; - } - }, nodes); - - return cb; - } - if (nodes[0]) { - switch (nodes[0].nodeName) { - case 'SELECT': - values = []; - for (i = 0; i < nodes[0].length; i += 1) { - if (nodes[0][i].selected) { - values.push(nodes[0][i].value); - } - } - return (values.length > 1) ? values : values[0]; - case 'INPUT': - case 'TEXTAREA': - case 'BUTTON': - return nodes[0].value; - } - } - }; - // Return matching checked checkbox or radios - cb.checked = function (check) { - if (typeof check === 'boolean') { - nodeLoop(function (elm) { - if (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) { - elm.checked = check; - } - }, nodes); - return cb; - } - if (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) { - return (!!nodes[0].checked); - } - }; - // Add event handler - cb.on = function (event, fn) { - if (selector === w || selector === d) { - nodes = [selector]; - } - nodeLoop(function (elm) { - if (d.addEventListener) { - elm.addEventListener(event, fn, false); - } else if (d.attachEvent) { - // <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions) - elm[event + fn] = function () { - return fn.apply(elm, arguments); - }; - elm.attachEvent('on' + event, elm[event + fn]); - } - }, nodes); - return cb; - }; - // Remove event handler - cb.off = function (event, fn) { - if (selector === w || selector === d) { - nodes = [selector]; - } - nodeLoop(function (elm) { - if (d.addEventListener) { - elm.removeEventListener(event, fn, false); - } else if (d.attachEvent) { - elm.detachEvent('on' + event, elm[event + fn]); - // Tidy up - elm[event + fn] = null; - } - }, nodes); - return cb; - }; - return cb; - } - - // Basic XHR - chibi.ajax = function (options) { // if options is a number, it's timeout in ms - var opts = extend({ - method: 'GET', - nocache: true, - timeout: 5000, - loader: true, - callback: null - }, options); - opts.method = opts.method.toUpperCase(); - - var loaderFn = opts.loader ? chibi._loader : function(){}; - var url = opts.url; - var method = opts.method; - var query = null; - - if (opts.data) { - query = serializeData(opts.data); - } - - if (query && (method === 'GET')) { - url += (url.indexOf('?') === -1) ? '?' + query : '&' + query; - query = null; - } - - var xhr = new XMLHttpRequest(); - - // prevent caching - if (opts.nocache) { - var ts = (+(new Date())).toString(36); - url += ((url.indexOf('?') === -1) ? '?' : '&') + '_=' + ts; - } - - loaderFn(true); - - xhr.open(method, url, true); - xhr.timeout = opts.timeout; - - // Abort after given timeout - var abortTmeo = setTimeout(function () { - console.error("XHR timed out."); - xhr.abort(); - loaderFn(false); - }, opts.timeout + 10); - - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - loaderFn(false); - - opts.callback && opts.callback(xhr.responseText, xhr.status); - - clearTimeout(abortTmeo); - } - }; - - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - if (method === 'POST') { - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - } - - xhr.send(query); - return xhr; - }; - - chibi._loader = function(){}; - - // Alias to cb.ajax(url, 'get', callback) - chibi.get = function (url, callback, opts) { - opts = opts || {}; - opts.url = url; - opts.callback = callback; - opts.method = 'GET'; - return chibi.ajax(opts); - }; - - // Alias to cb.ajax(url, 'post', callback) - chibi.post = function (url, callback, opts) { - opts = opts || {}; - opts.url = url; - opts.callback = callback; - opts.method = 'POST'; - return chibi.ajax(opts); - }; - - // Fire on DOM ready - chibi.ready = function (fn) { - if (fn) { - if (domready) { - fn(); - return chibi; - } else { - readyfn.push(fn); - } - } - }; - - // Fire on page loaded - chibi.loaded = function (fn) { - if (fn) { - if (pageloaded) { - fn(); - return chibi; - } else { - loadedfn.push(fn); - } - } - }; - - var entityMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '/': '/', - '`': '`', - '=': '=' - }; - - chibi.htmlEscape = function(string) { - return String(string).replace(/[&<>"'`=\/]/g, function (s) { - return entityMap[s]; - }); - }; - - // Set Chibi's global namespace here ($) - w.$ = chibi; -}()); -// keymaster.js -// (c) 2011-2013 Thomas Fuchs -// keymaster.js may be freely distributed under the MIT license. - -;(function(global){ - var k, - _handlers = {}, - _mods = { 16: false, 18: false, 17: false, 91: false }, - _scope = 'all', - // modifier keys - _MODIFIERS = { - '⇧': 16, shift: 16, - '⌥': 18, alt: 18, option: 18, - '⌃': 17, ctrl: 17, control: 17, - '⌘': 91, command: 91 - }, - // special keys - _MAP = { - backspace: 8, tab: 9, clear: 12, - enter: 13, 'return': 13, - esc: 27, escape: 27, space: 32, - left: 37, up: 38, - right: 39, down: 40, - del: 46, 'delete': 46, - home: 36, end: 35, - pageup: 33, pagedown: 34, - ',': 188, '.': 190, '/': 191, - '`': 192, '-': 189, '=': 187, - ';': 186, '\'': 222, - '[': 219, ']': 221, '\\': 220, - // added: - insert: 45, - np_0: 96, np_1: 97, np_2: 98, np_3: 99, np_4: 100, np_5: 101, - np_6: 102, np_7: 103, np_8: 104, np_9: 105, np_mul: 106, - np_add: 107, np_sub: 109, np_point: 110, np_div: 111, numlock: 144, - }, - code = function(x){ - return _MAP[x] || x.toUpperCase().charCodeAt(0); - }, - _downKeys = []; - - for(k=1;k<20;k++) _MAP['f'+k] = 111+k; - - // IE doesn't support Array#indexOf, so have a simple replacement - function index(array, item){ - var i = array.length; - while(i--) if(array[i]===item) return i; - return -1; - } - - // for comparing mods before unassignment - function compareArray(a1, a2) { - if (a1.length != a2.length) return false; - for (var i = 0; i < a1.length; i++) { - if (a1[i] !== a2[i]) return false; - } - return true; - } - - var modifierMap = { - 16:'shiftKey', - 18:'altKey', - 17:'ctrlKey', - 91:'metaKey' - }; - function updateModifierKey(event) { - for(k in _mods) _mods[k] = event[modifierMap[k]]; - }; - - function isModifierPressed(mod) { - if (mod=='control'||mod=='ctrl') return _mods[17]; - if (mod=='shift') return _mods[16]; - if (mod=='meta') return _mods[91]; - if (mod=='alt') return _mods[18]; - return false; - } - - // handle keydown event - function dispatch(event) { - var key, handler, k, i, modifiersMatch, scope; - key = event.keyCode; - - if (index(_downKeys, key) == -1) { - _downKeys.push(key); - } - - // if a modifier key, set the key. property to true and return - if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko - if(key in _mods) { - _mods[key] = true; - // 'assignKey' from inside this closure is exported to window.key - for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true; - return; - } - updateModifierKey(event); - - // see if we need to ignore the keypress (filter() can can be overridden) - // by default ignore key presses if a select, textarea, or input is focused - if(!assignKey.filter.call(this, event)) return; - - // abort if no potentially matching shortcuts found - if (!(key in _handlers)) return; - - scope = getScope(); - - // for each potential shortcut - for (i = 0; i < _handlers[key].length; i++) { - handler = _handlers[key][i]; - - // see if it's in the current scope - if(handler.scope == scope || handler.scope == 'all'){ - // check if modifiers match if any - modifiersMatch = handler.mods.length > 0; - for(k in _mods) - if((!_mods[k] && index(handler.mods, +k) > -1) || - (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false; - // call the handler and stop the event if neccessary - if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){ - if(handler.method(event, handler)===false){ - if(event.preventDefault) event.preventDefault(); - else event.returnValue = false; - if(event.stopPropagation) event.stopPropagation(); - if(event.cancelBubble) event.cancelBubble = true; - } - } - } - } - }; - - // unset modifier keys on keyup - function clearModifier(event){ - var key = event.keyCode, k, - i = index(_downKeys, key); - - // remove key from _downKeys - if (i >= 0) { - _downKeys.splice(i, 1); - } - - if(key == 93 || key == 224) key = 91; - if(key in _mods) { - _mods[key] = false; - for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false; - } - }; - - function resetModifiers() { - for(k in _mods) _mods[k] = false; - for(k in _MODIFIERS) assignKey[k] = false; - }; - - // parse and assign shortcut - function assignKey(key, scope, method){ - var keys, mods; - keys = getKeys(key); - if (method === undefined) { - method = scope; - scope = 'all'; - } - - // for each shortcut - for (var i = 0; i < keys.length; i++) { - // set modifier keys if any - mods = []; - key = keys[i].split('+'); - if (key.length > 1){ - mods = getMods(key); - key = [key[key.length-1]]; - } - // convert to keycode and... - key = key[0] - key = code(key); - // ...store handler - if (!(key in _handlers)) _handlers[key] = []; - _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods }); - } - }; - - // unbind all handlers for given key in current scope - function unbindKey(key, scope) { - var multipleKeys, keys, - mods = [], - i, j, obj; - - multipleKeys = getKeys(key); - - for (j = 0; j < multipleKeys.length; j++) { - keys = multipleKeys[j].split('+'); - - if (keys.length > 1) { - mods = getMods(keys); - } - - key = keys[keys.length - 1]; - key = code(key); - - if (scope === undefined) { - scope = getScope(); - } - if (!_handlers[key]) { - return; - } - for (i = 0; i < _handlers[key].length; i++) { - obj = _handlers[key][i]; - // only clear handlers if correct scope and mods match - if (obj.scope === scope && compareArray(obj.mods, mods)) { - _handlers[key][i] = {}; - } - } - } - }; - - // Returns true if the key with code 'keyCode' is currently down - // Converts strings into key codes. - function isPressed(keyCode) { - if (typeof(keyCode)=='string') { - keyCode = code(keyCode); - } - return index(_downKeys, keyCode) != -1; - } - - function getPressedKeyCodes() { - return _downKeys.slice(0); - } - - function filter(event){ - var tagName = (event.target || event.srcElement).tagName; - // ignore keypressed in any elements that support keyboard data input - return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA'); - } - - // initialize key. to false - for(k in _MODIFIERS) assignKey[k] = false; - - // set current scope (default 'all') - function setScope(scope){ _scope = scope || 'all' }; - function getScope(){ return _scope || 'all' }; - - // delete all handlers for a given scope - function deleteScope(scope){ - var key, handlers, i; - - for (key in _handlers) { - handlers = _handlers[key]; - for (i = 0; i < handlers.length; ) { - if (handlers[i].scope === scope) handlers.splice(i, 1); - else i++; - } - } - }; - - // abstract key logic for assign and unassign - function getKeys(key) { - var keys; - key = key.replace(/\s/g, ''); - keys = key.split(','); - if ((keys[keys.length - 1]) == '') { - keys[keys.length - 2] += ','; - } - return keys; - } - - // abstract mods logic for assign and unassign - function getMods(key) { - var mods = key.slice(0, key.length - 1); - for (var mi = 0; mi < mods.length; mi++) - mods[mi] = _MODIFIERS[mods[mi]]; - return mods; - } - - // cross-browser events - function addEvent(object, event, method) { - if (object.addEventListener) - object.addEventListener(event, method, false); - else if(object.attachEvent) - object.attachEvent('on'+event, function(){ method(window.event) }); - }; - - // set the handlers globally on document - addEvent(document, 'keydown', function(event) { dispatch(event) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48 - addEvent(document, 'keyup', clearModifier); - - // reset modifiers to false whenever the window is (re)focused. - addEvent(window, 'focus', resetModifiers); - - // store previously defined key - var previousKey = global.key; - - // restore previously defined key and return reference to our key object - function noConflict() { - var k = global.key; - global.key = previousKey; - return k; - } - - // set window.key and window.key.set/get/deleteScope, and the default filter - global.key = assignKey; - global.key.setScope = setScope; - global.key.getScope = getScope; - global.key.deleteScope = deleteScope; - global.key.filter = filter; - global.key.isPressed = isPressed; - global.key.isModifier = isModifierPressed; - global.key.getPressedKeyCodes = getPressedKeyCodes; - global.key.noConflict = noConflict; - global.key.unbind = unbindKey; - - if(typeof module !== 'undefined') module.exports = assignKey; - -})(this); -/** Make a node */ -function mk(e) {return document.createElement(e)} - -/** Find one by query */ -function qs(s) {return document.querySelector(s)} - -/** Find all by query */ -function qsa(s) {return document.querySelectorAll(s)} - -/** Convert any to bool safely */ -function bool(x) { - return (x === 1 || x === '1' || x === true || x === 'true'); -} - -/** - * Filter 'spacebar' and 'return' from keypress handler, - * and when they're pressed, fire the callback. - * use $(...).on('keypress', cr(handler)) - */ -function cr(hdl) { - return function(e) { - if (e.which == 10 || e.which == 13 || e.which == 32) { - hdl(); - } - }; -} - -/** Extend an objects with options */ -function extend(defaults, options) { - var target = {}; - - Object.keys(defaults).forEach(function(k){ - target[k] = defaults[k]; - }); - - Object.keys(options).forEach(function(k){ - target[k] = options[k]; - }); - - return target; -} - -/** Escape string for use as literal in RegExp */ -function rgxe(str) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); -} - -/** Format number to N decimal places, output as string */ -function numfmt(x, places) { - var pow = Math.pow(10, places); - return Math.round(x*pow) / pow; -} - -/** Get millisecond timestamp */ -function msNow() { - return +(new Date); -} - -/** Get ms elapsed since msNow() */ -function msElapsed(start) { - return msNow() - start; -} - -/** Shim for log base 10 */ -Math.log10 = Math.log10 || function(x) { - return Math.log(x) / Math.LN10; -}; - -/** - * Perform a substitution in the given string. - * - * Arguments - array or list of replacements. - * Arguments numeric keys will replace {0}, {1} etc. - * Named keys also work, ie. {foo: "bar"} -> replaces {foo} with bar. - * - * Braces are added to keys if missing. - * - * @returns {String} result - */ -String.prototype.format = function () { - var out = this; - var repl = arguments; - - if (arguments.length == 1 && (Array.isArray(arguments[0]) || typeof arguments[0] == 'object')) { - repl = arguments[0]; - } - - for (var ph in repl) { - if (repl.hasOwnProperty(ph)) { - var ph_orig = ph; - - if (!ph.match(/^\{.*\}$/)) { - ph = '{' + ph + '}'; - } - - // replace all occurrences - var pattern = new RegExp(rgxe(ph), "g"); - out = out.replace(pattern, repl[ph_orig]); - } - } - - return out; -}; - -/** HTML escape */ -function e(str) { - return $.htmlEscape(str); -} - -/** Check for undefined */ -function undef(x) { - return typeof x == 'undefined'; -} - -/** Safe json parse */ -function jsp(str) { - try { - return JSON.parse(str); - } catch(e) { - console.error(e); - return null; - } -} - -/** Create a character from ASCII code */ -function Chr(n) { - return String.fromCharCode(n); -} - -/** Decode number from 2B encoding */ -function parse2B(s, i) { - return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127; -} - -/** Decode number from 3B encoding */ -function parse3B(s, i) { - return (s.charCodeAt(i) - 1) + (s.charCodeAt(i+1) - 1) * 127 + (s.charCodeAt(i+2) - 1) * 127 * 127; -} - -/** Encode using 2B encoding, returns string. */ -function encode2B(n) { - var lsb, msb; - lsb = (n % 127); - n = ((n - lsb) / 127); - lsb += 1; - msb = (n + 1); - return Chr(lsb) + Chr(msb); -} - -/** Encode using 3B encoding, returns string. */ -function encode3B(n) { - var lsb, msb, xsb; - lsb = (n % 127); - n = (n - lsb) / 127; - lsb += 1; - msb = (n % 127); - n = (n - msb) / 127; - msb += 1; - xsb = (n + 1); - return Chr(lsb) + Chr(msb) + Chr(xsb); -} -/** Module for toggling a modal overlay */ -(function () { - var modal = {}; - var curCloseCb = null; - - modal.show = function (sel, closeCb) { - var $m = $(sel); - $m.removeClass('hidden visible'); - setTimeout(function () { - $m.addClass('visible'); - }, 1); - curCloseCb = closeCb; - }; - - modal.hide = function (sel) { - var $m = $(sel); - $m.removeClass('visible'); - setTimeout(function () { - $m.addClass('hidden'); - if (curCloseCb) curCloseCb(); - }, 500); // transition time - }; - - modal.init = function () { - // close modal by click outside the dialog - $('.Modal').on('click', function () { - if ($(this).hasClass('no-close')) return; // this is a no-close modal - modal.hide(this); - }); - - $('.Dialog').on('click', function (e) { - e.stopImmediatePropagation(); - }); - - // Hide all modals on esc - $(window).on('keydown', function (e) { - if (e.which == 27) { - modal.hide('.Modal'); - } - }); - }; - - window.Modal = modal; -})(); -(function (nt) { - var sel = '#notif'; - - var hideTmeo1; // timeout to start hiding (transition) - var hideTmeo2; // timeout to add the hidden class - - nt.show = function (message, timeout) { - $(sel).html(message); - Modal.show(sel); - - clearTimeout(hideTmeo1); - clearTimeout(hideTmeo2); - - if (undef(timeout)) timeout = 2500; - - hideTmeo1 = setTimeout(nt.hide, timeout); - }; - - nt.hide = function () { - var $m = $(sel); - $m.removeClass('visible'); - hideTmeo2 = setTimeout(function () { - $m.addClass('hidden'); - }, 250); // transition time - }; - - nt.init = function() { - $(sel).on('click', function() { - nt.hide(this); - }); - }; -})(window.Notify = {}); -/** Global generic init */ -$.ready(function () { - // Checkbox UI (checkbox CSS and hidden input with int value) - $('.Row.checkbox').forEach(function(x) { - var inp = x.querySelector('input'); - var box = x.querySelector('.box'); - - $(box).toggleClass('checked', inp.value); - - var hdl = function() { - inp.value = 1 - inp.value; - $(box).toggleClass('checked', inp.value) - }; - - $(x).on('click', hdl).on('keypress', cr(hdl)); - }); - - // Expanding boxes on mobile - $('.Box.mobcol,.Box.fold').forEach(function(x) { - var h = x.querySelector('h2'); - - var hdl = function() { - $(x).toggleClass('expanded'); - }; - $(h).on('click', hdl).on('keypress', cr(hdl)); - }); - - $('form').forEach(function(x) { - $(x).on('keypress', function(e) { - if ((e.keyCode == 10 || e.keyCode == 13) && e.ctrlKey) { - x.submit(); - } - }) - }); - - // loader dots... - setInterval(function () { - $('.anim-dots').each(function (x) { - var $x = $(x); - var dots = $x.html() + '.'; - if (dots.length == 5) dots = '.'; - $x.html(dots); - }); - }, 1000); - - // flipping number boxes with the mouse wheel - $('input[type=number]').on('mousewheel', function(e) { - var $this = $(this); - var val = +$this.val(); - if (isNaN(val)) val = 1; - - var step = +($this.attr('step') || 1); - var min = +$this.attr('min'); - var max = +$this.attr('max'); - if(e.wheelDelta > 0) { - val += step; - } else { - val -= step; - } - - if (typeof min != 'undefined') val = Math.max(val, +min); - if (typeof max != 'undefined') val = Math.min(val, +max); - $this.val(val); - - if ("createEvent" in document) { - var evt = document.createEvent("HTMLEvents"); - evt.initEvent("change", false, true); - $this[0].dispatchEvent(evt); - } else { - $this[0].fireEvent("onchange"); - } - - e.preventDefault(); - }); - - var errAt = location.search.indexOf('err='); - if (errAt !== -1 && qs('.Box.errors')) { - var errs = location.search.substr(errAt+4).split(','); - var hres = []; - errs.forEach(function(er) { - var lbl = qs('label[for="'+er+'"]'); - if (lbl) { - lbl.classList.add('error'); - hres.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, '')); - } else { - hres.push(er); - } - }); - - qs('.Box.errors .list').innerHTML = hres.join(', '); - qs('.Box.errors').classList.remove('hidden'); - } - - Modal.init(); - Notify.init(); - - // remove tabindixes from h2 if wide - if (window.innerWidth > 550) { - $('.Box h2').forEach(function (x) { - x.removeAttribute('tabindex'); - }); - - // brand works as a link back to term in widescreen mode - var br = qs('#brand'); - br && br.addEventListener('click', function() { - location.href='/'; // go to terminal - }); - } -}); - -$._loader = function(vis) { - $('#loader').toggleClass('show', vis); -}; - -function showPage() { - $('#content').addClass('load'); -} - -$.ready(function() { - if (window.noAutoShow !== true) { - setTimeout(function () { - showPage(); - }, 1); - } -}); - - -/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */ -if (!String.fromCodePoint) { - (function() { - var defineProperty = (function() { - // IE 8 only supports `Object.defineProperty` on DOM elements - try { - var object = {}; - var $defineProperty = Object.defineProperty; - var result = $defineProperty(object, object, object) && $defineProperty; - } catch(error) {} - return result; - }()); - var stringFromCharCode = String.fromCharCode; - var floor = Math.floor; - var fromCodePoint = function() { - var MAX_SIZE = 0x4000; - var codeUnits = []; - var highSurrogate; - var lowSurrogate; - var index = -1; - var length = arguments.length; - if (!length) { - return ''; - } - var result = ''; - while (++index < length) { - var codePoint = Number(arguments[index]); - if ( - !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity` - codePoint < 0 || // not a valid Unicode code point - codePoint > 0x10FFFF || // not a valid Unicode code point - floor(codePoint) != codePoint // not an integer - ) { - throw RangeError('Invalid code point: ' + codePoint); - } - if (codePoint <= 0xFFFF) { // BMP code point - codeUnits.push(codePoint); - } else { // Astral code point; split in surrogate halves - // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae - codePoint -= 0x10000; - highSurrogate = (codePoint >> 10) + 0xD800; - lowSurrogate = (codePoint % 0x400) + 0xDC00; - codeUnits.push(highSurrogate, lowSurrogate); - } - if (index + 1 == length || codeUnits.length > MAX_SIZE) { - result += stringFromCharCode.apply(null, codeUnits); - codeUnits.length = 0; - } - } - return result; - }; - if (defineProperty) { - defineProperty(String, 'fromCodePoint', { - 'value': fromCodePoint, - 'configurable': true, - 'writable': true - }); - } else { - String.fromCodePoint = fromCodePoint; - } - }()); -} -// Generated from PHP locale file -var _tr = { - "wifi.connected_ip_is": "Connected, IP is ", - "wifi.not_conn": "Not connected.", - "wifi.enter_passwd": "Enter password for \":ssid:\"" -}; - -function tr(key) { return _tr[key] || '?'+key+'?'; } -(function(w) { - var authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']; - var curSSID; - - // Get XX % for a slider input - function rangePt(inp) { - return Math.round(((inp.value / inp.max)*100)) + '%'; - } - - // Display selected STA SSID etc - function selectSta(name, password, ip) { - $('#sta_ssid').val(name); - $('#sta_password').val(password); - - $('#sta-nw').toggleClass('hidden', name.length == 0); - $('#sta-nw-nil').toggleClass('hidden', name.length > 0); - - $('#sta-nw .essid').html(e(name)); - var nopw = undef(password) || password.length == 0; - $('#sta-nw .passwd').toggleClass('hidden', nopw); - $('#sta-nw .nopasswd').toggleClass('hidden', !nopw); - $('#sta-nw .ip').html(ip.length>0 ? tr('wifi.connected_ip_is')+ip : tr('wifi.not_conn')); - } - - /** Update display for received response */ - function onScan(resp, status) { - //var ap_json = { - // "result": { - // "inProgress": "0", - // "APs": [ - // {"essid": "Chlivek", "bssid": "88:f7:c7:52:b3:99", "rssi": "204", "enc": "4", "channel": "1"}, - // {"essid": "TyNikdy", "bssid": "5c:f4:ab:0d:f1:1b", "rssi": "164", "enc": "3", "channel": "1"}, - // ] - // } - //}; - - if (status != 200) { - // bad response - rescan(5000); // wait 5sm then retry - return; - } - - try { - resp = JSON.parse(resp); - } catch (e) { - console.log(e); - rescan(5000); - return; - } - - var done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0); - rescan(done ? 15000 : 1000); - if (!done) return; // no redraw yet - - // clear the AP list - var $list = $('#ap-list'); - // remove old APs - $('#ap-list .AP').remove(); - - $list.toggleClass('hidden', !done); - $('#ap-loader').toggleClass('hidden', done); - - // scan done - resp.result.APs.sort(function (a, b) { - return b.rssi - a.rssi; - }).forEach(function (ap) { - ap.enc = parseInt(ap.enc); - - if (ap.enc > 4) return; // hide unsupported auths - - var item = mk('div'); - - var $item = $(item) - .data('ssid', ap.essid) - .data('pwd', ap.enc) - .attr('tabindex', 0) - .addClass('AP'); - - // mark current SSID - if (ap.essid == curSSID) { - $item.addClass('selected'); - } - - var inner = mk('div'); - $(inner).addClass('inner') - .htmlAppend('
{0}
'.format(ap.rssi_perc)) - .htmlAppend('
{0}
'.format($.htmlEscape(ap.essid))) - .htmlAppend('
{0}
'.format(authStr[ap.enc])); - - $item.on('click', function () { - var $th = $(this); - - var conn_ssid = $th.data('ssid'); - var conn_pass = ''; - - if (+$th.data('pwd')) { - // this AP needs a password - conn_pass = prompt(tr("wifi.enter_passwd").replace(":ssid:", conn_ssid)); - if (!conn_pass) return; - } - - $('#sta_password').val(conn_pass); - $('#sta_ssid').val(conn_ssid); - selectSta(conn_ssid, conn_pass, ''); - }); - - - item.appendChild(inner); - $list[0].appendChild(item); - }); - } - - function startScanning() { - $('#ap-loader').removeClass('hidden'); - $('#ap-scan').addClass('hidden'); - $('#ap-loader .anim-dots').html('.'); - - scanAPs(); - } - - /** Ask the CGI what APs are visible (async) */ - function scanAPs() { - if (_demo) { - onScan(_demo_aps, 200); - } else { - $.get('http://' + _root + '/cfg/wifi/scan', onScan); - } - } - - function rescan(time) { - setTimeout(scanAPs, time); - } - - /** Set up the WiFi page */ - function wifiInit(cfg) { - // Update slider value displays - $('.Row.range').forEach(function(x) { - var inp = x.querySelector('input'); - var disp1 = x.querySelector('.x-disp1'); - var disp2 = x.querySelector('.x-disp2'); - var t = rangePt(inp); - $(disp1).html(t); - $(disp2).html(t); - $(inp).on('input', function() { - t = rangePt(inp); - $(disp1).html(t); - $(disp2).html(t); - }); - }); - - // Forget STA credentials - $('#forget-sta').on('click', function() { - selectSta('', '', ''); - return false; - }); - - selectSta(cfg.sta_ssid, cfg.sta_password, cfg.sta_active_ip); - curSSID = cfg.sta_active_ssid; - } - - w.init = wifiInit; - w.startScanning = startScanning; -})(window.WiFi = {}); -/** Handle connections */ -var Conn = (function () { - var ws; - var heartbeatTout; - var pingIv; - var xoff = false; - var autoXoffTout; - var reconTout; - - var pageShown = false; - - function onOpen(evt) { - console.log("CONNECTED"); - doSend("i"); - } - - function onClose(evt) { - console.warn("SOCKET CLOSED, code " + evt.code + ". Reconnecting..."); - clearTimeout(reconTout); - reconTout = setTimeout(function () { - init(); - }, 2000); - // this happens when the buffer gets fucked up via invalid unicode. - // we basically use polling instead of socket then - } - - function onMessage(evt) { - try { - // . = heartbeat - switch (evt.data.charAt(0)) { - case 'B': - case 'T': - case 'S': - Screen.load(evt.data); - if(!pageShown) { - showPage(); - pageShown = true; - } - break; - - case '-': - //console.log('xoff'); - xoff = true; - autoXoffTout = setTimeout(function () { - xoff = false; - }, 250); - break; - - case '+': - //console.log('xon'); - xoff = false; - clearTimeout(autoXoffTout); - break; - } - heartbeat(); - } catch (e) { - console.error(e); - } - } - - function canSend() { - return !xoff; - } - - function doSend(message) { - if (_demo) { - console.log("TX: ", message); - return true; // Simulate success - } - if (xoff) { - // TODO queue - console.log("Can't send, flood control."); - return false; - } - - if (!ws) return false; // for dry testing - if (ws.readyState != 1) { - console.error("Socket not ready"); - return false; - } - if (typeof message != "string") { - message = JSON.stringify(message); - } - ws.send(message); - return true; - } - - function init() { - if (_demo) { - console.log("Demo mode!"); - Screen.load(_demo_screen); - showPage(); - return; - } - - clearTimeout(reconTout); - clearTimeout(heartbeatTout); - - ws = new WebSocket("ws://" + _root + "/term/update.ws"); - ws.onopen = onOpen; - ws.onclose = onClose; - ws.onmessage = onMessage; - console.log("Opening socket."); - heartbeat(); - } - - function heartbeat() { - clearTimeout(heartbeatTout); - heartbeatTout = setTimeout(heartbeatFail, 2000); - } - - function heartbeatFail() { - console.error("Heartbeat lost, probing server..."); - pingIv = setInterval(function () { - console.log("> ping"); - $.get('http://' + _root + '/system/ping', function (resp, status) { - if (status == 200) { - clearInterval(pingIv); - console.info("Server ready, reloading page..."); - location.reload(); - } - }, { - timeout: 100, - }); - }, 1000); - } - - return { - ws: null, - init: init, - send: doSend, - canSend: canSend, // check flood control - }; -})(); -/** - * User input - * - * --- Rx messages: --- - * S - screen content (binary encoding of the entire screen with simple compression) - * T - text labels - Title and buttons, \0x01-separated - * B - beep - * . - heartbeat - * - * --- Tx messages --- - * s - string - * b - action button - * p - mb press - * r - mb release - * m - mouse move - */ -var Input = (function() { - var opts = { - np_alt: false, - cu_alt: false, - fn_alt: false, - mt_click: false, - mt_move: false, - no_keys: false, - }; - - /** Send a literal message */ - function sendStrMsg(str) { - return Conn.send("s"+str); - } - - /** Send a button event */ - function sendBtnMsg(n) { - Conn.send("b"+Chr(n)); - } - - /** Fn alt choice for key message */ - function fa(alt, normal) { - return opts.fn_alt ? alt : normal; - } - - /** Cursor alt choice for key message */ - function ca(alt, normal) { - return opts.cu_alt ? alt : normal; - } - - /** Numpad alt choice for key message */ - function na(alt, normal) { - return opts.np_alt ? alt : normal; - } - - function _bindFnKeys() { - var keymap = { - 'tab': '\x09', - 'backspace': '\x08', - 'enter': '\x0d', - 'ctrl+enter': '\x0a', - 'esc': '\x1b', - 'up': ca('\x1bOA', '\x1b[A'), - 'down': ca('\x1bOB', '\x1b[B'), - 'right': ca('\x1bOC', '\x1b[C'), - 'left': ca('\x1bOD', '\x1b[D'), - 'home': ca('\x1bOH', fa('\x1b[H', '\x1b[1~')), - 'insert': '\x1b[2~', - 'delete': '\x1b[3~', - 'end': ca('\x1bOF', fa('\x1b[F', '\x1b[4~')), - 'pageup': '\x1b[5~', - 'pagedown': '\x1b[6~', - 'f1': fa('\x1bOP', '\x1b[11~'), - 'f2': fa('\x1bOQ', '\x1b[12~'), - 'f3': fa('\x1bOR', '\x1b[13~'), - 'f4': fa('\x1bOS', '\x1b[14~'), - 'f5': '\x1b[15~', // note the disconnect - 'f6': '\x1b[17~', - 'f7': '\x1b[18~', - 'f8': '\x1b[19~', - 'f9': '\x1b[20~', - 'f10': '\x1b[21~', // note the disconnect - 'f11': '\x1b[23~', - 'f12': '\x1b[24~', - 'shift+f1': fa('\x1bO1;2P', '\x1b[25~'), - 'shift+f2': fa('\x1bO1;2Q', '\x1b[26~'), // note the disconnect - 'shift+f3': fa('\x1bO1;2R', '\x1b[28~'), - 'shift+f4': fa('\x1bO1;2S', '\x1b[29~'), // note the disconnect - 'shift+f5': fa('\x1b[15;2~', '\x1b[31~'), - 'shift+f6': fa('\x1b[17;2~', '\x1b[32~'), - 'shift+f7': fa('\x1b[18;2~', '\x1b[33~'), - 'shift+f8': fa('\x1b[19;2~', '\x1b[34~'), - 'shift+f9': fa('\x1b[20;2~', '\x1b[35~'), // 35-38 are not standard - but what is? - 'shift+f10': fa('\x1b[21;2~', '\x1b[36~'), - 'shift+f11': fa('\x1b[22;2~', '\x1b[37~'), - 'shift+f12': fa('\x1b[23;2~', '\x1b[38~'), - 'np_0': na('\x1bOp', '0'), - 'np_1': na('\x1bOq', '1'), - 'np_2': na('\x1bOr', '2'), - 'np_3': na('\x1bOs', '3'), - 'np_4': na('\x1bOt', '4'), - 'np_5': na('\x1bOu', '5'), - 'np_6': na('\x1bOv', '6'), - 'np_7': na('\x1bOw', '7'), - 'np_8': na('\x1bOx', '8'), - 'np_9': na('\x1bOy', '9'), - 'np_mul': na('\x1bOR', '*'), - 'np_add': na('\x1bOl', '+'), - 'np_sub': na('\x1bOS', '-'), - 'np_point': na('\x1bOn', '.'), - 'np_div': na('\x1bOQ', '/'), - // we don't implement numlock key (should change in numpad_alt mode, but it's even more useless than the rest) - }; - - for (var k in keymap) { - if (keymap.hasOwnProperty(k)) { - bind(k, keymap[k]); - } - } - } - - /** Bind a keystroke to message */ - function bind(combo, str) { - // mac fix - allow also cmd - if (combo.indexOf('ctrl+') !== -1) { - combo += ',' + combo.replace('ctrl', 'command'); - } - - // unbind possible old binding - key.unbind(combo); - - key(combo, function (e) { - if (opts.no_keys) return; - e.preventDefault(); - sendStrMsg(str) - }); - } - - /** Bind/rebind key messages */ - function _initKeys() { - // This takes care of text characters typed - window.addEventListener('keypress', function(evt) { - if (opts.no_keys) return; - var str = ''; - if (evt.key) str = evt.key; - else if (evt.which) str = String.fromCodePoint(evt.which); - if (str.length>0 && str.charCodeAt(0) >= 32) { -// console.log("Typed ", str); - sendStrMsg(str); - } - }); - - // ctrl-letter codes are sent as simple low ASCII codes - for (var i = 1; i<=26;i++) { - bind('ctrl+' + String.fromCharCode(96+i), String.fromCharCode(i)); - } - bind('ctrl+]', '\x1b'); // alternate way to enter ESC - bind('ctrl+\\', '\x1c'); - bind('ctrl+[', '\x1d'); - bind('ctrl+^', '\x1e'); - bind('ctrl+_', '\x1f'); - - _bindFnKeys(); - } - - // mouse button states - var mb1 = 0; - var mb2 = 0; - var mb3 = 0; - - /** Init the Input module */ - function init() { - _initKeys(); - - // Button presses - $('#action-buttons button').forEach(function(s) { - s.addEventListener('click', function() { - sendBtnMsg(+this.dataset['n']); - }); - }); - - // global mouse state tracking - for motion reporting - window.addEventListener('mousedown', function(evt) { - if (evt.button == 0) mb1 = 1; - if (evt.button == 1) mb2 = 1; - if (evt.button == 2) mb3 = 1; - }); - - window.addEventListener('mouseup', function(evt) { - if (evt.button == 0) mb1 = 0; - if (evt.button == 1) mb2 = 0; - if (evt.button == 2) mb3 = 0; - }); - } - - /** Prepare modifiers byte for mouse message */ - function packModifiersForMouse() { - return (key.isModifier('ctrl')?1:0) | - (key.isModifier('shift')?2:0) | - (key.isModifier('alt')?4:0) | - (key.isModifier('meta')?8:0); - } - - return { - /** Init the Input module */ - init: init, - - /** Send a literal string message */ - sendString: sendStrMsg, - - /** Enable alternate key modes (cursors, numpad, fn) */ - setAlts: function(cu, np, fn) { - if (opts.cu_alt != cu || opts.np_alt != np || opts.fn_alt != fn) { - opts.cu_alt = cu; - opts.np_alt = np; - opts.fn_alt = fn; - - // rebind keys - codes have changed - _bindFnKeys(); - } - }, - - setMouseMode: function(click, move) { - opts.mt_click = click; - opts.mt_move = move; - }, - - // Mouse events - onMouseMove: function (x, y) { - if (!opts.mt_move) return; - var b = mb1 ? 1 : mb2 ? 2 : mb3 ? 3 : 0; - var m = packModifiersForMouse(); - Conn.send("m" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - }, - onMouseDown: function (x, y, b) { - if (!opts.mt_click) return; - if (b > 3 || b < 1) return; - var m = packModifiersForMouse(); - Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - // console.log("B ",b," M ",m); - }, - onMouseUp: function (x, y, b) { - if (!opts.mt_click) return; - if (b > 3 || b < 1) return; - var m = packModifiersForMouse(); - Conn.send("r" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - // console.log("B ",b," M ",m); - }, - onMouseWheel: function (x, y, dir) { - if (!opts.mt_click) return; - // -1 ... btn 4 (away from user) - // +1 ... btn 5 (towards user) - var m = packModifiersForMouse(); - var b = (dir < 0 ? 4 : 5); - Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - // console.log("B ",b," M ",m); - }, - mouseTracksClicks: function() { - return opts.mt_click; - }, - blockKeys: function(yes) { - opts.no_keys = yes; - } - }; -})(); - -var Screen = (function () { - var W = 0, H = 0; // dimensions - var inited = false; - - var cursor = { - a: false, // active (blink state) - x: 0, // 0-based coordinates - y: 0, - fg: 7, // colors 0-15 - bg: 0, - attrs: 0, - suppress: false, // do not turn on in blink interval (for safe moving) - forceOn: false, // force on unless hanging: used to keep cursor visible during move - hidden: false, // do not show (DEC opt) - hanging: false, // cursor at column "W+1" - not visible - }; - - var screen = []; - var blinkIval; - var cursorFlashStartIval; - - // Some non-bold Fraktur symbols are outside the contiguous block - var frakturExceptions = { - 'C': '\u212d', - 'H': '\u210c', - 'I': '\u2111', - 'R': '\u211c', - 'Z': '\u2128', - }; - - // for BEL - var audioCtx = null; - try { - audioCtx = new (window.AudioContext || window.audioContext || window.webkitAudioContext)(); - } catch (er) { - console.error("No AudioContext!", er); - } - - /** Get cell under cursor */ - function _curCell() { - return screen[cursor.y*W + cursor.x]; - } - - /** Safely move cursor */ - function cursorSet(y, x) { - // Hide and prevent from showing up during the move - cursor.suppress = true; - _draw(_curCell(), false); - cursor.x = x; - cursor.y = y; - // Show again - cursor.suppress = false; - _draw(_curCell()); - } - - function alpha2fraktur(t) { - // perform substitution - if (t >= 'a' && t <= 'z') { - t = String.fromCodePoint(0x1d51e - 97 + t.charCodeAt(0)); - } - else if (t >= 'A' && t <= 'Z') { - // this set is incomplete, some exceptions are needed - if (frakturExceptions.hasOwnProperty(t)) { - t = frakturExceptions[t]; - } else { - t = String.fromCodePoint(0x1d504 - 65 + t.charCodeAt(0)); - } - } - return t; - } - - /** Update cell on display. inv = invert (for cursor) */ - function _draw(cell, inv) { - if (!cell) return; - if (typeof inv == 'undefined') { - inv = cursor.a && cursor.x == cell.x && cursor.y == cell.y; - } - - var fg, bg, cn, t; - - fg = inv ? cell.bg : cell.fg; - bg = inv ? cell.fg : cell.bg; - - t = cell.t; - if (!t.length) t = ' '; - - cn = 'fg' + fg + ' bg' + bg; - if (cell.attrs & (1<<0)) cn += ' bold'; - if (cell.attrs & (1<<1)) cn += ' faint'; - if (cell.attrs & (1<<2)) cn += ' italic'; - if (cell.attrs & (1<<3)) cn += ' under'; - if (cell.attrs & (1<<4)) cn += ' blink'; - if (cell.attrs & (1<<5)) { - cn += ' fraktur'; - t = alpha2fraktur(t); - } - if (cell.attrs & (1<<6)) cn += ' strike'; - - cell.slot.textContent = t; - cell.elem.className = cn; - } - - /** Show entire screen */ - function _drawAll() { - for (var i = W*H-1; i>=0; i--) { - _draw(screen[i]); - } - } - - function _rebuild(rows, cols) { - W = cols; - H = rows; - - /* Build screen & show */ - var cOuter, cInner, cell, screenDiv = qs('#screen'); - - // Empty the screen node - while (screenDiv.firstChild) screenDiv.removeChild(screenDiv.firstChild); - - screen = []; - - for(var i = 0; i < W*H; i++) { - cOuter = mk('span'); - cInner = mk('span'); - - /* Mouse tracking */ - (function() { - var x = i % W; - var y = Math.floor(i / W); - cOuter.addEventListener('mouseenter', function (evt) { - Input.onMouseMove(x, y); - }); - cOuter.addEventListener('mousedown', function (evt) { - Input.onMouseDown(x, y, evt.button+1); - }); - cOuter.addEventListener('mouseup', function (evt) { - Input.onMouseUp(x, y, evt.button+1); - }); - cOuter.addEventListener('contextmenu', function (evt) { - if (Input.mouseTracksClicks()) { - evt.preventDefault(); - } - }); - cOuter.addEventListener('mousewheel', function (evt) { - Input.onMouseWheel(x, y, evt.deltaY>0?1:-1); - return false; - }); - })(); - - /* End of line */ - if ((i > 0) && (i % W == 0)) { - screenDiv.appendChild(mk('br')); - } - /* The cell */ - cOuter.appendChild(cInner); - screenDiv.appendChild(cOuter); - - cell = { - t: ' ', - fg: 7, - bg: 0, // the colors will be replaced immediately as we receive data (user won't see this) - attrs: 0, - elem: cOuter, - slot: cInner, - x: i % W, - y: Math.floor(i / W), - }; - screen.push(cell); - _draw(cell); - } - } - - /** Init the terminal */ - function _init() { - /* Cursor blinking */ - clearInterval(blinkIval); - blinkIval = setInterval(function () { - cursor.a = !cursor.a; - if (cursor.hidden || cursor.hanging) { - cursor.a = false; - } - - if (!cursor.suppress) { - _draw(_curCell(), cursor.forceOn || cursor.a); - } - }, 500); - - /* blink attribute animation */ - setInterval(function () { - $('#screen').removeClass('blink-hide'); - setTimeout(function () { - $('#screen').addClass('blink-hide'); - }, 800); // 200 ms ON - }, 1000); - - inited = true; - } - - // constants for decoding the update blob - var SEQ_SET_COLOR_ATTR = 1; - var SEQ_REPEAT = 2; - var SEQ_SET_COLOR = 3; - var SEQ_SET_ATTR = 4; - - /** Parse received screen update object (leading S removed already) */ - function _load_content(str) { - var i = 0, ci = 0, j, jc, num, num2, t = ' ', fg, bg, attrs, cell; - - if (!inited) _init(); - - var cursorMoved; - - // Set size - num = parse2B(str, i); i += 2; // height - num2 = parse2B(str, i); i += 2; // width - if (num != H || num2 != W) { - _rebuild(num, num2); - } - // console.log("Size ",num, num2); - - // Cursor position - num = parse2B(str, i); i += 2; // row - num2 = parse2B(str, i); i += 2; // col - cursorMoved = (cursor.x != num2 || cursor.y != num); - cursorSet(num, num2); - // console.log("Cursor at ",num, num2); - - // Attributes - num = parse2B(str, i); i += 2; // fg bg attribs - cursor.hidden = !(num & (1<<0)); // DEC opt "visible" - cursor.hanging = !!(num & (1<<1)); - // console.log("Attributes word ",num.toString(16)+'h'); - - Input.setAlts( - !!(num & (1<<2)), // cursors alt - !!(num & (1<<3)), // numpad alt - !!(num & (1<<4)) // fn keys alt - ); - - var mt_click = !!(num & (1<<5)); - var mt_move = !!(num & (1<<6)); - Input.setMouseMode( - mt_click, - mt_move - ); - $('#screen').toggleClass('noselect', mt_move); - - var show_buttons = !!(num & (1<<7)); - var show_config_links = !!(num & (1<<8)); - $('.x-term-conf-btn').toggleClass('hidden', !show_config_links); - $('#action-buttons').toggleClass('hidden', !show_buttons); - - fg = 7; - bg = 0; - attrs = 0; - - // Here come the content - while(i < str.length && ci> 4; - attrs = (num & 0xFF00)>>8; - } - else if (jc == SEQ_SET_COLOR) { - num = parse2B(str, i); i += 2; - fg = num & 0x0F; - bg = (num & 0xF0) >> 4; - } - else if (jc == SEQ_SET_ATTR) { - num = parse2B(str, i); i += 2; - attrs = num & 0xFF; - } - else if (jc == SEQ_REPEAT) { - num = parse2B(str, i); i += 2; - // console.log("Repeat x ",num); - for (; num>0 && ci 0 ? e(s) : " "; - x.style.opacity = s.length > 0 ? 1 : 0.2; - }) - } - - /** Audible beep for ASCII 7 */ - function _beep() { - var osc, gain; - if (!audioCtx) return; - - // Main beep - osc = audioCtx.createOscillator(); - gain = audioCtx.createGain(); - osc.connect(gain); - gain.connect(audioCtx.destination); - gain.gain.value = 0.5; - osc.frequency.value = 750; - osc.type = 'sine'; - osc.start(); - osc.stop(audioCtx.currentTime+0.05); - - // Surrogate beep (making it sound like 'oops') - osc = audioCtx.createOscillator(); - gain = audioCtx.createGain(); - osc.connect(gain); - gain.connect(audioCtx.destination); - gain.gain.value = 0.2; - osc.frequency.value = 400; - osc.type = 'sine'; - osc.start(audioCtx.currentTime+0.05); - osc.stop(audioCtx.currentTime+0.08); - } - - /** Load screen content from a binary sequence (new) */ - function load(str) { - //console.log(JSON.stringify(str)); - var content = str.substr(1); - switch(str.charAt(0)) { - case 'S': - _load_content(content); - break; - case 'T': - _load_labels(content); - break; - case 'B': - _beep(); - break; - default: - console.warn("Bad data message type, ignoring."); - console.log(str); - } - } - - return { - load: load, // full load (string) - }; -})(); -/** File upload utility */ -var TermUpl = (function() { - var lines, // array of lines without newlines - line_i, // current line index - fuTout, // timeout handle for line sending - send_delay_ms, // delay between lines (ms) - nl_str, // newline string to use - curLine, // current line (when using fuOil) - inline_pos; // Offset in line (for long lines) - - // lines longer than this are split to chunks - // sending a super-ling string through the socket is not a good idea - var MAX_LINE_LEN = 128; - - function fuOpen() { - fuStatus("Ready..."); - Modal.show('#fu_modal', onClose); - $('#fu_form').toggleClass('busy', false); - Input.blockKeys(true); - } - - function onClose() { - console.log("Upload modal closed."); - clearTimeout(fuTout); - line_i = 0; - Input.blockKeys(false); - } - - function fuStatus(msg) { - qs('#fu_prog').textContent = msg; - } - - function fuSend() { - var v = qs('#fu_text').value; - if (!v.length) { - fuClose(); - return; - } - - lines = v.split('\n'); - line_i = 0; - inline_pos = 0; // offset in line - send_delay_ms = qs('#fu_delay').value; - - // sanitize - 0 causes overflows - if (send_delay_ms < 0) { - send_delay_ms = 0; - qs('#fu_delay').value = send_delay_ms; - } - - nl_str = { - 'CR': '\r', - 'LF': '\n', - 'CRLF': '\r\n', - }[qs('#fu_crlf').value]; - - $('#fu_form').toggleClass('busy', true); - fuStatus("Starting..."); - fuSendLine(); - } - - function fuSendLine() { - if (!$('#fu_modal').hasClass('visible')) { - // Modal is closed, cancel - return; - } - - if (!Conn.canSend()) { - // postpone - fuTout = setTimeout(fuSendLine, 1); - return; - } - - if (inline_pos == 0) { - curLine = lines[line_i++] + nl_str; - } - - var chunk; - if ((curLine.length - inline_pos) <= MAX_LINE_LEN) { - chunk = curLine.substr(inline_pos, MAX_LINE_LEN); - inline_pos = 0; - } else { - chunk = curLine.substr(inline_pos, MAX_LINE_LEN); - inline_pos += MAX_LINE_LEN; - } - - if (!Input.sendString(chunk)) { - fuStatus("FAILED!"); - return; - } - - var all = lines.length; - - fuStatus(line_i+" / "+all+ " ("+(Math.round((line_i/all)*1000)/10)+"%)"); - - if (lines.length > line_i || inline_pos > 0) { - fuTout = setTimeout(fuSendLine, send_delay_ms); - } else { - closeWhenReady(); - } - } - - function closeWhenReady() { - if (!Conn.canSend()) { - // stuck in XOFF still, wait to process... - fuStatus("Waiting for Tx buffer..."); - setTimeout(closeWhenReady, 100); - } else { - fuStatus("Done."); - // delay to show it - setTimeout(function() { - fuClose(); - }, 100); - } - } - - function fuClose() { - Modal.hide('#fu_modal'); - } - - return { - init: function() { - qs('#fu_file').addEventListener('change', function (evt) { - var reader = new FileReader(); - var file = evt.target.files[0]; - console.log("Selected file type: "+file.type); - if (!file.type.match(/text\/.*|application\/(json|csv|.*xml.*|.*script.*)/)) { - // Deny load of blobs like img - can crash browser and will get corrupted anyway - if (!confirm("This does not look like a text file: "+file.type+"\nReally load?")) { - qs('#fu_file').value = ''; - return; - } - } - reader.onload = function(e) { - var txt = e.target.result.replace(/[\r\n]+/,'\n'); - qs('#fu_text').value = txt; - }; - console.log("Loading file..."); - reader.readAsText(file); - }, false); - }, - close: fuClose, - start: fuSend, - open: fuOpen, - } -})(); -/** Init the terminal sub-module - called from HTML */ -window.termInit = function () { - Conn.init(); - Input.init(); - TermUpl.init(); -};