/** * Time in seconds between every request. */ var INTERVAL = 15; var requestInterval = INTERVAL; var failedRequests = 0; var timeoutId = null; var request = null; var lastText; var lastStatus; var lastError; function onBodyLoad () { setText (); } function setText () { lastText = null; lastStatus = null; lastError = null; updateText (); } function onSettingsClick () { var deviceId = localStorage.getItem ('hederaDeviceId'); if (deviceId == null) deviceId = ''; deviceId = prompt ('Enter the device identifier', deviceId); if (deviceId == null) return; if (deviceId) localStorage.setItem ('hederaDeviceId', deviceId); else if (deviceId === '') localStorage.removeItem ('hederaDeviceId'); if (timeoutId != null) { clearTimeout (timeoutId); timeoutId = null; } if (request) { request.abort (); request = null; } setText (); } function updateText () { var deviceId = localStorage.getItem ('hederaDeviceId'); if (!deviceId) { display (null, null, 'Device id not set'); return; } var formData = new FormData (); formData.append ('srv', 'json:misc/production'); formData.append ('deviceId', deviceId); request = new XMLHttpRequest(); request.open ('POST', '', true); request.onreadystatechange = onRequestChange.bind (null, request); request.send (formData); } function onRequestChange (request) { if (request.readyState !== 4) return; try { switch (request.status) { case 200: var data = JSON.parse (request.responseText).data; display (data.displayText, data.status, null); requestInterval = INTERVAL; failedRequests = 0; break; case 400: var json = JSON.parse (request.responseText); throw new Error (json.data.message); case 0: throw new Error ('Connection lost'); default: throw new Error ('HTTP '+ request.status +': '+ request.statusText); } } catch (e) { display (null, null, e.message); console.error (e.message); failedRequests++; if (failedRequests > 10 && requestInterval < 60) { requestInterval += parseInt (Math.random() * INTERVAL) + 1; console.warn ('Request interval increased to %d seconds.', requestInterval); } } timeoutId = setTimeout (updateText, requestInterval * 1000); request = null; } function display (text, status, error) { if (error) { text = lastText; status = lastStatus; } if (text === lastText && status === lastStatus && error === lastError) return; var bgColor; $('text').textContent = text; if (error) { $('error').textContent = error; $('error').style.display = 'block'; bgColor = 'red'; } else { $('error').textContent = ''; $('error').style.display = 'none'; bgColor = 'green'; } var body = document.body; body.addEventListener ('transitionend', onTransitionEnd); body.style.backgroundColor = bgColor; lastText = text; lastStatus = status; lastError = error; } function onTransitionEnd () { var body = document.body; body.removeEventListener ('transitionend', onTransitionEnd); body.style.backgroundColor = ''; body.className = lastStatus ? lastStatus : ''; } function $ (elementId) { return document.getElementById (elementId); }