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 блока

  • '); if (tabsUnitsPer) PLC_tabs_units($("ul.PLC-tabs-units > li").last()); if ($("ul.PLC-tabs-units > li").last().index() == 3) $('#PLC_addBlock').remove(); // удаляем иконку + } /*************** Удаление вкладок слева PLC ****************/ function PLC_remove_block(){ var del_block = $("li.current-units").index(); if(del_block == 0) return; dialog("Удалить блок из мониторинга SNMP?", function(){ request({"cmd":"PLCrmBlock", "unit":del_block}, function(result, text){ if(result['status'] == 'ok'){ $("ul.PLC-tabs-units > li").last().remove(); PLC_tabs_units($("ul.PLC-tabs-units > li").last()); if ($("ul.PLC-tabs-units > li").last().index() == 2) $('#blockBtn').append(''); PLC_tabs_units($("ul.PLC-tabs-units > li").first()); PLC_getBlockslist(true); } }); }); } /********** Переход с одной вкладки слева на другую PLC***********/ function PLC_tabs_units(element){ $(element).addClass('current-units').siblings().removeClass('current-units'); $("#nameUnit").text($(".PLC-tabs-units li:eq("+ $("li.current-units").index() +") p:eq(0)").text()); if ($("li.current-units").index() == 0) $("#PLC_block_rm").addClass('hidden'); else $("#PLC_block_rm").removeClass('hidden'); } /******************** Запрос колличество блоков PLC******************/ function PLC_getBlockslist(force_request){ var stat = Array(); if((force_request) || ($('#plc:visible').length > 0)){ request({"cmd":"PLCgetBlockslist"}, function(result, text){ if(result['status'] == 'ok'){ for (i = 0; i < result['list'][0]; i++)stat[i] = $('.PLC-tabs-units li:eq('+ (i) +') #state_block').css('background'); //+ result['list'][i + 1][0] + for (; $('.PLC-tabs-units').find('li').length > result['list'][0];)PLC_remove_block(); for (i = 0; i < result['list'][0]; i++){ if((i > 0) && ($('.PLC-tabs-units').find('li').length < result['list'][0]))PLC_add_block(false); $('.PLC-tabs-units li:eq('+ (i) +') #state_block').css('background', stat[i]); if(result['list'][i + 1][0].length > 0) $(".PLC-tabs-units li:eq("+ (i) +") .sect_name p").text(result['list'][i + 1][0]); else $(".PLC-tabs-units li:eq("+ (i) +") .sect_name p").text("Имя блока"); if (result['list'][i + 1][1].length > 0)$(".PLC-tabs-units li:eq("+ (i) +") .sect_ip p").text(result['list'][i + 1][1]); else $(".PLC-tabs-units li:eq("+ (i) +") .sect_ip p").text("IP блока"); } $("#nameUnit").text($(".PLC-tabs-units li:eq("+ $("li.current-units").index() +") .sect_name p").text()); PLC_get_block_param($("li.current-units").index(), true); } }); } } /****************** Запрос динамических параметров блока PLC *********************/ var lastReqBlockParam = 0; function PLC_get_block_param(unit, force_request){ if(($('#plc:visible').length > 0) && ($('#popup:visible').length == 0)){ if((force_request) || (new Date().getTime() - lastReqBlockParam >= 3000)){ lastReqBlockParam = new Date().getTime(); var massHFval1Ru = Array("Нет сигнала", "Перегрузка", "Активация", "Прием данных"); var massHFval2Ru = Array("Аналог", "Транзит", "Цифр.ведущий", "Цифр.ведомый"); var massUMalarmRu = Array("ОК", "Обрыв линии", "Обрыв ФПРД", "Нет вх. сигнала", "Перегрев"); var massMSRMNT = Array("", "", "", "kHz", "kHz", "dBm", "dB", "kb/s", "kb/s", "dB", "dB", "", "", ""); var type_prm = Array("Несоглас.", "Соглас."); var att_prm = Array("0 dB", "-6 dB", "-12 dB", "-18 dB", "-24 dB"); request({"cmd": "PLCblockParams","unit": unit}, function(result, text){ if(result['status'] === 'ok'){ var unit = result['unit']; $("#common tr:eq(1) td:eq(1)").text(type_prm[result['filter'][0]]); $("#common tr:eq(2) td:eq(1)").text(att_prm[result['filter'][1]]); if(result['power'] == 0) $("#common tr:eq(3) td:eq(1)").text("n/a"); else $("#common tr:eq(3) td:eq(1)").text(result['power'] + " W"); if (result['vers'] == 0)$("#common tr:eq(0) td:eq(1)").text("-"); else $("#common tr:eq(0) td:eq(1)").text(result['vers']); for (i = 0; i < result['HF'].length; i++){ var HF = result['HF'][i]; for(q = 0; q < HF.length; q++) { if (q == 0){ if (HF[q]) $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text("Включен"); else $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text("Выключен"); } else if (q == 1 && (HF[q] in massHFval1Ru)){ if (HF[q] < 3 && HF[0])$("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").css(HF[0] ? {"color":"red"} : {"color":"#777"}); else $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").css(HF[0] ? {"color":"black"} : {"color":"#777"}); if(HF[0])$("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text(massHFval1Ru[HF[q]]); else $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text("-"); } else if (q == 2 && (HF[q] in massHFval2Ru)){ if(HF[0])$("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text(massHFval2Ru[HF[q]]); else $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text("-"); } else if (HF[0] == true){ if(q > 2 && q < 5) $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text((HF[q] - 2) + " - " + (HF[q] + 2) + " " + massMSRMNT[q]); else if(HF[2] >= 2){ if (q > 4 && q < 11) $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text((HF[q]/10) + " " + massMSRMNT[q]); else if(q == 11 )$("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text((HF[q]) + " " + massMSRMNT[q]); else if (q == 12) $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").html(HF[q]/10 + " • 10"+HF[++q]+""); } else { if (q > 4 && q < 7) $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text((HF[q]/10) + " " + massMSRMNT[q]); else $("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text("-"); } } else if (HF[0] == false)$("#vch"+(i + 1)+" tr:eq("+q+") td:eq(1)").text("-") } if(!HF[0]){ $("#comboHF_"+(i + 1)+"").css({"color":"#777"}); $("#vch"+(i + 1)+"").css({"color":"#777"}); } else { $("#comboHF_"+(i + 1)+"").css({"color":"black"}); $("#vch"+(i + 1)+"").css({"color":"black"}); } } for (i = 0; i < result['pwrAmp'].length; i++){ var pwr = result['pwrAmp'][i]; if (!pwr[0]){ // отсутствует $("#comboUM_" + (i + 1)).find('legend b').text("УМ02"); $("#um"+(i + 1)+" tr:eq(0) td:eq(1)").text("Отсутствует"); $("#um"+(i + 1)+" tr:eq(1) td:eq(1)").css({"color":"#777"}); for (q = 1; q < $("#um" + (i + 1)).find('tr').length; q++) $("#um"+(i + 1)+" tr:eq(" + q + ") td:eq(1)").text("-"); } else { $("#comboUM_" + (i + 1)).find('legend b').text("УМ02 v." + pwr[1]); $("#um"+(i + 1)+" tr:eq(0) td:eq(1)").text("OK"); if (pwr[2] != 0) $("#um"+(i + 1)+" tr:eq(1) td:eq(1)").css({"color":"red"}); // авария else $("#um"+(i + 1)+" tr:eq(1) td:eq(1)").css({"color":"black"}); if (pwr[2] in massUMalarmRu){ if(pwr[0])$("#um"+(i + 1)+" tr:eq(1) td:eq(1)").text(massUMalarmRu[pwr[2]]); else $("#um"+(i + 1)+" tr:eq(1) td:eq(1)").text("-"); } $("#um"+(i + 1)+" tr:eq(2) td:eq(1)").text(pwr[3] + " dBm"); $("#um"+(i + 1)+" tr:eq(3) td:eq(1)").html(pwr[4] + " ℃"); if(pwr[1] < 9) $("#um"+(i + 1)+" tr:eq(4) td:eq(1)").text("n/a"); else $("#um"+(i + 1)+" tr:eq(4) td:eq(1)").text((pwr[5] / 10) + " Vrms"); } if(!pwr[0]){ $("#comboUM_"+(i + 1)).css({"color":"#777"}); $("#um"+(i + 1)).css({"color":"#777"}); } else { $("#comboUM_"+(i + 1)).css({"color":"black"}); $("#um"+(i + 1)).css({"color":"black"}); } } } }); } PLC_getAlarm(force_request); } } /*************** Запрос состояния аварий PLC*******************/ var lastReqAlarm = 0; function PLC_getAlarm(force_request){ if($('#plc:visible').length > 0 ){ if((force_request) || (new Date().getTime() - lastReqAlarm >= 3000)){ lastReqAlarm = new Date().getTime(); request({"cmd": "PLCalarm"}, function(result, text){ if(result['status'] === 'ok'){ if(result['alarms'] != 'undifined'){ for(var i = 0; i < result['alarms'].length; i++){ switch(result['alarms'][i]){ case 0: $(".PLC-tabs-units li:eq("+ i +") #state_block").css({"background":"darkgreen"}).attr("title","Статус: OK"); break; case 1: $(".PLC-tabs-units li:eq("+ i +") #state_block").css({"background":"darkgray"}).attr("title","Статус: Отсутствует"); break; case 2: $(".PLC-tabs-units li:eq("+ i +") #state_block").css({"background":"red"}).attr("title","Статус: Авария"); break; } } } } }); } } } /*********************** Установка параметров блока PLC ********************/ function PLC_Set_Block(first){ if(($("li.current-units").index() === 0) || ((ip_format.test($('#net_settings tr:eq(0) td:eq(1) input').val())) && (ip_format.test($('#net_settings tr:eq(1) td:eq(1) input').val())) && (ip_format.test($('#net_settings tr:eq(2) td:eq(1) input').val())))){ if(($("#timePoll").val() < 1) || ($("#timePoll").val() > 30)){ $("#timePoll").val('5'); return critical("Время опроса блока должно быть от 1 до 30 секунд."); } if((route.length == 0) && ($("li.current-units").index() != 0))return critical("Не задан маршрут до блока."); if(first){ for(var i = 0; i < $('.PLC-tabs-units').find('li').length; i++){ if($('.PLC-tabs-units li:eq('+ i +') .sect_ip p').text() === $('#net_settings tr:eq(0) td:eq(1) input').val()) return critical("Введенный IP адрес уже используется."); } PLC_add_block(true); } var ctrl = getBusyOverlay($('#popup')[0], {opacity:0.6, text:'Запись...', style:'color:#1f4e6b; font-weight: bold;'}, {color: '#1f4e6b', type:'circle', size:48}); request({'cmd':'PLCsetBlock','unit':$("li.current-units").index()/*,'enable':true*/,'timePoll':Number($("#timePoll").val()), "name": $("#inputNameUnit").val(), "ip": $("#net_settings input:eq(0)").val(), "nm": $("#net_settings input:eq(1)").val(),"gw": $("#net_settings input:eq(2)").val(), 'filter':[Number($("#receiver_settings select:eq(0)").val()), Number($("#receiver_settings select:eq(1)").val())], 'route':JSON.parse(JSON.stringify(route))}, function(result, text){ if(result['status'] == 'ok') { closePopup(); PLC_getBlockslist(true); } }).progress(function(x){x < 100 || ctrl.remove();}); } else if($("li.current-units").index() > 0) critical("Некорректно введен IP адрес."); } /*********** Функция запроса и отображения настроек блока PLC ***************/ function PLC_BlockEdit(first){ // флаг first для создания блока впервые showPopup('PLC_EditBlock'); $('#popup .popup_footer .default').remove(); if(!first){ $('#popup .popup_footer').prepend(''); $('#popup .popup_header p').text($('#inputNameUnit').text()); if ($('.current-units').index() == 0) { $("#popup #net_settings input[type = text]").prop('disabled', true); $("#popup #common_settings tr:eq(2)").css({"display":"none"}); } else { $("#popup #net_settings input[type = text]").prop('disabled', false); $("#popup #common_settings tr:eq(2)").css({"display":"table-row"}); } var ctrl = getBusyOverlay($('#popup')[0], {opacity:0.6, text:'Подождите...', style:'color:#1f4e6b; font-weight: bold;'}, {color: '#1f4e6b', type:'circle', size:48}); request({"cmd":"PLCgetBlock","unit":$("li.current-units").index()}, function(result, text){ var massHF = Array("", "ВЧ 1к.", "ВЧ 2к.", "ВЧ 3к.", "Eht."); if(result['status'] == 'ok'){ $("#popup #inputNameUnit").val(result['name']); $('#popup .popup_header p').html(' "' + result['name'] + '"'); if(result['timePoll'] == 0)$(".popup #timePoll").val('1'); else $("#popup #timePoll").val(result['timePoll']); $("#receiver_settings select:eq(0)").val(result['filter'][0]); $("#receiver_settings select:eq(1)").val(result['filter'][1]); $("#popup #net_settings input:eq(0)").val(result['ip']); $("#popup #net_settings input:eq(1)").val(result['nm']); $("#popup #net_settings input:eq(2)").val(result['gw']); if(result['route']){ var isEht = 0; route = result['route']; $('#popup div #main_route').empty(); if(route[0] == 0) { $('#popup div #main_route').append('Маршрут не задан'); route.length = 0; } else { for(var i = 1, cnt = 0; i <= route[0]; i++){ if((route[i] & 0x0F) > 0){ if(isEht) {$('#popup div #main_route').append('ID ' + String(route[i] & 0x0F) + ' '); isEht = 0;} else $('#popup div #main_route').append(massHF[route[i] & 0x0F] + '→'); } else { $('#popup div #main_route').append(massHF[4] + '→'); isEht = 1; } if(++cnt == route[0]) break; if(((route[i] & 0xF0) >> 4) > 0){ if(isEht) {$('#popup div #main_route').append('ID ' + String((route[i] & 0xF0) >> 4)); isEht = 0;} else $('#popup div #main_route').append(massHF[((route[i] & 0xF0) >> 4)] + '→'); } else { $('#popup div #main_route').append(massHF[4] + '→'); isEht = 1; } if(++cnt == route[0]) break; } $('#popup div #main_route').append('

    "'+ $('.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('
    ID
    '); if((index != 'undifined') && (index > 0))$('#popup #table_route tr:eq(0) td:eq(' + (num) + ') #id_sel option:eq('+ (index - 1) +')').prop('selected', true); } /*************** Добавление маршрута и выбор если требуется ****************/ function PLC_add_route(btn, index){ var total_cell = $('#popup #table_route >tbody >tr:first >td').length; if (btn === 'route_add') { var html_select = '
    '; $('#popup #table_route tr:eq(0) td:eq(' + (total_cell - 1) + ')').html(html_select).removeClass('btn_route'); if (total_cell == 9) $('#popup #table_route tr:last').append('
    add
    '); else { $('#popup #table_route tr:last').append('
    add
    add
    '); if((index != 'undifined') && (index > 0)) $('#popup #table_route tr:eq(0) td:eq(' + (total_cell - 1) + ') #sel_route_' + (total_cell - 1) + ' option:eq('+ (index - 1) +')').prop('selected', true); } } if(btn === 'route_del'){ $('#popup #table_route tr:eq(0) td:eq(' + (total_cell - 1) + ')').remove(); if (total_cell != 3) $('#popup #table_route td:last').html('
    add
    add
    ').addClass('btn_route'); else $('#popup #table_route td:last').html('
    add
    ').addClass('btn_route'); } } /***************** Установка маршрута из всплывающего окна ******************/ function PLC_set_route(){ var total_cell = $('#popup #table_route >tbody >tr:first >td').length - 2; var cntNibble = 0, cntByte = 0; route.length = 0; if(total_cell == 0) {closePopup(); return $('div #main_route').html('Маршрут не задан');} else $('div #main_route').empty(); for (i = 1; i < total_cell + 1; i++) { cntByte = parseInt((cntNibble / 2) + 1, 10); if ($('#popup #table_route tr:eq(0) td:eq(' + i + ') #sel_route_' + i)[0].selectedIndex == 3) { $('div #main_route').append($('#popup #table_route tr:eq(0) td:eq(' + i + ') #sel_route_' + i).val() + '→'); $('div #main_route').append('ID' + $('#popup #table_route tr:eq(0) td:eq(' + i + ') #id_sel').val()+ ' '); if (cntNibble % 2 == 0) { route[cntByte] &= ~0xFF; route[cntByte] |= ($('#popup #table_route tr:eq(0) td:eq(' + i + ') #id_sel')[0].selectedIndex + 1) << 4; cntNibble++; } else { route[cntByte] &= ~0xF0; route[cntByte + 1] |= $('#popup #table_route tr:eq(0) td:eq(' + i + ') #id_sel')[0].selectedIndex + 1; cntNibble++; } cntNibble++; } else { $('div #main_route').append($('#popup #table_route tr:eq(0) td:eq(' + i + ') #sel_route_' + i).val()+ '→'); if (cntNibble % 2 == 0) route[cntByte] |= $('#popup #table_route tr:eq(0) td:eq(' + i + ') #sel_route_' + i)[0].selectedIndex + 1; else route[cntByte] |= ($('#popup #table_route tr:eq(0) td:eq(' + i + ') #sel_route_' + i)[0].selectedIndex + 1) << 4; cntNibble++; } } route[0] = cntNibble; route.fill(0, route.length, (route.length = 9)); $('div #main_route').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>>4&15)+m.charAt(15&_);return f} function X(d){for(var _=Array(d.length>>2),m=0;m<_.length;m++)_[m]=0;for(m=0;m<8*d.length;m+=8)_[m>>5]|=(255&d.charCodeAt(m/8))<>5]>>>m%32&255);return _} function Y(d,_){d[_>>5]|=128<<_%32,d[14+(_+64>>>9<<4)]=_;for(var m=1732584193,f=-271733879,r=-1732584194,i=271733878,n=0;n>16)+(_>>16)+(m>>16)<<16|65535&m} function bit_rol(d,_){return d<<_|d>>>32-_} /***************** Получаем cookie ******************/ function getCookies() { var pairs = document.cookie.split(';'); var cookies = {}; for(var i in pairs) { try { var pair = pairs[i].trim().split('='); if(pair.length == 2) cookies[encodeURIComponent(pair[0])] = encodeURIComponent(pair[1]); } catch(e) {} } return cookies; } /************ Показываем окно логина ********************/ function login(){ if($('#popup div.login').is(':visible'))return; showPopup('login'); $('#popup input.lat').focus(); } /****************** Авторизация *******************/ function auth(){ var passMD5=""; if($("#incorrectLogin").length > 0)$("#incorrectLogin").empty(); if($('#login input[type = text]').val().length === 0) $("#incorrectLogin").append("Ошибка: пустое имя пользователя").css({'color':'red'}); else { if(($('#login input[type = text]').val().length > 16) || ($('#login input[type = password]').val().length > 16)) { $("#incorrectLogin").append("Ошибка: имя пользователя или пароль
    более 16 символов").css({'color':'red'}); return; } if($("#login input[type = text]").val().match(/[^a-z0-9_]/i)) { $("#incorrectLogin").append("Ошибка: имя пользователя не может
    содержать русские символы").css({'color':'red'}); return; } if($('#login input[type = password]').val().length > 0) passMD5 = MD5($('#login input[type = password]').val()); else passMD5 = ""; $("#incorrectLogin").append("Выполняется вход...").css({'color':'black'}); request({"cmd":"login","user":""+$('#login input[type = text]').val()+"", "password":""+passMD5+""}, function(result, text){ if(result['status'] == 'ok'){ documentReload(); //closePopup(); //get_device(); } else if(result['status'] === 'error'){ if($("#incorrectLogin").length > 0)$("#incorrectLogin").empty(); if(result['error'] === 'incorrect login attempt')$("#incorrectLogin").append("Ошибка: неверное имя или пароль").css({'color':'red'}); } }); } }; /**************** Всплывающее окно ошибки ******************************/ function error(obj, text) { $(obj).nextAll('label.error').remove(); var label = $(''); $(obj).after(label); setTimeout(function() { label.remove(); }, 2500); return false; } /**************** Всплывающие окна ******************************/ function showPopup(popup_type, x, y) { $('#popupStack div.popup').removeAttr('id'); var html = $('#popup_' + popup_type).html(); $('#popupStack').append('
    '); var popup = $.extend($('#popup'), {close:function(){ var was_active = (this.attr('id') === 'popup'); this.closest('div.popupGroup').remove(); if(was_active) $('#popupStack div.popup:last').attr('id', 'popup'); this.closed = true; if(this.deferred && this.deferred.state() == 'pending') this.deferred.resolve(); return this; }}); var deferred = $.Deferred(); deferred.promise(popup); popup.deferred = deferred; popup.find(':input:visible:enabled').focus(); return popup.data('popup', popup).alignCenter(x, y); } function closePopup(id) { (id || $('#popup').data('popup')).close(); } function notice(text, hdr) { return myDialog(text, [{text:'Закрыть',defaction:true}], {header:(hdr || 'Уведомление')}); } function critical(text, hdr) { return myDialog(text, [{text:'Закрыть',defaction:true}], {header:(hdr || 'Ошибка'),img:'img/critical.png'}); } function dialog(content, onYes, onNo, options) { return myDialog(content, [{text:'Да',handler:onYes,defaction:true},{text:'Нет',handler:onNo}], $.extend({img:'img/question.png'}, options)); } function warning(text, hdr) { return myDialog(text, [{text:'Закрыть',defaction:true}], {header:(hdr || 'Предупреждение'),img:'img/warning.png'}); } function myDialog(content, buttons, opt) { var popup = showPopup(); popup.html(''); if(opt) { if(opt['header']) popup.prepend($('')); if(opt['img']) $('#popup .popup_body').prepend($('
    ')); } for(var i in buttons) { var btn = buttons[i]; var b = $('') .on('click', (function(h,popup,dontClose) { return function() { if(h) { h(popup); } if(!h || !dontClose) { popup.close(); } }; })(btn['handler'], popup, btn['dontClose'])); if(btn['defaction']) b.addClass('default'); if(btn['img']) b.prepend($('').css('margin-right', 4)).css('padding-left', 0); $('#popup div.popup_footer').append(b); } popup.find(':input:visible:enabled').focus(); return popup.alignCenter(); } function documentReload() { document.location.href = document.location.href.split('?')[0].replace(/#$/,''); } function request(datain, success, error, deferred) { var data = $.extend(true, {}, datain); console.log("request" + JSON.stringify(data)); var defer = deferred || new $.Deferred; $.ajax({ type: 'POST', url: 'api.c', cache: false, contentType: 'application/json; charset=UTF-8', data: JSON.stringify(data), dataType: 'json' }).done( function(result, text) { if(result) { console.log(result); if(result['status']){ if(result['status'] === 'error'){ defer.notify(100); if(result['error'] === 'not logged in'){ login(); return; } else if((result['error'] === 'incorrect login attempt') || (result['error'] === 'password change error')) { success(result, text); return; } else if(result['error'] === 'access denied')result['error'] = 'доступ запрещен'; if(result['cmd'] == '') result['cmd'] = data['cmd']; critical(result['cmd']+': '+result['error'], "Ошибка"); defer.reject(result); if(error) error(result, text); } else { defer.notify(100); if(success) success(result, text); defer.resolve(result); } } } else { defer.notify(100); defer.reject(); } }).fail(function(){ defer.notify(100); defer.reject(); }); return defer.promise(); }