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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers web-ajax-class.inc Source File

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 "}"