hedera-web/pages/production/main.js

162 lines
3.0 KiB
JavaScript

/**
* 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);
}