/**
|
|
* Created by Alex on 10/27/2014.
|
|
*/
|
|
|
|
var GETTING_EVENTS = false;
|
|
var agentList = {};
|
|
var jobList = {};
|
|
var eventGen = new EventGenerator("eventGenerator");
|
|
var agentGen = new AgentGenerator("agentGenerator");
|
|
var jobGen = new JobAgentGenerator("jobAgentGenerator");
|
|
|
|
|
|
|
|
// eventGen.start();
|
|
function getNewEvent() {
|
|
agentGen.getEvents(1);
|
|
}
|
|
|
|
function getTenNewEvents() {
|
|
agentGen.getEvents(10);
|
|
}
|
|
|
|
function getAllEvents() {
|
|
if (GETTING_EVENTS == false) {
|
|
GETTING_EVENTS = true;
|
|
agentGen.getEvents(agentGen.amountOfEvents);
|
|
}
|
|
}
|
|
|
|
function getAllEventsQuickly() {
|
|
INCREASE_SPEED = false;
|
|
EVENT_DELAY = 0;
|
|
if (GETTING_EVENTS == false) {
|
|
GETTING_EVENTS = true;
|
|
agentGen.getEvents(agentGen.amountOfEvents);
|
|
}
|
|
else {
|
|
}
|
|
}
|
|
|
|
function refreshJobs() {
|
|
var multiSelect = document.getElementById("multiselect");
|
|
while (multiSelect.firstChild) {
|
|
multiSelect.removeChild(multiSelect.firstChild);
|
|
}
|
|
var jobNames = jobGen.getAllJobNames();
|
|
for (var i = 0; i < jobNames.length; i++) {
|
|
var jobOption = new Option(jobNames[i], jobNames[i]);
|
|
multiSelect.appendChild(jobOption);
|
|
}
|
|
}
|
|
|
|
function updateGraph() {
|
|
var multiSelect = document.getElementById("multiselect");
|
|
var selection = [];
|
|
for (var i = 0; i < multiSelect.children.length; i++) {
|
|
if (multiSelect.children[i].selected) {
|
|
selection.push(multiSelect.children[i].value);
|
|
}
|
|
}
|
|
|
|
var filteredValues = [];
|
|
var originalPredictionValues = [];
|
|
var durationValues = [];
|
|
var predictionValues = [];
|
|
var diffValues = [];
|
|
var graphGroup = null;
|
|
var stdGroup = null;
|
|
var predictionGroup = null;
|
|
var originalPredictionGroup = null;
|
|
for (var i = 0; i < graph2dDataset.length; i++) {
|
|
if (selection.indexOf(graph2dDataset[i].type) != -1) {
|
|
if (showDuration == true) {
|
|
if (graph2dDataset[i].group == graph2dDataset[i].type + "_" + selectedGroup) {
|
|
filteredValues.push(graph2dDataset[i]);
|
|
durationValues.push(graph2dDataset[i]);
|
|
graphGroup = graph2dDataset[i].group;
|
|
}
|
|
}
|
|
if (showPrediction == true) {
|
|
if (graph2dDataset[i].group == graph2dDataset[i].type + "_pred_" + selectedGroup) {
|
|
filteredValues.push(graph2dDataset[i]);
|
|
predictionValues.push(graph2dDataset[i]);
|
|
predictionGroup = graph2dDataset[i].group;
|
|
}
|
|
if (graph2dDataset[i].group == graph2dDataset[i].type + "_pred_" + selectedGroup + "_std_higher") {
|
|
filteredValues.push(graph2dDataset[i]);
|
|
stdGroup = graph2dDataset[i].group;
|
|
}
|
|
if (graph2dDataset[i].group == graph2dDataset[i].type + "_pred_" + selectedGroup + "_std_lower") {
|
|
filteredValues.push(graph2dDataset[i]);
|
|
stdGroup = graph2dDataset[i].group;
|
|
}
|
|
if (graph2dDataset[i].group == graph2dDataset[i].type + "_pred_" + selectedGroup + "_original") {
|
|
filteredValues.push(graph2dDataset[i]);
|
|
originalPredictionValues.push(graph2dDataset[i]);
|
|
originalPredictionGroup = graph2dDataset[i].group;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
graph2DItems.clear();
|
|
if (differenceWithPrediction == true) {
|
|
for (var i = 0; i < durationValues.length; i++) {
|
|
var item = {};
|
|
item.x = i < 10 ? '2014-09-0' + i : '2014-09-' + i;
|
|
item.y = durationValues[i].y;
|
|
item.type = durationValues[i].type;
|
|
item.y -= originalPredictionValues[i].y;
|
|
var group = 'differenceNegative';
|
|
if (item.y < 0) {
|
|
item.y *= -1;
|
|
group = 'differencePositive'
|
|
}
|
|
item.group = group;
|
|
diffValues.push(item);
|
|
}
|
|
var legendDiv = document.getElementById("Legend");
|
|
legendDiv.innerHTML = "";
|
|
populateExternalLegend('differencePositive', "Faster than predicted (hours)");
|
|
populateExternalLegend('differenceNegative', "Slower than predicted (hours)");
|
|
graph2DItems.add(diffValues);
|
|
}
|
|
else {
|
|
var filteredValues = [];
|
|
for (var i = 0; i < durationValues.length; i++) {
|
|
var durationItem = {};
|
|
durationItem.x = i < 10 ? '2014-09-0' + i : '2014-09-' + i;
|
|
durationItem.y = durationValues[i].y;
|
|
durationItem.type = durationValues[i].type;
|
|
durationItem.group = durationValues[i].group;
|
|
filteredValues.push(durationItem);
|
|
if (showPrediction == true) {
|
|
var predItem = {};
|
|
predItem.x = i < 10 ? '2014-09-0' + i : '2014-09-' + i;
|
|
predItem.y = predictionValues[i].y;
|
|
predItem.type = predictionValues[i].type;
|
|
predItem.group = predictionValues[i].group;
|
|
filteredValues.push(predItem);
|
|
|
|
var originalPred = {};
|
|
originalPred.x = i < 10 ? '2014-09-0' + i : '2014-09-' + i;
|
|
originalPred.y = originalPredictionValues[i].y;
|
|
originalPred.type = originalPredictionValues[i].type;
|
|
originalPred.group = originalPredictionValues[i].group;
|
|
filteredValues.push(originalPred);
|
|
}
|
|
}
|
|
var legendDiv = document.getElementById("Legend");
|
|
legendDiv.innerHTML = "";
|
|
if (graphGroup != null) {
|
|
populateExternalLegend(graphGroup, "duration (hours)");
|
|
}
|
|
// if (stdGroup != null) {populateExternalLegend(stdGroup, "standard deviation");}
|
|
if (predictionGroup != null) {
|
|
populateExternalLegend(predictionGroup, "updated prediction (hours)");
|
|
}
|
|
if (originalPredictionGroup != null) {
|
|
populateExternalLegend(originalPredictionGroup, "initial prediction (hours)");
|
|
}
|
|
graph2DItems.add(filteredValues);
|
|
}
|
|
graph2d.fit();
|
|
|
|
}
|
|
|
|
function turnOff(type) {
|
|
var btn = document.getElementById(type);
|
|
btn.className = btn.className.replace(" selected", "");
|
|
}
|
|
|
|
function turnOffAll() {
|
|
var types = ['duration', 'durationWithPause', 'durationWithStartup', 'durationWithBoth'];
|
|
for (var i = 0; i < types.length; i++) {
|
|
turnOff(types[i]);
|
|
}
|
|
}
|
|
|
|
function turnOn(type) {
|
|
turnOffAll();
|
|
var btn = document.getElementById(type);
|
|
selectedGroup = type;
|
|
btn.className += " selected";
|
|
updateGraph();
|
|
}
|
|
|
|
function togglePrediction() {
|
|
if (differenceWithPrediction != true) {
|
|
var btn = document.getElementById('togglePrediction');
|
|
if (showPrediction == true) {
|
|
btn.className = btn.className.replace("selected", "");
|
|
showPrediction = false;
|
|
}
|
|
else {
|
|
showPrediction = true;
|
|
btn.className += " selected";
|
|
}
|
|
updateGraph();
|
|
}
|
|
}
|
|
function toggleDuration() {
|
|
if (differenceWithPrediction != true) {
|
|
var btn = document.getElementById('toggleDuration');
|
|
if (showDuration == true) {
|
|
btn.className = btn.className.replace("selected", "");
|
|
showDuration = false;
|
|
}
|
|
else {
|
|
showDuration = true;
|
|
btn.className += " selected";
|
|
}
|
|
updateGraph();
|
|
}
|
|
}
|
|
|
|
function toggleDifference() {
|
|
differenceWithPrediction = !differenceWithPrediction;
|
|
var btn = document.getElementById('togglePrediction');
|
|
if (showPrediction == false && differenceWithPrediction == true) {
|
|
showPrediction = true;
|
|
btn.className += " selected";
|
|
}
|
|
btn = document.getElementById('toggleDuration');
|
|
if (showDuration == false && differenceWithPrediction == true) {
|
|
showDuration = true;
|
|
btn.className += " selected";
|
|
}
|
|
|
|
var btn2 = document.getElementById('difference');
|
|
if (differenceWithPrediction == false) {
|
|
btn2.className = btn2.className.replace("selected", "");
|
|
}
|
|
else {
|
|
btn2.className += " selected";
|
|
}
|
|
updateGraph();
|
|
}
|
|
function showTimelineBtn() {
|
|
var timelineBtn = document.getElementById('showTimeline');
|
|
var graphBtn = document.getElementById('showGraph');
|
|
|
|
if (showTimeline == false) {
|
|
graphBtn.className = graphBtn.className.replace("selected", "");
|
|
timelineBtn.className += " selected";
|
|
var timelinewrapper = document.getElementById("timelineWrapper");
|
|
var graphwrapper = document.getElementById("graphWrapper");
|
|
graphwrapper.style.display = "none";
|
|
timelinewrapper.style.display = "block";
|
|
showTimeline = true;
|
|
showGraph = false;
|
|
}
|
|
}
|
|
function showGraphBtn() {
|
|
var timelineBtn = document.getElementById('showTimeline');
|
|
var graphBtn = document.getElementById('showGraph');
|
|
|
|
if (showGraph == false) {
|
|
timelineBtn.className = graphBtn.className.replace("selected", "");
|
|
graphBtn.className += " selected";
|
|
var timelinewrapper = document.getElementById("timelineWrapper");
|
|
var graphwrapper = document.getElementById("graphWrapper");
|
|
timelinewrapper.style.display = "none";
|
|
graphwrapper.style.display = "block";
|
|
showTimeline = false;
|
|
showGraph = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* this function fills the external legend with content using the getLegend() function.
|
|
*/
|
|
function populateExternalLegend(groupDataItem, description) {
|
|
var legendDiv = document.getElementById("Legend");
|
|
// create divs
|
|
var containerDiv = document.createElement("div");
|
|
var iconDiv = document.createElement("div");
|
|
var descriptionDiv = document.createElement("div");
|
|
|
|
// give divs classes and Ids where necessary
|
|
containerDiv.className = 'legendElementContainer';
|
|
containerDiv.id = groupDataItem + "_legendContainer";
|
|
iconDiv.className = "iconContainer";
|
|
descriptionDiv.className = "descriptionContainer";
|
|
|
|
// get the legend for this group.
|
|
var legend = graph2d.getLegend(groupDataItem, 30, 30);
|
|
|
|
// append class to icon. All styling classes from the vis.css have been copied over into the head here to be able to style the
|
|
// icons with the same classes if they are using the default ones.
|
|
legend.icon.setAttributeNS(null, "class", "legendIcon");
|
|
|
|
// append the legend to the corresponding divs
|
|
iconDiv.appendChild(legend.icon);
|
|
descriptionDiv.innerHTML = description;
|
|
|
|
// determine the order for left and right orientation
|
|
if (legend.orientation == 'left') {
|
|
descriptionDiv.style.textAlign = "left";
|
|
containerDiv.appendChild(iconDiv);
|
|
containerDiv.appendChild(descriptionDiv);
|
|
}
|
|
else {
|
|
descriptionDiv.style.textAlign = "right";
|
|
containerDiv.appendChild(descriptionDiv);
|
|
containerDiv.appendChild(iconDiv);
|
|
}
|
|
|
|
// append to the legend container div
|
|
legendDiv.appendChild(containerDiv);
|
|
}
|
|
|
|
|
|
function printEvents(events) {
|
|
var str = "";
|
|
str += "[";
|
|
for (var i = 0; i < events.length; i++) {
|
|
str += "{";
|
|
var first = true;
|
|
for (var eventField in events[i]) {
|
|
if (events[i].hasOwnProperty(eventField)) {
|
|
if (first == false) {
|
|
str += ","
|
|
}
|
|
first = false;
|
|
if (eventField == "time") {
|
|
str += eventField + ": '" + new Date(events[i][eventField]).valueOf() + "'";
|
|
}
|
|
else if(events[i][eventField] instanceof Array) {
|
|
str += eventField + ": [";
|
|
for (var j = 0; j < events[i][eventField].length; j++) {
|
|
str += "'" + events[i][eventField][j] + "'";
|
|
if (j != events[i][eventField].length - 1) {
|
|
str += ",";
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
str += eventField + ": '" + events[i][eventField] + "'";
|
|
}
|
|
}
|
|
}
|
|
str += "}";
|
|
if (i < events.length -1) {
|
|
str += ",";
|
|
}
|
|
}
|
|
str += "]";
|
|
console.log(str);
|
|
}
|