mirror of
https://github.com/Cacti/cacti.git
synced 2026-10-28 23:57:30 +09:00
Port of #8161 to develop. Reads graph_start and graph_end from each graph wrapper in initializeGraphs(), with empty fallbacks when absent, instead of relying on the shared date-filter globals for every graph.
6182 lines
171 KiB
JavaScript
6182 lines
171 KiB
JavaScript
/*
|
||
+-------------------------------------------------------------------------+
|
||
| Copyright (C) 2004-2026 The Cacti Group |
|
||
| |
|
||
| This program is free software; you can redistribute it and/or |
|
||
| modify it under the terms of the GNU General Public License |
|
||
| as published by the Free Software Foundation; either version 2 |
|
||
| of the License, or (at your option) any later version. |
|
||
| |
|
||
| This program is distributed in the hope that it will be useful, |
|
||
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||
| GNU General Public License for more details. |
|
||
+-------------------------------------------------------------------------+
|
||
| Cacti: The Complete RRDtool-based Graphing Solution |
|
||
+-------------------------------------------------------------------------+
|
||
| This code is designed, written, and maintained by the Cacti Group. See |
|
||
| about.php and/or the AUTHORS file for specific developer information. |
|
||
+-------------------------------------------------------------------------+
|
||
| http://www.cacti.net/ |
|
||
+-------------------------------------------------------------------------+
|
||
*/
|
||
|
||
const MESSAGE_LEVEL_NONE = 0;
|
||
const MESSAGE_LEVEL_INFO = 1;
|
||
const MESSAGE_LEVEL_WARN = 2;
|
||
const MESSAGE_LEVEL_ERROR = 3;
|
||
const MESSAGE_LEVEL_CSRF = 4;
|
||
const MESSAGE_LEVEL_MIXED = 5;
|
||
|
||
var theme;
|
||
var myRefresh;
|
||
var userMenuTimer;
|
||
var userMenuOpenTimer = null;
|
||
var graphMenuTimer;
|
||
var graphMenuElement = 0;
|
||
var callbackTimer = {};
|
||
var callbackClickTimer = {}
|
||
var callbackOpen = {};
|
||
var pulsating = true;
|
||
var pageLoaded = false;
|
||
var shiftPressed = false;
|
||
var sessionMessage = null;
|
||
var sessionMessageOpen = null;
|
||
var sessionMessageTimer = null;
|
||
var currentNavState = null;
|
||
var currentNavId = null;
|
||
var myTitle;
|
||
var myHref;
|
||
var lastPage = null;
|
||
var statePushed = false;
|
||
var popFired = false;
|
||
var hostInfoHeight = 0;
|
||
var marginLeftTree = null;
|
||
var marginLeftConsole = null;
|
||
var minTreeWidth = null;
|
||
var maxTreeWidth = null;
|
||
var pageName;
|
||
var columnsHidden = 0;
|
||
var lastColumnsHidden = {};
|
||
var lastWidth = {};
|
||
var resizeDelta = 100;
|
||
var resizeTime = 0;
|
||
var resizeTimeout = false;
|
||
var formArray = {};
|
||
var formRules = {};
|
||
var pageWidth = null;
|
||
var isHover = false;
|
||
var hoverTimer = false;
|
||
var previousMainWidth = null;
|
||
var previousColumns = null;
|
||
var pinnedTooltipElement = null;
|
||
var faIcons = {
|
||
open: {
|
||
icon: '<i class="ti ti-caret-down-filled" aria-hidden="true"></i>'
|
||
},
|
||
close: {
|
||
icon: '<i class="ti ti-circle-x-filled" aria-hidden="true"></i>'
|
||
},
|
||
checkAll: {
|
||
icon: '<i class="ti ti-check" aria-hidden="true"></i>'
|
||
},
|
||
uncheckAll: {
|
||
icon: '<i class="ti ti-ban" aria-hidden="true"></i>'
|
||
},
|
||
flipAll: {
|
||
icon: '<i class="ti ti-arrow-back-up" aria-hidden="true"></i>'
|
||
},
|
||
collapseAll: {
|
||
icon: '<i class="ti ti-chevrons-down" aria-hidden="true"></i>'
|
||
},
|
||
expandAll: {
|
||
icon: '<i class="ti ti-chevrons-right" aria-hidden="true"></i>'
|
||
},
|
||
collapse: {
|
||
icon: '<i class="ti ti-chevron-down" aria-hidden="true"></i>'
|
||
},
|
||
expand: {
|
||
icon: '<i class="ti ti-chevron-right" aria-hidden="true"></i>'
|
||
}
|
||
};
|
||
|
||
let select2Setup = {
|
||
displayDefaultLabel : false,
|
||
}
|
||
|
||
/* size the open dropdown to fit its options instead of the (possibly narrower) control */
|
||
if (typeof $ !== 'undefined' && $.fn.select2) {
|
||
$.fn.select2.defaults.set('dropdownAutoWidth', true);
|
||
}
|
||
|
||
window.paceOptions = {
|
||
ajax: true,
|
||
document: true,
|
||
elements: false,
|
||
minTime: 400,
|
||
startOnPageLoad: false,
|
||
restartOnPushState: false,
|
||
restartOnRequestAfter: 120,
|
||
eventLag: false,
|
||
};
|
||
|
||
window.onbeforeunload = renderLoading;
|
||
|
||
function renderLoading() {
|
||
Pace.stop();
|
||
Pace.bar.render();
|
||
setCactiTabCookie();
|
||
}
|
||
|
||
function clearPinnedTooltip() {
|
||
if (pinnedTooltipElement && pinnedTooltipElement.length) {
|
||
var target = pinnedTooltipElement;
|
||
|
||
pinnedTooltipElement = null;
|
||
target.removeData('cacti-tooltip-pinned');
|
||
|
||
if ($(document).tooltip('instance')) {
|
||
$(document).tooltip('close', $.Event('click', {
|
||
target: target[0],
|
||
currentTarget: target[0]
|
||
}));
|
||
}
|
||
}
|
||
}
|
||
|
||
var isMobile = {
|
||
Android: function () {
|
||
return navigator.userAgent.match(/Android/i);
|
||
},
|
||
BlackBerry: function () {
|
||
return navigator.userAgent.match(/BlackBerry/i);
|
||
},
|
||
iOS: function () {
|
||
return navigator.userAgent.match(/iPhone|iPad|iPod/i);
|
||
},
|
||
Opera: function () {
|
||
return navigator.userAgent.match(/Opera Mini/i);
|
||
},
|
||
Windows: function () {
|
||
return navigator.userAgent.match(/IEMobile/i);
|
||
},
|
||
any: function () {
|
||
return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
|
||
}
|
||
};
|
||
|
||
/* simple ajax request queueing */
|
||
jQuery.ajaxQ = (function () {
|
||
var id = 0, Q = {};
|
||
|
||
jQuery(document).ajaxSend(function (e, jqx) {
|
||
jqx._id = ++id;
|
||
Q[jqx._id] = jqx;
|
||
});
|
||
|
||
jQuery(document).ajaxComplete(function (e, jqx) {
|
||
delete Q[jqx._id];
|
||
});
|
||
|
||
return {
|
||
abortAll: function () {
|
||
var r = [];
|
||
jQuery.each(Q, function (i, jqx) {
|
||
r.push(jqx._id);
|
||
jqx.abort();
|
||
});
|
||
return r;
|
||
}
|
||
};
|
||
})();
|
||
|
||
/**
|
||
* basename - this function will return the basename
|
||
* of the php script called
|
||
*
|
||
* @param path - the document.url
|
||
* @param suffix - remove the named suffix from the file
|
||
*/
|
||
function basename(path, suffix) {
|
||
var b = path;
|
||
var lastChar = b.charAt(b.length - 1);
|
||
|
||
// Don't remove trailing slash for now //
|
||
/*
|
||
if (lastChar === '/' || lastChar === '\\\\') {
|
||
b = b.slice(0, -1);
|
||
}
|
||
*/
|
||
|
||
if (b.indexOf('?') > 0) {
|
||
var questionPosition = b.indexOf('?');
|
||
b = b.slice(0, questionPosition);
|
||
}
|
||
|
||
b = b.replace(/^.*[\\/\\\\]/g, '');
|
||
|
||
if (suffix !== undefined && b.substr(b.length - suffix.length) == suffix) {
|
||
b = b.substr(0, b.length - suffix.length);
|
||
}
|
||
|
||
if (b.length == 0) {
|
||
b = "index.php";
|
||
}
|
||
|
||
return b;
|
||
}
|
||
|
||
/** getTimestampFromDate - Simple function to convert a MySQL Date
|
||
* to a timestamp */
|
||
function getTimestampFromDate(dateStamp) {
|
||
if (typeof dateStamp != 'undefined') {
|
||
var dateParts = dateStamp.split(' ');
|
||
var timeParts = dateParts[1].split(':');
|
||
|
||
dateParts = dateParts[0].split('-');
|
||
var date = new Date(dateParts[0], parseInt(dateParts[1], 10) - 1, dateParts[2], timeParts[0], timeParts[1]);
|
||
|
||
return date.getTime() / 1000;
|
||
}
|
||
return '';
|
||
}
|
||
|
||
/** base64_encode - Simple function to base64 encode a utf-8 string */
|
||
function base64_encode(string) {
|
||
return btoa(unescape(encodeURIComponent(string)));
|
||
}
|
||
|
||
/**
|
||
* getQueryString - this function will return the value
|
||
* of the get request variable defined as input.
|
||
* @param name - the variable name to return
|
||
*/
|
||
function getQueryString(name) {
|
||
var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
|
||
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
|
||
}
|
||
|
||
|
||
/**
|
||
* delayKeyup - this function will delay the keyup to
|
||
* provide debouncing of input strokes on the keyboard
|
||
* this preventing your backend server from becoming overloaded
|
||
* usage: $("#yourid").delayKeyup(function(){ console.log('do something'); }, 500);
|
||
*
|
||
* @param name - the variable name to return
|
||
*/
|
||
$.fn.delayKeyup = function (callback, ms) {
|
||
var timer = 0;
|
||
if (typeof ms === 'undefined' || ms < 500) {
|
||
ms = keyup_delay;
|
||
}
|
||
|
||
$(this).on('keyup', function () {
|
||
clearTimeout(timer);
|
||
timer = setTimeout(callback, ms);
|
||
});
|
||
return $(this);
|
||
};
|
||
|
||
/**
|
||
* bindFirst - Function ensures that the event is found at the top
|
||
* of the event stack.
|
||
*/
|
||
$.fn.bindFirst = function (which, handler) {
|
||
var $el = $(this);
|
||
$el.off(which, handler);
|
||
$el.on(which, handler);
|
||
|
||
var events = $._data($el[0]).events;
|
||
var registered = events[which];
|
||
registered.unshift(registered.pop());
|
||
|
||
events[which] = registered;
|
||
};
|
||
|
||
/**
|
||
* replaceOptions - function replaces the options in a select dropdown
|
||
*/
|
||
$.fn.replaceOptions = function (options, selected) {
|
||
var self, $option;
|
||
|
||
this.empty();
|
||
self = this;
|
||
|
||
$.each(options, function (index, option) {
|
||
if (selected == option.value) {
|
||
$option = $('<option></option>')
|
||
.attr('value', option.value)
|
||
.prop('selected', true)
|
||
.text(option.text);
|
||
} else {
|
||
$option = $('<option></option>')
|
||
.attr('value', option.value)
|
||
.text(option.text);
|
||
}
|
||
self.append($option);
|
||
});
|
||
};
|
||
|
||
/**
|
||
* Enable or disable options that match the values passed
|
||
*
|
||
* @param {array} values The values to be updated
|
||
* @param {bool} optionEnabled Whether to enable or disable
|
||
* @param {function} valueCheckFunc The function be to called if anything changes
|
||
* @returns element
|
||
*/
|
||
$.fn.enableDisableOptions = function (values, optionEnabled, valueCheckFunc) {
|
||
var hasChanged = false;
|
||
|
||
if ($(this).length > 0) {
|
||
var self = $(this)[0];
|
||
|
||
$.each(self.options, function (index, option) {
|
||
var optionValue = $(this).val();
|
||
var optionDisabled = $(this).prop('disabled');
|
||
var optionIncluded = values.includes(optionValue);
|
||
|
||
/*
|
||
console.log('option ' + index + ' Name = ' + $(this).name);
|
||
console.log('option ' + index + ' Value = ' + optionValue);
|
||
console.log();
|
||
*/
|
||
|
||
var optionFinally = '---';
|
||
if (optionIncluded && optionDisabled == optionEnabled) {
|
||
hasChanged = true;
|
||
$(this).prop('disabled', !optionEnabled);
|
||
optionFinally = ($(this).prop('disabled') ? 'Yes':'No ');
|
||
}
|
||
|
||
/*
|
||
console.log('## option ' + index + ' (' + optionValue + ')' +
|
||
', Enabled = ' + (optionEnabled ? 'Yes' : 'No ') +
|
||
', Included = ' + (optionIncluded ? 'Yes' : 'No ') +
|
||
', Disabled = ' + (optionDisabled ? 'Yes' : 'No ') +
|
||
', Finally = ' + (optionFinally)
|
||
);
|
||
*/
|
||
});
|
||
}
|
||
|
||
/*
|
||
console.log('hasChanged = ' + hasChanged);
|
||
console.log();
|
||
*/
|
||
|
||
if (hasChanged) {
|
||
if (typeof valueCheckFunc == 'function') {
|
||
valueCheckFunc();
|
||
}
|
||
|
||
var selectMenu = $(this).selectmenu('instance');
|
||
if (typeof selectMenu != 'undefined') {
|
||
$(this).selectmenu('refresh');
|
||
}
|
||
|
||
if ($(this).hasClass("select2-hidden-accessible")) {
|
||
$(this).trigger('change.select2');
|
||
}
|
||
}
|
||
|
||
return $(this);
|
||
};
|
||
|
||
/**
|
||
* Enable options that match the values passed
|
||
*
|
||
* @param {array} values The values to be updated
|
||
* @param {function} valueCheckFunc The function be to called if anything changes
|
||
* @returns
|
||
*/
|
||
|
||
$.fn.disableOptions = function (values, valueCheckFunc) {
|
||
return $(this).enableDisableOptions(values, false, valueCheckFunc);
|
||
}
|
||
|
||
/**
|
||
* Disable options that match the values passed
|
||
*
|
||
* @param {array} values The values to be updated
|
||
* @param {function} valueCheckFunc The function be to called if anything changes
|
||
* @returns
|
||
*/
|
||
$.fn.enableOptions = function (values, valueCheckFunc) {
|
||
return $(this).enableDisableOptions(values, true, valueCheckFunc);
|
||
}
|
||
|
||
/**
|
||
* textWidth - This function will return the natural width of a string
|
||
* without any wrapping.
|
||
*/
|
||
$.fn.textWidth = function (text) {
|
||
var org = $(this);
|
||
var html = $('<span style="display:none;white-space:nowrap;position:absolute;width:auto;left:-9999px"></span>').text(text || org.text());
|
||
if (!text) {
|
||
html.css('font-family', org.css('font-family'));
|
||
html.css('font-weight', org.css('font-weight'));
|
||
html.css('font-size', org.css('font-size'));
|
||
html.css('padding', org.css('padding'));
|
||
html.css('margin', org.css('margin'));
|
||
}
|
||
$('body').append(html);
|
||
var width = html.width();
|
||
html.remove();
|
||
return width;
|
||
};
|
||
|
||
/**
|
||
* textBoxWidth - This function will return the natural width of a string
|
||
* without any wrapping.
|
||
*/
|
||
$.fn.textBoxWidth = function () {
|
||
var org = $(this);
|
||
if (org.val()) {
|
||
var text = encodeURIComponent(org.val());
|
||
} else {
|
||
var text = encodeURIComponent(org.text());
|
||
}
|
||
|
||
var html = $('<span style="display:none;white-space:nowrap;position:absolute;width:auto;left:-9999px">' + text + '</span>');
|
||
html.css('font-family', org.css('font-family'));
|
||
html.css('font-weight', org.css('font-weight'));
|
||
html.css('font-size', org.css('font-size'));
|
||
html.css('padding', org.css('padding'));
|
||
html.css('margin', org.css('margin'));
|
||
$('body').append(html);
|
||
var width = html.width();
|
||
html.remove();
|
||
return width;
|
||
};
|
||
|
||
/**
|
||
* classes - This function will return an array of all
|
||
* classes of an element
|
||
*/
|
||
$.fn.classes = function (callback) {
|
||
var classes = [];
|
||
$.each(this, function (i, v) {
|
||
var splitClassName = v.className.split(/\s+/);
|
||
for (var j in splitClassName) {
|
||
var className = splitClassName[j];
|
||
if (-1 === classes.indexOf(className)) {
|
||
classes.push(className);
|
||
}
|
||
}
|
||
});
|
||
if ('function' == typeof callback) {
|
||
for (var i in classes) {
|
||
callback(classes[i]);
|
||
}
|
||
}
|
||
return classes;
|
||
};
|
||
|
||
/**
|
||
* These three functions will set the cursor into
|
||
* a textbox or textarea and optionally select characters
|
||
*/
|
||
$.fn.setCursorPosition = function (position) {
|
||
if (this.length == 0) return this;
|
||
return this.setSelection(position, position);
|
||
};
|
||
|
||
$.fn.selectRange = function (start, end) {
|
||
if (!end) end = start;
|
||
return this.each(function () {
|
||
if (this.setSelectionRange) {
|
||
this.focus();
|
||
this.setSelectionRange(start, end);
|
||
} else if (this.createTextRange) {
|
||
var range = this.createTextRange();
|
||
range.collapse(true);
|
||
range.moveEnd('character', end);
|
||
range.moveStart('character', start);
|
||
range.select();
|
||
}
|
||
});
|
||
|
||
//return this;
|
||
};
|
||
|
||
$.fn.focusEnd = function () {
|
||
this.setCursorPosition($(this).val().length);
|
||
return this;
|
||
};
|
||
|
||
$.fn.getObjectDetails = function () {
|
||
var coords = {};
|
||
|
||
coords.width = $(this).outerWidth();
|
||
coords.height = $(this).outerHeight();
|
||
coords.left = 0;
|
||
coords.top = 0;
|
||
|
||
$(this).parentsUntil('body').each(function () {
|
||
coords.left += $(this).position().left;
|
||
coords.top += $(this).position().top;
|
||
});
|
||
|
||
return coords;
|
||
};
|
||
|
||
$.fn.serializeForm = function () {
|
||
var arrayData, objectData, hiddenSelectData;
|
||
arrayData = this.serializeArray();
|
||
|
||
/* for some reason the new selectmenus are not serialized */
|
||
hiddenSelectData = $('select:hidden').serializeArray();
|
||
|
||
$.each(hiddenSelectData, function(id, fd) {
|
||
var found = false;
|
||
|
||
$.each(arrayData, function(aid, afd) {
|
||
if (fd.name == afd.name) {
|
||
found = true;
|
||
}
|
||
});
|
||
|
||
if (!found) {
|
||
arrayData = arrayData.concat(fd);
|
||
}
|
||
});
|
||
|
||
formID = $(this).attr('id');
|
||
|
||
arrayData = arrayData.concat(
|
||
$('#' + formID + ' input[type=checkbox]:not(:checked)').map(function () {
|
||
return { "name": this.name, "value": $(this).is(':checked') ? 'on' : '' }
|
||
}).get());
|
||
|
||
objectData = {};
|
||
|
||
$.each(arrayData, function () {
|
||
var value;
|
||
|
||
if (this.value != null) {
|
||
value = this.value;
|
||
} else {
|
||
value = '';
|
||
}
|
||
|
||
if (objectData[this.name] != null) {
|
||
if (!objectData[this.name].push) {
|
||
objectData[this.name] = [objectData[this.name]];
|
||
}
|
||
|
||
objectData[this.name].push(value);
|
||
} else {
|
||
objectData[this.name] = value;
|
||
}
|
||
});
|
||
|
||
return objectData;
|
||
};
|
||
|
||
$.fn.serializeObject = function () {
|
||
var arrayData, objectData, formID, hiddenSelectData;
|
||
arrayData = this.serializeArray();
|
||
|
||
/* for some reason the new selectmenus are not serialized */
|
||
hiddenSelectData = $('select:hidden').serializeArray();
|
||
|
||
$.each(hiddenSelectData, function(id, fd) {
|
||
var found = false;
|
||
|
||
$.each(arrayData, function(aid, afd) {
|
||
if (fd.name == afd.name) {
|
||
found = true;
|
||
}
|
||
});
|
||
|
||
if (!found) {
|
||
arrayData = arrayData.concat(fd);
|
||
}
|
||
});
|
||
|
||
formID = $(this).attr('id');
|
||
|
||
objectData = {};
|
||
|
||
$.each(arrayData, function () {
|
||
var value;
|
||
|
||
if (this.value != null) {
|
||
value = this.value;
|
||
} else {
|
||
value = '';
|
||
}
|
||
|
||
if (objectData[this.name] != null) {
|
||
if (!objectData[this.name].push) {
|
||
objectData[this.name] = [objectData[this.name]];
|
||
}
|
||
|
||
objectData[this.name].push(value);
|
||
} else {
|
||
objectData[this.name] = value;
|
||
}
|
||
});
|
||
|
||
return objectData;
|
||
};
|
||
|
||
// Borrowed from mustache.js
|
||
function escapeString(string) {
|
||
var entityMap = {
|
||
'<': '<',
|
||
'>': '>',
|
||
'"': '"',
|
||
"'": ''',
|
||
'`': '`'
|
||
};
|
||
|
||
return String(string).replace(/[<>"'`]/g, function fromEntityMap(s) {
|
||
return entityMap[s];
|
||
});
|
||
}
|
||
|
||
// Plugin to apply numeric format for tablesorter
|
||
$.tablesorter.addParser({
|
||
id: 'numberFormat',
|
||
is: function (s) {
|
||
return /^[0-9]?[0-9,\.]*$/.test(s);
|
||
},
|
||
format: function (s) {
|
||
return $.tablesorter.formatFloat(s.replace(/,/g, ''));
|
||
},
|
||
type: 'numeric'
|
||
});
|
||
|
||
/** Mini jquery plugin to determine if an element has a scrollbar present */
|
||
(function ($) {
|
||
$.fn.hasScrollBar = function () {
|
||
return this.get(0).scrollHeight > this.outerHeight();
|
||
};
|
||
})(jQuery);
|
||
|
||
/** Mini jquery plugin to create a bind to show/hide events */
|
||
(function ($) {
|
||
$.each(['show', 'hide'], function (i, ev) {
|
||
var el = $.fn[ev];
|
||
$.fn[ev] = function () {
|
||
this.trigger(ev);
|
||
return el.apply(this, arguments);
|
||
};
|
||
});
|
||
})(jQuery);
|
||
|
||
// Helper function to get text dimensions
|
||
(function ($) {
|
||
$.textMetrics = function (el) {
|
||
var h = 0,
|
||
w = 0;
|
||
|
||
var div = document.createElement('div');
|
||
document.body.appendChild(div);
|
||
$(div).css({
|
||
position: 'absolute',
|
||
left: -1000,
|
||
top: -1000,
|
||
display: 'none'
|
||
});
|
||
|
||
$(div).html($(el).html());
|
||
|
||
var styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
|
||
|
||
$(styles).each(function () {
|
||
var s = this.toString();
|
||
$(div).css(s, $(el).css(s));
|
||
});
|
||
|
||
var h = $(div).outerHeight();
|
||
var w = $(div).outerWidth();
|
||
|
||
$(div).remove();
|
||
|
||
var ret = {
|
||
height: h,
|
||
width: w
|
||
};
|
||
|
||
return ret;
|
||
}
|
||
})(jQuery);
|
||
|
||
// helper function which selects row range when shift key is pressed during click
|
||
function updateCheckboxes(checkboxes, clicked_element) {
|
||
var prev_checkbox = clicked_element.closest('table').find('[data-prev-check]:checkbox');
|
||
|
||
if (!prev_checkbox.length) {
|
||
return;
|
||
}
|
||
|
||
var check = prev_checkbox.attr('data-prev-check') == 'true';
|
||
var start = checkboxes.index(prev_checkbox);
|
||
var stop = checkboxes.index(clicked_element);
|
||
var i = Math.min(start, stop);
|
||
var j = Math.max(start, stop);
|
||
|
||
for (var k = i; k <= j; k++) {
|
||
var tr = $(checkboxes[k]).prop('checked', check).closest('tr');
|
||
if (check) {
|
||
tr.addClass('selected');
|
||
} else {
|
||
tr.removeClass('selected');
|
||
}
|
||
}
|
||
}
|
||
|
||
/** applySelectorVisibility - This function set's the initial visibility
|
||
* of graphs for creation. Is will scan the against preset variables
|
||
* taking action as required to enable or disable rows. */
|
||
function applySelectorVisibilityAndActions() {
|
||
// Change for accessibility
|
||
$('input[type="radio"]').off('click').on('click', function () {
|
||
if ($(this).is(':checked')) {
|
||
$(this).attr('aria-checked', 'true');
|
||
} else {
|
||
$(this).attr('aria-checked', 'false');
|
||
}
|
||
});
|
||
|
||
// Apply disabled/enabled status first for Graph Templates
|
||
$('tr[id^="gt_line"]').each(function (data) {
|
||
var id = $(this).attr('id');
|
||
var search = id.substr(7);
|
||
if ($.inArray(search, gt_created_graphs) >= 0) {
|
||
$(this).addClass('disabled_row');
|
||
$(this).find(':checkbox').prop('disabled', true);
|
||
}
|
||
});
|
||
|
||
// Create Actions for Rows
|
||
$('tr[id^="gt_line"].selectable:not(.disabled_row)').off('click').on('click', function (event) {
|
||
selectUpdateRow(event, $(this));
|
||
});
|
||
|
||
// Create Actions for Rows
|
||
$('tr[id^="line"].selectable').filter(':not(.disabled_row)').off('click').on('click', function (event) {
|
||
selectUpdateRow(event, $(this));
|
||
});
|
||
}
|
||
|
||
function disableSelection() {
|
||
$('tr.selectable').css('-webkit-user-select', 'none');
|
||
$('tr.selectable').css('-moz-user-select', 'none');
|
||
$('tr.selectable').css('-ms-user-select', 'none');
|
||
$('tr.selectable').css('-o-user-select', 'none');
|
||
$('tr.selectable').css('user-select', 'none');
|
||
}
|
||
|
||
function enableSelection() {
|
||
$('tr.selectable').css('-webkit-user-select', '');
|
||
$('tr.selectable').css('-moz-user-select', '');
|
||
$('tr.selectable').css('-ms-user-select', '');
|
||
$('tr.selectable').css('-o-user-select', '');
|
||
$('tr.selectable').css('user-select', '');
|
||
}
|
||
|
||
/**
|
||
* selectUpdateRow - Highlight a selectable row combined with checkbox
|
||
*
|
||
* @param event - The click event to support multiple selections
|
||
* @param element - The jQuery selected object
|
||
*/
|
||
function selectUpdateRow(event, element) {
|
||
var checkboxes = element.closest('table').find('input[type=checkbox]:not(:disabled)');
|
||
|
||
if (event.shiftKey) {
|
||
updateCheckboxes(checkboxes, element.find(':checkbox'));
|
||
} else {
|
||
element.toggleClass('selected');
|
||
if (element.hasClass('selected')) {
|
||
element.find(':checkbox').prop('checked', true).attr('aria-checked', 'true').attr('data-prev-check', 'true');
|
||
} else {
|
||
element.find(':checkbox').prop('checked', false).removeAttr('aria-checked').removeAttr('data-prev-check');
|
||
}
|
||
}
|
||
|
||
if (element.closest('table').find(':checked').length) {
|
||
disableSelection();
|
||
} else {
|
||
enableSelection();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* dqUpdateDeps - When a user changes the Graph dropdown for a data query
|
||
* we have to check to see if those graphs are already created.
|
||
*
|
||
* @param snmp_query_id - The snmp query id the is current
|
||
*/
|
||
function dqUpdateDeps(snmp_query_id) {
|
||
$('tr[id^="dqline' + snmp_query_id + '_"]').addClass('selectable').removeClass('disabled_row').find(':checkbox').prop('disabled', false);
|
||
|
||
var snmp_query_graph_id = $('#sgg_' + snmp_query_id).val();
|
||
var removeSelectAll = false;
|
||
|
||
// Check if select all is clicked
|
||
var allChecked = $('#all_' + snmp_query_id).is(':checked');
|
||
|
||
// Next for Data Queries
|
||
$('tr[id^="dqline' + snmp_query_id + '_"]').each(function (data) {
|
||
var id = $(this).attr('id');
|
||
var pieces = id.split('_');
|
||
var dq = pieces[0].substr(6);
|
||
var hash = pieces[1];
|
||
|
||
if ($.inArray(hash, created_graphs[snmp_query_graph_id]) >= 0) {
|
||
if ($(this).hasClass('selected')) {
|
||
removeSelectAll = true;
|
||
}
|
||
|
||
$(this).addClass('disabled_row').removeClass('selected').removeClass('selectable');
|
||
$(this).find(':checkbox').prop('disabled', true).prop('checked', false);
|
||
} else {
|
||
removeSelectAll = true;
|
||
}
|
||
});
|
||
|
||
if (allChecked && removeSelectAll) {
|
||
$('#all_' + snmp_query_id).prop('checked', false);
|
||
}
|
||
|
||
$('tr[id^="dqline' + snmp_query_id + '_"]').not('.disabled_row').off('click').on('click', function (event) {
|
||
selectUpdateRow(event, $(this));
|
||
});
|
||
}
|
||
|
||
/**
|
||
* selectAll - This function will select all non-disabled rows
|
||
* @param attrib - The Graph Type either graph template, or data query
|
||
*/
|
||
function selectAll(attrib, checked) {
|
||
if (attrib == 'chk') {
|
||
if (checked == true) {
|
||
$('tr[id^="line"]:not(.disabled_row)').each(function (data) {
|
||
$(this).addClass('selected');
|
||
$(this).find(':checkbox').prop('checked', true).attr('aria-checked', 'true').attr('data-prev-check', 'true');
|
||
});
|
||
disableSelection();
|
||
} else {
|
||
$('tr[id^="line"]:not(.disabled_row)').each(function (data) {
|
||
$(this).removeClass('selected');
|
||
$(this).find(':checkbox').prop('checked', false).removeAttr('aria-checked').removeAttr('data-prev-check');
|
||
});
|
||
}
|
||
} else if (attrib == 'sg') {
|
||
if (checked == true) {
|
||
$('tr[id^="gt_line"]:not(.disabled_row)').each(function (data) {
|
||
$(this).addClass('selected');
|
||
$(this).find(':checkbox').prop('checked', true).attr('aria-checked', 'true').attr('data-prev-check', 'true');
|
||
});
|
||
disableSelection();
|
||
} else {
|
||
$('tr[id^="gt_line"]:not(.disabled_row)').each(function (data) {
|
||
$(this).removeClass('selected');
|
||
$(this).find(':checkbox').prop('checked', false).removeAttr('aria-checked').removeAttr('data-prev-check');
|
||
});
|
||
}
|
||
} else if (attrib.startsWith('sg_', 0)) {
|
||
var attribSplit = attrib.split('_');
|
||
var dq = attribSplit[1];
|
||
|
||
if (checked == true) {
|
||
$('tr[id^="dqline' + dq + '\_"]:not(.disabled_row)').each(function (data) {
|
||
$(this).addClass('selected');
|
||
$(this).find(':checkbox').prop('checked', true).attr('aria-checked', 'true').attr('data-prev-check', 'true');
|
||
});
|
||
disableSelection();
|
||
} else {
|
||
$('tr[id^="dqline' + dq + '\_"]:not(.disabled_row)').each(function (data) {
|
||
$(this).removeClass('selected');
|
||
$(this).find(':checkbox').prop('checked', false).removeAttr('aria-checked').removeAttr('data-prev-check');
|
||
});
|
||
}
|
||
} else {
|
||
if (checked == true) {
|
||
$('tr[id^="line_' + attrib + '"]:not(.disabled_row)').each(function (data) {
|
||
$(this).addClass('selected');
|
||
$(this).find(':checkbox').prop('checked', true).attr('aria-checked', 'true').attr('data-prev-check', 'true');
|
||
});
|
||
disableSelection();
|
||
} else {
|
||
$('tr[id^="line_' + attrib + '"]:not(.disabled_row)').each(function (data) {
|
||
$(this).removeClass('selected');
|
||
$(this).find(':checkbox').prop('checked', false).removeAttr('aria-checked').removeAttr('data-prev-check');
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
/* graph filtering */
|
||
function applyTimespanFilterChange() {
|
||
var href;
|
||
|
||
href = '?predefined_timespan=' + $('#predefined_timespan').val();
|
||
href += '&predefined_timeshift=' + $('#predefined_timeshift').val();
|
||
|
||
loadUrl({ url: href });
|
||
|
||
}
|
||
|
||
/**
|
||
* cactiReturnTo - This function simply returns to the previous page
|
||
* @param href - the previous page
|
||
*/
|
||
function cactiReturnTo(href) {
|
||
if (typeof href !== 'string' || href.trim() == '') {
|
||
href = document.referrer;
|
||
}
|
||
|
||
loadUrl({ url: href, force: true });
|
||
}
|
||
|
||
/**
|
||
* setupSelectmenuScrollClose - Close open select menus when their scroll
|
||
* container moves so the detached menu cannot remain over unrelated fields.
|
||
*/
|
||
function setupSelectmenuScrollClose() {
|
||
$('.cactiConsoleContentArea, .cactiGraphContentArea, .cactiGraphContentAreaPreview, .cactiTreeNavigationArea')
|
||
.add(window)
|
||
.off('scroll.cactiSelectmenu')
|
||
.on('scroll.cactiSelectmenu', function () {
|
||
if (!$('.ui-selectmenu-open').length) {
|
||
return;
|
||
}
|
||
|
||
$('select').each(function () {
|
||
if ($(this).selectmenu('instance') !== undefined) {
|
||
$(this).selectmenu('close');
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* applySkin - This function re-asserts all javascript behavior to a page
|
||
* that can't be set using a live attribute 'on()'
|
||
*/
|
||
function applySkin() {
|
||
pageName = basename($(location).attr('pathname'));
|
||
|
||
$('#messageContainer').remove();
|
||
|
||
/* Replace icons */
|
||
$('.fa-arrow-down').addClass('fa-chevron-down').removeClass('fa-arrow-down');
|
||
$('.fa-arrow-up').addClass('fa-chevron-up').removeClass('fa-arrow-up');
|
||
$('.fa-remove').addClass('fa-trash-o').removeClass('fa-remove');
|
||
|
||
if (!theme) {
|
||
theme = 'midwinter';
|
||
|
||
// debounce submits
|
||
$('form').on('submit', function () {
|
||
$('input[type="submit"], button[type="submit"]').not('.import, .export').prop('disabled', true);
|
||
});
|
||
} else {
|
||
$('input[type="submit"], input[type="button"], button').button();
|
||
|
||
// Handle re-index changes
|
||
$('fieldset.reindex_methods').controlgroup();
|
||
|
||
// debounce submits
|
||
$('form').on('submit', function () {
|
||
$('input[type="submit"], button[type="submit"]').not('.import, .export').button('disable');
|
||
});
|
||
}
|
||
|
||
// Setup blinking
|
||
setInterval(blinkMe, 1200);
|
||
|
||
function blinkMe() {
|
||
$('.blink').each(function() {
|
||
var width = $(this).textBoxWidth();
|
||
|
||
$(this).css({ 'min-width': width });
|
||
$(this).fadeOut(900).fadeIn(900);
|
||
});
|
||
}
|
||
|
||
/* applySkin() runs more than once per page view (initial load, then again
|
||
* after every AJAX load/filter apply); tear down any select2 widget still
|
||
* attached before setSelectMenus()/the blocks below re-initialize, instead
|
||
* of relying only on the :not(.select2-hidden-accessible) guards to skip
|
||
* them, so a widget can never end up duplicated. Must run before
|
||
* setSelectMenus() so its catch-all init below still re-enhances plain
|
||
* <select> elements that this teardown just destroyed. */
|
||
$('.select2-hidden-accessible').each(function() {
|
||
if ($(this).data('select2')) {
|
||
$(this).select2('destroy');
|
||
}
|
||
});
|
||
|
||
setSelectMenus();
|
||
|
||
setGraphTabs();
|
||
|
||
setupSortable();
|
||
|
||
setupBreadcrumbs();
|
||
|
||
applyTableSizing();
|
||
|
||
setupPageTimeout();
|
||
|
||
CsrfMagic.end();
|
||
|
||
setupSpecialKeys();
|
||
|
||
setupCollapsible();
|
||
|
||
ajaxAnchors();
|
||
|
||
applySelectorVisibilityAndActions();
|
||
|
||
makeCallbacks();
|
||
|
||
setupObjectChange();
|
||
|
||
$('.helpPage').off('click').on('click', function (event) {
|
||
event.stopPropagation();
|
||
getCactiHelp($(this).attr('data-page'));
|
||
});
|
||
|
||
if (typeof themeReady == 'function') {
|
||
themeReady();
|
||
}
|
||
|
||
setupSelectmenuScrollClose();
|
||
|
||
makeFiltersResponsive();
|
||
|
||
setupResponsiveMenuAndTabs();
|
||
|
||
setupButtonStyle();
|
||
|
||
// Debug message actions
|
||
$('table.debug tr:nth-child(1)').off('click').on('click', function () {
|
||
if ($(this).parent().find('table').is(':visible')) {
|
||
$(this).parent().find('table').slideUp('fast');
|
||
} else {
|
||
$(this).parent().find('table').slideDown('fast');
|
||
}
|
||
});
|
||
|
||
$('.cactiTableCopy').off('click').on('click', function (event) {
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
var containerId = $(this).attr('id');
|
||
copyToClipboard(containerId);
|
||
});
|
||
|
||
$('i, a, th, td, img, input, label, select, button, .drillDown, .checkboxSlider')
|
||
.tooltip()
|
||
.on('focus', function () {
|
||
if ($(this).tooltip('instance')) {
|
||
$(this).tooltip('close');
|
||
}
|
||
})
|
||
.on('click', function () {
|
||
if ($(this).tooltip('instance')) {
|
||
$(this).tooltip('close');
|
||
}
|
||
});
|
||
|
||
$(document).tooltip({
|
||
items: 'div.cactiTooltipHint, span.cactiTooltipHint, .checkboxSlider',
|
||
content: function () {
|
||
var element = $(this);
|
||
|
||
if (element.is('div')) {
|
||
var text = DOMPurify.sanitize($(this).find('span').html());
|
||
} else if (element.is('span') || element.is('a')) {
|
||
var text = DOMPurify.sanitize($(this).prop('title'));
|
||
}
|
||
return text;
|
||
}
|
||
});
|
||
|
||
$(document)
|
||
.off('.cactiTooltipPin')
|
||
.on('click.cactiTooltipPin', 'div.cactiTooltipHint, span.cactiTooltipHint', function (event) {
|
||
var target = $(this);
|
||
var isPinned = target.data('cacti-tooltip-pinned') === true;
|
||
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
|
||
if (pinnedTooltipElement && !target.is(pinnedTooltipElement)) {
|
||
clearPinnedTooltip();
|
||
}
|
||
|
||
if (isPinned) {
|
||
clearPinnedTooltip();
|
||
return;
|
||
}
|
||
|
||
pinnedTooltipElement = target;
|
||
target.data('cacti-tooltip-pinned', true);
|
||
|
||
$(document).tooltip('open', $.Event('mouseover', {
|
||
target: this,
|
||
currentTarget: this
|
||
}));
|
||
})
|
||
.on('click.cactiTooltipPinDismiss', function (event) {
|
||
var tooltipId, tooltip;
|
||
|
||
if (!pinnedTooltipElement || !pinnedTooltipElement.length) {
|
||
return;
|
||
}
|
||
|
||
tooltipId = pinnedTooltipElement.data('ui-tooltip-id');
|
||
tooltip = tooltipId ? $('#' + tooltipId) : $();
|
||
|
||
if (pinnedTooltipElement.is(event.target) ||
|
||
pinnedTooltipElement.has(event.target).length ||
|
||
(tooltip.length && (tooltip.is(event.target) || tooltip.has(event.target).length))) {
|
||
return;
|
||
}
|
||
|
||
clearPinnedTooltip();
|
||
})
|
||
.on('keyup.cactiTooltipPinDismiss', function (event) {
|
||
if (event.keyCode === $.ui.keyCode.ESCAPE) {
|
||
clearPinnedTooltip();
|
||
}
|
||
});
|
||
|
||
$(document).on('keyup keydown', function (event) {
|
||
shiftPressed = event.shiftKey;
|
||
});
|
||
|
||
$('#main').css('display', 'table');
|
||
|
||
var showPage = $('#main').map(function (i, el) {
|
||
var dfd = $.Deferred();
|
||
$(el).show(function () {
|
||
dfd.resolve();
|
||
});
|
||
|
||
return dfd;
|
||
});
|
||
|
||
$('#password').delayKeyup(function () {
|
||
var url = window.location.href.split('?')[0] + '?action=checkpass';
|
||
checkPassword(url);
|
||
});
|
||
|
||
$('#password_confirm').delayKeyup(function () {
|
||
checkPasswordConfirm();
|
||
});
|
||
|
||
//keepWindowSize();
|
||
|
||
sessionMessageDisplay();
|
||
sessionNoticesDisplay();
|
||
|
||
renderLanguages();
|
||
|
||
$('select.select2:not(.select2-hidden-accessible)').each(function() {
|
||
var options = {
|
||
minimumResultsForSearch: select2SearchRows
|
||
};
|
||
|
||
if ($(this).closest('.ui-dialog').length) {
|
||
options.dropdownParent = $(this).closest('.ui-dialog');
|
||
}
|
||
|
||
$(this).select2(options);
|
||
});
|
||
|
||
$('select.select2-nosearch:not(.select2-hidden-accessible)').each(function() {
|
||
if ($(this).closest('.ui-dialog').length) {
|
||
var dropdownParent = $(this).closest('.ui-dialog');
|
||
|
||
$(this).select2({
|
||
minimumResultsForSearch: Infinity,
|
||
dropdownParent: dropdownParent
|
||
});
|
||
} else {
|
||
$(this).select2({
|
||
minimumResultsForSearch: Infinity
|
||
});
|
||
}
|
||
});
|
||
|
||
$('select.select2-tags:not(.select2-hidden-accessible)').each(function() {
|
||
if ($(this).closest('.ui-dialog').length) {
|
||
var dropdownParent = $(this).closest('.ui-dialog');
|
||
|
||
$(this).select2({
|
||
tags: true,
|
||
dropdownParent: dropdownParent
|
||
});
|
||
} else {
|
||
$(this).select2({
|
||
tags: true
|
||
});
|
||
}
|
||
});
|
||
|
||
$('select.select2-multi:not(.select2-hidden-accessible)').each(function() {
|
||
var options = {
|
||
minimumResultsForSearch: select2SearchRows
|
||
};
|
||
|
||
if ($(this).closest('.ui-dialog').length) {
|
||
options.dropdownParent = $(this).closest('.ui-dialog');
|
||
}
|
||
|
||
$(this).select2(options);
|
||
});
|
||
|
||
/* multi-select that reports "N selected"/"All selected" instead of one chip per option */
|
||
/* select2 normally puts a multi-select's type-to-filter box inside the control itself,
|
||
* which grows its height and shoves the surrounding form down when opened. Build adapters
|
||
* that instead search from the floating dropdown panel (how single-selects behave) and
|
||
* drop the inline box entirely, so the control stays a fixed height whether open or closed */
|
||
var multiCountDropdownAdapter, multiCountSelectionAdapter;
|
||
if ($.fn.select2 && $.fn.select2.amd) {
|
||
/* string-form require() resolves synchronously; the array form defers via
|
||
* setTimeout, which would leave these undefined when the init loop below runs */
|
||
var s2amd = $.fn.select2.amd;
|
||
var Utils = s2amd.require('select2/utils');
|
||
var Dropdown = s2amd.require('select2/dropdown');
|
||
var DropdownSearch = s2amd.require('select2/dropdown/search');
|
||
var MinResults = s2amd.require('select2/dropdown/minimumResultsForSearch');
|
||
var AttachBody = s2amd.require('select2/dropdown/attachBody');
|
||
var MultipleSelection = s2amd.require('select2/selection/multiple');
|
||
var EventRelay = s2amd.require('select2/selection/eventRelay');
|
||
|
||
multiCountDropdownAdapter = Utils.Decorate(
|
||
Utils.Decorate(
|
||
Utils.Decorate(Dropdown, DropdownSearch),
|
||
MinResults
|
||
),
|
||
AttachBody
|
||
);
|
||
|
||
multiCountSelectionAdapter = Utils.Decorate(MultipleSelection, EventRelay);
|
||
}
|
||
|
||
$('select.select2-multi-count:not(.select2-hidden-accessible)').each(function() {
|
||
var $select = $(this);
|
||
var allText = $select.data('select-all-text') || multiSelectAllText;
|
||
var countText = $select.data('select-count-text') || multiSelectCountText;
|
||
var allValue = $select.data('select-all-value');
|
||
|
||
var options = {
|
||
/* without this select2 defaults width to 'resolve', which sizes the control
|
||
* (and thus the body-attached dropdown) to the native multi-select's wide
|
||
* content box instead of the rendered summary label */
|
||
width: 'auto',
|
||
minimumResultsForSearch: select2SearchRows,
|
||
closeOnSelect: false,
|
||
/* checkbox-styled option rows, closer to the old jquery-multiselect look;
|
||
* the checked mark itself is drawn from [aria-selected] via CSS */
|
||
templateResult: function(state) {
|
||
if (!state.id) {
|
||
return state.text;
|
||
}
|
||
|
||
return $('<span class="select2-checkbox-option">').text(state.text);
|
||
}
|
||
};
|
||
|
||
if (multiCountDropdownAdapter && multiCountSelectionAdapter) {
|
||
options.dropdownAdapter = multiCountDropdownAdapter;
|
||
options.selectionAdapter = multiCountSelectionAdapter;
|
||
}
|
||
|
||
if ($select.closest('.ui-dialog').length) {
|
||
options.dropdownParent = $select.closest('.ui-dialog');
|
||
}
|
||
|
||
$select.select2(options);
|
||
|
||
function updateSelect2CountLabel() {
|
||
var selected = $select.val() || [];
|
||
var rendered = $select.next('.select2-container').find('.select2-selection__rendered');
|
||
/* own span instead of bare text, so it can be centered independently of
|
||
* whatever else (e.g. select2's inline search box) shares this container */
|
||
var label = $('<span class="select2-count-label">');
|
||
|
||
if (selected.length == 0 || (allValue !== undefined && $.inArray(String(allValue), selected) > -1)) {
|
||
label.text(allText);
|
||
} else {
|
||
label.text(selected.length + ' ' + countText);
|
||
}
|
||
|
||
rendered.empty().append(label);
|
||
}
|
||
|
||
$select.on('select2:select select2:unselect change', updateSelect2CountLabel);
|
||
|
||
updateSelect2CountLabel();
|
||
});
|
||
|
||
$('select.select2-multi-tags:not(.select2-hidden-accessible)').each(function() {
|
||
if ($(this).closest('.ui-dialog').length) {
|
||
var dropdownParent = $(this).closest('.ui-dialog');
|
||
|
||
$(this).select2({
|
||
tags: true,
|
||
dropdownParent: dropdownParent
|
||
});
|
||
} else {
|
||
$(this).select2({
|
||
tags: true
|
||
});
|
||
}
|
||
});
|
||
|
||
/* ajax-backed lookup select: replaces the legacy .drop-callback/makeCallbacks() autocomplete
|
||
* widget for filter fields opted into it (see form_callback()'s $class parameter) */
|
||
$('select.select2-callback:not(.select2-hidden-accessible)').each(function() {
|
||
var $select = $(this);
|
||
var action = $select.data('action');
|
||
var requestVars = $select.data('variables');
|
||
var changeFunc = $select.data('callback');
|
||
var noAny = $select.data('noany');
|
||
var noNone = $select.data('nonone');
|
||
|
||
var options = {
|
||
dropdownParent: $select.closest('.ui-dialog').length ? $select.closest('.ui-dialog') : document.body,
|
||
minimumInputLength: 0,
|
||
ajax: {
|
||
type: 'post',
|
||
dataType: 'json',
|
||
delay: 250,
|
||
cache: false,
|
||
url: function(params) {
|
||
var url = pageName + '?action=' + encodeURIComponent(action);
|
||
|
||
if (requestVars) {
|
||
$.each(requestVars.split(','), function(index, field) {
|
||
if ($('#' + field).length) {
|
||
url += '&' + encodeURIComponent(field) + '=' + encodeURIComponent($('#' + field).val());
|
||
}
|
||
});
|
||
}
|
||
|
||
if (noAny == 1 || noAny === '1') {
|
||
url += '&noany=1';
|
||
}
|
||
|
||
if (noNone == 1 || noNone === '1') {
|
||
url += '&nonone=1';
|
||
}
|
||
|
||
if (params.term !== undefined && params.term != '') {
|
||
url += '&term=' + encodeURIComponent(params.term);
|
||
}
|
||
|
||
return url + '&page=' + encodeURIComponent(params.page || 1);
|
||
},
|
||
data: function() {
|
||
/* these callback actions are regular POST endpoints guarded by the
|
||
* same CSRF check as any other form submission */
|
||
return { __csrf_magic: csrfMagicToken };
|
||
},
|
||
processResults: function(data) {
|
||
return {
|
||
results: $.map(data, function(item) {
|
||
return { id: item.id, text: item.label };
|
||
})
|
||
};
|
||
}
|
||
}
|
||
};
|
||
|
||
$select.select2(options);
|
||
|
||
if (changeFunc) {
|
||
/* namespaced + unbound-before-rebound: applySkin() destroys/recreates this
|
||
* select2 widget on every AJAX filter reload, but that destroy doesn't remove
|
||
* a plain jQuery listener bound to the underlying <select> itself, so without
|
||
* this the handler would accumulate and fire the callback multiple times */
|
||
$select.off('select2:select.select2Callback').on('select2:select.select2Callback', function() {
|
||
executeFunctionByName(changeFunc.replace('(', '').replace(')', ''), window);
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
function checkPassword(url) {
|
||
var options = {
|
||
url: url,
|
||
handle: false,
|
||
funcEnd: 'checkPasswordFinalize'
|
||
}
|
||
|
||
if ($('#password').val().length == 0) {
|
||
$('#pass').empty();
|
||
$('#passconfirm').empty();
|
||
} else if ($('#password').val().length < passwordMinChars) {
|
||
checkPasswordFinalize(options, passwordTooShort);
|
||
} else {
|
||
var data = {
|
||
password: $('#password').val(),
|
||
password_confim: $('#password_confirm').val(),
|
||
__csrf_magic: csrfMagicToken
|
||
}
|
||
|
||
postUrl(options, data);
|
||
}
|
||
}
|
||
|
||
function checkPasswordFinalize(options, data) {
|
||
var className = 'fa-times badpassword';
|
||
if (data == 'ok') {
|
||
className = 'fa-check goodpassword';
|
||
data = passwordValid;
|
||
}
|
||
|
||
$('#pass').replaceWith('<div id="pass" style="float:left" class="fa ' + className + '" title="' + data + '"></div>');
|
||
$('#password').tooltip();
|
||
checkPasswordConfirm();
|
||
}
|
||
|
||
function checkPasswordConfirm() {
|
||
if ($('#password_confirm').val().length > 0) {
|
||
if ($('#password').val() != $('#password_confirm').val()) {
|
||
$('#passconfirm').replaceWith('<div id="passconfirm" style="float:left" class="badpassword ti ti-x" title="' + passwordNotMatch + '"></div>');
|
||
} else {
|
||
$('#passconfirm').replaceWith('<div id="passconfirm" style="float:left" class="goodpassword ti ti-check" title="' + passwordMatch + '"></div>');
|
||
}
|
||
} else {
|
||
$('#passconfirm').empty();
|
||
}
|
||
}
|
||
|
||
function renderLanguages() {
|
||
if ($('select#user_language').selectmenu('instance') !== undefined) {
|
||
$('select#user_language').selectmenu('destroy');
|
||
}
|
||
$('select#user_language').languageselect({
|
||
width: '220',
|
||
change: function () {
|
||
var name = $(this).attr('id');
|
||
var value = $(this).val();
|
||
var page = basename(location.pathname);
|
||
if (page == 'auth_profile.php') {
|
||
postUrl({
|
||
url: 'auth_profile.php?tab=' + currentTab + '&action=update_data',
|
||
redirect: 'auth_profile.php'
|
||
}, {
|
||
__csrf_magic: csrfMagicToken,
|
||
name: name,
|
||
value: value,
|
||
});
|
||
}
|
||
}
|
||
}).languageselect('menuWidget').addClass('ui-menu-icons customicons');
|
||
|
||
if ($('select#i18n_default_language').selectmenu('instance') !== undefined) {
|
||
$('select#i18n_default_language').selectmenu('destroy');
|
||
}
|
||
|
||
$('select#i18n_default_language').languageselect({
|
||
width: '220'
|
||
}).languageselect('menuWidget').addClass('ui-menu-icons customicons');
|
||
|
||
$('#user_language-menu').css('max-height', '200px');
|
||
$('#i18n_default_language-menu').css('max-height', '200px');
|
||
}
|
||
|
||
function setupButtonStyle() {
|
||
if ($('input#submit').length) {
|
||
$('input#submit').addClass('ui-state-active');
|
||
} else if ($('input#return').length) {
|
||
$('input#return').addClass('ui-state-active');
|
||
}
|
||
|
||
if ($('input#refresh').length) {
|
||
$('input#refresh').addClass('ui-state-active');
|
||
}
|
||
|
||
if ($('input#go').length) {
|
||
$('input#go').addClass('ui-state-active');
|
||
}
|
||
}
|
||
|
||
function raiseMessage(title, header, detail, level) {
|
||
var origErrorReasonTitle = errorReasonTitle;
|
||
var origErrorOnPage = errorOnPage;
|
||
var origMixedReasonTitle = mixedReasonTitle;
|
||
var origMixedOnPage = mixedOnPage;
|
||
var origSessionMessageTitle = sessionMessageTitle;
|
||
var origSessionMessageSave = sessionMessageSave;
|
||
var origSessionMessage = sessionMessage;
|
||
|
||
sessionMessage.message = detail;
|
||
sessionMessage.level = level;
|
||
|
||
if (level == MESSAGE_LEVEL_ERROR) {
|
||
errorReasonTitle = title;
|
||
errorOnPage = header;
|
||
} else if (level == MESSAGE_LEVEL_MIXED) {
|
||
mixedOnPage = header;
|
||
mixedReasonTitle = title;
|
||
} else {
|
||
sessionMessageTitle = title;
|
||
sessionMessageSave = header;
|
||
}
|
||
|
||
sessionMessageDisplay();
|
||
|
||
if (level == MESSAGE_LEVEL_ERROR) {
|
||
errorReasonTitle = origErrorReasonTitle;
|
||
errorOnPage = origErrorOnPage;
|
||
} else if (level == MESSAGE_LEVEL_MIXED) {
|
||
mixedOnPage = origMixedOnPage;
|
||
mixedReasonTitle = origMixedReasonTitle;
|
||
} else {
|
||
sessionMessageTitle = origSessionMessageTitle;
|
||
sessionMessageSave = origSessionMessageSave;
|
||
}
|
||
|
||
sessionMessage = origSessionMessage;
|
||
}
|
||
|
||
function sessionNoticesDisplay() {
|
||
if (typeof sessionNotices !== 'undefined' && Array.isArray(sessionNotices) && sessionNotices.length > 0) {
|
||
var currentNotices = sessionNotices;
|
||
sessionNotices = {};
|
||
|
||
currentNotices.forEach(function (notice, index) {
|
||
var level = MESSAGE_LEVEL_NONE;
|
||
var message = 'No message';
|
||
var title = '';
|
||
var id = '';
|
||
|
||
if (typeof notice.message !== 'undefined') {
|
||
message = notice.message;
|
||
}
|
||
|
||
if (typeof notice.title !== 'undefined') {
|
||
titLe = notice.tite;
|
||
}
|
||
|
||
if (typeof notice.level !== 'undefined') {
|
||
level = notice.level;
|
||
}
|
||
|
||
if (typeof notice.id !== 'undefined') {
|
||
id = '-' + notice.id;
|
||
}
|
||
|
||
switch (notice.level) {
|
||
case MESSAGE_LEVEL_CSRF:
|
||
location.reload();
|
||
|
||
break;
|
||
case MESSAGE_LEVEL_INFO:
|
||
PopupNotice(message, title);
|
||
|
||
break;
|
||
case MESSAGE_LEVEL_MIXED:
|
||
PopupUnknown(message, title);
|
||
|
||
break;
|
||
case MESSAGE_LEVEL_ERROR:
|
||
PopupError(message, title);
|
||
|
||
break;
|
||
case MESSAGE_LEVEL_WARN:
|
||
PopupWarning(message, title);
|
||
|
||
break;
|
||
|
||
default:
|
||
console.log('');
|
||
console.log('noticeDisplay(' + index + id + ') - Failed to find correct popup function for level ' + level + ': ' + message);
|
||
console.log('');
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
function sessionMessageDisplay() {
|
||
var title = '';
|
||
var header = '';
|
||
|
||
if (typeof sessionMessageTimer == 'function' || sessionMessageTimer !== null) {
|
||
clearInterval(sessionMessageTimer);
|
||
}
|
||
|
||
if (sessionMessage == null) {
|
||
return;
|
||
}
|
||
|
||
if (typeof sessionMessage.level != 'undefined') {
|
||
if (sessionMessage.level == MESSAGE_LEVEL_ERROR) {
|
||
title = errorReasonTitle;
|
||
header = errorOnPage;
|
||
var sessionMessageButtons = {
|
||
'Ok': {
|
||
text: sessionMessageOk,
|
||
id: 'btnSessionMessageOk',
|
||
click: function () {
|
||
$(this).dialog('close');
|
||
}
|
||
}
|
||
};
|
||
|
||
sessionMessageOpen = {};
|
||
} else if (sessionMessage.level == MESSAGE_LEVEL_MIXED) {
|
||
title = mixedReasonTitle;
|
||
header = mixedOnPage;
|
||
var sessionMessageButtons = {
|
||
'Ok': {
|
||
text: sessionMessageOk,
|
||
id: 'btnSessionMessageOk',
|
||
click: function () {
|
||
$(this).dialog('close');
|
||
}
|
||
}
|
||
};
|
||
|
||
sessionMessageOpen = {};
|
||
} else if (sessionMessage.level == MESSAGE_LEVEL_CSRF) {
|
||
location.reload();
|
||
return false;
|
||
} else {
|
||
title = sessionMessageTitle;
|
||
header = sessionMessageSave;
|
||
var sessionMessageButtons = {
|
||
'Pause': {
|
||
text: sessionMessagePause,
|
||
id: 'btnSessionMessagePause',
|
||
click: function () {
|
||
if (sessionMessageTimer != null) {
|
||
clearInterval(sessionMessageTimer);
|
||
sessionMessageTimer = null;
|
||
}
|
||
$('#btnSessionMessagePause').remove();
|
||
$('#btnSessionMessageOk').html('<span class="ui-button-text">' + sessionMessageOk + '</span>');
|
||
}
|
||
},
|
||
'Ok': {
|
||
text: sessionMessageOk,
|
||
id: 'btnSessionMessageOk',
|
||
click: function () {
|
||
$(this).dialog('close');
|
||
$('#messageContainer').remove();
|
||
clearInterval(sessionMessageTimer);
|
||
}
|
||
}
|
||
};
|
||
|
||
sessionMessageOpen = function () {
|
||
sessionMessageCountdown(5000);
|
||
}
|
||
}
|
||
|
||
var returnStr = '<div id="messageContainer" style="display:none">' +
|
||
'<h4>' + header + '</h4>' +
|
||
'<p style="display:table-cell;overflow:auto"> ' + sessionMessage.message + '</p>' +
|
||
'</div>';
|
||
|
||
$('#messageContainer').remove();
|
||
$('body').append(returnStr);
|
||
|
||
var messageWidth = $(window).width();
|
||
if (messageWidth > 600) {
|
||
messageWidth = 600;
|
||
} else {
|
||
messageWidth -= 50;
|
||
}
|
||
|
||
$('#messageContainer').dialog({
|
||
open: sessionMessageOpen,
|
||
draggable: true,
|
||
resizable: false,
|
||
height: 'auto',
|
||
minWidth: messageWidth,
|
||
maxWidth: 800,
|
||
maxHeight: 600,
|
||
title: title,
|
||
buttons: sessionMessageButtons
|
||
});
|
||
|
||
sessionMessage = null;
|
||
}
|
||
}
|
||
|
||
function sessionMessageCountdown(time) {
|
||
var sessionMessageTimeLeft = (time / 1000);
|
||
|
||
$('#btnSessionMessageOk').html('<span class="ui-button-text">' + sessionMessageOk + ' (' + sessionMessageTimeLeft + ')</span>');
|
||
|
||
sessionMessageTimer = setInterval(function () {
|
||
sessionMessageTimeLeft--;
|
||
|
||
$('#btnSessionMessageOk').html('<span class="ui-button-text">' + sessionMessageOk + ' (' + sessionMessageTimeLeft + ')</span>');
|
||
|
||
if (sessionMessageTimeLeft <= 0) {
|
||
clearInterval(sessionMessageTimer);
|
||
$('#messageContainer').dialog('close');
|
||
$('#messageContainer').remove();
|
||
}
|
||
}, 1000);
|
||
}
|
||
|
||
function markFilterTDs(child, filterNum) {
|
||
trNum = 0;
|
||
|
||
$('#' + child).find('tr').each(function () {
|
||
tdNum = 0;
|
||
$(this).find('td').each(function () {
|
||
$(this).attr('id', 'fn' + filterNum + 'tr' + trNum + 'td' + tdNum);
|
||
tdNum++;
|
||
});
|
||
trNum++;
|
||
});
|
||
}
|
||
|
||
function finalizeAuthProfileData(options, data) {
|
||
if (hScroll) {
|
||
$('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'visible' });
|
||
$('#overflow').removeClass('ti-arrows-diagonal').addClass('ti-arrows-diagonal-minimize-2');
|
||
|
||
resetTables();
|
||
} else {
|
||
$('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'hidden' });
|
||
$('#overflow').removeClass('ti-arrows-diagonal-minimize-2').addClass('ti-arrows-diagonal');
|
||
|
||
tuneTables();
|
||
}
|
||
}
|
||
|
||
function makeFiltersResponsive() {
|
||
var storage = Storages.sessionStorage;
|
||
|
||
var filterNum = 0;
|
||
|
||
if ($('div.cactiTableButton').closest('.cactiTable').not('#dqdebug').find('.filterTable').length) {
|
||
$('div.cactiTableButton').closest('.cactiTable').not('#dqdebug').each(function () {
|
||
if ($(this).find('.filterTable').length) {
|
||
filterHeader = $(this).closest('.cactiTable');
|
||
id = filterHeader.attr('id');
|
||
child = id + '_child';
|
||
filterContents = $('#' + child);
|
||
|
||
if (pageHasHidableColumnsAndProfile()) {
|
||
if (filterHeader.find('.cactiSwitchConstraints').length == 0) {
|
||
if (hScroll) {
|
||
$('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'visible' });
|
||
filterHeader.find('div.cactiTableButton').append('<span class="cactiSwitchConstraintWrapper"><a title="' + tableConstraints + '" class="linkOverDark cactiSwitchConstraints" href="#"><i id="overflow" class="ti ti-arrows-diagonal-minimize-2"></i></a></span>');
|
||
} else {
|
||
$('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'hidden' });
|
||
filterHeader.find('div.cactiTableButton').append('<span class="cactiSwitchConstraintWrapper"><a title="' + tableConstraints + '" class="linkOverDark cactiSwitchConstraints" href="#"><i id="overflow" class="ti ti-arrows-diagonal"></i></a></span>');
|
||
}
|
||
|
||
$('.cactiSwitchConstraints').off('click').on('click', function (event) {
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
|
||
hScroll = !hScroll;
|
||
|
||
postUrl({
|
||
url: urlPath + 'auth_profile.php?tab=general&action=update_data',
|
||
handle: false,
|
||
noState: true,
|
||
funcEnd: 'finalizeAuthProfileData'
|
||
}, {
|
||
__csrf_magic: csrfMagicToken,
|
||
name: 'enable_hscroll',
|
||
value: hScroll ? 'on' : ''
|
||
});
|
||
});
|
||
}
|
||
}
|
||
|
||
if (filterContents.find('#export').length) {
|
||
title = $('#export').attr('title');
|
||
filterHeader.find('div.cactiTableButton').append($('<span style="display:none;" class="cactiFilterExport"><i class="ti ti-chevron-down"></i></span>').attr('title', title));
|
||
|
||
$('.cactiFilterExport').off('click').on('click', function (event) {
|
||
event.stopPropagation();
|
||
$('#export').trigger('click');
|
||
}).tooltip();
|
||
}
|
||
|
||
if (filterContents.find('#import').length) {
|
||
title = $('#import').attr('title');
|
||
filterHeader.find('div.cactiTableButton').append($('<span style="display:none;" class="cactiFilterImport"><i class="ti ti-chevron-up"></i></span>').attr('title', title));
|
||
|
||
$('.cactiFilterImport').off('click').on('click', function (event) {
|
||
event.stopPropagation();
|
||
$('#import').trigger('click');
|
||
}).tooltip();
|
||
}
|
||
|
||
if (filterContents.find('#clear').length) {
|
||
if (filterHeader.find('.cactiFilterClear').length == 0) {
|
||
filterHeader.find('div.cactiTableButton').append('<span title="' + clearFilterTitle + '" style="display:none;" class="cactiFilterClear"><i class="ti ti-trash"></i></span>');
|
||
}
|
||
|
||
$('.cactiFilterClear').off('click').on('click', function(event) {
|
||
event.stopPropagation();
|
||
$('#clear').trigger('click');
|
||
}).tooltip();
|
||
}
|
||
|
||
toggleFilterAndIcon(id, child, true);
|
||
|
||
if (storage.isSet('filterVisibility')) {
|
||
state = storage.get('filterVisibility');
|
||
} else {
|
||
state = 'visible';
|
||
}
|
||
|
||
if (state == 'hidden') {
|
||
if (filterHeader.find('.cactiFilterState').length == 0) {
|
||
filterHeader.find('div.cactiTableButton').append('<a class="cactiFilterState" href="#"><i class="ti ti-chevrons-down"></i></a>');
|
||
} else {
|
||
filterHeader.find('div.cactiTableButton').find('.cactiFilterState').removeClass('fa-angle-double-up').addClass('fa-angle-double-down');
|
||
}
|
||
} else {
|
||
if (filterHeader.find('.cactiFilterState').length == 0) {
|
||
filterHeader.find('div.cactiTableButton').append('<a class="cactiFilterState" href="#"><i class="ti ti-chevrons-up"></i></a>');
|
||
} else {
|
||
filterHeader.find('div.cactiTableButton').find('.cactiFilterState').removeClass('fa-angle-double-down').addClass('fa-angle-double-up');
|
||
}
|
||
}
|
||
|
||
filterHeader.find('.cactiFilterState').off('click').on('click', function() {
|
||
id = $(this).closest('.cactiTable').attr('id');
|
||
child = id + '_child';
|
||
toggleFilterAndIcon(id, child, false);
|
||
});
|
||
|
||
if (typeof showHideFilter != 'undefined') {
|
||
$('.cactiFilterState').attr('title', showHideFilter).tooltip();
|
||
}
|
||
|
||
filterNum++;
|
||
}
|
||
});
|
||
} else if ($('#dqdebug').length) {
|
||
$('#dqdebug').find('div.cactiTableButton').each(function () {
|
||
if ($(this).find('a').length) {
|
||
anchors = $('div.cactiTableButton').find('a');
|
||
anchors.each(function () {
|
||
$(this).attr('title', $(this).text());
|
||
});
|
||
anchors.not('.cactiTableCopy').addClass('ti ti-trash');
|
||
anchors.filter('.cactiTableCopy').addClass('ti ti-copy');
|
||
anchors.tooltip().text('');
|
||
}
|
||
});
|
||
}
|
||
|
||
if ($('#form_graph_view').length) {
|
||
$('#form_graph_view').filter('input, select').not('#date1, #date2').on('click', function () {
|
||
closeDateFilters();
|
||
});
|
||
}
|
||
}
|
||
|
||
function toggleFilterAndIcon(id, child, initial) {
|
||
var storage = Storages.sessionStorage;
|
||
|
||
if (storage.isSet('filterVisibility')) {
|
||
state = storage.get('filterVisibility');
|
||
} else {
|
||
state = 'visible';
|
||
}
|
||
|
||
if (initial) {
|
||
if (state == 'hidden') {
|
||
$('#' + child).hide();
|
||
$('#' + id).find('.cactiFilterClear, .cactiFilterImport, .cactiFilterExport').show();
|
||
}
|
||
} else if ($('#' + child).is(':visible')) {
|
||
$('#' + child).hide();
|
||
$('#' + id).find('.cactiFilterClear, .cactiFilterImport, .cactiFilterExport').show();
|
||
$('.cactiFilterState').find('i').removeClass('ti-chevrons-up').addClass('ti-chevrons-down');
|
||
storage.set('filterVisibility', 'hidden');
|
||
} else {
|
||
$('#' + child).show();
|
||
$('#' + id).find('.cactiFilterClear, .cactiFilterImport, .cactiFilterExport').hide();
|
||
$('.cactiFilterState').find('i').removeClass('ti-chevrons-down').addClass('ti-chevrons-up');
|
||
storage.set('filterVisibility', 'visible');
|
||
}
|
||
|
||
$(window).trigger('resize');
|
||
}
|
||
|
||
function setGraphTabs() {
|
||
page = window.location.href;
|
||
|
||
if (page.indexOf('graph_view.php') >= 0) {
|
||
$('.lefttab').removeClass('selected');
|
||
$('#tab-graphs').addClass('selected');
|
||
|
||
if (page.indexOf('action=tree') > 0) {
|
||
$('#preview, #listview, #treeview').removeClass('selected').prop('aria-selected', false);
|
||
$('#treeview').addClass('selected').prop('aria-selected', true);
|
||
} else if (page.indexOf('action=list') > 0) {
|
||
$('#preview, #listview, #treeview').removeClass('selected').prop('aria-selected', false);
|
||
$('#listview').addClass('selected').prop('aria-selected', true);
|
||
} else if (page.indexOf('action=preview') > 0) {
|
||
$('#preview, #listview, #treeview').removeClass('selected').prop('aria-selected', false);
|
||
$('#preview').addClass('selected').prop('aria-selected', true);
|
||
}
|
||
}
|
||
}
|
||
|
||
function setupResponsiveMenuAndTabs() {
|
||
$('.maintabs a.lefttab, .dropdownMenu a, .menuoptions a, #gtabs a.righttab').not('[href^="http"], [href^="https"], [href^="#"], [target="_blank"]').off('click').on('click', function (event) {
|
||
if (!shouldCaptureClick(event)) {
|
||
return;
|
||
}
|
||
|
||
page = basename($(this).attr('href'));
|
||
|
||
if (page == 'logout.php' || page == 'auth_changepassword.php') {
|
||
return;
|
||
} else if (page == 'index.php' && $(this).attr('href').indexOf('login') > -1) {
|
||
return;
|
||
} else {
|
||
event.preventDefault();
|
||
}
|
||
|
||
if ((pageName != 'auth_profile.php') && (userMenuNavigationExists(page) || page == 'graph_view.php') && ($(this).hasClass('selected') || (pageName == page && pageName != 'graph_view.php') && pageName != 'link.php')) {
|
||
handleUserMenu(true);
|
||
} else {
|
||
var id = $(this).attr('id');
|
||
var href = $(this).attr('href');
|
||
|
||
loadTopTab(href, id, false);
|
||
}
|
||
});
|
||
|
||
$(window).on('orientationchange, fullscreenchange', function () {
|
||
responsiveUI('force');
|
||
});
|
||
}
|
||
|
||
function responsiveUI(event) {
|
||
var tree = false;
|
||
|
||
if (event != 'force') {
|
||
if (new Date() - resizeTime < resizeDelta) {
|
||
var myEvent = event;
|
||
setTimeout(function () {
|
||
responsiveUI(myEvent);
|
||
}, resizeDelta);
|
||
|
||
return false;
|
||
} else {
|
||
resizeTimeout = false;
|
||
}
|
||
}
|
||
|
||
if ($('.cactiTreeNavigationArea').length > 0) {
|
||
tree = true;
|
||
} else {
|
||
tree = false;
|
||
}
|
||
|
||
handleUserMenu(false);
|
||
|
||
var mainWidth = getMainWidth();
|
||
|
||
/* change textbox and textarea widths */
|
||
$('input[type="text"], textarea').each(function () {
|
||
if ($(this).attr('type') == 'text') {
|
||
var offset = 20;
|
||
} else {
|
||
var offset = 5;
|
||
}
|
||
|
||
if (mainWidth != 100) {
|
||
if ($(this).width() > mainWidth) {
|
||
$(this).css('max-width', (mainWidth - offset) + 'px');
|
||
} else {
|
||
$(this).css('max-width', '');
|
||
}
|
||
|
||
if ($(this).width() > mainWidth) {
|
||
$(this).css('max-width', (mainWidth - offset) + 'px');
|
||
}
|
||
|
||
if ($(this).parents('.formColumnRight').is(":visible") && $(this).width() > $(this).parents('.formColumnRight').prop('clientWidth')) {
|
||
$(this).css('max-width', ($(this).parents('.formColumnRight').prop('clientWidth')) + 'px');
|
||
} else {
|
||
$(this).css('max-width', '');
|
||
}
|
||
}
|
||
});
|
||
|
||
$('table.filterTable').each(function () {
|
||
tuneFilter($(this), mainWidth);
|
||
});
|
||
|
||
tuneTables();
|
||
}
|
||
|
||
function getMainWidth() {
|
||
// Subtract 15px for the scroll bar
|
||
if ($('#navigation').length && $('#navigation').is(':visible')) {
|
||
var mainWidth = $('body').outerWidth() - $('#navigation').width() - 15;
|
||
} else {
|
||
var mainWidth = $('body').outerWidth() - 15;
|
||
}
|
||
|
||
return mainWidth;
|
||
}
|
||
|
||
function getCactiHelp(cactiPage) {
|
||
var url = urlPath + 'help.php?page=' + cactiPage;
|
||
|
||
$.getJSON(url, function (data) {
|
||
if (data.status == 'Success') {
|
||
window.open(data.location, '_blank');
|
||
}
|
||
});
|
||
}
|
||
|
||
function responsiveResizeGraphs(initialize) {
|
||
var mainWidth = getMainWidth() - 30;
|
||
var myColumns = $('#columns').val();
|
||
var isThumb = $('#thumbnails').is(':checked') || $('#thumbnails').val() == 'true';
|
||
var isBusiness = $('#business_hours').is(':checked') || $('#business_hours').val() == 'true';
|
||
|
||
if ($('.tableRowGraph:first').length) {
|
||
var graphRow = $('.tableRowGraph:first').width();
|
||
} else {
|
||
var graphRow = 0;
|
||
}
|
||
|
||
if ($('.graphDrillDown:first').length) {
|
||
var drillDown = $('.graphDrillDown:first').outerWidth() + 15;
|
||
} else {
|
||
var drillDown = 0;
|
||
}
|
||
|
||
if (myColumns == null) {
|
||
myColumns = 1;
|
||
}
|
||
|
||
if (mainWidth < graphRow) {
|
||
graphRow = mainWidth - drillDown;
|
||
} else if (graphRow == 0) {
|
||
graphRow = mainWidth;
|
||
}
|
||
|
||
// Dont resize if nothing changed
|
||
if (typeof initialize == 'undefined' && (previousMainWidth == null || (previousMainWidth == mainWidth && previousColumns == myColumns))) {
|
||
previousMainWidth = mainWidth;
|
||
return true;
|
||
}
|
||
|
||
var myWidth = parseInt((graphRow - (drillDown * myColumns)) / myColumns);
|
||
|
||
$('.graphimage').each(function () {
|
||
var graph_id = $(this).attr('graph_id');
|
||
|
||
if (!(graph_id > 0)) {
|
||
graph_id = $(this).attr('id').replace('wrapper_', '');
|
||
graph_id = $(this).attr('id').replace('graph_', '');
|
||
}
|
||
|
||
var rra_id = $(this).attr('rra_id');
|
||
var type = $(this).attr('graph_type');
|
||
|
||
var original_cwidth = $('#wrapper_' + graph_id).attr('graph_width');
|
||
var original_cheight = $('#wrapper_' + graph_id).attr('graph_height');
|
||
|
||
/* original image attributes */
|
||
var image_width = $(this).attr('image_width');
|
||
var image_height = $(this).attr('image_height');
|
||
var canvas_top = $(this).attr('canvas_top');
|
||
var canvas_left = $(this).attr('canvas_left');
|
||
var canvas_width = $(this).attr('canvas_width');
|
||
var canvas_height = $(this).attr('canvas_height');
|
||
|
||
var remove_whcss = false;
|
||
var ratio = myWidth / image_width;
|
||
|
||
/* optimize display and set correct ratio if image is full size */
|
||
if (image_width * original_cwidth / canvas_width < myWidth) {
|
||
remove_whcss = true;
|
||
ratio = original_cwidth / canvas_width;
|
||
}
|
||
|
||
// Dont change the size if the differential is small
|
||
if (ratio > .97 && ratio < 1.03) {
|
||
ratio = 1;
|
||
}
|
||
|
||
var new_image_width = parseInt(image_width * ratio)
|
||
var new_image_height = parseInt(image_height * ratio)
|
||
var new_canvas_width = parseInt(canvas_width * ratio);
|
||
var new_canvas_height = parseInt(canvas_height * ratio);
|
||
var new_canvas_graph_top = parseInt(canvas_top * ratio);
|
||
var new_canvas_graph_left = parseInt(canvas_left * ratio);
|
||
|
||
$(this).attr('graph_width', new_canvas_width);
|
||
$(this).attr('graph_height', new_canvas_height);
|
||
$(this).attr('graph_top', new_canvas_graph_top);
|
||
$(this).attr('graph_left', new_canvas_graph_left);
|
||
|
||
if (!remove_whcss || type == 'svg+xml') {
|
||
$(this).css('width', new_image_width);
|
||
$(this).css('height', new_image_height);
|
||
} else {
|
||
$(this).css('width', '');
|
||
$(this).css('height', '');
|
||
$(this).removeAttr('width');
|
||
$(this).removeAttr('height');
|
||
}
|
||
});
|
||
|
||
previousMainWidth = mainWidth;
|
||
previousColumns = myColumns;
|
||
|
||
if ($('.cactiTreeNavigationArea').length) {
|
||
resizeTreePanel();
|
||
}
|
||
}
|
||
|
||
function resizeTreePanel() {
|
||
var docHeight = $(window).outerHeight();
|
||
var navWidth = $('.cactiTreeNavigationArea').width();
|
||
var searchHeight = $('.cactiTreeSearch').outerHeight();
|
||
var pageHeadHeight = $('.cactiPageHead').outerHeight();
|
||
var breadCrHeight = $('.breadCrumbBar').outerHeight();
|
||
var pageBottomHeight = $('.cactiPageBottom').outerHeight();
|
||
//console.log('----------------------');
|
||
|
||
var jsTreeHeight = Math.max.apply(Math, $('#jstree').children(':visible').map(function () {
|
||
return $(this).outerHeight();
|
||
}).get());
|
||
|
||
var treeAreaHeight = docHeight - pageHeadHeight - breadCrHeight - searchHeight - pageBottomHeight;
|
||
//console.log('docHeight:' + docHeight);
|
||
//console.log('searchHeight:' + searchHeight);
|
||
//console.log('pageHeadHeight:' + pageHeadHeight);
|
||
//console.log('pageBottomHeight:' + pageBottomHeight);
|
||
//console.log('breadCrHeight:' + breadCrHeight);
|
||
//console.log('jsTreeHeight:' + jsTreeHeight);
|
||
//console.log('treeAreaHeight:' + treeAreaHeight);
|
||
|
||
$('#jstree').height(jsTreeHeight + 30);
|
||
$('.cactiTreeNavigationArea').height(treeAreaHeight + searchHeight);
|
||
|
||
var treeLeft = $('#jstree').offset().left;
|
||
var visWidth = Math.max.apply(Math, $('#jstree').find('.jstree-anchor:visible').map(function () {
|
||
return this.getBoundingClientRect().right - treeLeft;
|
||
}).get());
|
||
|
||
if (visWidth < 0) {
|
||
$('.cactiTreeNavigationArea').css('width', 0);
|
||
$('.cactiGraphContentArea').css('margin-left', 0);
|
||
$('.cactiTreeNavigationArea').css('overflow-x', '');
|
||
} else if (visWidth < minTreeWidth) {
|
||
$('.cactiTreeNavigationArea').css('width', minTreeWidth);
|
||
$('.cactiGraphContentArea').css('margin-left', minTreeWidth + 5);
|
||
$('.cactiTreeNavigationArea').css('overflow-x', '');
|
||
} else if (visWidth > maxTreeWidth) {
|
||
$('.cactiTreeNavigationArea').css('width', maxTreeWidth);
|
||
$('.cactiGraphContentArea').css('margin-left', maxTreeWidth + 5);
|
||
$('.cactiTreeNavigationArea').css('overflow-x', 'auto');
|
||
} else if (visWidth > navWidth) {
|
||
$('.cactiTreeNavigationArea').css('width', visWidth);
|
||
$('.cactiGraphContentArea').css('margin-left', visWidth + 5);
|
||
$('.cactiTreeNavigationArea').css('overflow-x', 'auto');
|
||
} else {
|
||
$('.cactiTreeNavigationArea').css('width', visWidth);
|
||
$('.cactiGraphContentArea').css('margin-left', visWidth + 5);
|
||
$('.cactiTreeNavigationArea').css('overflow-x', '');
|
||
}
|
||
|
||
var navWidth = $('#navigation').width();
|
||
$('#searcher').css('width', getTreeSearchWidth(navWidth));
|
||
}
|
||
|
||
function getTreeSearchWidth(navWidth) {
|
||
return Math.max(navWidth - 70, 40);
|
||
}
|
||
|
||
function countHiddenCols(object) {
|
||
var hidden = 0;
|
||
|
||
$(object).find('th').each(function () {
|
||
if ($(this).css('display') == 'none') {
|
||
hidden++;
|
||
}
|
||
});
|
||
|
||
return hidden;
|
||
}
|
||
|
||
function tuneTables() {
|
||
var mainWidth = getMainWidth();
|
||
|
||
$('.cactiTable').each(function () {
|
||
$(this).find('th:first-child').each(function () {
|
||
var object = $(this).closest('.cactiTable');
|
||
|
||
tuneTable(object, mainWidth);
|
||
});
|
||
});
|
||
}
|
||
|
||
function pageHasHidableColumnsAndProfile() {
|
||
if (typeof userSettings != 'undefined' && userSettings && $(document).find('th').length) {
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
function resetTables() {
|
||
$('.cactiTable').each(function () {
|
||
$(this).find('th:first-child').each(function () {
|
||
var object = $(this).closest('.cactiTable');
|
||
|
||
resetTable(object);
|
||
});
|
||
});
|
||
}
|
||
|
||
function resetTable(object) {
|
||
var id = $(object).attr('id');
|
||
var column = 1;
|
||
$(object).find('th').each(function () {
|
||
$('#' + id + ' th:nth-child(' + column + ')').show();
|
||
$('#' + id + ' td:nth-child(' + column + ')').show();
|
||
column++;
|
||
});
|
||
}
|
||
|
||
function tuneTable(object, width) {
|
||
var rows = $(object).find('tr').length;
|
||
var width = width;
|
||
var tableWidth = $(object).width();
|
||
var totalCols = $(object).find('th').length;
|
||
var reducedWidth = 0;
|
||
var columnsHidden = countHiddenCols(object);
|
||
var visibleColumns = totalCols - columnsHidden;
|
||
var id = $(object).attr('id');
|
||
|
||
if (rows > 101) return false;
|
||
|
||
// Enable horizontal scroll bar
|
||
if (hScroll) {
|
||
$('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'visible' });
|
||
|
||
return false;
|
||
} else {
|
||
$('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'hidden' });
|
||
}
|
||
|
||
// We have to both show and hide columns that fit.
|
||
// So, always find the size of the page columns.
|
||
var calculatedColumns = [];
|
||
var calculatedWidth = 0;
|
||
var allSeenWidth = 0;
|
||
var calculatedPadding = 15;
|
||
var tableChanged = false;
|
||
var stopExpand = false;
|
||
var debug = false;
|
||
|
||
var tableHeaders = $(object).find('th');
|
||
var tableCheckBox = $(tableHeaders).each(function () {
|
||
if ($(this).index() == tableHeaders.length) {
|
||
calculatedColumns.addClass('noHide');
|
||
}
|
||
});
|
||
|
||
// Traverse the table and look for columns to hide from left to right
|
||
$($(object).find('th').get()).each(function () {
|
||
var isLastCheckBox = $(this).hasClass('tableSubHeaderCheckbox') && $(this).index() == tableHeaders.length - 1;
|
||
var columnWidth = $.textMetrics(this).width;
|
||
|
||
// Get the width of columns that can not be hidden
|
||
if ($(this).hasClass('noHide') || isLastCheckBox) {
|
||
calculatedColumns.push($(this).index());
|
||
calculatedWidth += columnWidth + calculatedPadding;
|
||
}
|
||
|
||
if ($(this).is(':visible')) {
|
||
allSeenWidth += columnWidth + calculatedPadding;
|
||
}
|
||
});
|
||
|
||
if (debug) {
|
||
console.log(
|
||
'allSeenWidth:' + Math.round(allSeenWidth, 1) +
|
||
', calulatedWidth:' + Math.round(calculatedWidth, 1) +
|
||
', tableWidth:' + Math.round(tableWidth, 1) +
|
||
', width:' + Math.round(width, 1)
|
||
);
|
||
}
|
||
|
||
if (width < tableWidth) {
|
||
$($(object).find('th').get()).each(function () {
|
||
// Now traverse the available columns for hiding
|
||
// and See which need to be hidden
|
||
if (!calculatedColumns.includes($(this).index())) {
|
||
var columnWidth = $.textMetrics(this).width + calculatedPadding;
|
||
var name = $(this).find('div.sortinfo').attr('sort-column');
|
||
|
||
if (debug) {
|
||
console.log(
|
||
'ColIndex:' + $(this).index() +
|
||
', ColWidth:' + Math.round(columnWidth, 1) +
|
||
', TotalWidth:' + Math.round(calculatedWidth, 1) +
|
||
', PageWidth:' + Math.round(width, 1)
|
||
);
|
||
}
|
||
|
||
if (width < calculatedWidth) {
|
||
$(this).hide();
|
||
tableChanged = true;
|
||
} else {
|
||
calculatedColumns.push($(this).index());
|
||
calculatedWidth += columnWidth + calculatedPadding;
|
||
}
|
||
}
|
||
});
|
||
|
||
if (tableChanged) {
|
||
$($(object).find('td').each(function () {
|
||
if (!calculatedColumns.includes($(this).index())) {
|
||
$(this).hide();
|
||
}
|
||
}));
|
||
}
|
||
}
|
||
|
||
tableChanged = false;
|
||
|
||
if (allSeenWidth < width) {
|
||
calculatedColumns = calculatedColumns.sort();
|
||
|
||
// Since we can show hidden columns now, let's go
|
||
// in reverse until we run out of space
|
||
$($(object).find('th').get()).each(function () {
|
||
if (!calculatedColumns.includes($(this).index())) {
|
||
if ($(this).is(':hidden') && stopExpand == false) {
|
||
var columnWidth = $.textMetrics(this).width + calculatedPadding;
|
||
var name = $(this).find('div.sortinfo').attr('sort-column');
|
||
|
||
if (allSeenWidth + columnWidth < tableWidth) {
|
||
$(this).show();
|
||
|
||
var newTableWidth = $(object).width();
|
||
|
||
if (debug) {
|
||
console.log(
|
||
'Reverse ColIndex:' + $(this).index() +
|
||
', columnWidth:' + Math.round(columnWidth, 1) +
|
||
', allSeenWidth:' + Math.round(allSeenWidth, 1) +
|
||
', width:' + Math.round(width, 1) +
|
||
', newTableWidth:' + Math.round(newTableWidth, 1)
|
||
);
|
||
}
|
||
|
||
if (newTableWidth > width) {
|
||
$(this).hide();
|
||
stopExpand = true;
|
||
} else {
|
||
calculatedColumns.push($(this).index());
|
||
tableChanged = true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
if (tableChanged) {
|
||
$($(object).find('td').each(function () {
|
||
if (calculatedColumns.includes($(this).index())) {
|
||
$(this).show();
|
||
}
|
||
}));
|
||
}
|
||
}
|
||
}
|
||
|
||
function tuneFilter(object, width) {
|
||
if ($(object).find('#timespan').length && $(object).find('#timespan').is(':visible')) {
|
||
var timespan = true;
|
||
|
||
var timeShiftWidth = $(object).find('.shiftArrow').closest('td').width();
|
||
var dateWidth = $(object).find('#date1').closest('td').width() + $(object).find('#date1').closest('td').prev('td').width();
|
||
var clearWidth = $('#tsclear').width();
|
||
var refreshWidth = $('#tsrefresh').width();
|
||
} else {
|
||
var timespan = false;
|
||
|
||
var clearWidth = $(object).find('#clear').width();
|
||
var saveWidth = $(object).find('#save').width();
|
||
var exportWidth = $(object).find('#export').width();
|
||
var importWidth = $(object).find('#import').width();
|
||
}
|
||
|
||
var minTds = 2;
|
||
var visTds = $(object).find('td:visible').length;
|
||
|
||
if ($(object).find('input[type="button"]').length) {
|
||
minTds++;
|
||
}
|
||
|
||
if ($(object).width() > width) {
|
||
if (!timespan) {
|
||
$($(object).find('td').get().reverse()).each(function () {
|
||
if ($(this).find('input[type="button"]').length == 0) {
|
||
if ($(this).is(':visible')) {
|
||
$(this).hide();
|
||
visTds--;
|
||
|
||
if ($(this).closest('td').prev().find('input, select').length == 0) {
|
||
$(this).closest('td').prev().hide();
|
||
visTds--;
|
||
}
|
||
}
|
||
|
||
if ($(object).width() < width) {
|
||
return false;
|
||
}
|
||
|
||
if (visTds <= minTds) {
|
||
return false;
|
||
}
|
||
}
|
||
});
|
||
|
||
if ($(object).width() > width) {
|
||
if (saveWidth > 0) {
|
||
$('#save').hide();
|
||
}
|
||
}
|
||
|
||
if ($(object).width() > width) {
|
||
if (exportWidth > 0) {
|
||
$('#export').hide();
|
||
}
|
||
}
|
||
|
||
if ($(object).width() > width) {
|
||
if (importWidth > 0) {
|
||
$('#import').hide();
|
||
}
|
||
}
|
||
|
||
if ($(object).width() > width) {
|
||
if (clearWidth > 0) {
|
||
$('#clear').hide();
|
||
}
|
||
}
|
||
} else {
|
||
$('#date1').closest('td').hide().prev('td').hide();
|
||
$('#date2').closest('td').hide().prev('td').hide();
|
||
|
||
if ($(object).width() > width) {
|
||
$('.shiftArrow').closest('td').hide();
|
||
}
|
||
|
||
if ($(object).width() > width) {
|
||
$('#tsclear').hide();
|
||
}
|
||
|
||
if ($(object).width() > width) {
|
||
$('#tsrefresh').hide();
|
||
}
|
||
}
|
||
} else {
|
||
if (!timespan) {
|
||
if ($(object).width() + clearWidth < width) {
|
||
$('#clear').show();
|
||
}
|
||
|
||
if ($(object).width() + importWidth < width) {
|
||
$('#import').show();
|
||
}
|
||
|
||
if ($(object).width() + exportWidth < width) {
|
||
$('#export').show();
|
||
}
|
||
|
||
if ($(object).width() + saveWidth < width) {
|
||
$('#save').show();
|
||
}
|
||
|
||
if ($(object).width() < width) {
|
||
$(object).find('td').each(function () {
|
||
if ($(this).find('input[type="button"]').length == 0) {
|
||
if (!$(this).is(':visible')) {
|
||
showWidth = $(this).width();
|
||
if ($(this).next('td').find('input, select').length > 0) {
|
||
showWidth += $(this).next('td').width();
|
||
}
|
||
|
||
if ($(object).width() + showWidth < width) {
|
||
$(this).show();
|
||
if ($(this).next('td').find('input, select').length > 0) {
|
||
$(this).next('td').show();
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
} else {
|
||
if ($(object).width() + refreshWidth < width) {
|
||
$('#tsrefresh').show();
|
||
}
|
||
|
||
if ($(object).width() + clearWidth < width) {
|
||
$('#tsclear').show();
|
||
}
|
||
|
||
if ($(object).width() + timeShiftWidth < width) {
|
||
$('.shiftArrow').closest('td').show();
|
||
}
|
||
|
||
if ($(object).width() + (2 * dateWidth) < width) {
|
||
$('#date1').closest('td').show().prev('td').show();
|
||
$('#date2').closest('td').show().prev('td').show();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
function handleUserMenu(toggle) {
|
||
var storage = Storages.sessionStorage;
|
||
|
||
var windowWidth = $(window).width();
|
||
|
||
/* set the navigation id is not set */
|
||
if (currentNavId == 'undefined' || currentNavId == null) {
|
||
currentNavId = 'menu:' + $('.lefttab.selected').attr('id');
|
||
}
|
||
|
||
/* check if the tab is selected */
|
||
var checkNav = currentNavId.replace('menu:', '');
|
||
|
||
if (!$('#'+checkNav).hasClass('selected')) {
|
||
$('#'+checkNav).addClass('selected');
|
||
}
|
||
|
||
if (toggle) {
|
||
if (currentNavState == 'visible') {
|
||
currentNavState = 'hidden';
|
||
} else {
|
||
currentNavState = 'visible';
|
||
}
|
||
} else if (currentNavState == null) {
|
||
currentNavState = 'visible';
|
||
}
|
||
|
||
storage.set(currentNavId, currentNavState);
|
||
|
||
if ($('#navigation').length) {
|
||
if (currentNavState == 'hidden') {
|
||
menuHide(true);
|
||
} else if (currentNavState == 'visible') {
|
||
menuShow();
|
||
}
|
||
}
|
||
}
|
||
|
||
function menuHide(store) {
|
||
var myClass = '';
|
||
var curMargin = parseInt($('#navigation_right').css('margin-left'));
|
||
|
||
if ($('.cactiTreeNavigationArea').length) {
|
||
myClass = '.cactiTreeNavigationArea';
|
||
|
||
if (curMargin > 0) {
|
||
marginLeftTree = curMargin;
|
||
$('.cactiTreeNavigationArea').css('width', curMargin);
|
||
}
|
||
} else if ($('.cactiConsoleNavigationArea').length) {
|
||
myClass = '.cactiConsoleNavigationArea';
|
||
|
||
if (curMargin > 0) {
|
||
marginLeftConsole = curMargin;
|
||
}
|
||
}
|
||
|
||
$('#navigation_right').animate({ 'margin-left': '0px' }, 20);
|
||
|
||
if (myClass != '') {
|
||
$(myClass).hide('slide', { direction: 'left' }, 20, function () {
|
||
responsiveResizeGraphs();
|
||
});
|
||
}
|
||
|
||
$('#navigation').hide();
|
||
|
||
if (myClass == '.cactiTreeNavigationArea' || pageName == 'graph_view.php') {
|
||
responsiveResizeGraphs();
|
||
}
|
||
}
|
||
|
||
function menuShow() {
|
||
var myClass = '';
|
||
|
||
if (!userMenuNavigationExists(pageName)) {
|
||
if (pageName != 'graph_view.php' && pageName != 'about.php') {
|
||
$('#navigation').hide();
|
||
return;
|
||
}
|
||
} else if ($('#menu').length > 0) {
|
||
marginLeftConsole = $('#navigation').width();
|
||
}
|
||
|
||
if ($('.cactiTreeNavigationArea').length) {
|
||
myClass = '.cactiTreeNavigationArea';
|
||
|
||
if (marginLeftTree == null) {
|
||
marginLeftTree = minTreeWidth;
|
||
}
|
||
|
||
var treeWidth = $('.cactiTreeNavigationArea').width();
|
||
|
||
|
||
if (marginLeftTree > treeWidth) {
|
||
$('#navigation_right').animate({ 'margin-left': marginLeftTree }, 20);
|
||
$('.cactiTreeNavigationArea').css('width', marginLeftTree);
|
||
}
|
||
} else if ($('.cactiConsoleNavigationArea').length) {
|
||
myClass = '.cactiConsoleNavigationArea';
|
||
|
||
if (marginLeftConsole > 0) {
|
||
$('#navigation_right').animate({ 'margin-left': marginLeftConsole }, 20);
|
||
}
|
||
|
||
$('#navigation').show();
|
||
}
|
||
|
||
if (myClass != '') {
|
||
$(myClass).show('slide', { direction: 'left' }, 20, function () {
|
||
responsiveResizeGraphs();
|
||
});
|
||
}
|
||
|
||
$('#navigation').show();
|
||
}
|
||
|
||
function loadTopTab(href, id, force) {
|
||
var storage = Storages.sessionStorage;
|
||
|
||
/* used for debugging */
|
||
var stack = ''; //getStackTrace(); // new Error().stack;
|
||
var url = href;// + (href.indexOf('?') > 0 ? '&' : '?') + 'headercontent=true';
|
||
|
||
/* close all toasts */
|
||
$.toast().reset('all');
|
||
|
||
/**
|
||
* set the last visible lefttabs have a menu state,
|
||
* right tabs do not and are always visible.
|
||
*/
|
||
if (id !== undefined && id.startsWith('tab-')) {
|
||
currentNavId = 'menu:'+id;
|
||
currentNavState = storage.get(currentNavId);
|
||
|
||
if (currentNavState == null) {
|
||
currentNavState = 'visible';
|
||
}
|
||
} else {
|
||
currentNavState = 'visible';
|
||
}
|
||
|
||
return loadUrl({
|
||
url: url,
|
||
tabId: id,
|
||
force: force,
|
||
loadType: 'toptab',
|
||
funcStart: 'loadTopTabStart',
|
||
funcEnd: 'loadTopTabEnd',
|
||
elementId: 'cactiContent'
|
||
});
|
||
}
|
||
|
||
function loadTopTabStart(options) {
|
||
$('.submenuoptions').slideUp(120);
|
||
$('.menuoptions').slideUp(120);
|
||
|
||
if (options.url.indexOf('graph_view.php') >= 0) {
|
||
$('.cactiGraphHeaderBackground').show();
|
||
$('.cactiConsolePageHeadBackdrop').hide();
|
||
} else if (userMenuNavigationExists(options.url)) {
|
||
$('.cactiGraphHeaderBackground').hide();
|
||
$('.cactiConsolePageHeadBackdrop').show();
|
||
}
|
||
}
|
||
|
||
function loadTopTabEnd(options) {
|
||
if (options.pageName != '') {
|
||
if ($('#menu').find("a[href^='" + escapeString(options.url) + "']").length > 0) {
|
||
$('#menu').find('.pic').removeClass('selected');
|
||
$('#menu').find("a[href^='" + escapeString(options.url) + "']").addClass('selected');
|
||
} else if ($('#menu').find("a[href*='/" + pageName + "']").length > 0) {
|
||
$('#menu').find('.pic').removeClass('selected');
|
||
$('#menu').find("a[href*='/" + pageName + "']").addClass('selected');
|
||
}
|
||
}
|
||
|
||
if (options.tabId) {
|
||
var tabElementId = '#' + options.tabId;
|
||
var tabElement = $(tabElementId);
|
||
|
||
if (tabElement.hasClass('lefttab')) {
|
||
$('.lefttab').removeClass('selected');
|
||
$('.submenuoptions').find('.selected').removeClass('selected');
|
||
tabElement.addClass('selected');
|
||
|
||
var hideTabId = tabElementId.substring(0, tabElementId.length - 9);
|
||
|
||
if (hideTabId && hideTabId != '#') {
|
||
$(hideTabId).addClass('selected');
|
||
}
|
||
} else if (tabElement.parents('.submenuoptions').length > 0) {
|
||
tabElement.parents('.submenuoptions').find('.selected').removeClass('selected');
|
||
tabElement.addClass('selected');
|
||
}
|
||
}
|
||
|
||
handleUserMenu();
|
||
}
|
||
|
||
function userMenuNavigationExists(url) {
|
||
if (url == 'index.php' || basename(url) == 'index.php') {
|
||
return true;
|
||
} else {
|
||
var myFound = false;
|
||
|
||
$('#navigation').find('a').each(function () {
|
||
var checkUrl = basename($(this).attr('href'));
|
||
|
||
if (checkUrl == url || checkUrl == basename(url)) {
|
||
myFound = true;
|
||
|
||
return true;
|
||
}
|
||
});
|
||
|
||
return myFound;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
function loadPageUsingPost(href, postData, returnLocation) {
|
||
var stack = ''; //getStackTrace(); // new Error().stack;
|
||
console.error("Function loadPageUsingPost is now deprecated, use postUrl instead\n" + stack);
|
||
return postUrl({
|
||
url: href,
|
||
tabId: returnLocation,
|
||
type: 'loadPageUsingPost',
|
||
}, postData);
|
||
}
|
||
|
||
function setNavigationScroll() {
|
||
var object = '';
|
||
|
||
$('.cactiConsoleNavigationArea, .cactiTreeNavigationArea').off('mousemove').on('mousemove', function (pos) {
|
||
object = '';
|
||
|
||
if ($('.cactiConsoleNavigationArea').length) {
|
||
object = '.cactiConsoleNavigationArea';
|
||
} else if ($('.cactiTreeNavigationArea').length) {
|
||
object = '.cactiTreeNavigationArea';
|
||
}
|
||
|
||
if (object != '') {
|
||
var mpos = $(object).position();
|
||
var width = $(object).outerWidth();
|
||
var height = $(object).outerHeight();
|
||
if (pos.pageX < mpos.left ||
|
||
pos.pageY < mpos.top ||
|
||
pos.pageX > mpos.left + width - 1 ||
|
||
pos.pageY > mpos.top + height - 1) {
|
||
|
||
if (isHover) {
|
||
clearTimeout(hoverTimer);
|
||
hoverTimer = setTimeout(function () {
|
||
$(object).css('overflow-y', 'hidden');
|
||
}, 500);
|
||
}
|
||
|
||
isHover = false;
|
||
} else {
|
||
if (!isHover) {
|
||
clearTimeout(hoverTimer);
|
||
hoverTimer = setTimeout(function () {
|
||
$(object).css('overflow-y', 'auto');
|
||
}, 500);
|
||
}
|
||
|
||
isHover = true;
|
||
}
|
||
}
|
||
});
|
||
|
||
$('.cactiConsoleNavigationArea, .cactiTreeNavigationArea').off('mouseleave').on('mouseleave', function (pos) {
|
||
if ($('.cactiConsoleNavigationArea').length) {
|
||
object = '.cactiConsoleNavigationArea';
|
||
} else if ($('.cactiTreeNavigationArea').length) {
|
||
object = '.cactiTreeNavigationArea';
|
||
}
|
||
|
||
isHover = false;
|
||
|
||
clearTimeout(hoverTimer);
|
||
hoverTimer = setTimeout(function () {
|
||
$(object).css('overflow-y', 'hidden');
|
||
}, 500);
|
||
});
|
||
}
|
||
|
||
function loadPageNoHeader(href, scroll, force) {
|
||
var stack = ''; //getStackTrace(); // new Error().stack;
|
||
console.error("Function loadPageNoHeader is now deprecated, use loadUrl instead\n" + stack);
|
||
return loadUrl({
|
||
url: href,
|
||
scroll: scroll,
|
||
force: force,
|
||
loadType: 'noheader'
|
||
});
|
||
}
|
||
|
||
function cactiPreparePostRequest(href, postData) {
|
||
var target = new URL(href, window.location.href);
|
||
|
||
if (target.origin !== window.location.origin) {
|
||
throw new Error('Refusing to send a CSRF token to a different origin');
|
||
}
|
||
|
||
if (typeof postData === 'string') {
|
||
postData = postData.replace(/(^|&)__csrf_magic=[^&]*/g, '').replace(/&{2,}/g, '&').replace(/^&|&$/g, '');
|
||
postData = '__csrf_magic=' + encodeURIComponent(csrfMagicToken) + (postData === '' ? '' : '&' + postData);
|
||
} else {
|
||
postData = $.extend({__csrf_magic: csrfMagicToken}, postData || {});
|
||
postData.__csrf_magic = csrfMagicToken;
|
||
}
|
||
|
||
return {
|
||
url: target.pathname + target.search,
|
||
data: postData
|
||
};
|
||
}
|
||
|
||
function cactiPreparePostRequestFromUrl(href) {
|
||
var target = new URL(href, window.location.href);
|
||
|
||
if (target.origin !== window.location.origin) {
|
||
throw new Error('Refusing to send a CSRF token to a different origin');
|
||
}
|
||
|
||
var fields = [];
|
||
target.searchParams.forEach(function (value, name) {
|
||
if (name !== '__csrf_magic') {
|
||
fields.push({name: name, value: value});
|
||
}
|
||
});
|
||
|
||
return cactiPreparePostRequest(target.pathname, $.param(fields));
|
||
}
|
||
|
||
function submitPageUsingPost(href) {
|
||
var request = cactiPreparePostRequestFromUrl(href);
|
||
var form = $('<form>', {method: 'post', action: request.url});
|
||
|
||
new URLSearchParams(request.data).forEach(function (value, name) {
|
||
form.append($('<input>', {type: 'hidden', name: name, value: value}));
|
||
});
|
||
|
||
form.appendTo(document.body);
|
||
form[0].submit();
|
||
}
|
||
|
||
function loadPage(href, force) {
|
||
var stack = ''; //getStackTrace(); // new Error().stack;
|
||
console.error("Function loadPage is now deprecated, use loadUrl instead\n" + stack);
|
||
return loadUrl({
|
||
url: href,
|
||
force: force,
|
||
loadType: 'loadPage'
|
||
});
|
||
}
|
||
|
||
function loadUrl(options) {
|
||
setCactiTabCookie();
|
||
|
||
clearAllTimeouts();
|
||
|
||
statePushed = false;
|
||
cont = false;
|
||
|
||
/* get rid of old selectmenu's */
|
||
$('.ui-selectmenu-menu').empty();
|
||
|
||
if (typeof options.noState == 'undefined' || options.noState == false) {
|
||
/* close all toasts */
|
||
$.toast().reset('all');
|
||
}
|
||
|
||
options = sanitizeAjaxOptions(options);
|
||
|
||
/**
|
||
* Warn the user if they have made changes in a form but haven not
|
||
* saved those options.
|
||
*/
|
||
if (!options.force) {
|
||
cont = checkFormStatus(options.url, options.loadType, options.scroll);
|
||
} else {
|
||
cont = true;
|
||
}
|
||
|
||
if (cont) {
|
||
if (options.funcStart != '') {
|
||
window[options.funcStart](options);
|
||
}
|
||
|
||
/* remove dialogs that were not purged */
|
||
$('.ui-dialog').empty().remove();
|
||
|
||
closeDateFilters();
|
||
|
||
/**
|
||
* commenting out as this is causing issues in
|
||
* current browsers with the current jQuery.
|
||
*
|
||
* clearAllTimeouts();
|
||
*/
|
||
|
||
$.ajaxQ.abortAll();
|
||
|
||
if (options.json == true) {
|
||
return $.getJSON(options.url)
|
||
.done(function (html) {
|
||
handleAjaxResponse(html, options);
|
||
return false;
|
||
})
|
||
.fail(function (html) {
|
||
getPresentHTTPError(html);
|
||
});
|
||
} else {
|
||
return $.get(options.url)
|
||
.done(function (html) {
|
||
handleAjaxResponse(html, options);
|
||
return false;
|
||
})
|
||
.fail(function (html) {
|
||
getPresentHTTPError(html);
|
||
});
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
function postUrl(options, data) {
|
||
setCactiTabCookie();
|
||
|
||
statePushed = false;
|
||
cont = false;
|
||
|
||
if (typeof options.noState == 'undefined' || options.noState == false) {
|
||
/* close all toasts */
|
||
$.toast().reset('all');
|
||
}
|
||
|
||
options = sanitizeAjaxOptions(options);
|
||
if (options.funcStart != '') {
|
||
window[options.funcStart](options);
|
||
}
|
||
|
||
$.ajaxQ.abortAll();
|
||
|
||
return $.post(options.url, data)
|
||
.done(function (html) {
|
||
handleAjaxResponse(html, options);
|
||
return false;
|
||
})
|
||
.fail(function (html) {
|
||
getPresentHTTPError(html);
|
||
});
|
||
}
|
||
|
||
function findElement(htmlObject, element) {
|
||
var wanted = $();
|
||
|
||
if (htmlObject !== null) {
|
||
wanted = htmlObject.find(element);
|
||
if (typeof wanted == 'undefined' || wanted.length == 0) {
|
||
wanted = htmlObject.filter(element);
|
||
}
|
||
}
|
||
|
||
return wanted;
|
||
}
|
||
|
||
function sanitizeAjaxOptions(check) {
|
||
options = {
|
||
force: false,
|
||
scroll: false,
|
||
json: false,
|
||
elementId: 'main',
|
||
tabId: '',
|
||
loadType: 'noheader',
|
||
funcStart: '',
|
||
funcEnd: '',
|
||
url: '',
|
||
pageName: '',
|
||
noState: false,
|
||
handle: true,
|
||
redirect: '',
|
||
};
|
||
|
||
if (typeof check == 'undefined') {
|
||
check = {};
|
||
}
|
||
|
||
if (typeof check.url == 'string') {
|
||
options.url = check.url;
|
||
var hrefParts = options.url.split('?');
|
||
options.pageName = basename(hrefParts[0]);
|
||
options.noState = options.url.indexOf('nostate') > -1;
|
||
}
|
||
|
||
if (typeof check.noState != 'undefined') {
|
||
options.noState = check.noState;
|
||
}
|
||
|
||
if (typeof check.scroll != 'undefined') {
|
||
options.scroll = check.scroll;
|
||
}
|
||
|
||
if (typeof check.funcStart == 'string') {
|
||
options.funcStart = check.funcStart;
|
||
}
|
||
|
||
if (typeof check.funcEnd == 'string') {
|
||
options.funcEnd = check.funcEnd;
|
||
}
|
||
|
||
if (typeof check.elementId == 'string') {
|
||
options.elementId = check.elementId;
|
||
}
|
||
|
||
if (typeof check.tabId == 'string') {
|
||
options.tabId = check.tabId;
|
||
}
|
||
|
||
if (typeof check.loadType == 'string') {
|
||
options.loadType = check.loadType;
|
||
}
|
||
|
||
if (typeof check.redirect == 'string') {
|
||
options.redirect = check.redirect;
|
||
}
|
||
|
||
if (typeof check.handle == 'boolean') {
|
||
options.handle = check.handle;
|
||
}
|
||
|
||
if (typeof check.force == 'boolean') {
|
||
options.force = check.force;
|
||
}
|
||
|
||
if (typeof check.json == 'boolean') {
|
||
options.json = check.json;
|
||
}
|
||
|
||
if (options.elementId.trim() == '') {
|
||
options.elementId = 'main';
|
||
}
|
||
|
||
return options;
|
||
}
|
||
|
||
function handleAjaxResponse(html, options) {
|
||
checkForLogout(html);
|
||
|
||
options = sanitizeAjaxOptions(options);
|
||
|
||
if (!options.json || options.json == false) {
|
||
if (html.indexOf('cactiAuthArea') > 0) {
|
||
document.location = 'index.php';
|
||
}
|
||
|
||
if (options.handle && options.redirect.trim() == '') {
|
||
elementId = '#' + options.elementId;
|
||
|
||
var htmlObject = null;
|
||
try {
|
||
htmlObject = $(html);
|
||
} catch (Exception) {
|
||
htmlObject = null;
|
||
}
|
||
|
||
var matches = null;
|
||
if (typeof html.match !== 'undefined') {
|
||
matches = html.match(/<title>(.*?)<\/title>/);
|
||
}
|
||
|
||
if (matches != null) {
|
||
var htmlTitle = matches[1];
|
||
var breadCrumbs = findElement(htmlObject, '#breadcrumbs').html();
|
||
var htmlContent = findElement(htmlObject, elementId).html();
|
||
|
||
$('title').text(htmlTitle);
|
||
$('#breadcrumbs').html(breadCrumbs);
|
||
|
||
myTitle = htmlTitle;
|
||
}
|
||
|
||
if (typeof htmlContent == 'undefined') {
|
||
htmlContent = html;
|
||
}
|
||
|
||
// No need to check noState on options
|
||
// as this is handled inside pushState();
|
||
pushState(myTitle, options);
|
||
|
||
if (html !== null && html.length > 0) {
|
||
|
||
/* detect confirmations */
|
||
let confirmation = '#action_confirm';
|
||
let htmlConfirm = findElement(htmlObject, confirmation).parent().html();
|
||
|
||
if (typeof htmlConfirm !== 'undefined' && typeof window['preparePopOver'] === 'function') {
|
||
preparePopOver(htmlConfirm);
|
||
}else {
|
||
$(elementId).hide().empty().hide();
|
||
$(elementId).html(htmlContent);
|
||
$(elementId).show();
|
||
}
|
||
|
||
|
||
}
|
||
|
||
if (options.pageName != '') {
|
||
// Workaround for Create Device
|
||
if (options.pageName == 'host.php') {
|
||
if (options.url.indexOf('create') >= 0) {
|
||
$('#menu').find('.pic').removeClass('selected');
|
||
$('#menu').find("a[href='" + escapeString(options.url) + "']").addClass('selected');
|
||
} else {
|
||
$('#menu').find('.pic').removeClass('selected');
|
||
$('#menu').find("a[href$='host.php']").addClass('selected');
|
||
}
|
||
} else if ($('#menu').find("a[href^='" + escapeString(options.url) + "']").length > 0) {
|
||
$('#menu').find('.pic').removeClass('selected');
|
||
$('#menu').find("a[href^='" + escapeString(options.url) + "']").addClass('selected');
|
||
} else if ($('#menu').find("a[href*='/" + options.pageName + "']").length > 0) {
|
||
$('#menu').find('.pic').removeClass('selected');
|
||
$('#menu').find("a[href*='/" + options.pageName + "']").addClass('selected');
|
||
}
|
||
}
|
||
|
||
var scrollTop = (isMobile.any() != null) ? 1 : 0;
|
||
|
||
if (options.scroll) {
|
||
scrollTop = options.scroll;
|
||
}
|
||
|
||
window.scrollTo(0, scrollTop);
|
||
|
||
handleConsole(options.pageName);
|
||
|
||
Pace.stop();
|
||
}
|
||
}
|
||
|
||
if (options.funcEnd != '') {
|
||
if (typeof window[options.funcEnd] === 'undefined') {
|
||
console.log('WARNING: Missing function "' + options.funcEnd + '".');
|
||
} else {
|
||
window[options.funcEnd](options, html);
|
||
}
|
||
}
|
||
|
||
if (options.redirect.trim() != '') {
|
||
document.location = options.redirect;
|
||
}
|
||
|
||
applySkin();
|
||
}
|
||
|
||
function getPresentHTTPError(data) {
|
||
getPresentHTTPErrorOrRedirect(data);
|
||
}
|
||
|
||
function getPresentHTTPErrorOrRedirect(data, url) {
|
||
if (typeof data.status != 'undefined') {
|
||
var errorStr = data.status;
|
||
var errorSub = data.statusText;
|
||
var errorText = errorReasonUnexpected;
|
||
var found = false;
|
||
|
||
if (typeof data.responseText != 'undefined') {
|
||
var dataText = data.responseText;
|
||
|
||
var title_match = dataText.match(/<title>(.*?)<\/title>/);
|
||
var head_match = dataText.match(/<h1>(.*?)<\/h1>/);
|
||
var para_match = dataText.match(/<p>(.*?)<\/p>/);
|
||
|
||
if (title_match != null) {
|
||
var errorSub = title_match[1];
|
||
found = true;
|
||
}
|
||
|
||
if (head_match != null) {
|
||
var errorSub = head_match[1];
|
||
found = true;
|
||
}
|
||
|
||
if (para_match != null) {
|
||
var errorText = para_match[1];
|
||
found = true;
|
||
}
|
||
|
||
if (!found && dataText != '') {
|
||
var errorText = dataText;
|
||
}
|
||
|
||
var returnStr = '<div id="httperror" style="display:none">' +
|
||
'<h4>' + errorOnPage + '</h4><hr>' +
|
||
'<div style="padding-bottom: 5px;"><div style="display:table-cell;width:75px"><b>' + errorNumberPrefix + '</b></div> ' +
|
||
'<div style="display:table-cell"> ' + errorStr + ' ' + errorSub + '</div></div>' +
|
||
'<div><div style="display:table-cell;width:75px"><b>' + errorReasonPrefix + '</b></div> ' +
|
||
'<div style="display:table-cell"> ' + errorText + '</div></div>' +
|
||
'</div></div>';
|
||
|
||
var messageWidth = $(window).width();
|
||
if (messageWidth > 400) {
|
||
messageWidth = 400;
|
||
} else {
|
||
messageWidth -= 50;
|
||
}
|
||
|
||
$('#httperror').remove();
|
||
$('body').append(returnStr);
|
||
$('#httperror').dialog({
|
||
resizable: false,
|
||
height: 'auto',
|
||
width: messageWidth,
|
||
title: errorReasonTitle,
|
||
buttons: {
|
||
Ok: function () {
|
||
$(this).dialog('close');
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
if (typeof url != 'undefined') {
|
||
if (data.status >= 500) {
|
||
// Let the HTTP Error stick log an error
|
||
$.get(urlPath + 'help.php?page=' + encodeURIComponent(url) + '&error=' + data.status);
|
||
} else if (data.status >= 400) {
|
||
// Let the HTTP Error stick
|
||
} else if (data.statusText != 'abort') {
|
||
$.ajaxQ.abortAll();
|
||
document.location = url;
|
||
}
|
||
}
|
||
}
|
||
|
||
function ajaxAnchors() {
|
||
var page = basename(location.pathname);
|
||
|
||
$(document).off('click.cactiPostAction', 'a.cactiPostAction').on('click.cactiPostAction', 'a.cactiPostAction', function (event) {
|
||
if (!shouldCaptureClick(event)) {
|
||
return;
|
||
}
|
||
|
||
event.preventDefault();
|
||
event.stopImmediatePropagation();
|
||
|
||
var href = $(this).data('url') || $(this).attr('href');
|
||
|
||
if (href != null && href != '#') {
|
||
submitPageUsingPost(href);
|
||
}
|
||
|
||
return false;
|
||
});
|
||
|
||
$('a.pic, a.linkOverDark, a.linkEditMain, a.console, a.hyperLink, a.tab').not('[href^="http"], [href^="https"], [href^="#"], [href^="mailto"], [target="_blank"]').not('.cactiPostAction').off('click').on('click', function (event) {
|
||
if (!shouldCaptureClick(event)) {
|
||
return;
|
||
}
|
||
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
|
||
if ($(window).width() < 640) {
|
||
menuHide(false);
|
||
}
|
||
|
||
/* determine the page name */
|
||
var href = $(this).attr('href');
|
||
|
||
if (href == '#') {
|
||
return false;
|
||
}
|
||
|
||
/* update menu selection */
|
||
if ($(this).hasClass('pic')) {
|
||
$(this).addClass('selected');
|
||
}
|
||
|
||
/* update menu selection */
|
||
if ($(this).hasClass('lefttab')) {
|
||
$('.lefttab').removeClass('selected');
|
||
$(this).addClass('selected');
|
||
}
|
||
|
||
/* update menu selection */
|
||
if ($(this).hasClass('righttab')) {
|
||
$('.righttab').removeClass('selected');
|
||
$(this).addClass('selected');
|
||
}
|
||
|
||
if (href != null) {
|
||
pageName = basename(href);
|
||
}
|
||
|
||
loadUrl({
|
||
url: href,
|
||
loadType: 'loadPage'
|
||
});
|
||
|
||
return false;
|
||
});
|
||
}
|
||
|
||
function checkFormStatus(href, type, scroll_or_id) {
|
||
var changed = false;
|
||
|
||
if ($('.cactiFormStart').not('#chk').length) {
|
||
$('.cactiFormStart').not('#chk').each(function () {
|
||
var formID = $(this).attr('id');
|
||
var submitData = $(this).serializeForm();
|
||
|
||
if (typeof formArray != 'undefined' && typeof formArray[formID] != 'undefined') {
|
||
var formData = formArray[formID];
|
||
|
||
$.each(submitData, function (index, value) {
|
||
if (typeof formData[index] != 'undefined') {
|
||
if (formData[index] != value) {
|
||
if (index == 'settings_sendmail_path' || index == 'rrd_archive' || index == '__csrf_magicSubmit' || index == '__csrf_magic' || index == 'settings_smtp_password' || index == 'settings_smtp_password_confirm') {
|
||
// Ignore this entry
|
||
} else if (index.indexOf('[]') > 0) {
|
||
// Ignore this entry
|
||
} else {
|
||
console.log('Index:-' + index + '-:Submit:' + value + ', Orig:' + formData[index]);
|
||
changed = true;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
});
|
||
|
||
if (changed) {
|
||
warningMessage(href, type, scroll_or_id);
|
||
return false;
|
||
} else {
|
||
return true;
|
||
}
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
function setupCollapsible() {
|
||
var storage = Storages.sessionStorage;
|
||
|
||
$('.collapsible').each(function (data) {
|
||
var id = $(this).attr('id') + '_cs';
|
||
if (storage.isSet(id)) {
|
||
var state = storage.get(id);
|
||
} else {
|
||
var state = 'show';
|
||
}
|
||
|
||
if (state == 'hide') {
|
||
$(this).addClass('collapsed');
|
||
$(this).nextUntil('div.spacer').hide();
|
||
$(this).find('i').removeClass('ti-chevrons-up').addClass('ti-chevrons-down');
|
||
storage.set(id, 'hide');
|
||
}
|
||
});
|
||
|
||
$('.collapsible').off('click').on('click', function (data) {
|
||
var id = $(this).attr('id') + '_cs';
|
||
|
||
if ($(this).find('i').hasClass('ti-chevrons-up')) {
|
||
$(this).addClass('collapsed');
|
||
$(this).nextUntil('div.spacer').slideUp('slow');
|
||
$(this).find('i').removeClass('ti-chevrons-up').addClass('ti-chevrons-down');
|
||
storage.set(id, 'hide');
|
||
} else {
|
||
$(this).removeClass('collapsed');
|
||
$(this).nextUntil('div.spacer').slideDown('slow');
|
||
$(this).nextUntil('div.spacer').each(function (data) {
|
||
$(this).find('input, select').trigger('change');
|
||
});
|
||
$(this).find('i').removeClass('ti-chevrons-down').addClass('ti-chevrons-up');
|
||
storage.set(id, 'show');
|
||
}
|
||
});
|
||
}
|
||
|
||
function openUserMenu() {
|
||
$('.user').removeClass('usermenuup').addClass('usermenudown');
|
||
$('.menuoptions').slideDown(120, 'easeInOutCubic');
|
||
}
|
||
|
||
function closeUserMenu() {
|
||
$('.user').removeClass('usermenudown').addClass('usermenuup');
|
||
$('.menuoptions').slideUp(120, 'easeInOutCubic');
|
||
}
|
||
|
||
function handleConsole(pageName) {
|
||
if (pageName == null || pageName.length == 0) {
|
||
pageName = basename($(location).attr('pathname'));
|
||
}
|
||
|
||
// Modify the console pic
|
||
$('#menu_main_console').find('.menu_parent').attr('href', 'index.php').addClass('console selected');
|
||
$('#menu_main_console_div').remove();
|
||
if (pageName != 'index.php') {
|
||
$('#menu_main_console').find('.menu_parent').removeClass('selected');
|
||
}
|
||
}
|
||
|
||
function setupUserMenu() {
|
||
handleConsole();
|
||
|
||
$('.menuoptions').on('mouseenter', function () {
|
||
clearTimeout(userMenuTimer);
|
||
}).on('mouseleave', function () {
|
||
if ($('.menuoptions').is(':visible')) {
|
||
userMenuTimer = setTimeout(function () { closeUserMenu(); }, 1000);
|
||
}
|
||
});
|
||
|
||
$('.user').on('mouseenter', function (data) {
|
||
clearTimeout(userMenuTimer);
|
||
userMenuOpenTimer = setTimeout(function () { openUserMenu(); }, 400);
|
||
openUserMenu();
|
||
}).on('mouseleave', function (data) {
|
||
if ($('.menuoptions').is(':visible')) {
|
||
userMenuTimer = setTimeout(function () { closeUserMenu(); }, 1000);
|
||
} else {
|
||
clearTimeout(userMenuOpenTimer);
|
||
}
|
||
});
|
||
}
|
||
|
||
function setupSpecialKeys() {
|
||
if (!isMobile.any()) {
|
||
$('#filter, #rfilter').trigger('focus');
|
||
} else {
|
||
$('#filter, #rfilter').prop('size', '15');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* setupSortable - This function will set all actions for sortable columns
|
||
* every time a page is regenerated
|
||
*/
|
||
function setupSortable() {
|
||
$('th.sortable').on('click', function (e) {
|
||
document.getSelection().removeAllRanges();
|
||
|
||
var $target = $(e.target);
|
||
var sortAdd = '';
|
||
var href = '';
|
||
|
||
if (!$target.is('.ui-resizable-handle')) {
|
||
var page = $(this).find('.sortinfo').attr('sort-page');
|
||
var column = $(this).find('.sortinfo').attr('sort-column');
|
||
var direction = $(this).find('.sortinfo').attr('sort-direction');
|
||
var returnto = $(this).find('.sortinfo').attr('sort-return');
|
||
|
||
if (shiftPressed) {
|
||
sortAdd = '&add=true';
|
||
} else {
|
||
sortAdd = '&add=reset';
|
||
}
|
||
|
||
url = page + (page.indexOf('?') > 0 ? '&' : '?') +
|
||
'sort_column=' + column +
|
||
'&sort_direction=' + direction +
|
||
sortAdd;
|
||
|
||
loadUrl({
|
||
url: url,
|
||
elementId: returnto
|
||
});
|
||
}
|
||
});
|
||
}
|
||
|
||
function shouldCaptureClick(event) {
|
||
var evt = event ? event : window.event;
|
||
return !(evt.shiftKey || evt.altKey || evt.ctrlKey || evt.metaKey);
|
||
}
|
||
|
||
function setupBreadcrumbs() {
|
||
$('#breadcrumbs > li > a').on('click', function (event) {
|
||
if (!shouldCaptureClick(event))
|
||
return
|
||
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
|
||
var href = $(this).attr('href');
|
||
|
||
if (href != '#') {
|
||
href = href.replace('action=tree_content', 'action=tree');
|
||
$(this).prop('href', href);
|
||
document.location = href;
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* saveTableWidths - This function will initialize table widths on page
|
||
* load. It includes the 'initial' boolean to initialize the page
|
||
*/
|
||
function saveTableWidths(initial) {
|
||
// We will save columns widths persistently
|
||
var storage = Storages.localStorage;
|
||
var key;
|
||
|
||
// Initialize table width on the page
|
||
$('table.cactiTable').each(function (data) {
|
||
var key = $(this).attr('id');
|
||
|
||
if (storage.isSet(key)) {
|
||
var sizes = storage.get(key);
|
||
} else {
|
||
var sizes = new Array();
|
||
}
|
||
|
||
var items = sizes ? sizes : new Array();
|
||
var width = $(document).width();
|
||
|
||
// if the table width changes, reset the columns
|
||
if (key !== undefined && sizes == undefined) {
|
||
storage.remove(key);
|
||
|
||
var sizes = new Array();
|
||
var items = new Array();
|
||
} else if (key !== undefined && initial) {
|
||
if (items.length > 0) {
|
||
if (items[0] + 18 < width) {
|
||
storage.remove(key);
|
||
|
||
var sizes = new Array();
|
||
var items = new Array();
|
||
}
|
||
}
|
||
}
|
||
|
||
var i = 1;
|
||
|
||
items[0] = width;
|
||
sizes[0] = width;
|
||
|
||
if (key !== undefined) {
|
||
if (initial && items.length > 1) {
|
||
$('#' + key).find('th.ui-resizable').each(function (data) {
|
||
if (items[i] == 0) {
|
||
items[i] = $(this).width();
|
||
sizes[i] = items[i];
|
||
}
|
||
|
||
if (items[i] != 0) {
|
||
$(this).css('width', items[i]);
|
||
$(this).attr('resizeWidth', items[i]);
|
||
}
|
||
i++;
|
||
});
|
||
} else {
|
||
$('#' + key).find('th.ui-resizable').each(function (data) {
|
||
sizes[i] = $(this).width();
|
||
|
||
if (sizes[i] != 0) {
|
||
$(this).css('width', items[i]);
|
||
$(this).attr('resizeWidth', sizes[i]);
|
||
}
|
||
i++;
|
||
});
|
||
|
||
if (i > 1) {
|
||
storage.set(key, sizes);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
/** applyTableSizing - This function sets all table headers to be resizable using
|
||
* the jQueryUI function resizable. It also calls the saveTableWidths function
|
||
* to store the widths in localStorage every time a column is resized. */
|
||
function applyTableSizing() {
|
||
var originalSize = 0;
|
||
var colWidth = 0;
|
||
|
||
$('.tableHeader').not('.tableFixed').find('th').resizable({
|
||
handles: 'e',
|
||
|
||
start: function (event, ui) {
|
||
colWidth = $(this).width();
|
||
originalSize = ui.size.width;
|
||
|
||
if (originalSize == 0) {
|
||
originalSize = $(this).width();
|
||
}
|
||
|
||
$(ui.originalElement).siblings().each(function (data) {
|
||
$(this).attr('resizeWidth', $(this).width());
|
||
});
|
||
},
|
||
|
||
resize: function (event, ui) {
|
||
var resizeDelta = ui.size.width - originalSize;
|
||
var newColWidth = colWidth + resizeDelta;
|
||
var nextWidth = $(ui.element).next().attr('resizeWidth');
|
||
$(ui.element).next().css('width', nextWidth - resizeDelta);
|
||
$(ui.element).prevUntil('tr').each(function (data) {
|
||
$(this).css('width', $(this).attr('resizeWidth'));
|
||
});
|
||
$(this).css('height', 'auto');
|
||
},
|
||
|
||
stop: function (event, ui) {
|
||
saveTableWidths(false);
|
||
}
|
||
});
|
||
|
||
saveTableWidths(true);
|
||
}
|
||
|
||
function correctUrlParameters(url) {
|
||
if (url.indexOf('action=tree_content') < 0 && url.indexOf('action=tree') >= 0) {
|
||
url = url.replace('action=tree', 'action=tree_content');
|
||
}
|
||
|
||
return url;
|
||
}
|
||
|
||
/** setupPageTimeout - This function will setup the page timeout based upon
|
||
* the plugin developers $refresh requirements. It also sets up a location
|
||
* to redirect the user to upon timeout. This is generally done for automatically
|
||
* logging out the user, but can be used for simply refreshing the page as in the
|
||
* case of the Graphs page. */
|
||
function setupPageTimeout() {
|
||
if (typeof myRefresh != 'undefined') {
|
||
clearTimeout(myRefresh);
|
||
}
|
||
|
||
if (typeof refreshMSeconds != 'undefined') {
|
||
myRefresh = setTimeout(function () {
|
||
if (refreshIsLogout) {
|
||
document.location = urlPath + 'logout.php?action=timeout';
|
||
} else {
|
||
if (previousPage != '') {
|
||
refreshPage = previousPage;
|
||
}
|
||
|
||
/* fix coner case with tree refresh */
|
||
if (refreshFunction == '') {
|
||
refreshPage = correctUrlParameters(refreshPage);
|
||
loadUrl({ url: refreshPage });
|
||
} else {
|
||
var funct = refreshFunction.replace('()', '');
|
||
|
||
window[funct]();
|
||
|
||
setupPageTimeout();
|
||
}
|
||
}
|
||
}, refreshMSeconds);
|
||
}
|
||
}
|
||
|
||
function pulsateStart(element) {
|
||
pulsating = true;
|
||
pulsate(element);
|
||
}
|
||
|
||
function pulsate(element) {
|
||
if (pulsating) {
|
||
$(element || this).delay(100).fadeOut(800).delay(100).fadeIn(800, pulsate);
|
||
}
|
||
}
|
||
|
||
function pulsateStop(element) {
|
||
pulsating = false;
|
||
}
|
||
|
||
function setTitleAndHref() {
|
||
myHref = $(location).attr('href');
|
||
myTitle = $(document).attr('title');
|
||
}
|
||
|
||
function clearAllTimeouts() {
|
||
if (typeof installTimer != 'undefined') {
|
||
return true;
|
||
}
|
||
|
||
var id = window.setTimeout(function () { }, 0);
|
||
|
||
while (id--) {
|
||
window.clearTimeout(id); // will do nothing if no timeout with id is present
|
||
}
|
||
}
|
||
|
||
function setZoneInfo() {
|
||
var dt = new Date();
|
||
var tz = -dt.getTimezoneOffset();
|
||
|
||
var CactiDateTime = 'CactiDateTime=' + dt.toString() + '; Max-Age: -1; path=' + urlPath + '; SameSite=Strict;';
|
||
var CactiTimeZone = 'CactiTimeZone=' + tz.toString() + '; Max-Age: -1; path=' + urlPath + '; SameSite=Strict;';
|
||
|
||
if (window.location.protocol == 'https:') {
|
||
CactiDateTime += ' Secure;';
|
||
CactiTimeZone += ' Secure;';
|
||
}
|
||
|
||
document.cookie = CactiDateTime;
|
||
document.cookie = CactiTimeZone;
|
||
}
|
||
|
||
$(function (){
|
||
cactiReady();
|
||
});
|
||
|
||
function cactiReady() {
|
||
statePushed = false;
|
||
popFired = false;
|
||
var tapped = false;
|
||
|
||
/**
|
||
* Unbind key elements to debounce actions
|
||
*/
|
||
$('input, select, textarea, a').off();
|
||
|
||
// Use traditional popstate handler
|
||
window.onpopstate = function (event) {
|
||
handlePopState(event);
|
||
}
|
||
|
||
// Don't allow selection when shift is pressed
|
||
$(document).on('mousedown', function (event) {
|
||
if (event.shiftKey) {
|
||
event.preventDefault();
|
||
}
|
||
});
|
||
|
||
$('#filter, #rfilter').on('keydown', function (event) {
|
||
if (event.keyCode == 8 && $(this).val() == '') {
|
||
handlePopState();
|
||
}
|
||
});
|
||
|
||
setZoneInfo();
|
||
|
||
setTitleAndHref();
|
||
|
||
setupUserMenu();
|
||
|
||
applySkin();
|
||
|
||
setupEllipsis();
|
||
|
||
handleUserMenu();
|
||
|
||
$('#navigation_right').show();
|
||
|
||
if (isMobile.any() != null) {
|
||
$(window).on('touchstart', function (event) {
|
||
if (!tapped) {
|
||
tapped = setTimeout(function () { tapped = null; }, 300);
|
||
} else {
|
||
clearTimeout(tapped);
|
||
tapped = null;
|
||
|
||
if (screenfull.isEnabled) {
|
||
screenfull.request();
|
||
}
|
||
}
|
||
});
|
||
|
||
$(window).on('load', function (event) {
|
||
setTimeout(function () { window.scrollTo(0, 1); }, 0);
|
||
});
|
||
}
|
||
}
|
||
|
||
/* only perform the recalculation of elements at the final end of the windows resize event */
|
||
var waitForFinalEvent = (function () {
|
||
var timers = {};
|
||
|
||
return function (callback, ms, uniqueId) {
|
||
if (!uniqueId) {
|
||
uniqueId = "Don't call this twice without a uniqueId";
|
||
}
|
||
|
||
if (timers[uniqueId]) {
|
||
clearTimeout(timers[uniqueId]);
|
||
}
|
||
|
||
timers[uniqueId] = setTimeout(callback, ms);
|
||
};
|
||
})();
|
||
|
||
function setSelectMenus() {
|
||
$.widget('ui.selectmenu', $.ui.selectmenu, {
|
||
_renderMenu: function(ul, items) {
|
||
let that = this;
|
||
let attr = this.element[0].attributes;
|
||
|
||
$.each( items, function( index, item ) {
|
||
that._renderItemData( ul, item );
|
||
});
|
||
|
||
if (typeof(attr['data-defaultLabel']) !== 'undefined') {
|
||
if(this.menuWrap.find('input').length === 0) {
|
||
this.menuWrap.prepend('<div class="ui-selectmenu-search"><input type="search" class="ui-state-default ui-corner-all" data-scope="theme" placeholder="' + searchPlaceholder + '"></div>');
|
||
}
|
||
|
||
this._on(false, this.menuWrap.find('input'), {
|
||
'keydown': function (event) {
|
||
var preventDefault = true;
|
||
switch ( event.keyCode ) {
|
||
case $.ui.keyCode.TAB:
|
||
case $.ui.keyCode.ESCAPE:
|
||
this.close(event);
|
||
break;
|
||
case $.ui.keyCode.ENTER:
|
||
case $.ui.keyCode.UP:
|
||
case $.ui.keyCode.DOWN:
|
||
case $.ui.keyCode.HOME:
|
||
case $.ui.keyCode.PAGE_UP:
|
||
case $.ui.keyCode.END:
|
||
case $.ui.keyCode.PAGE_DOWN:
|
||
case $.ui.keyCode.SPACE:
|
||
this.menu.trigger(event);
|
||
break;
|
||
default:
|
||
preventDefault = false;
|
||
break;
|
||
}
|
||
if ( preventDefault ) {
|
||
event.preventDefault();
|
||
}
|
||
},
|
||
'input': function (event) {
|
||
let search_string = that.menuWrap.find('input').val().toUpperCase();
|
||
$(ul).find('li').each(function (index, item) {
|
||
if ($(this).text().toUpperCase().indexOf(search_string) > -1) {
|
||
$(this).addClass('ui-menu-item').prop('hidden', false);
|
||
} else {
|
||
$(this).removeClass('ui-menu-item').prop('hidden', true);
|
||
}
|
||
})
|
||
}
|
||
})
|
||
}
|
||
},
|
||
_renderButtonItem: function(item) {
|
||
let that = this;
|
||
let attr = this.element[0].attributes;
|
||
let showDefaultLabel = select2Setup["displayDefaultLabel"];
|
||
|
||
if (typeof(attr['data-defaultLabel']) !== 'undefined') {
|
||
let defaultLabel = attr['data-defaultLabel'].value;
|
||
let filterActive = '';
|
||
let defaultIndex = 0;
|
||
let defaultValue = this.element.find("option").eq(0).val();
|
||
|
||
if (typeof(attr['data-defaultValue']) !== 'undefined') {
|
||
let defaultValue = attr['data-defaultValue'].value;
|
||
}
|
||
|
||
filterActive = (defaultValue !== item.value) ? 'true' : 'false';
|
||
|
||
/* fallback to index value -- maybe superfluous */
|
||
if (filterActive === '') {
|
||
filterActive = (defaultIndex !== item.index) ? 'true' : 'false';
|
||
}
|
||
|
||
let buttonItem = $('<span>', {
|
||
'class': 'ui-selectmenu-text',
|
||
'data-active': filterActive
|
||
})
|
||
|
||
if (filterActive === 'true') {
|
||
this._setText(buttonItem, ((showDefaultLabel) ? defaultLabel+': ' : '') + item.label);
|
||
|
||
let icon = {'button' : 'ui-icon-close'};
|
||
|
||
this._setOption('icons', icon);
|
||
|
||
this._off(this.button.find('span.ui-icon'), 'click');
|
||
this._on(false, this.button.find('span.ui-icon'), {
|
||
click: function(event) {
|
||
event.stopImmediatePropagation();
|
||
let defaultValue = this.element.find('option').eq(0).val();
|
||
let defaultLabel = this.element.find('option').eq(0).text();
|
||
let item = {'index' : 0, 'value' : defaultValue, 'label' : defaultLabel };
|
||
this._select(item, event);
|
||
}
|
||
});
|
||
} else {
|
||
this._setText(buttonItem, (showDefaultLabel) ? defaultLabel : item.label);
|
||
}
|
||
|
||
return buttonItem;
|
||
} else {
|
||
let buttonItem = $('<span>', {
|
||
'class': 'ui-selectmenu-text',
|
||
})
|
||
|
||
this._setText(buttonItem, item.label);
|
||
|
||
return buttonItem;
|
||
}
|
||
}
|
||
});
|
||
|
||
$.widget('custom.dropicon', $.ui.selectmenu, {
|
||
_renderItem: function( ul, item ) {
|
||
var li = $('<li>');
|
||
var wrapper = $('<div>', {text: item.label});
|
||
|
||
if (item.disabled) {
|
||
li.addClass('ui-state-disabled');
|
||
}
|
||
|
||
if (item.element.attr('data-style') != '') {
|
||
var style = item.element.attr('data-style')+';background:transparent;min-width:20px;';
|
||
} else {
|
||
var style = 'background:transparent;min-width:20px;';
|
||
}
|
||
|
||
var iclass = item.element.attr('data-class');
|
||
|
||
$('<i>', {
|
||
style: style,
|
||
'class': iclass
|
||
})
|
||
.prependTo(wrapper);
|
||
|
||
return li.append(wrapper).appendTo(ul);
|
||
}
|
||
});
|
||
|
||
$('select.drop-icon').dropicon();
|
||
|
||
$('select.colordropdown').dropcolor();
|
||
|
||
$('select').not('.colordropdown').not('.drop-icon').not('.multiselect').not('#user_language').not('#i18n_default_language')
|
||
.not('.select2').not('.select2-nosearch').not('.select2-tags').not('.select2-multi').not('.select2-multi-tags').not('.select2-multi-count').not('.select2-callback')
|
||
.not('.select2-hidden-accessible')
|
||
.each(function() {
|
||
var $this = $(this);
|
||
|
||
/* a plugin may have already deliberately widget-ified this element with
|
||
* jQuery UI selectmenu itself; don't layer select2 on top of that too */
|
||
if ($this.selectmenu('instance')) {
|
||
return;
|
||
}
|
||
|
||
var options = {
|
||
width: 'auto',
|
||
minimumResultsForSearch: select2SearchRows
|
||
};
|
||
|
||
if ($this.closest('.ui-dialog').length) {
|
||
options.dropdownParent = $this.closest('.ui-dialog');
|
||
}
|
||
|
||
$this.select2(options);
|
||
});
|
||
|
||
/* graph_template_id's '-1' option means "All Templates"; picking it clears every
|
||
* other selection and picking anything else clears '-1', mirroring the old
|
||
* jquery.multiselect uncheckAll/click handlers this replaces */
|
||
var graphTemplateValueAtOpen = null;
|
||
|
||
$('#graph_template_id.select2-multi-count').off('select2:select.graphTemplateSentinel select2:unselect.graphTemplateSentinel select2:open.graphTemplateSentinel select2:close.graphTemplateSentinel')
|
||
.on('select2:open.graphTemplateSentinel', function(event) {
|
||
graphTemplateValueAtOpen = ($(this).val() || []).join(',');
|
||
}).on('select2:select.graphTemplateSentinel', function(event) {
|
||
var $this = $(this);
|
||
var instance = $this.data('select2');
|
||
|
||
if (!instance) {
|
||
return;
|
||
}
|
||
|
||
/* unselect through select2's own event bus (not just the underlying <option>s)
|
||
* so the open dropdown's checkboxes redraw along with the selection - a plain
|
||
* .prop('selected', ...) + change only updates the "N Selected" summary label */
|
||
if (event.params.data.id == '-1') {
|
||
$this.find('option:selected').not('[value="-1"]').each(function() {
|
||
instance.trigger('unselect', { data: { id: this.value, text: this.text, element: this } });
|
||
});
|
||
} else {
|
||
var $allOption = $this.find('option[value="-1"]:selected');
|
||
|
||
if ($allOption.length) {
|
||
instance.trigger('unselect', { data: { id: '-1', text: $allOption.text(), element: $allOption[0] } });
|
||
}
|
||
}
|
||
|
||
/* belt-and-suspenders: force the open dropdown's checkboxes to match the
|
||
* current selection right now, rather than trusting internal event-ordering
|
||
* between the data and results adapters to have already redrawn them */
|
||
if (instance.results && instance.results.setClasses) {
|
||
instance.results.setClasses();
|
||
}
|
||
}).on('select2:unselect.graphTemplateSentinel', function(event) {
|
||
var $this = $(this);
|
||
var instance = $this.data('select2');
|
||
var $allOption = $this.find('option[value="-1"]');
|
||
|
||
if (instance && $allOption.length && $this.find('option:selected').length == 0) {
|
||
instance.trigger('select', { data: { id: '-1', text: $allOption.text(), element: $allOption[0] } });
|
||
}
|
||
|
||
if (instance && instance.results && instance.results.setClasses) {
|
||
instance.results.setClasses();
|
||
}
|
||
}).on('select2:close.graphTemplateSentinel', function(event) {
|
||
var currentValue = ($(this).val() || []).join(',');
|
||
|
||
/* only reload if the selection actually changed while open - just opening
|
||
* and closing without picking anything shouldn't refresh the page */
|
||
if (currentValue !== graphTemplateValueAtOpen) {
|
||
/* defer past select2's own close teardown so the reload isn't torn down with it */
|
||
setTimeout(applyGraphFilter, 0);
|
||
}
|
||
});
|
||
|
||
var msWidth = 40;
|
||
|
||
$('#graph_template_id option').each(function() {
|
||
var curWidth = $(this).textWidth();
|
||
if (curWidth > msWidth) {
|
||
msWidth = curWidth;
|
||
}
|
||
});
|
||
|
||
/* shrink down */
|
||
msWidth -= 20;
|
||
|
||
/* legacy jquery.multiselect widget, preserved for any plugin/theme still emitting its
|
||
* own class='graph-multiselect' element; core's own #graph_template_id now uses
|
||
* select2-multi-count (see above) and no longer matches this selector */
|
||
$('#graph_template_id.graph-multiselect').hide().multiselect({
|
||
menuHeight: $(window).height()*.7,
|
||
menuWidth: 'auto',
|
||
header: ['uncheckAll'],
|
||
linkInfo: faIcons,
|
||
buttonWidth: 'auto',
|
||
noneSelectedText: allSelectedText,
|
||
selectedText: function(numChecked, numTotal, checkedItems) {
|
||
myReturn = numChecked + ' ' + templatesSelected;
|
||
|
||
$.each(checkedItems, function(index, value) {
|
||
if (value.value == '-1') {
|
||
myReturn = allSelectedText;
|
||
return false;
|
||
}
|
||
});
|
||
|
||
return myReturn;
|
||
},
|
||
checkAllText: allText,
|
||
uncheckAllText: noneText,
|
||
uncheckAll: function() {
|
||
$(this).find('option[value="-1"]').prop('selected', true);
|
||
$(this).multiselect('widget').find(':checkbox[value="-1"]').prop('checked', true);
|
||
},
|
||
close: function(event, ui) {
|
||
applyGraphFilter();
|
||
},
|
||
open: function(event, ui) {
|
||
$("input[type='search']:first").trigger('focus');
|
||
},
|
||
click: function(event, ui) {
|
||
var checked = $(this).multiselect('widget').find('input:checked').length;
|
||
|
||
if (ui.value == -1) {
|
||
if (ui.checked == true) {
|
||
$('#graph_template_id').multiselect('uncheckAll');
|
||
$(this).find('option[value="-1"]').prop('selected', true);
|
||
$(this).multiselect('widget').find(':checkbox:first').prop('checked', true);
|
||
} else {
|
||
$(this).find('option[value="-1"]').prop('selected', false);
|
||
$(this).multiselect('widget').find(':checkbox:first').prop('checked', false);
|
||
}
|
||
} else if (checked == 0) {
|
||
$(this).multiselect('widget').find(':checkbox:first').prop('checked', true);
|
||
$(this).find('option[value="-1"]').prop('selected', true);
|
||
} else {
|
||
$(this).multiselect('widget').find(':checkbox:first').prop('checked', false);
|
||
$(this).find('option[value="-1"]').prop('selected', false);
|
||
}
|
||
}
|
||
}).multiselectfilter({
|
||
label: searchPlaceholder,
|
||
placeholder: searchEnterKeyword,
|
||
width: msWidth
|
||
});
|
||
}
|
||
|
||
function setupObjectChange() {
|
||
function disableField(id) {
|
||
$('#' + id).prop('disabled', true).addClass('ui-state-disabled');
|
||
|
||
if (id == 'location') {
|
||
$('#location_wrap').prop('disabled', true).addClass('ui-selectmenu-disabled ui-state-disabled');
|
||
}
|
||
|
||
if ($('#' + id).button('instance')) {
|
||
$('#' + id).button('disable');
|
||
} else if ($('#' + id).selectmenu('instance')) {
|
||
$('#' + id).selectmenu('disable');
|
||
} else if ($('#' + id).hasClass('select2-hidden-accessible')) {
|
||
$('#' + id).trigger('change.select2');
|
||
}
|
||
}
|
||
|
||
function enableField(id) {
|
||
$('#' + id).prop('disabled', false).removeClass('ui-state-disabled');
|
||
|
||
if (id == 'location') {
|
||
$('#location_wrap').prop('disabled', false).removeClass('ui-selectmenu-disabled ui-state-disabled');
|
||
}
|
||
|
||
if ($('#' + id).button('instance')) {
|
||
$('#' + id).button('enable');
|
||
} else if ($('#' + id).selectmenu('instance')) {
|
||
$('#' + id).selectmenu('enable');
|
||
} else if ($('#' + id).hasClass('select2-hidden-accessible')) {
|
||
$('#' + id).trigger('change.select2');
|
||
}
|
||
}
|
||
|
||
$('.confirm_actions').find('input[id^="t_"]').on('click', function() {
|
||
var id = $(this).attr('id').substring(2);
|
||
if ($(this).is(':checked')) {
|
||
enableField(id);
|
||
} else {
|
||
disableField(id);
|
||
}
|
||
});
|
||
|
||
$('.confirm_actions').find('input[id^="t_"]').each(function() {
|
||
var id = $(this).attr('id').substring(2);
|
||
disableField(id);
|
||
});
|
||
}
|
||
|
||
function setupEllipsis() {
|
||
$('<div class="dropdownMenu">' +
|
||
'<ul id="submenu-ellipsis" class="submenuoptions" style="display:none;">' +
|
||
'</ul>' +
|
||
'</div>').appendTo('body');
|
||
|
||
$('.maintabs-submenu, .usertabs-submenu, .submenu-ellipsis').off('click').on('click', function (event) {
|
||
event.preventDefault();
|
||
|
||
var submenu_index = $(this).attr('id').replace('menu-', 'submenu-');
|
||
var submenu = $('#' + submenu_index);
|
||
|
||
if (submenu.is(':visible') === false) {
|
||
/* close other drop down menus first */
|
||
$('.submenuoptions').slideUp(120);
|
||
$('.menuoptions').slideUp(120);
|
||
|
||
/* re-position */
|
||
var position = $(this).position();
|
||
|
||
if (position.left - parseInt(submenu.outerWidth()) < 0) {
|
||
submenu.css({ 'left': 0 }).slideDown(120);
|
||
} else {
|
||
submenu.css({ 'left': position.left - parseInt(submenu.outerWidth()) + parseInt($(this).outerWidth()) }).slideDown(120);
|
||
}
|
||
} else {
|
||
submenu.slideUp(120);
|
||
}
|
||
|
||
return false;
|
||
});
|
||
|
||
$('.submenuoptions').on('mouseenter', function (event) {
|
||
clearTimeout(userMenuTimer);
|
||
}).on('mouseleave', function (event) {
|
||
if ($('.submenuoptions').is(':visible')) {
|
||
userMenuTimer = setTimeout(function () { $('.submenuoptions').stop().slideUp(120); }, 1000);
|
||
} else {
|
||
clearTimeout(userMenuOpenTimer);
|
||
}
|
||
});
|
||
|
||
$(window).on('click', function (event) {
|
||
if ($(event.target).parents('.submenuoptions').length == 0 && $('.submenuoptions').is(':visible')) {
|
||
$('.submenuoptions').slideUp(120);
|
||
}
|
||
if ($(event.target).parents('.menuoptions').length == 0 && $('.menuoptions').is(':visible')) {
|
||
$('.menuoptions').slideUp(120);
|
||
}
|
||
});
|
||
}
|
||
|
||
function keepWindowSize() {
|
||
$(window).on('resize', function (event) {
|
||
waitForFinalEvent(function () {
|
||
$('.cactiGraphContentArea').show();
|
||
|
||
var resizeTime = new Date();
|
||
var myEvent = event;
|
||
if (resizeTimeout === false) {
|
||
resizeTimeout = true;
|
||
setTimeout(function () {
|
||
responsiveUI(myEvent);
|
||
}, resizeDelta);
|
||
}
|
||
heightPage = $(window).height();
|
||
|
||
if ($('#cactiPageHead').is(':visible')) {
|
||
heightPageHead = $('#cactiPageHead').outerHeight();
|
||
} else {
|
||
heightPageHead = 0;
|
||
}
|
||
|
||
if ($('#breadCrumbBar').is(':visible')) {
|
||
heightBreadCrumbBar = $('#breadCrumbBar').outerHeight();
|
||
} else {
|
||
heightBreadCrumbBar = 0;
|
||
}
|
||
|
||
if ($('#cactiPageBottom').is(':visible')) {
|
||
heightPageBottom = $('#cactiPageBottom').outerHeight();
|
||
} else {
|
||
heightPageBottom = 0;
|
||
}
|
||
|
||
heightPageContent = heightPage - heightPageHead - heightPageBottom - heightBreadCrumbBar;
|
||
|
||
$('body').css('height', heightPage);
|
||
$('#cactiContent, #navigation, #navigation_right').css('height', heightPageContent);
|
||
|
||
// Handle links pages
|
||
$('#content').css({ 'width': '100%', 'height': heightPageContent - 4 });
|
||
|
||
var navWidth = $('#navigation').width();
|
||
$('#searcher').css('width', getTreeSearchWidth(navWidth));
|
||
|
||
responsiveResizeGraphs();
|
||
|
||
/* close open dropdown menus first off */
|
||
$('.dropdownMenu > ul').hide();
|
||
|
||
if ($('#gtabs > .tabs').is(':visible')) {
|
||
var graphTabWidth = $('#gtabs > .tabs').outerWidth();
|
||
} else {
|
||
var graphTabWidth = 0;
|
||
}
|
||
|
||
if ($('.usertabs').length) {
|
||
var userTabs = $('.usertabs').outerWidth();
|
||
} else {
|
||
var userTabs = 0;
|
||
}
|
||
|
||
var bodyWidth = $('body').width();
|
||
var otherWidth = 0;
|
||
$('#tabs').find('div:not(.maintabs):visible').each(function () {
|
||
otherWidth += $(this).outerWidth();
|
||
});
|
||
|
||
var ellipsisWidth = $('.maintabs-submenu-ellipsis').outerWidth();
|
||
var tabHeight = $('#tabs').outerHeight();
|
||
var mainTabPos = false;
|
||
|
||
if ($('.maintabs').length) {
|
||
mainTabPos = $('.maintabs:first').position();
|
||
}
|
||
|
||
if ($('.usertabs').length) {
|
||
mainTabHeight = tabHeight;
|
||
userTabPos = $('.usertabs').position();
|
||
} else if (mainTabPos != false) {
|
||
mainTabHeight = $('.maintabs:first nav').outerHeight();
|
||
userTabPos = mainTabPos;
|
||
}
|
||
|
||
pageWidth = bodyWidth;
|
||
|
||
var items = $($('.maintabs nav ul li a.lefttab').get());
|
||
var done = false;
|
||
items.each(function () {
|
||
var id = $(this).attr('id');
|
||
|
||
showCurrentTab(id);
|
||
});
|
||
|
||
// Hide top menus if you have to
|
||
var items = $($('.maintabs nav ul li a.lefttab').get().reverse());
|
||
var done = false;
|
||
items.each(function () {
|
||
var id = $(this).attr('id');
|
||
|
||
if (!done) {
|
||
if (tabsWrapping()) {
|
||
hideCurrentTab(id, true);
|
||
} else {
|
||
done = true;
|
||
}
|
||
}
|
||
});
|
||
|
||
if ($('#submenu-ellipsis li').length == 0) {
|
||
$('.ellipsis').hide();
|
||
} else {
|
||
$('.ellipsis').show();
|
||
}
|
||
}, 50, 'resize-content');
|
||
}).trigger('resize');
|
||
}
|
||
|
||
function hideCurrentTab(id, shrinking) {
|
||
if ($('#' + id + '-ellipsis').length == 0) {
|
||
var myid = id + '-ellipsis';
|
||
var href = $('#' + id).attr('href');
|
||
var selected = $('#' + id).hasClass('selected');
|
||
var text = $('#' + id).text();
|
||
|
||
if (shrinking) {
|
||
$('#submenu-ellipsis').prepend($('<li>').append($('<a class="lefttab">').toggleClass('selected', !!selected).attr({id: myid, href: href}).text(text)));
|
||
} else {
|
||
$('#submenu-ellipsis').append($('<li>').append($('<a class="lefttab">').toggleClass('selected', !!selected).attr({id: myid, href: href}).text(text)));
|
||
}
|
||
|
||
setupResponsiveMenuAndTabs();
|
||
|
||
$('#' + id).parent().hide();
|
||
}
|
||
}
|
||
|
||
function showCurrentTab(id) {
|
||
$('#' + id + '-ellipsis').parent().remove();
|
||
$('#' + id).parent().show();
|
||
}
|
||
|
||
function tabsWrapping() {
|
||
var mainTabPos = $('.maintabs:first').position();
|
||
var tabHeight = $('#tabs').height();
|
||
|
||
if ($('.usertabs').length) {
|
||
var mainTabHeight = tabHeight;
|
||
var userTabPos = $('.usertabs').position();
|
||
} else {
|
||
var mainTabHeight = $('.maintabs:first nav').height();
|
||
var userTabPos = mainTabPos;
|
||
}
|
||
|
||
var bodyWidth = $('body').width();
|
||
var otherWidth = 0;
|
||
$('#tabs').find('div:not(.maintabs):visible').each(function () {
|
||
otherWidth += $(this).outerWidth();
|
||
});
|
||
|
||
var ellipsisWidth = $('.maintabs-submenu-ellipsis').outerWidth();
|
||
var mtabsWidth = $('.maintabs:not(.usertabs)').outerWidth();
|
||
|
||
if ($('#gtabs>.tabs').length) {
|
||
var gtabsWidth = $('#gtabs>.tabs').outerWidth();
|
||
} else {
|
||
var gtabsWidth = 0;
|
||
}
|
||
|
||
if ($('.usertabs').length) {
|
||
var utabsWidth = $('.usertabs').outerWidth();
|
||
} else {
|
||
var utabsWidth = 0;
|
||
}
|
||
|
||
if (gtabsWidth + mtabsWidth + utabsWidth + otherWidth + ellipsisWidth > bodyWidth - 20) {
|
||
return true;
|
||
}
|
||
|
||
if (mainTabPos.top != userTabPos.top || mainTabHeight > tabHeight) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/* Graph related javascript functions */
|
||
if (typeof urlPath == 'undefined') {
|
||
var urlPath = '';
|
||
}
|
||
|
||
/* Setup a session per tab */
|
||
if (window.name == '') {
|
||
var max = 99999999;
|
||
var min = 10000000;
|
||
sessionStorage.tab = Math.floor(Math.random() * (max - min + 1) + min);
|
||
window.name = sessionStorage.tab;
|
||
|
||
if (urlPath != '') {
|
||
setCactiTabCookie();
|
||
}
|
||
|
||
document.location = document.location.href;
|
||
}
|
||
|
||
var graphPage = urlPath + 'graph_view.php';
|
||
var pageAction = 'preview';
|
||
|
||
function checkForLogout(data) {
|
||
checkForRedirects(data, null);
|
||
}
|
||
|
||
function setCactiTabCookie() {
|
||
document.cookie = 'CactiTab=' + sessionStorage.tab + '; Max-Age: -1;' + (window.location.protocol === 'https:' ? ' SameSite=None; Secure;' : ' SameSite=Strict;') +' Path=' + urlPath;
|
||
}
|
||
|
||
function checkForRedirects(data, href) {
|
||
if (typeof data == 'undefined') {
|
||
return true;
|
||
} else if (typeof data == 'object') {
|
||
return true;
|
||
} else if (data.indexOf('cactiLoginSuspend') >= 0) {
|
||
$.ajaxQ.abortAll();
|
||
document.location = urlPath + 'logout.php?action=disabled';
|
||
} else if (data.indexOf('cactiRemoteState') >= 0) {
|
||
$.ajaxQ.abortAll();
|
||
document.location = urlPath + 'logout.php?action=remote';
|
||
} else if (data.indexOf('cactiPermissionDenied') >= 0) {
|
||
$.ajaxQ.abortAll();
|
||
document.location = urlPath + 'permission_denied.php';
|
||
} else if (data.indexOf('cactiRedirect') >= 0) {
|
||
if (typeof href == 'undefined' || href == null) {
|
||
$.ajaxQ.abortAll();
|
||
location.reload();
|
||
} else {
|
||
$.ajaxQ.abortAll();
|
||
document.location = href;
|
||
}
|
||
} else if (data.indexOf('cactiLoginLogo') >= 0) {
|
||
$.ajaxQ.abortAll();
|
||
document.location = urlPath + 'logout.php?action=timeout';
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
function clearGraphFilter() {
|
||
var href = correctUrlParameters(graphPage + '?action=' + pageAction + '&clear=1');
|
||
loadUrl({ url: href });
|
||
}
|
||
|
||
function closeDateFilters() {
|
||
date1Open = false;
|
||
date2Open = false;
|
||
|
||
$('#date1').datetimepicker('hide');
|
||
$('#date2').datetimepicker('hide');
|
||
}
|
||
|
||
function saveGraphFilter(section) {
|
||
postUrl({
|
||
noState: true,
|
||
url: graphPage + '?action=save',
|
||
funcEnd: 'finalizeGraphFilter'
|
||
}, {
|
||
section: section,
|
||
columns: $('#columns').val(),
|
||
graphs: $('#graphs').val(),
|
||
graph_template_id: $('#graph_template_id').val(),
|
||
predefined_timespan: $('#predefined_timespan').val(),
|
||
predefined_timeshift: $('#predefined_timeshift').val(),
|
||
thumbnails: $('#thumbnails').is(':checked'),
|
||
business_hours: $('#business_hours').is(':checked'),
|
||
__csrf_magic: csrfMagicToken
|
||
});
|
||
}
|
||
|
||
function finalizeGraphFilter(options, data) {
|
||
$('#text').show().text(filterSettingsSaved).fadeOut(2000, function () {
|
||
$('#text').empty();
|
||
});
|
||
}
|
||
|
||
function applyGraphFilter() {
|
||
var href = correctUrlParameters(graphPage + '?action=' + pageAction +
|
||
'&rfilter=' + base64_encode($('#rfilter').val()) +
|
||
(typeof $('#site_id').val() != 'undefined' ? '&site_id=' + $('#site_id').val() : '') +
|
||
(typeof $('#location').val() != 'undefined' ? '&location=' + $('#location').val() : '') +
|
||
(typeof $('#host_id').val() != 'undefined' ? '&host_id=' + $('#host_id').val() : '') +
|
||
(typeof $('#graph_source').val() != 'undefined' ? '&graph_source=' + $('#graph_source').val() : '') +
|
||
(typeof $('#graph_order').val() != 'undefined' ? '&graph_order=' + $('#graph_order').val() : '') +
|
||
(typeof $('#cf').val() != 'undefined' ? '&cf=' + $('#cf').val() : '') +
|
||
(typeof $('#measure').val() != 'undefined' ? '&measure=' + $('#measure').val() : '') +
|
||
'&columns=' + $('#columns').val() +
|
||
'&graphs=' + $('#graphs').val() +
|
||
'&graph_template_id=' + $('#graph_template_id').val() +
|
||
'&thumbnails=' + $('#thumbnails').is(':checked') +
|
||
'&business_hours=' + $('#business_hours').is(':checked'));
|
||
|
||
loadUrl({ url: href });
|
||
}
|
||
|
||
function cleanUrlParameters(href) {
|
||
href = href.replace('action=tree_content', 'action=tree');
|
||
href = href.replace('?header=false', '?').replace('&header=false', '');
|
||
href = href.replace('?nostate=true', '?').replace('&nostate=true', '').replace('?&', '?');
|
||
|
||
return href;
|
||
}
|
||
|
||
function pushState(myTitle, options) {
|
||
options = sanitizeAjaxOptions(options);
|
||
if (!options.noState) {
|
||
if (statePushed == false) {
|
||
if (typeof window.history.pushState != 'undefined') {
|
||
var myObject = { Page: myTitle, Url: cleanUrlParameters(options.url), Options: Object.assign({}, options) };
|
||
window.history.pushState(myObject, myObject.Page, myObject.Url);
|
||
}
|
||
}
|
||
statePushed = true;
|
||
}
|
||
}
|
||
|
||
function handlePopState(e) {
|
||
var href = document.location.href;
|
||
|
||
if (typeof e !== 'undefined' && e.state != 'undefined' && e.state != null) {
|
||
if (typeof e.state.Options != 'undefined' && e.state.Options != null) {
|
||
loadUrl(e.state.Options);
|
||
return false;
|
||
} else if (typeof e.state.Url != 'undefined' && e.state.Url != null) {
|
||
loadUrl({ url: href });
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
function applyGraphTimespan() {
|
||
var href = correctUrlParameters(graphPage + '?action=' + pageAction +
|
||
($('#rfilter').length ? '&rfilter=' + base64_encode($('#rfilter').val()) : '') +
|
||
'&predefined_timespan=' + $('#predefined_timespan').val() +
|
||
'&predefined_timeshift=' + $('#predefined_timeshift').val() +
|
||
(typeof $('#site_id').val() != 'undefined' ? '&site_id=' + $('#site_id').val() : '') +
|
||
(typeof $('#location').val() != 'undefined' ? '&location=' + $('#location').val() : '') +
|
||
(typeof $('#host_id').val() != 'undefined' ? '&host_id=' + $('#host_id').val() : '') +
|
||
(typeof $('#graph_source').val() != 'undefined' ? '&graph_source=' + $('#graph_source').val() : '') +
|
||
(typeof $('#graph_order').val() != 'undefined' ? '&graph_order=' + $('#graph_order').val() : '') +
|
||
(typeof $('#cf').val() != 'undefined' ? '&cf=' + $('#cf').val() : '') +
|
||
(typeof $('#measure').val() != 'undefined' ? '&measure=' + $('#measure').val() : '') +
|
||
'&columns=' + $('#columns').val() +
|
||
'&graphs=' + $('#graphs').val() +
|
||
'&graph_template_id=' + $('#graph_template_id').val() +
|
||
'&thumbnails=' + $('#thumbnails').is(':checked') +
|
||
'&business_hours=' + $('#business_hours').is(':checked'));
|
||
|
||
closeDateFilters();
|
||
|
||
loadUrl({ url: href });
|
||
}
|
||
|
||
function refreshGraphTimespanFilter() {
|
||
postUrl({
|
||
url: correctUrlParameters(graphPage + '?action=' + pageAction),
|
||
funcEnd: 'finalizeGraphFilter',
|
||
}, {
|
||
custom: 1,
|
||
button_refresh_x: 1,
|
||
date1: $('#date1').val(),
|
||
rfilter: base64_encode($('#rfilter').val()),
|
||
date2: $('#date2').val(),
|
||
predefined_timespan: $('#predefined_timespan').val(),
|
||
predefined_timeshift: $('#predefined_timeshift').val(),
|
||
__csrf_magic: csrfMagicToken
|
||
});
|
||
}
|
||
|
||
function timeshiftGraphFilterLeft() {
|
||
postUrl({
|
||
url: correctUrlParameters(graphPage + '?action=' + pageAction),
|
||
funcEnd: 'finalizeGraphFilter',
|
||
}, {
|
||
move_left_x: 1,
|
||
move_left_y: 1,
|
||
date1: $('#date1').val(),
|
||
date2: $('#date2').val(),
|
||
predefined_timespan: $('#predefined_timespan').val(),
|
||
predefined_timeshift: $('#predefined_timeshift').val(),
|
||
__csrf_magic: csrfMagicToken
|
||
});
|
||
}
|
||
|
||
function timeshiftGraphFilterRight() {
|
||
postUrl({
|
||
url: correctUrlParameters(graphPage + '?action=' + pageAction),
|
||
funcEnd: 'finalizeGraphFilter',
|
||
}, {
|
||
move_right_x: 1,
|
||
move_right_y: 1,
|
||
date1: $('#date1').val(),
|
||
date2: $('#date2').val(),
|
||
predefined_timespan: $('#predefined_timespan').val(),
|
||
predefined_timeshift: $('#predefined_timeshift').val(),
|
||
__csrf_magic: csrfMagicToken
|
||
});
|
||
}
|
||
|
||
function clearGraphTimespanFilter() {
|
||
postUrl({
|
||
url: correctUrlParameters(graphPage + '?action=' + pageAction),
|
||
funcEnd: 'finalizeGraphFilter',
|
||
}, {
|
||
button_clear: 1,
|
||
__csrf_magic: csrfMagicToken
|
||
});
|
||
}
|
||
|
||
function removeSpikes(method, dryrun, local_graph_id) {
|
||
var graph_start = $('#graph_' + local_graph_id).attr('graph_start');
|
||
var graph_end = $('#graph_' + local_graph_id).attr('graph_end');
|
||
|
||
if (!(graph_start > 0 && graph_end > 0)) {
|
||
console.log('FATAL: Can not find Graph ID: ' + local_graph_id);
|
||
return false;
|
||
}
|
||
|
||
closeDateFilters();
|
||
|
||
var href = urlPath + 'spikekill.php' +
|
||
'?method=' + method +
|
||
(dryrun ? '&dryrun=true':'') +
|
||
'&local_graph_id=' + local_graph_id +
|
||
'&outlier-start=' + graph_start +
|
||
'&outlier-end=' + graph_end;
|
||
|
||
$.getJSON(href)
|
||
.done(function(data) {
|
||
checkForRedirects(data, href);
|
||
|
||
redrawGraph(local_graph_id);
|
||
|
||
$('#spikeresults').remove();
|
||
$('body').append('<div id="spikeresults" style="overflow-y:scroll;" title="' + spikeKillResults + '"></div>');
|
||
$('#spikeresults').html(data.results);
|
||
$('#spikeresults').dialog({ width:1100, maxHeight: 600 });
|
||
})
|
||
.fail(function(data) {
|
||
getPresentHTTPError(data);
|
||
}
|
||
);
|
||
}
|
||
|
||
function redrawGraph(graph_id) {
|
||
var mainWidth = getMainWidth() - 30;
|
||
var isThumb = $('#thumbnails').is(':checked') || $('#thumbnails').val() == 'true';
|
||
var isBusiness = $('#business_hours').is(':checked') || $('#business_hours').val() == 'true';
|
||
var myColumns = $('#columns').val();
|
||
var graphRow = $('.tableRowGraph').width();
|
||
var drillDown = $('.graphDrillDown:first').outerWidth() + 10;
|
||
var isSource = $('#graph_source').length ? true:false;
|
||
var isOrder = $('#graph_order').length ? true:false;
|
||
var isCF = $('#cf').length ? true:false;
|
||
var isMeasure = $('#measure').length ? true:false;
|
||
|
||
if (mainWidth < graphRow) {
|
||
graphRow = mainWidth - drillDown;
|
||
} else if (graphRow == 0) {
|
||
graphRow = mainWidth;
|
||
}
|
||
|
||
var myWidth = (graphRow - (drillDown * myColumns)) / myColumns;
|
||
|
||
var graph_height = $('#wrapper_' + graph_id).attr('graph_height');
|
||
var graph_width = $('#wrapper_' + graph_id).attr('graph_width');
|
||
|
||
closeDateFilters();
|
||
|
||
var href = 'graph_json.php?rra_id=0' +
|
||
'&local_graph_id=' + graph_id +
|
||
'&graph_start=' + graph_start +
|
||
'&graph_end=' + graph_end +
|
||
'&graph_height=' + graph_height +
|
||
'&graph_width=' + graph_width +
|
||
(isThumb ? '&graph_nolegend=true' : '') +
|
||
(isSource ? '&graph_source='+$('#graph_source').val() : '') +
|
||
(isOrder ? '&graph_order='+$('#graph_order').val() : '') +
|
||
(isCF ? '&cf='+$('#cf').val() : '') +
|
||
(isMeasure ? '&measure='+$('#measure').val() : '') +
|
||
'&business_hours=' + (isBusiness ? 'true' : 'false') +
|
||
|
||
$.getJSON(href, function(data) {
|
||
if (typeof data.status == 'undefined') {
|
||
if (myWidth < data.image_width) {
|
||
ratio = myWidth / data.image_width;
|
||
data.image_width = parseInt(data.image_width * ratio);
|
||
data.image_height = parseInt(data.image_height * ratio);
|
||
data.graph_width = parseInt(data.graph_width * ratio);
|
||
data.graph_height = parseInt(data.graph_height * ratio);
|
||
data.graph_top = parseInt(data.graph_top * ratio);
|
||
data.graph_left = parseInt(data.graph_left * ratio);
|
||
}
|
||
|
||
$('#wrapper_' + data.local_graph_id).empty().html(
|
||
"<img class='graphimage' id='graph_" + data.local_graph_id + "'" +
|
||
" src='data:image/" + data.type + ";base64," + data.image + "'" +
|
||
" rra_id='" + data.rra_id + "'" +
|
||
" graph_type='" + data.type + "'" +
|
||
" graph_id='" + data.local_graph_id + "'" +
|
||
" graph_start='" + data.graph_start + "'" +
|
||
" graph_end='" + data.graph_end + "'" +
|
||
" graph_left='" + data.graph_left + "'" +
|
||
" graph_top='" + data.graph_top + "'" +
|
||
" graph_width='" + data.graph_width + "'" +
|
||
" graph_height='" + data.graph_height + "'" +
|
||
" width='" + data.image_width + "'" +
|
||
" height='" + data.image_height + "'" +
|
||
" image_width='" + data.image_width + "'" +
|
||
" image_height='" + data.image_height + "'" +
|
||
" canvas_top='" + data.graph_top + "'" +
|
||
" canvas_left='" + data.graph_left + "'" +
|
||
" canvas_width='" + data.graph_width + "'" +
|
||
" canvas_height='" + data.graph_height + "'" +
|
||
" value_min='" + data.value_min + "'" +
|
||
" value_max='" + data.value_max + "'>"
|
||
);
|
||
|
||
$('#graph_' + data.local_graph_id).zoom({
|
||
inputfieldStartTime: 'date1',
|
||
inputfieldEndTime: 'date2',
|
||
serverTimeOffset: timeOffset
|
||
});
|
||
|
||
data = undefined;
|
||
}
|
||
});
|
||
}
|
||
|
||
function refreshGraphs() {
|
||
var post = {
|
||
'predefined_timespan': $('#predefined_timespan').val(),
|
||
__csrf_magic: csrfMagicToken
|
||
};
|
||
|
||
$.ajax({
|
||
type: 'POST',
|
||
url: document.location.pathname + '?action=update_timespan',
|
||
data: post,
|
||
dataType: 'json'
|
||
}).done(function(data) {
|
||
$('#date1').val(data.date1);
|
||
$('#date2').val(data.date2);
|
||
initializeGraphs();
|
||
});
|
||
}
|
||
|
||
function initializeGraphs(disable_cache) {
|
||
disable_cache = (typeof disable_cache == 'undefined') ? false : true;
|
||
|
||
$.ajaxQ.abortAll();
|
||
|
||
$('a[id$="_mrtg"]').each(function () {
|
||
var graph_id = $(this).attr('id').replace('graph_', '').replace('_mrtg', '');
|
||
|
||
var tree = $('#navigation').length ? true:false;
|
||
|
||
$(this).attr('href', urlPath + pageName + 'action=view' + (tree ? '-tree':'-preview') + '&local_graph_id=' + graph_id);
|
||
|
||
$(this).off('click').on('click', function (event) {
|
||
if (!shouldCaptureClick(event))
|
||
return;
|
||
|
||
var graph_id = $(this).attr('id').replace('graph_', '').replace('_mrtg', '');
|
||
var tree = $('#navigation').length ? true:false;
|
||
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
|
||
loadUrl({ url: urlPath + pageName + '?action=view' + (tree ? '-tree':'-preview') + '&local_graph_id=' + graph_id });
|
||
});
|
||
});
|
||
|
||
// Get these outside of the each to reduce calls
|
||
var timestampDate1 = getTimestampFromDate($('#date1').val());
|
||
var timestampDate2 = getTimestampFromDate($('#date2').val());
|
||
|
||
graph_start = timestampDate1;
|
||
graph_end = timestampDate2;
|
||
|
||
if (timestampDate1 <= 0) {
|
||
return false;
|
||
}
|
||
|
||
$('a[id$="_csv"]').each(function () {
|
||
var graph_id = $(this).attr('id').replace('graph_', '').replace('_csv', '');
|
||
|
||
// Disable context menu
|
||
$(this).children().contextmenu(function () {
|
||
return false;
|
||
});
|
||
|
||
var url = urlPath +
|
||
'graph_xport.php' +
|
||
'?local_graph_id=' + graph_id +
|
||
'&rra_id=0' +
|
||
'&view_type=tree' +
|
||
'&graph_start=' + graph_start +
|
||
'&graph_end=' + graph_end;
|
||
|
||
$(this).attr('href', url);
|
||
|
||
$(this).off('click').on('click', function (event) {
|
||
if (!shouldCaptureClick(event))
|
||
return;
|
||
|
||
var graph_id = $(this).attr('id').replace('graph_', '').replace('_csv', '');
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
|
||
document.location = urlPath +
|
||
'graph_xport.php' +
|
||
'?local_graph_id=' + graph_id +
|
||
'&rra_id=0' +
|
||
'&view_type=tree' +
|
||
'&graph_start=' + graph_start +
|
||
'&graph_end=' + graph_end;
|
||
|
||
Pace.stop();
|
||
});
|
||
});
|
||
|
||
$('#form_graph_view').off('submit').on('submit', function (event) {
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
applyFilter();
|
||
});
|
||
|
||
var mainWidth = getMainWidth() - 30;
|
||
var myColumns = $('#columns').val();
|
||
var isThumb = $('#thumbnails').is(':checked') || $('#thumbnails').val() == 'true';
|
||
var isBusiness = $('#business_hours').is(':checked') || $('#business_hours').val() == 'true';
|
||
var myWidth = (mainWidth - (30 * myColumns)) / myColumns;
|
||
var numGraphs = $('.graphWrapper').length;
|
||
var isSource = $('#graph_source').length ? true:false;
|
||
var isOrder = $('#graph_order').length ? true:false;
|
||
var isCF = $('#cf').length ? true:false;
|
||
var isMeasure = $('#measure').length ? true:false;
|
||
|
||
$('.graphWrapper').each(function () {
|
||
var graph_id = $(this).attr('graph_id');
|
||
if (!(graph_id > 0)) {
|
||
graph_id = $(this).attr('id').replace('wrapper_', '');
|
||
}
|
||
|
||
var rra_id = $(this).attr('rra_id');
|
||
if (!(rra_id > 0)) {
|
||
rra_id = 0;
|
||
}
|
||
|
||
var graph_start = $(this).attr('graph_start') || '';
|
||
var graph_end = $(this).attr('graph_end') || '';
|
||
var graph_height = $(this).attr('graph_height');
|
||
var graph_width = $(this).attr('graph_width');
|
||
var error_url = urlPath + 'graph_view.php';
|
||
|
||
closeDateFilters();
|
||
|
||
var url = urlPath + 'graph_json.php' +
|
||
'?rra_id=' + rra_id +
|
||
'&local_graph_id=' + graph_id +
|
||
'&graph_start=' + graph_start +
|
||
'&graph_end=' + graph_end +
|
||
'&graph_height=' + graph_height +
|
||
'&graph_width=' + graph_width +
|
||
(isSource ? '&graph_source='+$('#graph_source').val() : '') +
|
||
(isOrder ? '&graph_order='+$('#graph_order').val() : '') +
|
||
(isCF ? '&cf='+$('#cf').val() : '') +
|
||
(isMeasure ? '&measure='+$('#measure').val() : '') +
|
||
(disable_cache ? '&disable_cache=true' : '') +
|
||
(isThumb ? '&graph_nolegend=true' : '') +
|
||
'&business_hours=' + (isBusiness ? 'true' : 'false');
|
||
|
||
$.getJSON(url)
|
||
.done(function (data) {
|
||
if (myWidth < data.image_width) {
|
||
ratio = myWidth / data.image_width;
|
||
|
||
data.image_width = parseInt(data.image_width * ratio);
|
||
data.image_height = parseInt(data.image_height * ratio);
|
||
data.graph_width = parseInt(data.graph_width * ratio);
|
||
data.graph_height = parseInt(data.graph_height * ratio);
|
||
data.graph_top = parseInt(data.graph_top * ratio);
|
||
data.graph_left = parseInt(data.graph_left * ratio);
|
||
}
|
||
|
||
var wrapper_id = '#wrapper_' + data.local_graph_id;
|
||
|
||
if (rra_id > 0) {
|
||
wrapper_id += '[rra_id=\'' + data.rra_id + '\']';
|
||
}
|
||
|
||
let raw_data_compressed = {};
|
||
if(data.data !== undefined) raw_data_compressed.data = data.data;
|
||
if(data.meta !== undefined) raw_data_compressed.meta = data.meta;
|
||
raw_data_compressed = lzjs.compressToBase64(JSON.stringify(raw_data_compressed));
|
||
|
||
$(wrapper_id).empty().html(
|
||
"<img class='graphimage' id='graph_" + data.local_graph_id + "'" +
|
||
" src='data:image/" + data.type + ";base64," + data.image + "'" +
|
||
" data-raw='" + raw_data_compressed + "'" +
|
||
" rra_id='" + data.rra_id + "'" +
|
||
" graph_type='" + data.type + "'" +
|
||
" graph_id='" + data.local_graph_id + "'" +
|
||
" graph_start='" + data.graph_start + "'" +
|
||
" graph_end='" + data.graph_end + "'" +
|
||
" graph_left='" + data.graph_left + "'" +
|
||
" graph_top='" + data.graph_top + "'" +
|
||
" graph_width='" + data.graph_width + "'" +
|
||
" graph_height='" + data.graph_height + "'" +
|
||
" width='" + data.image_width + "'" +
|
||
" height='" + data.image_height + "'" +
|
||
" image_width='" + data.image_width + "'" +
|
||
" image_height='" + data.image_height + "'" +
|
||
" canvas_top='" + data.graph_top + "'" +
|
||
" canvas_left='" + data.graph_left + "'" +
|
||
" canvas_width='" + data.graph_width + "'" +
|
||
" canvas_height='" + data.graph_height + "'" +
|
||
" value_min='" + data.value_min + "'" +
|
||
" value_max='" + data.value_max + "'>"
|
||
);
|
||
|
||
var graph_id = '#graph_' + data.local_graph_id;
|
||
if (rra_id > 0) {
|
||
graph_id += '[rra_id=\'' + data.rra_id + '\']';
|
||
}
|
||
|
||
$(graph_id).zoom({
|
||
inputfieldStartTime: 'date1',
|
||
inputfieldEndTime: 'date2',
|
||
serverTimeOffset: timeOffset
|
||
});
|
||
|
||
if (typeof realtimeArray != 'undefined') {
|
||
realtimeArray[data.local_graph_id] = false;
|
||
}
|
||
|
||
if (!--numGraphs) {
|
||
responsiveResizeGraphs();
|
||
}
|
||
|
||
data = undefined;
|
||
})
|
||
.fail(function (data) {
|
||
getPresentHTTPErrorOrRedirect(data, error_url);
|
||
});
|
||
});
|
||
|
||
$('#realtimeoff').off('click').on('click', function () {
|
||
stopRealtime();
|
||
});
|
||
|
||
$('#ds_step').off('change').on('change', function () {
|
||
realtimeGrapher();
|
||
});
|
||
|
||
$('a[id$="_util"]').each(function () {
|
||
var graph_id = $(this).attr('id').replace('graph_', '').replace('_util', '');
|
||
var tree = $('#navigation').length ? true:false;
|
||
|
||
$(this).attr('href', urlPath + pageName +
|
||
'?action=zoom' + (tree ? '-tree':'-preview') +
|
||
'&rra_id=0' +
|
||
'&business_hours=' + (isBusiness ? 'true' : 'false') +
|
||
'&local_graph_id=' + graph_id +
|
||
'&graph_start=' + timestampDate1 +
|
||
'&graph_end=' + timestampDate2);
|
||
|
||
$(this).off('click').on('click', function (event) {
|
||
if (!shouldCaptureClick(event))
|
||
return;
|
||
|
||
var graph_id = $(this).attr('id').replace('graph_', '').replace('_util', '');
|
||
var tree = $('#navigation').length ? true:false;
|
||
var graph_url = urlPath + pageName +
|
||
'?action=zoom' + (tree ? '-tree':'-preview') +
|
||
'&local_graph_id=' + graph_id +
|
||
'&rra_id=0' +
|
||
'&business_hours=' + (isBusiness ? 'true' : 'false') +
|
||
'&graph_start=' + getTimestampFromDate($('#date1').val()) +
|
||
'&graph_end=' + getTimestampFromDate($('#date2').val());
|
||
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
|
||
loadUrl({ url: graph_url });
|
||
});
|
||
});
|
||
|
||
$('a[id$="_realtime"]').each(function () {
|
||
// Disable right click
|
||
$(this).children().on('contextmenu', function (event) {
|
||
return false;
|
||
});
|
||
|
||
$(this).off('click').on('click', function (event) {
|
||
if (!shouldCaptureClick(event))
|
||
return;
|
||
|
||
var graph_id = $(this).attr('id').replace('graph_', '').replace('_realtime', '');
|
||
|
||
event.preventDefault();
|
||
event.stopPropagation();
|
||
|
||
if (realtimeArray[graph_id]) {
|
||
$('#wrapper_' + graph_id).html(keepRealtime[graph_id]).trigger('change');
|
||
$(this).html("<i class='drillDown ti ti-chart-area-line-filled realTime' title='" + realtimeClickOn + "'></i>");
|
||
|
||
$('graph_id' + graph_id).tooltip().zoom({
|
||
inputfieldStartTime: 'date1',
|
||
inputfieldEndTime: 'date2',
|
||
serverTimeOffset: timeOffset
|
||
});
|
||
|
||
realtimeArray[graph_id] = false;
|
||
setFilters();
|
||
} else {
|
||
keepRealtime[graph_id] = $('#wrapper_' + graph_id).html();
|
||
$(this).html("<i style='text-align:center;padding:0px;' title='" + realtimeClickOff + "' class='drillDown ti ti-loader-2 fa-spin'></i>");
|
||
$(this).find('i').tooltip();
|
||
realtimeArray[graph_id] = true;
|
||
setFilters();
|
||
realtimeGrapher();
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
$.widget('ui.tooltip', $.ui.tooltip, {
|
||
_create: function() {
|
||
this._on( {
|
||
mouseover: 'open',
|
||
focusin: 'open'
|
||
} );
|
||
|
||
// IDs of generated tooltips, needed for destroy
|
||
this.tooltips = {};
|
||
|
||
// IDs of parent tooltips where we removed the title attribute
|
||
this.parents = {};
|
||
|
||
// Append the aria-live region so tooltips announce correctly,
|
||
// but only once !
|
||
let liveRegion = $('[role=log].ui-helper-hidden-accessible');
|
||
if ( liveRegion.length === 0 ) {
|
||
this.liveRegion = $( '<div>' )
|
||
.attr( {
|
||
role: 'log',
|
||
'aria-live': 'assertive',
|
||
'aria-relevant': 'additions'
|
||
} )
|
||
.appendTo( this.document[ 0 ].body );
|
||
this._addClass( this.liveRegion, null, 'ui-helper-hidden-accessible' );
|
||
}else{
|
||
this.liveRegion = liveRegion;
|
||
}
|
||
this.disabledTitles = $( [] );
|
||
},
|
||
close: function( event ) {
|
||
var target = $( event ? event.currentTarget : this.element );
|
||
|
||
if ( target.length && target.data( 'cacti-tooltip-pinned' ) === true ) {
|
||
return;
|
||
}
|
||
|
||
return this._super( event );
|
||
},
|
||
_open: function( event, target, content ) {
|
||
var tooltipData, tooltip, delayedShow, a11yContent,
|
||
positionOption = $.extend( {}, this.options.position );
|
||
|
||
if ( !content ) {
|
||
return;
|
||
}
|
||
|
||
// Content can be updated multiple times. If the tooltip already
|
||
// exists, then just update the content and bail.
|
||
tooltipData = this._find( target );
|
||
if ( tooltipData ) {
|
||
tooltipData.tooltip.find( '.ui-tooltip-content' ).html( content );
|
||
return;
|
||
}
|
||
|
||
// If we have a title, clear it to prevent the native tooltip
|
||
// we have to check first to avoid defining a title if none exists
|
||
// (we don't want to cause an element to start matching [title])
|
||
//
|
||
// We use removeAttr only for key events, to allow IE to export the correct
|
||
// accessible attributes. For mouse events, set to empty string to avoid
|
||
// native tooltip showing up (happens only when removing inside mouseover).
|
||
if ( target.is( '[title]' ) ) {
|
||
if ( event && event.type === 'mouseover' ) {
|
||
target.attr( 'title', '' );
|
||
} else {
|
||
target.removeAttr( 'title' );
|
||
}
|
||
}
|
||
|
||
tooltipData = this._tooltip( target );
|
||
tooltip = tooltipData.tooltip;
|
||
this._addDescribedBy( target, tooltip.attr( 'id' ) );
|
||
tooltip.find( '.ui-tooltip-content' ).html( content );
|
||
|
||
// Support: Voiceover on OS X, JAWS on IE <= 9
|
||
// JAWS announces deletions even when aria-relevant="additions"
|
||
// Voiceover will sometimes re-read the entire log region's contents from the beginning
|
||
this.liveRegion.empty();
|
||
a11yContent = $( '<div>' ).html( tooltip.find( '.ui-tooltip-content' ).html() );
|
||
a11yContent.removeAttr( 'name' ).find( '[name]' ).removeAttr( 'name' );
|
||
a11yContent.removeAttr( 'id' ).find( '[id]' ).removeAttr( 'id' );
|
||
a11yContent.appendTo( this.liveRegion );
|
||
|
||
function position( event ) {
|
||
positionOption.of = event;
|
||
if ( tooltip.is( ':hidden' ) ) {
|
||
return;
|
||
}
|
||
tooltip.position( positionOption );
|
||
}
|
||
if ( this.options.track && event && /^mouse/.test( event.type ) ) {
|
||
this._on( this.document, {
|
||
mousemove: position
|
||
} );
|
||
|
||
// trigger once to override element-relative positioning
|
||
position( event );
|
||
} else {
|
||
tooltip.position( $.extend( {
|
||
of: target
|
||
}, this.options.position ) );
|
||
}
|
||
|
||
tooltip.hide();
|
||
|
||
this._show( tooltip, this.options.show );
|
||
|
||
// Handle tracking tooltips that are shown with a delay (#8644). As soon
|
||
// as the tooltip is visible, position the tooltip using the most recent
|
||
// event.
|
||
// Adds the check to add the timers only when both delay and track options are set (#14682)
|
||
if ( this.options.track && this.options.show && this.options.show.delay ) {
|
||
delayedShow = this.delayedShow = setInterval( function() {
|
||
if ( tooltip.is( ':visible' ) ) {
|
||
position( positionOption.of );
|
||
clearInterval( delayedShow );
|
||
}
|
||
}, 13 );
|
||
}
|
||
|
||
this._trigger( 'open', event, { tooltip: tooltip } );
|
||
},
|
||
})
|
||
|
||
$.widget('custom.languageselect', $.ui.selectmenu, {
|
||
_renderItem: function (ul, item) {
|
||
var li = $('<li>');
|
||
var wrapper = $('<div>', { text: item.label });
|
||
if (item.disabled) {
|
||
li.addClass('ui-state-disabled');
|
||
}
|
||
|
||
$('<span>', {
|
||
style: item.element.attr('data-style') + ';float:right',
|
||
'class': 'right fi fis ' + item.element.attr('data-class')
|
||
}).appendTo(wrapper);
|
||
|
||
return li.append(wrapper).appendTo(ul);
|
||
}
|
||
});
|
||
|
||
// combobox example borrowed from jqueryui
|
||
$.widget('custom.dropcolor', {
|
||
_create: function () {
|
||
this.wrapper = $('<span style="display:inline-flex"><span class="ui-select-text"><div id="bgc" class="ui-icon color-icon" style="margin-left:2px;margin-right:3px;"></div></span></span>')
|
||
.addClass('ui-selectmenu-button ui-selectmenu-button-closed ui-corner-all ui-button ui-widget')
|
||
.insertAfter(this.element);
|
||
|
||
this.element.hide();
|
||
this._createAutocomplete();
|
||
this._createShowAllButton();
|
||
},
|
||
|
||
_createAutocomplete: function () {
|
||
var selected = this.element.children(':selected');
|
||
var value = selected.val() ? selected.text() : '';
|
||
var regExp = /\(([^)]+)\)/;
|
||
var hex = regExp.exec(value);
|
||
|
||
if (hex != null) {
|
||
this.wrapper.find('#bgc').css('background-color', '#' + hex[1]);
|
||
}
|
||
// GHSA-9x9h-2577-9w86: build the input as a node so a colour name cannot
|
||
// break out of the value attribute once the browser decodes the entities.
|
||
this.input = $('<input>', {
|
||
'class': 'ui-autocomplete-input ui-state-default ui-selectmenu-text',
|
||
style: 'background:transparent;border:0px;padding:0px;padding-left:24px;margin-left:-24px',
|
||
value: value
|
||
})
|
||
.appendTo(this.wrapper)
|
||
.on('click', function () {
|
||
$(this).autocomplete('search', '');
|
||
})
|
||
.autocomplete({
|
||
delay: 0,
|
||
minLength: 0,
|
||
source: this._source.bind(this),
|
||
select: this._select.bind(this),
|
||
search: function () {
|
||
$(this).data('ui-autocomplete').menu.bindings = $();
|
||
},
|
||
close: function () {
|
||
$(this).data('ui-autocomplete').menu.bindings = $();
|
||
},
|
||
create: function () {
|
||
$(this).data('ui-autocomplete')._renderItem = function (ul, item) {
|
||
var regExp = /\(([^)]+)\)/;
|
||
var hex = regExp.exec(item.label);
|
||
// GHSA-9x9h-2577-9w86: item.label is plain text; drop the
|
||
// parseHTML round-trip that re-parses it as HTML.
|
||
var label = item.label;
|
||
|
||
if (hex !== null) {
|
||
color = hex[1];
|
||
return $('<li>').attr('data-value', item.value).append($('<div>').append($('<span class="ui-icon color-icon">').css('background-color', '#' + color), document.createTextNode(label))).appendTo(ul);
|
||
} else {
|
||
return $('<li>').attr('data-value', item.value).append($('<div>').append($('<span class="ui-icon color-icon"></span>'), document.createTextNode(label))).appendTo(ul);
|
||
}
|
||
}
|
||
|
||
$(this).data('ui-autocomplete')._resizeMenu = function () {
|
||
var ul = this.menu.element;
|
||
ul.outerWidth('220px');
|
||
}
|
||
}
|
||
});
|
||
|
||
this._on(this.input, {
|
||
autocompleteselect: function (event, ui) {
|
||
ui.item.option.selected = true;
|
||
this._trigger('select', event, {
|
||
item: ui.item.option
|
||
});
|
||
},
|
||
|
||
autocompletechange: '_removeIfInvalid'
|
||
});
|
||
},
|
||
|
||
_select: function (event, ui) {
|
||
var regExp = /\(([^)]+)\)/;
|
||
var hex = regExp.exec(ui.item.label);
|
||
var id = $(ui.item.option).attr('value');
|
||
|
||
if (hex !== null) {
|
||
color = hex[1];
|
||
this.wrapper.find('#bgc').css('background-color', '#' + color);
|
||
this.wrapper.find('input').val(ui.item.value);
|
||
} else {
|
||
this.wrapper.find('#bgc').css('background-color', '');
|
||
this.wrapper.find('input').val(ui.item.value);
|
||
}
|
||
},
|
||
|
||
_createShowAllButton: function () {
|
||
var input = this.input;
|
||
var wasOpen = false;
|
||
|
||
$('<span>')
|
||
.attr('tabIndex', -1)
|
||
.appendTo(this.wrapper)
|
||
.addClass('ui-icon ui-icon-triangle-1-s ui-selectmenu-icon')
|
||
.on('mousedown', function () {
|
||
wasOpen = input.autocomplete('widget').is(':visible');
|
||
})
|
||
.on('click', function () {
|
||
input.trigger('focus');
|
||
|
||
// Close if already visible
|
||
if (wasOpen) {
|
||
return;
|
||
}
|
||
|
||
input.autocomplete('search', '');
|
||
});
|
||
},
|
||
|
||
_source: function (request, response) {
|
||
var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), 'i');
|
||
results = this.element.children('option').map(function () {
|
||
var text = $(this).text();
|
||
if (this.value && (!request.term || matcher.test(text))) {
|
||
return {
|
||
label: text,
|
||
value: text,
|
||
option: this
|
||
};
|
||
}
|
||
});
|
||
|
||
response(results);
|
||
},
|
||
|
||
_removeIfInvalid: function (event, ui) {
|
||
// Selected an item, nothing to do
|
||
if (ui.item) {
|
||
return;
|
||
}
|
||
|
||
// Search for a match (case-insensitive)
|
||
var value = this.input.val();
|
||
var valueLowerCase = value.toLowerCase();
|
||
var valid = false;
|
||
|
||
this.element.children('option').each(function () {
|
||
if ($(this).text().toLowerCase() === valueLowerCase) {
|
||
this.selected = valid = true;
|
||
return false;
|
||
}
|
||
});
|
||
|
||
// Found a match, nothing to do
|
||
if (valid) {
|
||
return;
|
||
}
|
||
|
||
// Remove invalid value
|
||
this.input.val('');
|
||
this.element.val('');
|
||
this._delay(function () {
|
||
this.input.tooltip('close').attr('title', '');
|
||
}, 2500);
|
||
this.input.autocomplete('instance').term = '';
|
||
},
|
||
|
||
_destroy: function () {
|
||
this.wrapper.remove();
|
||
this.element.show();
|
||
}
|
||
});
|
||
|
||
function makeCallbacks() {
|
||
var cn = 0;
|
||
|
||
$('.drop-callback').each(function() {
|
||
var title = searchSelect;
|
||
var action = $(this).attr('data-action');
|
||
var value = $(this).attr('data-value');
|
||
var reqvars = $(this).attr('data-variables');
|
||
|
||
var Id = $(this).attr('id');
|
||
var dcId = '#' + Id;
|
||
var dcWrap = dcId + '_wrap';
|
||
var dcWrapId = Id + '_wrap';
|
||
var dcClickId = Id + '_click';
|
||
var dcInput = dcId + '_input';
|
||
var dcInputId = Id + '_input';
|
||
var dcDisable = $(dcId).hasClass('ui-state-disabled');
|
||
|
||
var dcInputFields = 'input' + dcId + '_input';
|
||
|
||
$(dcId).attr('data-callback-id', cn);
|
||
|
||
if ($(dcWrap).length) {
|
||
$(dcWrap).remove();
|
||
}
|
||
|
||
if (value == '') {
|
||
value = title;
|
||
}
|
||
|
||
var dialogForm = $('<span class="ui-selectmenu-button ui-selectmenu-button-closed ui-corner-all ui-button ui-widget">')
|
||
.attr('id', dcWrapId)
|
||
.toggleClass('ui-selectmenu-disabled ui-state-disabled', !!dcDisable);
|
||
dialogForm.append($('<span style="z-index:4" class="ui-selectmenu-icon ui-icon ui-icon-triangle-1-s">').attr('id', dcClickId));
|
||
dialogForm.append($('<span class="ui-select-text">').append($('<input type="text" class="ui-state-default ui-corner-all">').attr('id', dcInputId).val(value)));
|
||
|
||
$(this).after(dialogForm, document.createTextNode(' '));
|
||
$(this).hide();
|
||
|
||
$(dcInput).autocomplete({
|
||
source: function(request, response) {
|
||
var _action = pageName + '?action=' + action;
|
||
|
||
if (reqvars != '') {
|
||
var variables = reqvars.split(',');
|
||
|
||
$.each(variables, function(index, data) {
|
||
if ($('#'+data).length) {
|
||
_action += "&" + data + "=" + $('#'+data).val();
|
||
}
|
||
});
|
||
}
|
||
|
||
_action += '&term=' + request.term;
|
||
|
||
$.getJSON(_action, function(data) {
|
||
response(data);
|
||
});
|
||
},
|
||
autoFocus: true,
|
||
minLength: 0,
|
||
select: function(event, ui) {
|
||
var callBack = $(dcId).attr('data-callback');
|
||
|
||
$(dcInput).val(ui.item.label);
|
||
|
||
if (ui.item.id) {
|
||
$(dcId).val(ui.item.id);
|
||
} else {
|
||
$(dcId).val(ui.item.value);
|
||
}
|
||
|
||
if (callBack != '') {
|
||
callBack = callBack.replace('(', '').replace(')', '');
|
||
|
||
executeFunctionByName(callBack, window);
|
||
}
|
||
},
|
||
open: function(event, ui) {
|
||
$('.ui-dialog').css('z-index', '20');
|
||
$(this).css('z-index', '5000');
|
||
},
|
||
close: function(event, ui) {
|
||
var cn = $(dcId).attr('data-callback-id');
|
||
callbackOpen[cn] = false;
|
||
clearTimeout(callbackTimer[cn]);
|
||
}
|
||
}).css('border', 'none').css('background-color', 'transparent');
|
||
|
||
$(dcWrap).on('dblclick', function() {
|
||
var cn = $(dcId).attr('data-callback-id');
|
||
|
||
callbackOpen[cn] = false;
|
||
|
||
clearTimeout(callbackTimer[cn]);
|
||
|
||
clearTimeout(callbackClickTimer[cn]);
|
||
$(dcInput).autocomplete('close').select();
|
||
}).on('click', function() {
|
||
var cn = $(dcId).attr('data-callback-id');
|
||
|
||
if (callbackOpen[cn]) {
|
||
$(dcInput).autocomplete('close');
|
||
clearTimeout(callbackTimer[cn]);
|
||
callbackOpen[cn] = false;
|
||
} else {
|
||
callbackClickTimer[cn] = setTimeout(function() {
|
||
var cn = $(dcId).attr('data-callback-id');
|
||
$(dcInput).autocomplete('search', '');
|
||
|
||
clearTimeout(callbackTimer[cn]);
|
||
callbackOpen[cn] = true;
|
||
}, 200);
|
||
}
|
||
$(dcInput).select();
|
||
}).on('mouseleave', function() {
|
||
var cn = $(dcId).attr('data-callback-id');
|
||
|
||
callbackTimer[cn] = setTimeout(function() { $(dcInput).autocomplete('close'); }, 800);
|
||
});
|
||
|
||
var width = $(dcInput).textBoxWidth();
|
||
if (width < 200) {
|
||
width = 200;
|
||
}
|
||
|
||
$(dcWrap).css('width', width+20);
|
||
$(dcInput).css('width', width);
|
||
$(dcWrap).find('.ui-select-text').css('width', width);
|
||
|
||
$('ul[id^="ui-id"]').on('mouseenter', function() {
|
||
var cn = $(dcId).attr('data-callback-id');
|
||
clearTimeout(callbackTimer[cn]);
|
||
}).on('mouseleave', function() {
|
||
var cn = $(dcId).attr('data-callback-id');
|
||
callbackTimer[cn] = setTimeout(function() {
|
||
$(dcInput).autocomplete('close');
|
||
}, 800);
|
||
});
|
||
|
||
$('ul[id^="ui-id"] > li').on('mouseenter', function() {
|
||
$(this).addClass('ui-state-hover');
|
||
}).on('mouseleave', function() {
|
||
$(this).removeClass('ui-state-hover');
|
||
});
|
||
|
||
$(dcWrap).on('mouseenter', function() {
|
||
$(this).addClass('ui-state-hover');
|
||
|
||
if ($('input#' + id + '_input').length) {
|
||
$('input#' + id + '_input').addClass('ui-state-hover');
|
||
}
|
||
}).on('mouseleave', function() {
|
||
$(this).removeClass('ui-state-hover');
|
||
$(dcInputFields).removeClass('ui-state-hover');
|
||
});
|
||
|
||
cn++;
|
||
});
|
||
}
|
||
|
||
function expandClipboardSection(section) {
|
||
var isVisible = section.is(':visible');
|
||
if (!isVisible) {
|
||
section.slideDown('fast');
|
||
}
|
||
|
||
var children = section.find('table').each(function (i) {
|
||
expandClipboardSection($(this));
|
||
});
|
||
}
|
||
|
||
function copyToClipboard(containerId) {
|
||
var clipboardDataId = containerId.replace('copyToClipboard', 'clipboardData');
|
||
var clipboardData = document.getElementById(clipboardDataId);
|
||
|
||
var messageWidth = $(window).width();
|
||
if (messageWidth > 350) {
|
||
messageWidth = 350;
|
||
} else {
|
||
messageWidth -= 50;
|
||
}
|
||
|
||
if (clipboardData == null) {
|
||
$('body').append('<div style="display:none;" id="clipboardMessage" title="' + clipboard + '">' + clipboardCopyFailed + '<br/><br/>' + clipboardID + ': ' + clipboardDataId + '</div>');
|
||
|
||
$('#clipboardMessage').dialog({
|
||
resizable: false,
|
||
draggable: false,
|
||
height: 170,
|
||
width: messageWidth,
|
||
buttons: {
|
||
Ok: function () {
|
||
$(this).dialog('close');
|
||
$('#clipboardMessage').remove();
|
||
}
|
||
}
|
||
});
|
||
|
||
$('#clipboardMessage').dialog('open');
|
||
} else if (!document.queryCommandSupported('copy')) {
|
||
$('body').append('<div style="display:none;" id="clipboardMessage" title="' + clipboard + '">' + clipboardNotAvailable + '</div>');
|
||
|
||
$('#clipboardMessage').dialog({
|
||
resizable: false,
|
||
draggable: false,
|
||
height: 120,
|
||
width: messageWidth,
|
||
buttons: {
|
||
Ok: function () {
|
||
$(this).dialog('close');
|
||
$('#clipboardMessage').remove();
|
||
}
|
||
}
|
||
});
|
||
|
||
$('#clipboardMessage').dialog('open');
|
||
} else {
|
||
var clipboardHeaderId = containerId.replace('copyToClipboard', 'clipboardHeader');
|
||
var clipboardHeader = document.getElementById(clipboardHeaderId);
|
||
|
||
if (clipboardData != null) {
|
||
expandClipboardSection($(clipboardData));
|
||
}
|
||
|
||
if (clipboardHeader != null) {
|
||
expandClipboardSection($(clipboardHeader));
|
||
}
|
||
|
||
// get Selection object from currently user selected text
|
||
var selection = window.getSelection();
|
||
|
||
// unselect any user selected text (if any)
|
||
selection.removeAllRanges();
|
||
|
||
// create new range object
|
||
var range = document.createRange();
|
||
|
||
// set range to encompass desired element text
|
||
if (clipboardHeader == null) {
|
||
range.selectNode(clipboardData);
|
||
} else {
|
||
range.selectNode(clipboardHeader);
|
||
}
|
||
|
||
// add range to Selection object to select it
|
||
selection.addRange(range);
|
||
|
||
var success = document.execCommand('copy');
|
||
selection.removeAllRanges();
|
||
|
||
var successMessage = (!success ? clipboardNotUpdated : clipboardUpdated);
|
||
|
||
$('body').append('<div style="display:none;" id="clipboardMessage" title="' + clipboard + '">' + successMessage + '</div>');
|
||
|
||
$('#clipboardMessage').dialog({
|
||
resizable: false,
|
||
draggable: false,
|
||
height: 120,
|
||
width: messageWidth,
|
||
buttons: {
|
||
Ok: function () {
|
||
$(this).dialog('close');
|
||
$('#clipboardMessage').remove();
|
||
}
|
||
}
|
||
});
|
||
|
||
$('#clipboardMessage').dialog('open');
|
||
}
|
||
}
|
||
|
||
var snmp_password = '';
|
||
var snmp_auth_protocol = '';
|
||
var snmp_priv_protocol = '';
|
||
var snmp_priv_passphrase = '';
|
||
var snmp_security_initialized = false;
|
||
|
||
function storeSNMPSecurity() {
|
||
if ($('#snmp_version').val() == '3') {
|
||
if ($('#snmp_auth_protocol').val() != '[None]') {
|
||
snmp_auth_protocol = $('#snmp_auth_protocol').val();
|
||
snmp_password = $('#snmp_password').val();
|
||
} else {
|
||
snmp_auth_protocol = '';
|
||
snmp_password = '';
|
||
}
|
||
|
||
if ($('#snmp_priv_protocol').val() != '[None]') {
|
||
snmp_priv_protocol = $('#snmp_priv_protocol').val();
|
||
snmp_priv_passphrase = $('#snmp_priv_passphrase').val();
|
||
} else {
|
||
snmp_priv_protocol = '';
|
||
snmp_priv_passphrase = '';
|
||
}
|
||
} else {
|
||
$('#snmp_security_level').val(defaultSNMPSecurityLevel);
|
||
}
|
||
}
|
||
|
||
function setSNMPSecurity() {
|
||
if ($('#snmp_version').val() == '3') {
|
||
if (!snmp_security_initialized) {
|
||
if ($('#snmp_auth_protocol').val() == '[None]') {
|
||
$('#snmp_security_level').val('noAuthNoPriv');
|
||
} else if ($('#snmp_priv_protocol').val() == '[None]') {
|
||
$('#snmp_security_level').val('authNoPriv');
|
||
} else {
|
||
$('#snmp_security_level').val('authPriv');
|
||
}
|
||
|
||
var selectmenu = ($('#snmp_security_level').selectmenu('instance') !== undefined);
|
||
if (selectmenu) {
|
||
$('#snmp_security_level').selectmenu('refresh');
|
||
} else if ($('#snmp_security_level').hasClass('select2-hidden-accessible')) {
|
||
$('#snmp_security_level').trigger('change.select2');
|
||
}
|
||
|
||
$('#snmp_password').delayKeyup(function () {
|
||
checkSNMPPassphrase('auth');
|
||
});
|
||
|
||
$('#snmp_password_confirm').delayKeyup(function () {
|
||
checkSNMPPassphraseConfirm('auth');
|
||
});
|
||
|
||
$('#snmp_priv_passphrase').delayKeyup(function () {
|
||
checkSNMPPassphrase('priv');
|
||
});
|
||
|
||
$('#snmp_priv_passphrase_confirm').delayKeyup(function () {
|
||
checkSNMPPassphraseConfirm('priv');
|
||
});
|
||
}
|
||
|
||
snmp_security_initialized = true;
|
||
}
|
||
}
|
||
|
||
function setSNMP() {
|
||
var snmp_version = $('#snmp_version').val();
|
||
|
||
storeSNMPSecurity();
|
||
setSNMPSecurity();
|
||
|
||
let snmp_advanced = snmp_version > 2;
|
||
let snmp_basic = snmp_version > 0 && !snmp_advanced;
|
||
let snmp_none = !snmp_advanced && !snmp_basic;
|
||
|
||
if (snmp_version == 3) {
|
||
if ($('#snmp_security_level').val() == 'noAuthNoPriv') {
|
||
$('#snmp_auth_protocol option[value*="None"]').prop('disabled', false);
|
||
$('#snmp_priv_protocol option[value*="None"]').prop('disabled', false);
|
||
|
||
if ($('#snmp_auth_protocol').val() != '[None]') {
|
||
snmp_auth_protocol = $('#snmp_auth_protocol').val();
|
||
snmp_password = $('#snmp_password').val();
|
||
}
|
||
|
||
if ($('#snmp_priv_protocol').val() != '[None]') {
|
||
snmp_priv_protocol = $('#snmp_priv_protocol').val();
|
||
snmp_priv_passphrase = $('#snmp_priv_passphrase').val();
|
||
}
|
||
|
||
$('#snmp_auth_protocol').val('[None]');
|
||
$('#snmp_priv_protocol').val('[None]');
|
||
} else if ($('#snmp_security_level').val() == 'authNoPriv') {
|
||
$('#snmp_auth_protocol option[value*="None"]').prop('disabled', false);
|
||
$('#snmp_priv_protocol option[value*="None"]').prop('disabled', false);
|
||
|
||
if ($('#snmp_priv_protocol').val() != '[None]') {
|
||
snmp_priv_protocol = $('#snmp_priv_protocol').val();
|
||
snmp_priv_passphrase = $('#snmp_priv_passphrase').val();
|
||
}
|
||
|
||
if (snmp_auth_protocol != '[None]' && snmp_auth_protocol != '' && $('#snmp_auth_protocol').val() == '[None]') {
|
||
$('#snmp_auth_protocol').val(snmp_auth_protocol);
|
||
$('#snmp_password').val(snmp_password);
|
||
$('#snmp_password_confirm').val(snmp_password);
|
||
} else if ($('#snmp_auth_protocol').val() == '[None]' || $('#snmp_auth_protocol').val() == '') {
|
||
if (defaultSNMPAuthProtocol == '' || defaultSNMPAuthProtocol == '[None]') {
|
||
$('#snmp_auth_protocol').val('MD5');
|
||
} else {
|
||
$('#snmp_auth_protocol').val(defaultSNMPAuthProtocol);
|
||
}
|
||
}
|
||
|
||
$('#snmp_priv_protocol').val('[None]');
|
||
|
||
$('#snmp_auth_protocol option[value*="None"]').prop('disabled', true);
|
||
$('#snmp_priv_protocol option[value*="None"]').prop('disabled', false);
|
||
checkSNMPPassphrase('auth');
|
||
} else {
|
||
$('#snmp_auth_protocol option[value*="None"]').prop('disabled', false);
|
||
$('#snmp_priv_protocol option[value*="None"]').prop('disabled', false);
|
||
|
||
if (snmp_auth_protocol != '' && $('#snmp_auth_protocol').val() == '[None]') {
|
||
$('#snmp_auth_protocol').val(snmp_auth_protocol);
|
||
$('#snmp_password').val(snmp_password);
|
||
$('#snmp_password_confirm').val(snmp_password);
|
||
} else if ($('#snmp_auth_protocol').val() == '[None]' || $('#snmp_auth_protocol').val() == '') {
|
||
if (defaultSNMPAuthProtocol == '' || defaultSNMPAuthProtocol == '[None]') {
|
||
$('#snmp_auth_protocol').val('MD5');
|
||
} else {
|
||
$('#snmp_auth_protocol').val(defaultSNMPAuthProtocol);
|
||
}
|
||
}
|
||
|
||
if (snmp_priv_protocol != '' && $('#snmp_priv_protocol').val() == '[None]') {
|
||
$('#snmp_priv_protocol').val(snmp_priv_protocol);
|
||
$('#snmp_priv_passphrase').val(snmp_priv_passphrase);
|
||
$('#snmp_priv_passphrase_confirm').val(snmp_priv_passphrase);
|
||
} else if ($('#snmp_priv_protocol').val() == '[None]' || $('#snmp_priv_protocol').val() == '') {
|
||
if (defaultSNMPPrivProtocol == '' || defaultSNMPPrivProtocol == '[None]') {
|
||
$('#snmp_priv_protocol').val('DES');
|
||
} else {
|
||
$('#snmp_priv_protocol').val(defaultSNMPPrivProtocol);
|
||
}
|
||
}
|
||
|
||
$('#snmp_auth_protocol option[value*="None"]').prop('disabled', true);
|
||
$('#snmp_priv_protocol option[value*="None"]').prop('disabled', true);
|
||
checkSNMPPassphrase('auth');
|
||
checkSNMPPassphrase('priv');
|
||
}
|
||
|
||
if ($('#snmp_auth_protocol').val() == '[None]') {
|
||
$('#snmp_password').val('');
|
||
$('#snmp_password_confirm').val('');
|
||
}
|
||
|
||
if ($('#snmp_priv_protocol').val() == '[None]') {
|
||
$('#snmp_priv_passphrase').val('');
|
||
$('#snmp_priv_passphrase_confirm').val('');
|
||
}
|
||
}
|
||
|
||
|
||
var canSnmpAuth = !$('#snmp_auth_protocol').is(':disabled');
|
||
var canSnmpPriv = !$('#snmp_priv_protocol').is(':disabled');
|
||
var canSnmpAuthPass = $('#snmp_auth_protocol').val() != '[None]';
|
||
var canSnmpPrivPass = $('#snmp_priv_protocol').val() != '[None]';
|
||
|
||
toggleFields({
|
||
snmp_username: snmp_advanced && canSnmpAuthPass,
|
||
snmp_password: snmp_advanced && canSnmpAuthPass,
|
||
snmp_community: snmp_basic,
|
||
snmp_security_level: snmp_advanced && canSnmpAuth,
|
||
snmp_auth_password: snmp_advanced && canSnmpAuth && canSnmpAuthPass,
|
||
snmp_auth_protocol: snmp_advanced && canSnmpAuth && canSnmpAuthPass,
|
||
snmp_priv_passphrase: snmp_advanced && canSnmpPriv && canSnmpPrivPass,
|
||
snmp_priv_protocol: snmp_advanced && canSnmpPriv && canSnmpAuthPass,
|
||
snmp_engine_id: snmp_advanced,
|
||
snmp_context: snmp_advanced,
|
||
snmp_port: snmp_basic || snmp_advanced,
|
||
snmp_timeout: snmp_basic || snmp_advanced,
|
||
snmp_retries: snmp_basic || snmp_advanced,
|
||
max_oids: snmp_basic || snmp_advanced,
|
||
bulk_walk_size: snmp_basic || snmp_advanced,
|
||
});
|
||
|
||
selectmenu = ($('#snmp_security_level').selectmenu('instance') !== undefined);
|
||
if (selectmenu) {
|
||
$('#snmp_security_level').selectmenu('refresh');
|
||
$('#snmp_auth_protocol').selectmenu('refresh');
|
||
$('#snmp_priv_protocol').selectmenu('refresh');
|
||
}
|
||
|
||
if ($('#snmp_security_level').hasClass('select2-hidden-accessible')) {
|
||
$('#snmp_security_level').trigger('change.select2');
|
||
$('#snmp_auth_protocol').trigger('change.select2');
|
||
$('#snmp_priv_protocol').trigger('change.select2');
|
||
}
|
||
}
|
||
|
||
function checkSNMPPassphrase(type) {
|
||
var minChars = 8;
|
||
|
||
if (type == 'priv') {
|
||
var pass = '#snmp_priv_passphrase';
|
||
var conf = '#snmp_priv_passphrase_confirm';
|
||
var span = 'priv';
|
||
} else {
|
||
var pass = '#snmp_password';
|
||
var conf = '#snmp_password_confirm';
|
||
var span = 'auth';
|
||
}
|
||
|
||
if ($(pass).val().length == 0) {
|
||
$('#' + span).remove();
|
||
$('#' + span + 'conf').remove();
|
||
} else if ($(pass).val().length < minChars) {
|
||
$('#' + span).remove();
|
||
$(pass).after('<span id="' + span + '"><i class="badpassword ti ti-x"></i><span style="padding-left:4px;">' + passwordTooShort + '<span></span>');
|
||
checkSNMPPassphraseConfirm(type);
|
||
} else {
|
||
$('#' + span).remove();
|
||
$(pass).after('<span id="' + span + '"><i class="goodpassword ti ti-check"></i><span style="padding-left:4px;">' + passwordPass + '</span></span>');
|
||
checkSNMPPassphraseConfirm(type);
|
||
}
|
||
}
|
||
|
||
function checkSNMPPassphraseConfirm(type) {
|
||
var minChars = 8;
|
||
|
||
if (type == 'priv') {
|
||
var pass = '#snmp_priv_passphrase';
|
||
var conf = '#snmp_priv_passphrase_confirm';
|
||
var span = 'priv';
|
||
var spanconf = 'privconf';
|
||
} else {
|
||
var pass = '#snmp_password';
|
||
var conf = '#snmp_password_confirm';
|
||
var span = 'auth';
|
||
var spanconf = 'authconf';
|
||
}
|
||
|
||
if ($(conf).val().length < minChars) {
|
||
var passphrase = $(pass).val();
|
||
|
||
if (passphrase.indexOf($(conf).val()) == 0) {
|
||
$('#' + spanconf).remove();
|
||
$(conf).after('<span id="' + spanconf + '"><i class="badpassword ti ti-x"></i><span style="padding-left:4px;">' + passwordMatchTooShort + '<span></span>');
|
||
} else {
|
||
$('#' + spanconf).remove();
|
||
$(conf).after('<span id="' + spanconf + '"><i class="badpassword ti ti-x"></i><span style="padding-left:4px;">' + passwordNotMatchTooShort + '<span></span>');
|
||
}
|
||
} else {
|
||
if ($(pass).val() != $(conf).val()) {
|
||
$('#' + spanconf).remove();
|
||
$(conf).after('<span id="' + spanconf + '"><i class="badpassword ti ti-x"></i><span style="padding-left:4px;">' + passwordNotMatch + '</span></span>');
|
||
} else {
|
||
$('#' + span).remove();
|
||
$('#' + spanconf).remove();
|
||
$(pass).after('<span id="' + spanconf + '"><i class="goodpassword ti ti-check"></i><span style="padding-left:4px;">' + passwordMatch + '</span></span>');
|
||
}
|
||
}
|
||
}
|
||
|
||
// 0 - None
|
||
// 1 - Ping and SNMP Uptime
|
||
// 4 - Ping or SNMP Uptime
|
||
// 2 - SNMP Uptime
|
||
// 5 - SNMP Desc
|
||
// 6 - SNMP GetNext
|
||
// 7 - Stream Device
|
||
// 3 - Ping
|
||
const availabilityToggleOptions = ['1', '2', '4', '5', '6'];
|
||
const streamAvailabilityToggleOptions = ['0', '1', '2', '3', '4', '5', '6'];
|
||
const streamSNMPToggleOptions = ['1', '2', '3'];
|
||
|
||
function setAvailability() {
|
||
var hasChanged = false;
|
||
|
||
if ($('#availability_method').val() != '7') {
|
||
if ($('#snmp_version').val() == '0') {
|
||
$('#availability_method').disableOptions(availabilityToggleOptions, function() {
|
||
if ($('#availability_method').val() != '3' && $('#availability_method').val() != '0' && $('#availability_method').val() != '7') {
|
||
$('#availability_method').val('3');
|
||
}
|
||
});
|
||
} else {
|
||
$('#availability_method').enableOptions(availabilityToggleOptions);
|
||
}
|
||
|
||
var availability_method = $('#availability_method').val();
|
||
var canPing = true;
|
||
|
||
if (availability_method == 0 ||
|
||
availability_method == 2 ||
|
||
availability_method == 5 ||
|
||
availability_method == 6) {
|
||
$('#ping_method').val('1');
|
||
canPing = false;
|
||
} else if (availability_method == 7) {
|
||
$('#ping_method').val('0');
|
||
canPing = false;
|
||
}
|
||
} else {
|
||
$('#availability_method').disableOptions(streamAvailabilityToggleOptions, function() {
|
||
});
|
||
|
||
$('#snmp_version').disableOptions(streamSNMPToggleOptions);
|
||
|
||
canPing = false;
|
||
}
|
||
|
||
toggleFields({
|
||
ping_method: availability_method != 1 && availability_method != 3 && availability_method != 4,
|
||
ping_timeout: canPing,
|
||
ping_port: canPing,
|
||
ping_retries: canPing,
|
||
})
|
||
}
|
||
|
||
function setPing() {
|
||
var availability_method = $('#availability_method').val();
|
||
var ping_method = $('#ping_method').val();
|
||
var show_ping_port = (availability_method == 1 || availability_method == 4 || availability_method == 3) && ping_method != 1;
|
||
var show_ping_method = availability_method == 1 || availability_method == 3 || availability_method == 4;
|
||
var canPing = true;
|
||
|
||
if (availability_method != '7') {
|
||
if (availability_method == 0 ||
|
||
availability_method == 2 ||
|
||
availability_method == 5 ||
|
||
availability_method == 6) {
|
||
$('#ping_method').val('1');
|
||
canPing = false;
|
||
} else if (availability_method == 7) {
|
||
$('#ping_method').val('0');
|
||
canPing = false;
|
||
}
|
||
} else {
|
||
canPing = false;
|
||
}
|
||
|
||
toggleFields({
|
||
ping_method: show_ping_method,
|
||
ping_port: canPing,
|
||
ping_timeout: canPing,
|
||
ping_retries: canPing
|
||
});
|
||
}
|
||
|
||
|
||
(function ($) {
|
||
$.textMetrics = function (el) {
|
||
|
||
var h = 0, w = 0;
|
||
|
||
var div = document.createElement('div');
|
||
document.body.appendChild(div);
|
||
$(div).css({
|
||
position: 'absolute',
|
||
left: -1000,
|
||
top: -1000,
|
||
display: 'none'
|
||
});
|
||
|
||
$(div).html($(el).html());
|
||
var styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
|
||
$(styles).each(function () {
|
||
var s = this.toString();
|
||
$(div).css(s, $(el).css(s));
|
||
});
|
||
|
||
h = $(div).outerHeight();
|
||
w = $(div).outerWidth();
|
||
|
||
$(div).remove();
|
||
|
||
var ret = {
|
||
height: h,
|
||
width: w
|
||
};
|
||
|
||
return ret;
|
||
}
|
||
})(jQuery);
|
||
|
||
function formValidate(formId, href) {
|
||
changed = false;
|
||
|
||
var formObj = $(formId);
|
||
if (formObj.length) {
|
||
formArray[formId] = $(formObj).serializeForm();
|
||
|
||
$(formObj).find('input[type="email"]').each(function () {
|
||
var name = $(this).attr('id');
|
||
if (name === null || name.length == 0) {
|
||
name = $(this).attr('name');
|
||
}
|
||
|
||
if (name !== null && name.length > 0) {
|
||
if (typeof formRules[formId] !== 'undefined') {
|
||
formRules[formId][name] = {
|
||
required: true,
|
||
email: true,
|
||
};
|
||
}
|
||
}
|
||
});
|
||
|
||
|
||
$(formObj).on('submit', function (event) {
|
||
event.preventDefault();
|
||
|
||
// Disable the submit button so it can't be done twice
|
||
$(this).find('input, textarea, select').prop('disabled', false);
|
||
}).validate({
|
||
rules: formRules[formId],
|
||
errorClass: 'txtErrorText',
|
||
validClass: 'success',
|
||
highlight: function (element, errorClass, validClass) {
|
||
$(element).parents("div.formData").addClass("txtErrorTextBox"); //.addClass(errorClass).removeClass(validClass);
|
||
},
|
||
unhighlight: function (element, errorClass, validClass) {
|
||
$(element).parents("div.formData").removeClass("txtErrorTextBox"); // .removeClass(errorClass).addClass(validClass);
|
||
},
|
||
submitHandler: function (form) {
|
||
$('input[type="submit"], button[type="submit"]').not('.import, .export').button('disable');
|
||
|
||
var json = $(form).serializeObject();
|
||
postUrl({ url: href }, json).always(function () {
|
||
$('input[type="submit"], button[type="submit"]').not('.import, .export').button('enable');
|
||
});
|
||
},
|
||
invalidHandler: function (event, validator) {
|
||
// 'this' refers to the form
|
||
var errors = validator.numberOfInvalids();
|
||
if (errors) {
|
||
var message = errors == 1
|
||
? 'You missed 1 field. It has been highlighted'
|
||
: 'You missed ' + errors + ' fields. They have been highlighted';
|
||
$("div.error span").html(message);
|
||
$("div.error").show();
|
||
} else {
|
||
$("div.error").hide();
|
||
}
|
||
|
||
$('input[type="submit"], button[type="submit"]').not('.import, .export').button('enabled');
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
function toggleFields(fields, prefix = '#row_') {
|
||
var parents = [];
|
||
var lastParent = '-1';
|
||
var curParent = '';
|
||
|
||
Object.keys(fields).forEach(index => {
|
||
curParent = $(prefix + index).parent().attr('id');
|
||
|
||
if (typeof curParent != 'undefined' && curParent != lastParent) {
|
||
parents.push(curParent);
|
||
}
|
||
|
||
var value = fields[index];
|
||
|
||
if (value) {
|
||
$(prefix + index).show();
|
||
} else {
|
||
$(prefix + index).hide();
|
||
}
|
||
|
||
if (typeof curParent != 'undefined') {
|
||
lastParent = curParent;
|
||
}
|
||
});
|
||
|
||
parents.forEach(myParent => {
|
||
var stripe = 'odd';
|
||
|
||
$('#'+myParent+' > div.formRow').each(function () {
|
||
if ($(this).is(':visible')) {
|
||
$(this).removeClass('odd').removeClass('even').addClass(stripe);
|
||
stripe = (stripe == 'odd' ? 'even':'odd');
|
||
}
|
||
});
|
||
})
|
||
}
|
||
|
||
function executeFunctionByName(functionName, context /*, args */) {
|
||
var args = Array.prototype.slice.call(arguments, 2);
|
||
var namespaces = functionName.split('.');
|
||
var func = namespaces.pop();
|
||
|
||
for(var i = 0; i < namespaces.length; i++) {
|
||
context = context[namespaces[i]];
|
||
}
|
||
|
||
return context[func].apply(context, args);
|
||
}
|