Skip to content

Instantly share code, notes, and snippets.

@filimo
Last active September 28, 2016 07:05
Show Gist options
  • Save filimo/08197362cbc3eb5cc18258674918ad44 to your computer and use it in GitHub Desktop.
Save filimo/08197362cbc3eb5cc18258674918ad44 to your computer and use it in GitHub Desktop.
function main() {
var DevicesConnector = function() {
return new Common.Connector("Handlers/JSonHandler.ashx/Devices/");
}
var params = {
chartType: $(document).getUrlParam("chartType"),
baseCUID: $(document).getUrlParam("CUID"),
CUID: $(document).getUrlParam("CUID"),
hash: document.location.hash.replace("#", ""),
url: $(document).getUrlParam("url"),
startDate: Number($(document).getUrlParam("startTime")),
isCompare: $(".compareMenu").size() != 0,
compareData: [],
activeLoad : [],
sortedList:[],
compareDevices:$("#compareTask").size() == 0
};
if (params.chartType == "ResponseTime"
|| params.chartType == "ResponseTime_ByLocation"
|| params.chartType == "ResponseTime_ByTask"
|| params.isCompare)
$(".outlier").show();
else $(".outlier").hide();
function filterOutlier() {
var useOutlier = $("#outlier").is(":checked");
function removeElement(ar, index) {
ar.splice(index, 1);
}
function isOutlier(val, avr, stdev) {
return Math.abs(val[1] - avr) > 2*stdev;
}
var series = $.extend(true, [], params.plotData);
if (useOutlier) {
var max = 0;
var min = null;
var maxAvr = 0;
var minAvr = null;
var maxLim = null;
var minLim = null;
var mint = null;
var maxt = null;
for (var i = 0; i < series.length; i++) {
var points = series[i].data;
if (points.length && points[0].info) {
if(mint=-null)
{
maxt = series[i].Average + series[i].STDDev*2;
mint = series[i].Average - series[i].STDDev*2;
}
else
{
var tt = series[i].Average + series[i].STDDev*2;
if (tt>maxt) maxt = tt;
tt = series[i].Average - series[i].STDDev*2;
if (tt<mint) mint = tt;
}
}
}
maxLim = maxt;
minLim = mint;
for (var i = 0; i < series.length; i++) {
var points = series[i].data;
if (points.length && points[0].info) {
var avr = series[i].Average;
for (var j = 0; j < points.length; j++) {
if (minLim > points[j][1] || maxLim < points[j][1]) {
removeElement(points, j--);
} else {
if (max < points[j][1]) max = points[j][1];
if (min === null) min = points[j][1];
else if (min > points[j][1]) min = points[j][1];
}
}
}
}
series.maxY = max;
series.minY = min;
} else {
var max = 0;
var min = null;
for (var i = 0; i < series.length; i++) {
var points = series[i].data;
if (points.length && points[0].info) {
for (var j = 0; j < points.length; j++) {
//if (points && points[i] && points[i][j] && points[i][j]) {
if (max < points[j][1]) max = points[j][1];
if (min === null) min = points[j][1];
else if (min > points[j][1]) min = points[j][1];
//}
}
}
}
series = params.plotData;
series.maxY = max;
series.minY = min;
}
new Plot(series, true);
}
(function outlier() {
var el = $("#outlier");
el.click(filterOutlier);
})();
function setStddev(av, st) {
/*if (typeof (av) !== "undefined" && typeof (st) !== "undefined") {
params.average = av;
params.stddev = st;
$("#outlier").removeAttr("disabled");
} else {
params.average = null;
params.stddev = null;
$("#outlier").attr("disabled", "disabled");
}*/
}
function anyWait() {
for (var i in params.activeLoad) {
if (params.activeLoad[i])
return true;
}
return false;
}
function waitOff() {
for (var i in params.activeLoad) {
delete params.activeLoad[i]
}
waiting(false);
}
if (params.isCompare) {
params.tasks = {
init: function() {
$("#compareDevice").change(params.tasks.load);
$("#compareTask").change(function() {
params.devices.isContains();
})
params.tasks.load();
},
load: function() {
$("#compareTask").hide();
$("#addChart").hide();
var dev = $("#compareDevice").val();
function on(data) {
if (!data || (typeof data.Error !== "undefined" && data.Error != "")) {
error(data);
return;
}
$("#compareTask").empty();
var html = "";
var newData = [];
for (var i in data) {
if (data[i].Task_ID != defTaskID)
newData.push(data[i]);
}
data = newData;
if (data.length == 0) {
$("#compareTask").html("<option>No tasks</option>");
} else {
for (var i in data) {
if (!data[i].Task_Name) data[i].Task_Name = "Task";
html += "<option value=" + data[i].Task_ID + ">" + data[i].Task_Name + "</option>";
}
$("#compareTask").html(html);
$("#addChart").show();
}
$("#compareTask").show();
params.devices.isContains();
}
DevicesConnector().Post("TasksOf", { Site_Seq_ID: dev }, on);
}
}
params.devices = {
cache: new Array(),
actionState: true,
isContains: function() {
params.devices.switchButton(!params.devices.isinchart());
},
switchButton: function(state) {
if (params.devices.actionState == state) return;
params.devices.actionState = state;
$("#addChart").val(state ? "Add" : "Remove");
$("#addChart").unbind("click");
if (state) {
$("#addChart").click(params.devices.addAction);
} else {
$("#addChart").click(params.devices.removeActive);
}
},
isinchart: function() {
var devId = Number(params.compareDevices ? $("#compareDevice").val() : $("#compareTask").val());
return !!params.devices.cache[devId];
},
addDevice: function(deviceId, baseCUID) {
params.activeLoad[deviceId] = true;
waiting(true);
params.devices.changeDevice(baseCUID, deviceId, function(cuid) {
cuid = cuid.CUID;
params.devices.getUID(cuid, function(processData) {
params.devices.wait(processData, function(chartParams) {
params.devices.getChartData(chartParams, function(chartData) {
var pts = [];
$.each(chartData.Series[0].Points, function(i, key) {
var el = [key.X, key.Y];
el.info = key;
pts.push(el);
})
var newData = { Device: deviceId, label: chartData.Series[0].LegendName, data: pts, color: undefined, tooltip: params.plotData[0].tooltip, Average : chartData.Average, STDDev : chartData.STDDev };
if (!params.compareDevices) {
newData.label = newData.label;
}
params.plotData.push(newData);
params.devices.sort();
new Plot(params.plotData);
filterOutlier();
params.devices.isContains();
params.activeLoad[deviceId] = false;
waiting(false);
})
})
})
})
},
sort: function() {
function _sort(a, b) {
if (!a.Device)
return -1;
if (!b.Device)
return 1;
var aInd = sortList[a.Device];
var bInd = sortList[b.Device];
if (aInd > bInd) return 1;
else if (aInd < bInd) return -1;
else return 0;
}
var sortList = [];
var ind = 0;
for (var i in params.sortedList) {
sortList[params.sortedList[i]] = i + 1;
}
params.plotData = params.plotData.sort(_sort);
},
removeActive: function() {
var devId = Number(params.compareDevices ? $("#compareDevice").val() : $("#compareTask").val());
params.devices.removeDevice(devId);
},
removeDevice: function(deviceId) {
var newCache = [];
var newPlotData = [];
for (var i in params.devices.cache) {
if (i != deviceId)
newCache[i] = params.devices.cache[i];
}
for (var i in params.plotData) {
if ((!params.plotData[i].Device || params.plotData[i].Device != deviceId)) {
if (isNaN(Number(i)))
newPlotData[i] = params.plotData[i];
else
newPlotData.push(params.plotData[i]);
}
}
params.plotData = newPlotData;
params.devices.cache = newCache;
Plot(params.plotData);
params.devices.isContains();
},
changeDevice: function(CUID, newDevice, callback) {
if (params.devices.cache[newDevice] && params.devices.cache[newDevice].CUID) {
callback({ CUID: params.devices.cache[newDevice].CUID });
}
else {
if (params.compareDevices) {
if ( sitePlatform == "BrowserView" || sitePlatform == "UserView" || sitePlatform == "MetricsView") {
function __on(data) {
if (data && data.length > 0) {
var tid = data[0].Task_ID;
Connector().Post("ChangeTask", { CUID: unescape(CUID), newTask: tid }, _on);
} else { error(); }
}
DevicesConnector().Post("TasksOf", { Site_Seq_ID: $("#compareDevice").val() }, __on);
} else {
Connector().Post("ChangeDevice", { CUID: unescape(CUID), newDevice: newDevice }, _on);
}
}
else
Connector().Post("ChangeTask", { CUID: unescape(CUID), newTask: newDevice }, _on);
}
function _on(data) {
if (!data || (typeof data.Error !== "undefined" && data.Error != "")) {
error(data);
return;
}
params.sortedList.push(newDevice);
params.devices.cache[newDevice] = {};
params.devices.cache[newDevice].CUID = data.CUID;
callback(data);
}
},
update: function() {
for (var i in params.devices.cache) {
if (!isNaN(Number(i))) {
params.devices.addDevice(i);
}
}
},
getChartData: function(_data, callback) {
var basedata = {
chartType: params.chartType
}
var data = $.extend(data, _data);
Connector().Post("GetChart", data, _on);
function _on(data) {
if (!data || (typeof data.Error !== "undefined" && data.Error != "")) {
error(data);
return;
}
callback(data);
}
},
getUID: function(CUID, callback) {
var data = {
CUID: unescape(CUID),
UID: "",
ResponseFilterUri: null,
chartType: params.chartType
};
if (params.filter) {
data.Start = params.filter.Start;
data.End = params.filter.End;
} else if (params.devices.cache[CUID]) {
callback({ CUID: CUID, UID: params.devices.cache[CUID] });
return;
}
Connector().Post("IsInProcess", data, _on);
function _on(data) {
if (!data || (typeof data.Error !== "undefined" && data.Error != "")) {
error(data);
return;
}
params.devices.cache[data.CUID] = data.UID;
callback({ CUID: data.CUID, UID: data.UID });
}
},
wait: function(_data, callback) {
if (!_data || (typeof _data.Error !== "undefined" && _data.Error != "")) {
error(data);
return;
}
var basedata = {
chartType: params.chartType
}
var data = $.extend(data, _data);
Connector().Post("IsInProcess", data, check);
function check(data) {
if (!_data || (typeof data.Error !== "undefined" && data.Error != "")) {
error(data);
return;
}
if (data.IsDone) {
callback({ CUID: data.CUID, UID: data.UID });
} else if (data.IsInProcess) {
setTimeout(function() { Connector().Post("IsInProcess", data, check); }, 3000);
}
}
},
addAction: function() {
params.devices.addDevice(params.compareDevices ? Number($("#compareDevice").val()) : Number($("#compareTask").val()), params.CUID);
},
init: function() {
$("#addChart").click(params.devices.addAction);
if (params.compareDevices) $("#compareDevice").change(function() {
params.devices.isContains();
})
}
};
if (!params.compareDevices)
params.tasks.init();
params.devices.init();
}
function error(msg) {
$.colorbox({ html: $("<div>").css('padding', '10px').html(msg?(msg.Error? msg.Error : msg):"<center>Please, reload page and try again<br><input type='button' value='Reload Page' style='margin-top:20px;' onclick='javascript:location.reload(true);'/></center>"), title: "Server Error" });
}
var Connector = function() {
var onStart = function() {
if(this.data.CUID === undefined) this.data.CUID = params.CUID;
};
return new Common.Connector("Handlers/JSonHandler.ashx/ChartAdapter/", {onStart: onStart});
}
var filter = new Filter(),
wholeBtn = $("#whole");
var data = {ResponseFilterUri: params.url};
if(params.startDate !== undefined) {
data.Start = params.startDate - 1000 * 60 * 60 * 24 * 7;
data.End = params.startDate ;
$("#startDate").val($.formatDate(new Date(data.Start), "MM/dd/yyyy hh:mm:ss a"));
$("#endDate").val($.formatDate(new Date(data.End), "MM/dd/yyyy hh:mm:ss a"));
}
new GetChart(data);
var oldShowStripValue = true;
function StripVisible() {
return $($.find("input:radio[name=getParams]:checked")).val() === "true";
}
function ActualUrl() {
return unescape(StripVisible() ? params.url : params.url.split('%3F')[0] + '*')
}
function toUTCString(dateString) {
var d = new Date(Number(dateString));
return d.toUTCString().replace(" GMT", "");
}
function setRanges(filter) {
var data = {
Start: filter.from,
End: filter.to,
ResponseFilterUri: filter.url
};
params.filter = data;
new GetChart(data);
whole();
}
function whole()
{
wholeBtn.filter(":not(visible)")
.data("hash", document.location.hash)
.unbind("click")
.click(function() {
document.location.hash = $(this).hide().data("hash");
params.CUID = params.baseCUID;
new GetChart();
delete params.filter;
});
}
function ToolTip() {
var showTooltip = function(x, y, contents) {
$('<div id="tooltip">' + contents + '</div>').css({
position: 'absolute',
display: 'none',
top: y + 5,
left: x + 5,
border: '1px solid #fdd',
padding: '2px',
'background-color': '#fee',
opacity: 0.80
}).appendTo("body").fadeIn(200);
};
var point = function(item) {
var getPoint = function(n) { return item.datapoint[n].toFixed(2); };
var x = toUTCString(getPoint(0));
var y = getPoint(1);
return { x: x, y: y };
};
this.Downtime = function(item) {
showTooltip(item.pageX, item.pageY, item.series.label);
};
this.ResponseTime = function(item) {
var p = point(item);
if (item.series.ttmessage)
showTooltip(item.pageX, item.pageY, item.series.ttmessage);
else
showTooltip(item.pageX, item.pageY, p.x + " = " + p.y);
};
this.ResponseTime_ByLocation = function(item) {
var p = point(item);
if (item.series.ttmessage)
showTooltip(item.pageX, item.pageY, item.series.ttmessage);
else
showTooltip(item.pageX, item.pageY, item.series.label + " of " + p.x + " = " + p.y);
};
this.ResponseTimeWithUri = function(item) {
var p = point(item);
if (item.series.ttmessage)
showTooltip(item.pageX, item.pageY, item.series.ttmessage);
else
showTooltip(item.pageX, item.pageY, item.series.label + " of " + p.x + " = " + p.y);
};
this.ResponseTime_ByTask = function(item) {
var p = point(item);
if (item.series.ttmessage)
showTooltip(item.pageX, item.pageY, item.series.ttmessage);
else
showTooltip(item.pageX, item.pageY, item.series.label + " of " + p.x + " = " + p.y);
};
this.Week = function(item) {
var p = point(item);
if (item.series.ttmessage)
showTooltip(item.pageX, item.pageY, item.series.ttmessage);
else
showTooltip(item.pageX, item.pageY, p.y);
};
this.Day = function(item) {
var p = point(item);
if (item.series.ttmessage)
showTooltip(item.pageX, item.pageY, item.series.ttmessage);
else
showTooltip(item.pageX, item.pageY, p.y);
};
this.History = function(item) {
var info = item.series.info;
var from = toUTCString(info.StartTime);
var to = toUTCString(info.EndTime);
var type = info.BaseType;
showTooltip(item.pageX, item.pageY, type + "<br/>from " + from + "<br/>to " + to);
};
}
function Plot(data, notsave) {
if (!notsave) { params.plotData = data; }
if (params.isCompare) {
data.options.legend.show = true;
data.options.legend.container = $("#legend_container");
$("#legend_container").show();
}
var plot = $("#TimeWork").empty();
if (!data.options.yaxis) data.options.yaxis = {};
data.options.yaxis.autoscaleMargin = null;
if (params.chartType.toLowerCase() === "downtime") {
if (!data.options.series) data.options.series = {};
data.options.series.pie = { show: true, label: { show:false } };
}
if (data.maxY && data.options.yaxis) data.options.yaxis.max = data.maxY;
if (data.minY && data.options.yaxis) data.options.yaxis.min = data.minY;
$.plot(plot, data, data.options);
plot.unbind("plotclick");
if (params.chartType.toLowerCase() !== "downtime") {
plot.bind("plotclick", plotclick);
}
if(Plot.IsSetEvents != true) {
Plot.IsSetEvents = true;
plot.bind("plothover", plothover);
plot.bind("plotselected", plotselected);
}
function plotclick(event, pos, item) {
if (item && item.series.data[item.dataIndex].info) {
var info = item.series.data[item.dataIndex].info;
if (info.CanShowWaterfall) {
function on(r) {
if (r.CanShowDetailView) {
window.open('DetailView.aspx?id=' + info.ID + '&CUID=' + params.CUID);
}
}
Connector().Post("CanShowDetailView", { ID: info.ID }, on);
}
if(info.CanDrillDown) {
var data = {
Start: info.Start,
End: info.End,
ResponseFilterUri: ActualUrl()
};
new GetChart(data);
whole();
wholeBtn.show();
}
}
}
function plotselected(event, ranges) {
wholeBtn.show();
setRanges({ from: ranges.xaxis.from, to: ranges.xaxis.to, url: params.url });
}
function plothover(event, pos, item) {
function select(on) {
if (on) {
this.currentSelected = item;
plot.highlight(item.series, item.datapoint, false);
} else {
if (this.currentSelected !== undefined) {
plot.unhighlight(this.currentSelected.series, this.currentSelected.datapoint);
this.currentSelected = undefined;
}
}
}
function tooltip(on) {
var elm = $("#tooltip");
elm.remove();
if (on) {
if (item.series.tooltip)
item.series.tooltip(item);
else if (params.chartType.toLowerCase() === "downtime") {
$('<div id="tooltip">' + item.series.label + '</div>').css({
position: 'absolute',
display: 'none',
top: pos.pageY - 15,
left: pos.pageX + 5,
border: '1px solid #fdd',
padding: '2px',
'background-color': '#fee',
opacity: 0.80
}).appendTo("body").fadeIn(200);
}
}
}
if (item) {
if (typeof (this.previousPoint) == 'undefined') {
this.previousPoint = item.datapoint;
tooltip(true);
}
if (this.previousPoint != item.datapoint) {
this.previousPoint = item.datapoint;
tooltip(true);
}
}
else {
tooltip(false);
this.previousPoint = undefined;
}
}
}
function Chart(data, reLegend) {
//setStddev(data.Average, data.STDDev);
var tooltip = (new ToolTip())[params.chartType];
if (reLegend != false) Chart.legend = new Legend($("#legend_container"), params.chartType, data.Series);
var legend = Chart.legend;
legend.click(function() { new Chart(data, false); });
if ($(".charttitle").text() === "")
$(".charttitle").html(data.Header);
$("#footer").text(data.Footer);
new Plot(new Types(params.chartType));
function Types(type) {
var dest = [];
function line() {
dest.zoom = true;
dest.options = {
xaxis: { mode: "time" },
selection: { mode: "x" },
legend: { show: false },
grid: { hoverable: true, clickable: true, color: "#a1a1a1", borderWidth: 0.5 }
};
dest.maxY = 0;
dest.minY = null;
$(data.Series).each(function(index, line) {
var filter = legend.filter(index + "" + line.LegendName);
if (filter.val) {
var l = { label: line.LegendName, data: [], tooltip: tooltip, color: filter.color, Average: typeof (data.Average) !== "undefined" ? data.Average : line.Average, STDDev: typeof (data.STDDev) !== "undefined" ? data.STDDev : line.STDDev };
$(line.Points).each(function(index, p) {
var v = [p.X, p.Y];
v.info= {ID: p.ID, Start: p.Start, End: p.End, CanShowWaterfall: p.CanShowWaterfall, CanDrillDown: p.CanDrillDown, y: p.Y};
l.data.push(v);
if (p.Y > dest.maxY) { dest.maxY = p.Y; }
if (dest.minY === null) dest.minY = p.Y;
else if (dest.minY > p.Y) dest.minY = p.Y;
});
dest.push(l);
}
});
if (data.Background)
$(data.Background).each(function(index, line) {
var max = dest.maxY == 0 ? 100 : dest.maxY;
var l = { data: [[line.Start, max]], ttmessage: "<span style='font-weight:bold;'>" + line.Type + "</span><br>HitCount: " + line.HitCount+"<br/>From: "+new Date(line.Start) + "<br/>To:"+new Date(line.End), tooltip: tooltip, color: line.color, bars: { lineWidth: 0, barWidth: (line.End - line.Start), show: true} };
dest.push(l);
});
if (dest.maxY === 0) { dest.maxY = 0.001; }
}
this.Downtime = function() {
dest.zoom = false;
var tickFormatter = function(v, axis, a) {
return "";
};
dest.options = {
xaxis: { tickSize: 1, tickFormatter: tickFormatter },
yaxis: { max: 100 },
legend: { show: false },
grid: { hoverable: true, clickable: true, color: "#a1a1a1", borderWidth: 0.5 }
};
var x = 0;
$(data.Series).each(function(index, line) {
var filter = legend.filter(index + "" + line.LegendName);
var l = { label: line.LegendName, data: [], bars: { show: true }, tooltip: tooltip, color: filter.color };
$(line.Points).each(function(index, point) {
l.data.push([x++, point.Y]);
});
dest.push(l);
});
}
this.ResponseTime = function() { line(); };
this.ResponseTime_ByLocation = function() { line(); };
this.ResponseTimeWithUri = function() { line(); };
this.ResponseTime_ByTask = function() { line(); };
this.Week = function() {
dest.zoom = false;
var tickFormatter = function(v, axis) {
return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", ""][v];
};
dest.options = {
xaxis: { tickFormatter: tickFormatter },
legend: { show: false },
grid: { hoverable: true, clickable: true, color: "#a1a1a1", borderWidth: 0.5 }
};
var x = 0;
$(data.Series).each(function(index, line) {
var l = { label: line.LegendName, data: [], bars: { show: true, align: "center" }, tooltip: tooltip };
$(line.Points).each(function(index, point) {
l.data.push([x++, point.Y]);
});
dest.push(l);
});
};
this.Day = function() {
dest.zoom = false;
var tickFormatter = function(v, axis) { return v; };
dest.options = {
xaxis: { tickSize: 1, tickFormatter: tickFormatter },
legend: { show: false },
grid: { hoverable: true, clickable: true, color: "#a1a1a1", borderWidth: 0.5 }
};
var x = 0;
$(data.Series).each(function(index, line) {
var l = { label: line.LegendName, data: [], bars: { show: true, align: "center" }, tooltip: tooltip };
$(line.Points).each(function(index, point) {
l.data.push([x++, point.Y]);
});
dest.push(l);
});
};
this[type]();
return dest;
}
}
function waiting(on, proc) {
if (!on && anyWait()) return;
var waiting = $("#waiting");
if (on) {
var dialogWidth;
var dialogHeight = 150;
waiting.dialog({
modal: true,
width: 600,
position: (isMobile.any()) ? [0, 0] : { my: "center", at: "center", of: window },
closeOnEscape: false,
open: function () {
if (isMobile.any()) {
$(this).dialog("option", "width", (window.innerWidth > 600) ? 600 : (window.innerWidth - 10));
dialogWidth = $(this).dialog("option", "width");
var left = (window.innerWidth / 2) - (dialogWidth / 2);
var top = (window.innerHeight / 2) - (dialogHeight / 2);
$(this).dialog("option", "position", [left, top]);
}
},
});
waiting.dialog("open");
waiting.prev(".ui-dialog-titlebar").hide();
}else{
waiting.dialog("close");
}
}
function GetChart(extra_params) {
var CUID;
params.activeLoad["main"] = true;
waiting(true);
if(extra_params !== undefined || params.hash == "") {
wait({UID: ""});
}else{
get({UID: params.hash});
}
function get(r) {
var UID = r.UID;
function on(r) {
new Chart(r);
filterOutlier();
filter.set(r.Range);
if (params.isCompare) { params.devices.update(); }
params.activeLoad["main"] = false;
waiting(false);
}
Connector().Post("GetChart", { chartType: params.chartType, CUID: unescape(params.CUID), UID: UID, ResponseFilterUri: ActualUrl() }, on);
}
function wait(r) {
function check(r) {
CUID = r.CUID;
if (r.Error != "") {
params.activeLoad["main"] = false;
waiting(false);
if (isMobile.any()) {
$.colorbox.settings.width = "70%";
$.colorbox.settings.height = "260px";
$.colorbox.settings.reposition = false;
}
$.colorbox({ html: $("<div>").css('padding', '10px').html(r.Error), title: 'Server error' });
$(document).bind('cbox_complete', function () {
if (isMobile.any()) {
$("#colorbox").css({
left: window.pageXOffset + ((window.innerWidth / 2) - ($("#colorbox").width() / 2))
});
$("#colorbox").css('font-size', '3vw');
$("#colorbox").css('text-align', 'center');
$("#cboxTitle").css('font-size', '3vw');
}
});
} else if (r.IsDone) {
document.location.hash = "#" + escape(r.UID);
if (params.hash === '') params.hash = document.location.hash.replace("#", "");
get(r);
} else {
setTimeout(function() { wait(r); }, 3000);
}
}
var data = $.extend({ chartType: params.chartType, CUID: unescape(params.CUID), UID: r.UID }, extra_params);
extra_params = {};
if (data.Start <= 0 || data.End <= 0) {
delete data.Start;
delete data.End;
}
if (data.ResponseFilterUri)
data.ResponseFilterUri = unescape(data.ResponseFilterUri);
Connector().Post("IsInProcess", data, check);
}
}
function Legend(container, type, lines) {
var click;
var filter = {};
var color = ["#a7cd5e", "#ae59b3", "#757fce", "#7d7d41", "#e15f00", "#3896c6", "#2c9f36", "#a02f09", "#eab80b", "#a7a7a7", "#6a3604", "#afcffd", "#c2c655", "#71d3d4", "#b07061", "#dc143c", "#483d8b", "#ff1493", "#696969", "#ffb6c1", "#ffa500", "#ff0000", "#000080", "#00ff00", "#ffa07a", "#8b0000"];
color.current = 0;
this.container = container;
tr();
draw();
function tr() {
var elm = container.find("tr").hide();
if (elm.size() == 1) {
var maxRows = Math.ceil(lines.length / container.find("tr:first td").size());
for(var i = 0; i < maxRows; i++) {
elm.after(elm.clone());
}
}
}
function Types() {
function draw() {
function widthTd() {
var count = container.find("tr:first td").size();
return $(document).width() / count;
}
refresh();
var tds = container.find("td");
var i = 0;
var widthTd = widthTd();
jQuery.each(filter, function(key, val) {
var enabled = lines[i].Points.length != 0;
var elm = new Checkbox(lines[i].LegendName, key, filter[key].color, check, enabled);
if (enabled) elm.on(); else elm.off();
$(tds[i++]).empty().append(elm.elm).closest("tr").show();
});
//extending to a full list of monitors
if (params.chartType == "ResponseTime_ByLocation" || params.chartType == "ResponseTimeWithUri")
if (existingMonitors !== undefined) {
jQuery.each(existingMonitors, function(index, mName) {
if (filter === undefined || filter[mName] == null) {
var elm = new Checkbox(mName, mName, "lightgray", function(){}, false);
elm.off();
$(tds[i++]).empty().append(elm.elm).closest("tr").show();
}
});
}
}
function downtime() {
refresh();
var tds = container.find("td");
var i = 0;
jQuery.each(filter, function(key, val) {
var elm = new Checkbox(lines[i].LegendName, key, filter[key].color);
elm.off();
$(tds[i++]).empty().append(elm.elm).closest("tr").show();
});
}
this.Downtime = function() { downtime(); };
this.ResponseTime = function() { };
this.ResponseTime_ByTask = function() { draw(); };
this.ResponseTime_ByLocation = function() { draw(); };
this.ResponseTimeWithUri = function() { draw(); };
this.Week = function() { };
this.Day = function() { };
}
function draw() {
(new Types())[type]();
}
this.filter = function(name) {
var f = filter[name];
if (f === undefined) {
return { val: true };
} else {
return { val: f.val, color: f.color };
}
};
this.click = function(callback) {
click = callback;
};
function refresh() {
var empty = true;
$(lines).each(function(index, line) {
var f = filter[index+line.LegendName] = {};
f.val = true;
f.color = color[color.current++];
empty = false;
});
if (!empty) { container.show(); }
}
function check(data, val) {
filter[data].val = val;
click();
}
}
function Checkbox(text, data, color, click, width) {
if(Checkbox.checkbox === undefined) Checkbox.checkbox = $(".legendcheckboxlist").clone(true).show();
var obj = this;
var img = { on: "images/ccheckbox-on.gif", off: "images/ccheckbox-off.gif" };
var elms = {
elm: Checkbox.checkbox.clone(true)
};
elms.div = elms.elm.find(".legendcheckbox").css("background-color", color);
elms.img = elms.elm.find("img")[0];
this.elm = elms.elm;
if (width != false) elms.elm.click(onclick);
var div = $('<div style="overflow:hidden"><div>').text(text);
if (width == false) $(div).css("color", "lightgray");
div.width(width);
elms.elm.find(".legendcheckboxlabel").html(div);
var val = false;
function onclick() {
if (click !== undefined) {
if (val) {
obj.off();
} else {
obj.on();
}
click(data, val);
}
}
this.off = function() {
elms.img.src = img.off;
val = false;
};
this.on = function() {
elms.img.src = img.on;
val = true;
};
this.val = function() { return data; };
}
function Filter() {
var testDate = new RegExp(/\d{1,2}\/\d{1,2}\/\d{2,4}/);
var elms = {
startDate: $("#startDate"),
endDate: $("#endDate")
}
$("#startDate, #endDate")
.focus(function() {
$(this).attr("prevValue", $(this).val());
})
.blur(function() {
var val = $(this).val();
var dStart = new Date(elms.startDate.val());
var dEnd = new Date(elms.endDate.val());
var d = new Date(val);
var test = new RegExp(/(\d{1,2})\/(\d{1,2})\/(\d{4,4})\D((\d{1,2}):(\d{1,2}):(\d{1,2})\s(PM|AM))?/);
var ex = test.exec(val);
if ($(this).attr("prevValue")) {
var dt = Date.parse(val);
if (!test.test(val) || isNaN(dt) || (dStart.getTime() == dEnd.getTime()) || Number(ex[1]) <= 0 || Number(ex[2]) <= 0 || Number(ex[3]) <= 0 || Number(ex[1]) > 12 || Number(ex[2]) > 31)
$(this).val($(this).attr("prevValue"))
}
$(this).removeAttr("prevValue");
});
this.set = function(range) {
//set(elms.startDate, range.from);
//set(elms.endDate, range.to);
function set(elm, val) {
var v = $.formatDate(new Date(val), "MM/dd/yyyy hh:mm:ss a");
elm.val(v);
}
};
if(params.url!==null) {
$("#filter").show();
$("#back").show();
}
$("#load").click(function() {
if (Date.parse(elms.startDate.val()) && Date.parse(elms.endDate.val()))
var filter = {
from: m(elms.startDate.val()),
to: m(elms.endDate.val()),
url: ActualUrl()
};
setRanges(filter);
function m(s) { return new Date(s).getUTCTotalMilliseconds(); }
});
$("#back").click(function() {
if (document.referrer != '') window.location = document.referrer;
else window.history.go(-1 * (window.history.length - 1));
});
$("input:radio[name=getParams]").change(function() {
if (StripVisible() == oldShowStripValue) return;
oldShowStripValue = StripVisible();
var filter = {
from: m(elms.startDate.val()),
to: m(elms.endDate.val()),
url: ActualUrl()
};
setRanges(filter);
function m(s) { return new Date(s).getUTCTotalMilliseconds(); }
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment