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(''.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();
-};