Common stuff for all my devices' web server pages: css, login, log, ipv4, ipv6, firmware update, clock, reset info etc.
Dependents: oldheating gps motorhome heating
web-ajax-class.inc
00001 "//Ajax class\n" 00002 "'use strict';\n" 00003 "\n" 00004 "//Exposed properties\n" 00005 "let ajaxResponse_ = '';\n" 00006 "let ajaxHeaders_ = '';\n" 00007 "let ajaxDate_ = null;\n" 00008 "let ajaxMs_ = 0;\n" 00009 "let ajaxOnResponse_ = null;\n" 00010 "let ajaxOnTick_ = null;\n" 00011 "let ajaxServer_ = '';\n" 00012 "\n" 00013 "//Private variables\n" 00014 "let ajaxOverrideBlockUpdateOnFocus_ = false;\n" 00015 "let ajaxXhr_ = null;\n" 00016 "let ajaxMsCountAtAjaxSend_ = 0;\n" 00017 "const ajaxTickMs_ = 100;\n" 00018 "const ajaxQuickUpdateMs_ = 1000;\n" 00019 "const ajaxUpdateMs_ = 10000;\n" 00020 "let ajaxDoQuickUpdate_ = false;\n" 00021 "\n" 00022 "//Private utilities\n" 00023 "function ajaxGetElementOrNull_(elementName) //Returns the element if it: exists; block is overidden; does not have focus\n" 00024 "{\n" 00025 " let elem = document.getElementById(elementName);\n" 00026 " if (!elem) return null;\n" 00027 " if (ajaxOverrideBlockUpdateOnFocus_) return elem;\n" 00028 " if (elem !== document.activeElement) return elem;\n" 00029 " return null;\n" 00030 "}\n" 00031 "function ajaxHexToBit_(text, iBit)\n" 00032 "{\n" 00033 " let value = parseInt(text, 16);\n" 00034 " value >>= iBit;\n" 00035 " return value & 1;\n" 00036 "}\n" 00037 "function ajaxHexToSignedInt8_(text)\n" 00038 "{\n" 00039 " let value = parseInt(text, 16);\n" 00040 " if (value < 0x80) return value;\n" 00041 " return value - 0x100;\n" 00042 "}\n" 00043 "function ajaxHexToSignedInt16_(text)\n" 00044 "{\n" 00045 " let value = parseInt(text, 16);\n" 00046 " if (value < 0x8000) return value;\n" 00047 " return value - 0x10000;\n" 00048 "}\n" 00049 "function ajaxHexToSignedInt32_(text)\n" 00050 "{\n" 00051 " let value = parseInt(text, 16);\n" 00052 " if (value < 0x80000000) return value;\n" 00053 " return value - 0x100000000;\n" 00054 "}\n" 00055 "\n" 00056 "\n" 00057 "//Private ajax functions\n" 00058 "function ajaxHandleAjaxResponse_()\n" 00059 "{\n" 00060 " if (ajaxXhr_.readyState == 4 && ajaxXhr_.status == 200)\n" 00061 " {\n" 00062 " ajaxResponse_ = ajaxXhr_.responseText;\n" 00063 " ajaxHeaders_ = ajaxXhr_.getAllResponseHeaders();\n" 00064 " let iDateStart = Ajax.headers.toLowerCase().indexOf('date:');\n" 00065 " let iDateEnd = Ajax.headers.indexOf('\\r', iDateStart);\n" 00066 " ajaxDate_ = new Date(Ajax.headers.slice(iDateStart + 5, iDateEnd));\n" 00067 "\n" 00068 " let elem;\n" 00069 " elem = ajaxGetElementOrNull_('ajax-response' ); if (elem) elem.textContent = ajaxResponse_;\n" 00070 " elem = ajaxGetElementOrNull_('ajax-headers' ); if (elem) elem.textContent = ajaxHeaders_;\n" 00071 " elem = ajaxGetElementOrNull_('ajax-date-local' );\n" 00072 " if (elem)\n" 00073 " {\n" 00074 " elem.textContent = ajaxDate_.toLocaleString( undefined, { weekday : 'short' ,\n" 00075 " day : '2-digit',\n" 00076 " month : 'short' ,\n" 00077 " year : 'numeric',\n" 00078 " hour : '2-digit',\n" 00079 " minute : '2-digit',\n" 00080 " timeZoneName: 'short'\n" 00081 " }\n" 00082 " );\n" 00083 " }\n" 00084 " if (ajaxOnResponse_) ajaxOnResponse_();\n" 00085 " ajaxOverrideBlockUpdateOnFocus_ = false; //Received response so reset override after display\n" 00086 " }\n" 00087 "}\n" 00088 "function ajaxSendNameValue_(name, value) //Used by this script and from HTML page\n" 00089 "{\n" 00090 " ajaxXhr_ = new XMLHttpRequest();\n" 00091 " ajaxXhr_.onreadystatechange = ajaxHandleAjaxResponse_;\n" 00092 " if (name)\n" 00093 " {\n" 00094 " if (value)\n" 00095 " {\n" 00096 " ajaxXhr_.open('GET', ajaxServer_ + '?' + name + '=' + encodeURIComponent(value), true);\n" 00097 " }\n" 00098 " else\n" 00099 " {\n" 00100 " ajaxXhr_.open('GET', ajaxServer_ + '?' + name, true);\n" 00101 " }\n" 00102 " }\n" 00103 " else\n" 00104 " {\n" 00105 " ajaxXhr_.open('GET', ajaxServer_, true);\n" 00106 " }\n" 00107 " ajaxXhr_.send();\n" 00108 " ajaxDoQuickUpdate_ = false;\n" 00109 " ajaxMsCountAtAjaxSend_ = ajaxMs_;\n" 00110 "}\n" 00111 "function AjaxSendNameValue(name, value) //From html\n" 00112 "{\n" 00113 " ajaxOverrideBlockUpdateOnFocus_ = true; //Request has come from an update\n" 00114 " ajaxSendNameValue_(name, value);\n" 00115 " ajaxDoQuickUpdate_ = true;\n" 00116 "}\n" 00117 "\n" 00118 "//Private functions\n" 00119 "function ajaxTick_() //Called about every 100ms\n" 00120 "{\n" 00121 " ajaxMs_ += ajaxTickMs_; //Don't use Date.now() as we don't know when the PC's clock will be updated around a leap second\n" 00122 " if (ajaxMs_ >= ajaxMsCountAtAjaxSend_ + ajaxUpdateMs_) ajaxSendNameValue_('', '');\n" 00123 " if (ajaxDoQuickUpdate_)\n" 00124 " {\n" 00125 " if (ajaxMs_ >= ajaxMsCountAtAjaxSend_ + ajaxQuickUpdateMs_) ajaxSendNameValue_('', '');\n" 00126 " }\n" 00127 " if (ajaxOnTick_) ajaxOnTick_();\n" 00128 "}\n" 00129 "function ajaxInit_()\n" 00130 "{\n" 00131 " setInterval(ajaxTick_, ajaxTickMs_);\n" 00132 " ajaxSendNameValue_('', '');\n" 00133 "}\n" 00134 "\n" 00135 "//Exposed public\n" 00136 "class Ajax\n" 00137 "{\n" 00138 " static get ms () { return ajaxMs_ ; }\n" 00139 " static get response () { return ajaxResponse_ ; }\n" 00140 " static get headers () { return ajaxHeaders_ ; }\n" 00141 " static get date () { return ajaxDate_ ; }\n" 00142 " \n" 00143 " static set tickMs (v) { ajaxTickMs_ = v; }\n" 00144 " static set updateMs (v) { ajaxUpdateMs_ = v; }\n" 00145 " static set server (v) { ajaxServer_ = v; }\n" 00146 " static set onResponse(v) { ajaxOnResponse_ = v; }\n" 00147 " static set onTick (v) { ajaxOnTick_ = v; }\n" 00148 "\n" 00149 " static getElementOrNull(elementName) { return ajaxGetElementOrNull_(elementName) ; }\n" 00150 " static hexToBit (text, iBit ) { return ajaxHexToBit_ (text, iBit ) ; }\n" 00151 " static hexToSignedInt8 (text ) { return ajaxHexToSignedInt8_ (text ) ; }\n" 00152 " static hexToSignedInt16(text ) { return ajaxHexToSignedInt16_(text ) ; }\n" 00153 " static hexToSignedInt32(text ) { return ajaxHexToSignedInt32_(text ) ; }\n" 00154 " \n" 00155 " static init()\n" 00156 " {\n" 00157 " if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', ajaxInit_ ); // Loading hasn't finished yet\n" 00158 " else ajaxInit_(); //`DOMContentLoaded` has already fired\n" 00159 " }\n" 00160 "}"
Generated on Wed Jul 13 2022 14:19:59 by 1.7.2