2022-12-24 12:57:55 +03:00

246 lines
6.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function isObject(o) {
return Object.prototype.toString.call(o) === '[object Object]';
}
function ge(id) {
return document.getElementById(id)
}
function hide(el) {
el.style.display = 'none'
}
function cancelEvent(evt) {
if (evt.preventDefault) evt.preventDefault();
if (evt.stopPropagation) evt.stopPropagation();
evt.cancelBubble = true;
evt.returnValue = false;
return false;
}
function errorText(e) {
return e instanceof Error ? e.message : e+''
}
(function() {
function request(method, url, data, callback) {
data = data || null;
if (typeof callback != 'function') {
throw new Error('callback must be a function');
}
if (!url)
throw new Error('no url specified');
switch (method) {
case 'GET':
if (isObject(data)) {
for (var k in data) {
if (data.hasOwnProperty(k))
url += (url.indexOf('?') === -1 ? '?' : '&')+encodeURIComponent(k)+'='+encodeURIComponent(data[k])
}
}
break;
case 'POST':
if (isObject(data)) {
var sdata = [];
for (var k in data) {
if (data.hasOwnProperty(k))
sdata.push(encodeURIComponent(k)+'='+encodeURIComponent(data[k]));
}
data = sdata.join('&');
}
break;
}
var xhr = new XMLHttpRequest();
xhr.open(method, url);
if (method === 'POST')
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if ('status' in xhr && !/^2|1223/.test(xhr.status))
throw new Error('http code '+xhr.status)
callback(null, JSON.parse(xhr.responseText));
}
};
xhr.onerror = function(e) {
callback(e, null);
};
xhr.send(method === 'GET' ? null : data);
return xhr;
}
window.ajax = {
get: request.bind(request, 'GET'),
post: request.bind(request, 'POST')
}
})();
function lock(el) {
el.setAttribute('disabled', 'disabled');
}
function unlock(el) {
el.removeAttribute('disabled');
}
function initNetworkSettings() {
function setupField(el, value) {
if (value !== null)
el.value = value;
unlock(el);
}
var doneRequestsCount = 0;
function onRequestDone() {
doneRequestsCount++;
if (doneRequestsCount === 2) {
hide(ge('loading_label'))
}
}
var form = document.forms.network_settings;
form.addEventListener('submit', function(e) {
if (!form.hid.value.trim()) {
alert('Введите home id');
return cancelEvent(e);
}
if (form.psk.value.length < 8) {
alert('Неверный пароль (минимальная длина - 8 символов)');
return cancelEvent(e);
}
if (form.ssid.selectedIndex === -1) {
alert('Не выбрана точка доступа');
return cancelEvent(e);
}
lock(form.submit)
})
form.show_psk.addEventListener('change', function(e) {
form.psk.setAttribute('type', e.target.checked ? 'text' : 'password');
});
form.ssid.addEventListener('change', function(e) {
var i = e.target.selectedIndex;
if (i !== -1) {
var opt = e.target.options[i];
if (opt)
form.psk.value = '';
}
});
ajax.get('/status', {}, function(error, response) {
try {
if (error)
throw error;
setupField(form.hid, response.home_id || null);
setupField(form.psk, null);
setupField(form.submit, null);
onRequestDone();
} catch (error) {
alert(errorText(error));
}
});
ajax.get('/scan', {}, function(error, response) {
try {
if (error)
throw error;
form.ssid.innerHTML = '';
for (var i = 0; i < response.list.length; i++) {
var ssid = response.list[i][0];
var rssi = response.list[i][1];
form.ssid.append(new Option(ssid + ' (' + rssi + ' dBm)', ssid));
}
unlock(form.ssid);
onRequestDone();
} catch (error) {
alert(errorText(error));
}
});
}
function initUpdateForm() {
var form = document.forms.update_settings;
form.addEventListener('submit', function(e) {
cancelEvent(e);
if (!form.file.files.length) {
alert('Файл обновления не выбран');
return false;
}
lock(form.submit);
var xhr = new XMLHttpRequest();
var fd = new FormData();
fd.append('file', form.file.files[0]);
xhr.upload.addEventListener('progress', function (e) {
var total = form.file.files[0].size;
var progress;
if (e.loaded < total) {
progress = Math.round(e.loaded / total * 100).toFixed(2);
} else {
progress = 100;
}
form.submit.innerHTML = progress + '%';
});
xhr.onreadystatechange = function() {
var errorMessage = 'Ошибка обновления';
var successMessage = 'Обновление завершено, устройство перезагружается';
if (xhr.readyState === 4) {
try {
var response = JSON.parse(xhr.responseText);
if (response.result === 1) {
alert(successMessage);
} else {
alert(errorMessage);
}
} catch (e) {
alert(successMessage);
}
}
};
xhr.onerror = function(e) {
alert(errorText(e));
};
xhr.open('POST', e.target.action);
xhr.send(fd);
return false;
});
form.file.addEventListener('change', function(e) {
if (e.target.files.length) {
var reader = new FileReader();
reader.onload = function() {
var hash = window.md5(reader.result);
form.setAttribute('action', '/update?md5='+hash);
unlock(form.submit);
};
reader.onerror = function() {
alert('Ошибка чтения файла');
};
reader.readAsBinaryString(e.target.files[0]);
}
});
}
window.initApp = function() {
initNetworkSettings();
initUpdateForm();
}