var ip_format = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-4]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
var busyDOM;
$(document).on('click', 'ul.tabs > li:not(.current)', function(event) {
$(this).addClass('current').siblings().removeClass('current')
.closest('div.section').children('div.box').hide().eq($(this).index()).css('display','inline-block').fadeIn(150, function() { $(this).trigger('onShow'); });
});
document.addEventListener("DOMContentLoaded", () => {
busyDOM = getBusyOverlay($('.box').parent()[0], {opacity:0.6, text:'Загрузка', style:'color:#1f4e6b; font-weight: bold;'}, {color: '#1f4e6b', type:'circle', size:48});
});
$(window).on('load', function() {
busyDOM.remove();
_ticker = new Ticker($('#ticker'));
_update_();
get_device();
});
jQuery.fn.extend({
alignCenter: function(x, y) {
return this.each(function() {
var w = $(this).width();
var h = $(this).height();
var W = $(window).width();
var H = $(window).height();
var SL = $(window).scrollLeft();
var ST = $(window).scrollTop();
if(x == undefined || y == undefined) {
x = $(window).width()/2 + SL;
y = $(window).height()/2.5 + ST;
}
var marginLeft = Math.max(SL, Math.min(W + SL, parseInt(x + w/2)) - w) + 'px';
var marginTop = Math.max(ST, Math.min(H + ST, parseInt(y + h/2)) - h) + 'px';
$(this).css({'left':marginLeft, 'top':marginTop});
});
}
});
var dragging = {'on':false};
$(document).on( 'mousedown', 'div.popup_header', function(e) {
var popup = $(this).parent();
dragging.startLeft = parseInt(popup.css('left')) - e.pageX;
dragging.startTop = parseInt(popup.css('top')) - e.pageY;
dragging.obj = popup;
dragging.on = true;
$(document).on( 'mousemove', function(e) {
dragging.obj.css( {'left':dragging.startLeft + e.pageX, 'top':dragging.startTop + e.pageY} );
return false;
});
return false;
});
$(document).on( 'mouseup', function(e) {
shiftSelectionStart = undefined;
if(dragging.on) {
$(document).off('mousemove');
dragging.on = false;
$(document.elementFromPoint(e.pageX-$(window).scrollLeft(), e.pageY-$(window).scrollTop())).trigger('drop', dragging.obj);
}
});
$(document).on('keydown', function(event) {
if($('#popupStack div.popup').length > 0) {
if(event.keyCode === 27 && $('#popup div.dontclose').length == 0) {
closePopup();
return false;
}
if(event.keyCode === 13) {
var button = $('#popup button.default');
if(button.length == 1) {
button.click();
return false;
}
}
}
});
$(document).on('keypress', function(event) {
var id = event.target.id;
if(event.which == 0 || event.which == 8 || event.which == 13)
return true;
if($(event.target).hasClass('lat')) {
if(String.fromCharCode(event.which).search(/[a-z0-9_]/i) < 0)
return error(event.target, 'Допустимы только латинские буквы, цифры и символ "_"');
}
else if($(event.target).hasClass('lat_')) {
if(String.fromCharCode(event.which).search(/[a-z]/i) < 0)
return error(event.target, 'Допустимы только латинские буквы');
}
});
$(document).on('click', '#exit', function(){
document.cookie = "password=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/";
documentReload();
})
$(document).on('change', '#corr', function(){
if($('#corr').val() < -39)$('#corr').val(-39);
if($('#corr').val() > 72) $('#corr').val(72);
request({"cmd": "setRTCcorr","corr": Number($("#corr").val())});
})
$(document).on('click', '#save', function(){
dialog("Вы действительно хотите сохранить текущую конфигурацию?", function() {
request({"cmd": "saveConfig"}, function(result, text){
if(result['status'] == 'ok') notice("Конфигурация успешно сохранена");
else if(result['status'] == 'error'){
if(result['error'] == 'save failed') notice("Ошибка сохранения конфигурации");
}
});
});
})
$(document).on('click', 'ul.PLC-tabs-units > li:not(.current-units)', function(event) {
PLC_tabs_units(this);
PLC_get_block_param($("li.current-units").index(), true);
})
$(document).on('click', '.other_butt', function(event){
var parentID = $(event.target).parent().attr('id');
if(parentID === 'btn_restart'){
dialog("Вы действительно хотите произвести перезапуск модуля S-port?", function(){
request({"cmd":"restart"});
$("ul.tabs > li").first().addClass('current').siblings().removeClass('current')
.closest('div.section').children('div.box').hide().eq($("ul.tabs > li").index()).css('display','inline-block').fadeIn(150, function() { $("ul.tabs > li").trigger('onShow'); });
});
}
else if(parentID === 'btn_ethernet'){
showPopup('ethernet');
var ctrl = getBusyOverlay($('#popup')[0], {opacity:0.6, text:'Подождите...', style:'color:#1f4e6b; font-weight: bold;'}, {color: '#1f4e6b', type:'circle', size:48});
request({"cmd":"getNet"}, function(result, text){
var net = result['net'];
$("#ethernet tr:eq(0) td:eq(1) input").val(net['MAC']);
$("#ethernet tr:eq(1) td:eq(1) input").val(net['ip']);
$("#ethernet tr:eq(2) td:eq(1) input").val(net['mask']);
$("#ethernet tr:eq(3) td:eq(1) input").val(net['gw']);
}).progress(function(x){x < 100 || ctrl.remove();});
}
else if(parentID === 'btn_snmp'){
showPopup('snmp');
var ctrl = getBusyOverlay($('#popup')[0], {opacity:0.6, text:'Подождите...', style:'color:#1f4e6b; font-weight: bold;'}, {color: '#1f4e6b', type:'circle', size:48});
request({"cmd":"getSnmp"}, function(result, text){
if(result['status'] == 'ok'){
$("#snmp-version select:eq(0)").val(result['version']);
$("#community input[type = text]").val(result['community']);
var trap = result['trap'];
$("#traps input[type = checkbox]")[0].checked = trap['enable'];
$("#traps input[type = text]").prop('disabled', !trap['enable']);
$("#traps input[type = text]:eq(1)").val(trap['community']);
$("#traps input[type = text]:eq(0)").val(trap['ip']);
}
}).progress(function(x){x < 100 || ctrl.remove();});;
}
else if(parentID === 'btn_changePass'){
showPopup('changePass');
var cookies = getCookies();
$('#popup .popup_header p').html(cookies['login']);
$('#popup .popup_header input[type = password]').val("");
}
});
$(document).on('focus or click', '#net_settings tr:eq(1) input[type = text]', function(){
if($('#net_settings tr:eq(1) input[type = text]').val().length == 0)
$('#net_settings tr:eq(1) input[type = text]').val('255.255.255.0');
});
$(document).on("keyup", ".ip_mask", function(){
if($(this).val().match(ip_format)) $(this).css({'border': '0.1em solid green'});
else $(this).css({'border': '0.1em solid red'});
})
$(document).on("blur", ".ip_mask", function(){
if(!($(this).val().match(ip_format))) $(this).val("");
$(this).css({'border': '0.1em solid #AAA'});
})
$(document).on('click', 'ul.tabs > li:not(.current)', function(event) {
if($(event.target).parent().attr('id') === 'tabsFirs'){
switch($(this).index()){
case 0:
PLC_tabs_units($("ul.PLC-tabs-units > li").first());
PLC_getBlockslist(true);
break;
case 1:
request({"cmd": "getRTCcorr"}, function(result, text){
if(result['status'] == 'ok') $("#corr").val(result['corr']);
});
break;
case 2:
request({"cmd": "getVersion"}, function(result, text){
if(result['status'] == 'ok') $('#version span').html('' + result['ver'] + '.' + result['subVer'] + '');
});
break;
}
}
});
$(document).on('change', '#inputNameUnit', function () {
if($('#route_name').length){
$('#route_name').html('"' + $('#inputNameUnit').val() + '"');
}
});
$(document).on('change', '#popup #table_route select', function (event) {
if (event.target.id == 'id_sel') return;
var num = event.target.id.replace("sel_route_", "");
if ($('#popup #' + event.target.id)[0].selectedIndex != 3) {
$('#popup #table_route tr:eq(0) td:eq(' + (num) + ') #id_block').remove();
return;
}
PLC_route_add_select(num);
});
var route = Array();
$(document).on('click', '#route_settings', function(event){
showPopup('PLC_route');
$('#table_route tr:eq(0) td:eq(0) b').html($('.PLC-tabs-units li:eq(0) .sect_name p').text() + '
' + $('.PLC-tabs-units li:eq(0) .sect_ip p').text());
$('#popup .popup_header p').html(' "' + $('#inputNameUnit').val()+ '"');
if(route.length > 0){
var isEht = 0;
for(var i = 1, cnt = 0; i <= route[0]; i++){
if((route[i] & 0x0F) > 0){
if(isEht) {PLC_route_add_select(cnt > 2 ? i + 1 : i, route[i] & 0x0F); isEht = 0;}
else PLC_add_route('route_add', route[i] & 0x0F);
}
else {
PLC_add_route('route_add', 4);
isEht = 1;
}
if(++cnt == route[0]) break;
if(((route[i] & 0xF0) >> 4) > 0){
if(isEht) {PLC_route_add_select(cnt > 2 ? i + 1 : i, (route[i] & 0xF0) >> 4); isEht = 0;}
else PLC_add_route('route_add', (route[i] & 0xF0) >> 4);
}
else {
PLC_add_route('route_add', 4);
isEht = 1;
}
if(++cnt == route[0]) break;
}
}
});
$(document).on('click', '#enable-all-poll input[type = checkbox]', function (event) {
request({"cmd": "enableAllPool","enable": $(this)[0].checked}, function(result, text){
if(result['status'] == 'ok'){
if($('#enable-all-poll input[type = checkbox]')[0].checked) $('#plc h3').removeClass('hidden');
else $('#plc h3').addClass('hidden');
}
});
});
$(document).on('click', '#traps input[type = checkbox]', function (event) {
$("#traps input[type = text]").prop('disabled', !$(this)[0].checked);
if(!$(this)[0].checked) $("#traps input[type = text]").val("");
});
$(document).on('mouseenter or mouseleave', '.parent li', function (event) {
$(this).find(".child").stop().slideToggle(300);
});
$(document).on('click', '#enable-ntp', function (event) {
if($('#enable-ntp')[0].checked) {
$("#ip-ntp").prop('disabled', false);
$("#poll-ntp").prop('disabled', false);
}
else {
$("#ip-ntp").prop('disabled', true);
$("#poll-ntp").prop('disabled', true);
}
});
/*##############################################################################*/
function edit_user(){
var cookies = getCookies();
showPopup('editUser');
$('#popup .popup_header p').html(cookies['login']);
}
/****************** Таймер **************/
function _update_() {
var deferred = $.Deferred();
deferred.promise()
.then(PLC_get_block_param($("li.current-units").index()))
.then(getTime)
.then(getTemp)
.always(function(){setTimeout(_update_, 1000);});
deferred.resolve();
}
/**************** Запрос температуры S-port *******************/
var lastReqTemp = 0;
function getTemp(force_request){
if($('#popup div.login').is(':visible'))return;
if((force_request) || (new Date().getTime() - lastReqTemp >= 60000)){
lastReqTemp = new Date().getTime();
request({"cmd": "getTemp"}, function(result, text){
if(result['status'] === 'ok'){
if(result['temp'] != 'missing')$('#boardName').attr("title","Температура " + result['temp']);
else $('#boardName').removeAttr("title");
}
});
}
}
/**************** Запрос девайса S-port *******************/
function get_device(){
request({"cmd": "getDevice"},function(result, text){
if(result['status'] == 'ok'){
$('#boardName').text(result['name']);
document.title = result['name'];
switch(Number(result['type'])){
case 16:
$('.box #plc').removeClass('hidden');
$('#tabsFirs li.current').html('PLC блоки');
request({"cmd": "enableAllPool"},function(result, text){
if(result['status'] == 'ok') $('#enable-all-poll input[type = checkbox]')[0].checked = result['enable'];
if(result['enable']) $('#plc h3').removeClass('hidden');
});
PLC_getBlockslist(true);
break;// PLC
}
getTemp(true);
}
});
}
/********** Изменение пароля пользователя **************/
function changePass(){
var current = $('#popup #tablePass tr:eq(0) td:eq(1) input').val();
var new1 = $('#popup #tablePass tr:eq(1) td:eq(1) input').val();
var new2 = $('#popup #tablePass tr:eq(2) td:eq(1) input').val();
if(new1 != new2) return critical('Новые пароли не совпадают');
request({"cmd": "changePass", "user":$('#popup .popup_header p').text(),
"current": (current.length > 0) ? MD5(current) : "", "new":(new1.length > 0) ? MD5(new1) : ""}, function(result, text){
if(result['status'] == 'error'){
if(result['error'] == 'password change error')critical('Ошибка смены пароля');
}
else if(result['status'] == 'ok') login();
});
closePopup();
}
/********** Установка настроек snmp **************/
function setSnmp(){
if($("#community input[type = text]").val() == 0)return critical("community не может быть пустым");
else if($("#community input[type = text]").val().length > 16)return critical("community не может содержать более 16 символов");
else if($("#community input[type = text]").val().match(/[^a-z]/i))return critical("community не может содержать русские символы");
if($("#traps input[type = checkbox]")[0].checked){
if(!ip_format.test($('#traps input[type = text]:eq(0)').val())) return critical("Некорректно введены настройки сети");
if($("#traps input[type = text]:eq(1)").val() == 0)return critical("community не может быть пустым");
else if($("#traps input[type = text]:eq(1)").val().length > 16)return critical("community не может содержать более 16 символов");
else if($("#traps input[type = text]:eq(1)").val().match(/[^a-z]/i))return critical("community не может содержать русские символы");
}
request({"cmd":"setSnmp", "version": Number($("#snmp-version select:eq(0)").val()), "community":$("#community input[type = text]").val(), "trap":{"enable":$("#traps input[type = checkbox]")[0].checked,
"ip":$("#traps input[type = text]:eq(0)").val(), "community":$("#traps input[type = text]:eq(1)").val()}}, function(result, text){
if(result['status'] == 'ok')closePopup();
});
}
/********** Установка настроек Ethernet **************/
function setNet(){
if((ip_format.test($('#ethernet tr:eq(1) td:eq(1) input').val())) && (ip_format.test($('#ethernet tr:eq(2) td:eq(1) input').val())) &&
(ip_format.test($('#ethernet tr:eq(3) td:eq(1) input').val()))){
request({"cmd":"setNet","net":{"ip" : $("#ethernet tr:eq(1) td:eq(1) input").val(),
"mask" : $("#ethernet tr:eq(2) td:eq(1) input").val(), "gw" : $("#ethernet tr:eq(3) td:eq(1) input").val()}
});
window.location.href = 'http://' + $("#ethernet tr:eq(1) td:eq(1) input").val() + '/';
}
else critical("Некорректно введены настройки сети");
}
/*********** Состояние отправки данных ***************/
function Ticker(img) {
this.state = 0;
this.timer = 0;
this.started = false;
this.images = ['empty.png','arrowup.png','hourglass.png','delete.png','arrowdown.png','success.png'];
this.cache = new Array(this.images.length);
for(var i in this.images) { this.cache[i] = new Image; this.cache[i].src = 'img/'+this.images[i]; }
var _this = this;
$(document).ajaxStart(function() { _this.started = true; });
$(document).ajaxStop(function() { _this.started = false; });
$(document).ajaxSend(function() { _this.toState(1); });
$(document).ajaxError(function() { _this.toState(3); });
$(document).ajaxSuccess(function() { _this.toState(4); });
this.toState = function(s) {
if(s >= 6) return false;
clearTimeout(this.timer);
this.state = s;
img.attr('src','img/'+this.images[s]);
var to = ([0, 700, 20000, 0, 700, 5000])[s];
if(to > 0) { this.timer = setTimeout(function() { _this.timeout(); }, to); }
};
this.timeout = function() {
this.timer = 0;
this.toState(([0, 2, 3, 3, (this.started ? 2 : 5), 0])[this.state]);
};
}
/****************** Изменение NTP сервера **********************/
function editNTP(){
showPopup('ntp');
if(($('.sync-time tr:eq(0) td:eq(1)').text() != '-') && ($('.sync-time tr:eq(0) td:eq(1)').text().length > 0))
$('#popupStack div.popup input[type = text]').val($('.sync-time tr:eq(0) td:eq(1)').text());
}
/****************** Установка NTP сервера **********************/
function setNTP(){
if((ip_format.test($('#ip-ntp').val())) || ($('#ip-ntp').val().length == 0)) {
request({'cmd':'setNTP','ip':$('#popupStack div.popup input[type = text]').val()},
function(result, text){
if(result['status'] == 'ok') closePopup();
});
}
else critical("Некорректно введен IP адрес");
}
/****************** Получение времени **********************/
function getTime(){
const options = {year: 'numeric', month: 'long', day: 'numeric' };
if($('#clock:visible').length > 0 ){
var d = new Date();
$('#pc-date').html(d.toLocaleDateString(undefined, options));
$('#pc-time').html(d.toLocaleTimeString('it-IT'));
request({"cmd": "getRTC"}, function(result, text){
if(result['status'] == 'ok'){
var rtc = new Date(result['time'] * 1000);
$('#rtc-date').html(rtc.toLocaleDateString(undefined, options));
$('#rtc-time').html(rtc.toLocaleTimeString('it-IT'));
if(result['bl'])$('.rtc-bat').css({'display':'block'});
else $('.rtc-bat').css({'display':'none'});
if(result['ip'] != '0.0.0.0'){
$('.sync-time tr:eq(0) td:eq(1)').text(result['ip']);
$('.sync-time tr:eq(1) td:eq(1)').text(result['stratum']);
$('.sync-time tr:eq(2) td:eq(1)').text(result['poll']);
$('.sync-time tr:eq(3) td:eq(1)').text(result['reach']);
}
else {
$('.sync-time tr:eq(0) td:eq(1)').text('-');
$('.sync-time tr:eq(1) td:eq(1)').text('-');
$('.sync-time tr:eq(2) td:eq(1)').text('-');
$('.sync-time tr:eq(3) td:eq(1)').text('-');
}
}
});
}
}
/****************** Запись времени **********************/
function sendTime(){
request({"cmd": "setRTC","time": parseInt(Date.now() / 1000, 10)});
}
/*############################################################################################*/
/*######################################### PLC ##############################################*/
/***************** Создание вкладок слева PLC *******************/
function PLC_add_block(tabsUnitsPer){
if ($("ul.PLC-tabs-units > li").last().index() == 3) return;
$('.PLC-tabs-units').append('
Имя блока
IP блока
"'+ $('.popup #inputNameUnit').val() + '"
'); } } } }).progress(function(x){x < 100 || ctrl.remove();}); } else { $('#popup .popup_header').text('Добавление блока для мониторинга SNMP'); $("#popup #timePoll").val('5'); route.length = 0; $('#popup div #main_route').text('Маршрут не задан'); $('#popup .popup_footer').prepend(''); } } /***** Добавление селектора ID и выбор если требуется ******/ function PLC_route_add_select(num, index) { $('#popup #table_route tr:eq(0) td:eq(' + (num) + ') div').append('"'+ $('#inputNameUnit').val() + '"
'); closePopup(); } /*########################################## END PLC ###################################*/ /*######################################################################################*/ /************** Вычисление hash MD5 ***********/ var MD5 = function(d){result = M(V(Y(X(d),8*d.length)));return result.toLowerCase()}; function M(d){for(var _,m="0123456789ABCDEF",f="",r=0;r