/** * Time in seconds between every request. */ var INTERVAL = 15; var requestInterval = INTERVAL; var failedRequests = 0; var timeoutId = null; var request = null; var myText; var myStatus; var myError; function onBodyLoad () { setTimeout (setText, 1000); } 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 setText () { display (null, null, null); updateText (); } 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 (myText, myStatus, 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 (text === myText && status === myStatus && error === myError) return; var bgColor; var body = document.body; if (error) { text = text ? text : 'Er'; $('error').textContent = error; $('error').style.display = 'block'; bgColor = 'red'; } else { $('error').textContent = ''; $('error').style.display = 'none'; bgColor = 'green'; } $('text').textContent = text; body.className = status ? status : ''; body.addEventListener ('transitionend', onTransitionEnd); body.style.backgroundColor = bgColor; myText = text; myStatus = status; myError = error; } function onTransitionEnd () { var body = document.body; body.removeEventListener ('transitionend', onTransitionEnd); body.style.backgroundColor = ''; } function $ (elementId) { return document.getElementById (elementId); }