function focusOn(event) { var nodeId = event.value; network.selectNodes([nodeId]); highlightConnections({nodes:[nodeId]}) network.focusOnNode(nodeId,{animation:false, scale:0.2}) } function viewAllNeighbours() { network.zoomExtent({nodes:connectedNodes, duration:0}) } function doSteps(amount) { network.setOptions({stabilizationIterations:amount}) network._stabilize() } var network; var nodes; var edges; var edgeOpacity = 0.15; function drawAll(dataJSON, file) { // create an array with nodes nodes = new vis.DataSet(dataJSON.nodes); var totalMass = 0; for (var i = 0; i < dataJSON.nodes.length; i++) { totalMass += dataJSON.nodes[i].mass; //console.log(dataJSON.nodes[i].mass) } var gravityConstant = -20000; if (totalMass < 2000) { gravityConstant = -2000; } var edgeNodeRatio = Math.max(1,dataJSON.edges.length) / Math.max(1,dataJSON.nodes.length); var nodeEdgeRatio = Math.max(1,dataJSON.nodes.length) / Math.max(1,dataJSON.edges.length); var centralGravity = Math.min(5,Math.max(0.1,edgeNodeRatio)); opacity = Math.min(1.0,Math.max(0.15,nodeEdgeRatio)); // create an array with edges edges = new vis.DataSet(dataJSON.edges); // console.log(edgesArray.length,edgesArray) // create a network var container = document.getElementById('mynetwork'); var data = { nodes: nodes, edges: edges }; var amountOfNodes = dataJSON.nodes.length; var options = { stabilize: true, stabilizationIterations: 15000, smoothCurves: { enabled: false, dynamic: false }, configurePhysics: false, physics: {barnesHut: {gravitationalConstant: gravityConstant, centralGravity: centralGravity, springLength: 100, springConstant: 0.001}}, //physics: {barnesHut: {gravitationalConstant: 0, centralGravity: 0.0, springConstant: 0}}, nodes: { shape: 'dot', radiusMax: amountOfNodes * 0.5, fontColor: '#ffffff', fontDrawThreshold: 8, scaleFontWithValue: true, fontSizeMin: 14, fontSizeMax: amountOfNodes * 0.25, fontSizeMaxVisible: 20, fontStrokeWidth: 1, // px fontStrokeColor: '#222222' }, edges: { opacity: edgeOpacity }, hideEdgesOnDrag: true, maxVelocity: 100, tooltip: { delay: 200, fontSize: 12, color: { background: "#fff" } } }; network = new vis.Network(container, {nodes:[],edges:[]}, options); network.on("stabilizationIterationsDone", function() { this.setFreezeSimulation(true); }); network.on("stabilized", function() { console.log('downloading') network.storePositions(); download(file); setTimeout(getNewTask(file),3000); }) network.setData(data); if (dataJSON.nodes.length < 2) { console.log('downloading because few nodes') network.storePositions(); download(file); setTimeout(getNewTask(file),3000); } //network.on("click", highlightConnections); //window.onresize = function () { // network.redraw() //}; //network.on("stabilized", function() { // network.setOptions({physics: {barnesHut: {gravitationalConstant: 0, centralGravity: 0, springConstant: 0}}}); // console.log('downlaoding') // download(); // setTimeout(next,2000); //}); //populateCompanyDropdown(); } // marked is used so we don't do heavy stuff on each click var marked = false; var connectedNodes = []; function highlightConnections(selectedItems) { var nodeId; var requireUpdate = false; // we get all data from the dataset once to avoid updating multiple times. if (selectedItems.nodes.length == 0 && marked === true) { connectedNodes = []; requireUpdate = true; var allNodes = nodes.get({returnType:"Object"}); // restore on unselect for (nodeId in allNodes) { allNodes[nodeId].color = undefined; if (allNodes[nodeId].oldLabel !== undefined) { allNodes[nodeId].label = allNodes[nodeId].oldLabel; allNodes[nodeId].oldLabel = undefined; } } marked = false; network.setOptions({nodes:{fontSizeMin:14},edges:{opacity:0.15}}) } else if (selectedItems.nodes.length > 0) { var allNodes = nodes.get({returnType:"Object"}); marked = true; requireUpdate = true; var mainNode = selectedItems.nodes[0]; // this is an ID connectedNodes = network.getConnectedNodes(mainNode); connectedNodes.push(mainNode); for (nodeId in allNodes) { allNodes[nodeId].color = 'rgba(150,150,150,0.1)'; if (allNodes[nodeId].oldLabel === undefined) { allNodes[nodeId].oldLabel = allNodes[nodeId].label; allNodes[nodeId].label = ""; } } for (var i = 0; i < connectedNodes.length; i++) { allNodes[connectedNodes[i]].color = undefined; if (allNodes[connectedNodes[i]].oldLabel !== undefined) { allNodes[connectedNodes[i]].label = allNodes[connectedNodes[i]].oldLabel; allNodes[connectedNodes[i]].oldLabel = undefined; } } network.setOptions({nodes:{fontSizeMin:150},edges:{opacity:0.025}}) } if (requireUpdate === true) { var updateArray = []; for (nodeId in allNodes) { updateArray.push(allNodes[nodeId]); } nodes.update(updateArray); } } function loadJSON(path, success, error) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { success(JSON.parse(xhr.responseText), path); } else { error(); } } }; xhr.open("GET", path, true); xhr.send(); } function populateDropdown() { var nodesAr = nodes.get(); var nodeIds = []; for (var i = 0; i < nodesAr.length;i++) { nodeIds.push(nodesAr[i].id); } nodeIds.sort() var dropdown = document.getElementById("companyDropdown"); var option = document.createElement('option'); option.text = option.value = 'pick a company to focus on.'; dropdown.add(option); for (i = 0; i < nodeIds.length; i++) { option = document.createElement('option'); option.text = option.value = nodeIds[i]; dropdown.add(option); } } function download(path) { var file = path.replace("./data/data/",""); var nodesAr = nodes.get(); var edgesAr = edges.get(); var obj = {nodes: nodesAr, edges: edgesAr}; var json = JSON.stringify(obj); var blob = new Blob([json], {type: "text/plain;charset=utf-8"}); saveAs(blob, "processed_" + file); } function startTask(path, success) { // if we find the file already processed, we go to the next one loadJSON("./data/processedData/processed_" + path, function() { getNewTask(path); }, function() { loadJSON("./data/data/" + path, success, function() { console.log("could not find file ", path); }) }); } function askAgent(to, message) { return new Promise(function (resolve, reject) { if (typeof message == 'object') { message = JSON.stringify(message); } // create XMLHttpRequest object to send the POST request var http = new XMLHttpRequest(); // insert the callback function. This is called when the message has been delivered and a response has been received http.onreadystatechange = function () { if (http.readyState == 4 && http.status == 200) { var response = ""; if (http.responseText.length > 0) { response = JSON.parse(http.responseText); } resolve(response); } else if (http.readyState == 4) { reject(new Error("http.status:" + http.status)); } }; // open an asynchronous POST connection http.open("POST", to, true); // include header so the receiving code knows its a JSON object http.setRequestHeader("Content-Type", "text/plain"); // send http.send(message); }); } function getNewTask(path) { var file = undefined; if (path !== undefined) { file = path.replace("./data/data/", ""); } askAgent("http://127.0.0.1:3000/agents/proxy", {jsonrpc:"2.0",method:"getAssignment", params:{finishedFile:file}}).then(function(reply) { console.log(reply, reply.result); if (reply.result != 'none') { startTask(reply.result, function(data,path) {document.getElementById("FILENAME").innerHTML = path; setTimeout(function() {drawAll(data,path);},200)}); } }) } getNewTask()