// some global vars
|
|
var network;
|
|
var connectedNodes = [];
|
|
var largeNode = undefined;
|
|
var NORMAL_SIZE = 60;
|
|
var LARGE_SIZE = 60;
|
|
var IMAGE_PATH = './images/exampleScreenshots/';
|
|
|
|
function loadVis(SPACING) {
|
|
// getting the sizes of the containers
|
|
var linksContainer = document.getElementById('contentContainer');
|
|
var networkContainer = document.getElementById('networkContainer');
|
|
var linksContainerRect = linksContainer.getBoundingClientRect();
|
|
var linksContainerHeight = linksContainerRect.bottom - linksContainerRect.top;
|
|
|
|
networkContainer.style.height = (linksContainerHeight + LARGE_SIZE) + 'px';
|
|
linksContainer.style.marginTop = '-' + (linksContainerHeight + LARGE_SIZE) + 'px';
|
|
|
|
// constructing nodes and edges from links with class exampleLink
|
|
var links = linksContainer.getElementsByTagName('a');
|
|
var nodesArray = [];
|
|
var edgesArray = [];
|
|
var idCounter = 0;
|
|
var firstLink = undefined;
|
|
for (var i = 0; i < links.length; i++) {
|
|
var link = links[i];
|
|
if (link.className === 'exampleLink') {
|
|
var exampleName = link.getAttribute('href').replace('.html','').replace('examples/','');
|
|
|
|
var linkRect = link.getBoundingClientRect();
|
|
var linkWidth = linkRect.right - linkRect.left;
|
|
|
|
if (firstLink === undefined) {
|
|
firstLink = link;
|
|
}
|
|
nodesArray.push({id:idCounter,
|
|
x:link.offsetLeft + linkWidth,
|
|
y:link.offsetTop,
|
|
color:{
|
|
background:'rgba(0,0,0,0.0)',
|
|
border:'rgba(70,158,255,0)'
|
|
},
|
|
shape:'dot',
|
|
size:2,
|
|
fixed:true
|
|
});
|
|
nodesArray.push({id:idCounter + 'image',
|
|
x:link.offsetLeft + 400 + 100 + (idCounter % 3) * SPACING,
|
|
y:link.offsetTop,
|
|
color:{
|
|
border:'rgba(70,158,255,1)'
|
|
},
|
|
shadow:{
|
|
size:2,
|
|
x:0,
|
|
y:0
|
|
},
|
|
shape:'image',
|
|
image:IMAGE_PATH+(exampleName)+'.png',
|
|
size:NORMAL_SIZE
|
|
});
|
|
edgesArray.push({from: idCounter, to: idCounter+'image', arrows:'from'});
|
|
idCounter += 1;
|
|
}
|
|
}
|
|
|
|
// making a dataset.
|
|
var nodes = new vis.DataSet(nodesArray);
|
|
var edges = new vis.DataSet(edgesArray);
|
|
|
|
// creating a network
|
|
var networkContainer = document.getElementById('networkContainer');
|
|
var data = {
|
|
nodes: nodes,
|
|
edges: edges
|
|
};
|
|
var options = {
|
|
edges:{
|
|
color:{inherit:'both'},
|
|
smooth:false
|
|
},
|
|
physics: false,
|
|
interaction:{
|
|
zoomView:false,
|
|
dragView: false
|
|
}
|
|
};
|
|
network = new vis.Network(networkContainer, data, options);
|
|
|
|
// get the offset or the camera
|
|
var firstLinkPos = {x:firstLink.offsetLeft, y:firstLink.offsetTop};
|
|
var firstLinkRect = firstLink.getBoundingClientRect();
|
|
var firstLinkWidth = firstLinkRect.right - firstLinkRect.left;
|
|
var firstLinkHeight = firstLinkRect.bottom - firstLinkRect.top;
|
|
var networkContainerRect = networkContainer.getBoundingClientRect();
|
|
var networkContainerWidth = networkContainerRect.right - networkContainerRect.left;
|
|
var networkContainerHeight = networkContainerRect.bottom - networkContainerRect.top;
|
|
var ydiff = linksContainer.offsetTop - networkContainer.offsetTop;
|
|
|
|
// move the camera
|
|
network.moveTo({
|
|
scale: 1,
|
|
position: network.getPositions([0])[0],
|
|
offset: {
|
|
x: -0.5 * networkContainerWidth + firstLinkPos.x + firstLinkWidth,
|
|
y: -0.5 * networkContainerHeight + firstLinkPos.y + ydiff + 0.5 * firstLinkHeight
|
|
},
|
|
animation: false
|
|
});
|
|
|
|
// onclick handler
|
|
linksContainer.onclick = function (event) {
|
|
var nodeUnderCursor = network.getNodeAt({x:event.layerX, y:event.layerY+ydiff});
|
|
if (nodeUnderCursor !== undefined) {
|
|
var url = nodes.get(nodeUnderCursor).image.replace(IMAGE_PATH, './examples/').replace(".png",".html");
|
|
window.location.href = url;
|
|
}
|
|
}
|
|
|
|
// throttled mouse move handler
|
|
var t0 = new Date().valueOf();
|
|
linksContainer.onmousemove = function (event) {
|
|
if (new Date().valueOf() - t0 > 60) {
|
|
handleMouse(event);
|
|
t0 = new Date().valueOf();
|
|
}
|
|
}
|
|
|
|
|
|
// get a node at a position, select the node, update the dataset
|
|
function handleMouse(event) {
|
|
var nodeUnderCursor = network.getNodeAt({x:event.layerX, y:event.layerY+ydiff});
|
|
if (connectedNodes.length > 0) {
|
|
nodes.update([{id: connectedNodes[0], color: {border: 'rgba(70,158,255,0)'}}])
|
|
connectedNodes = []
|
|
}
|
|
|
|
if (largeNode !== undefined) {
|
|
nodes.update([{id: largeNode, size: NORMAL_SIZE}]);
|
|
largeNode = undefined;
|
|
}
|
|
|
|
|
|
if (nodeUnderCursor !== undefined) {
|
|
connectedNodes = network.getConnectedNodes(nodeUnderCursor);
|
|
largeNode = nodeUnderCursor;
|
|
nodes.update([{id: largeNode, size: LARGE_SIZE}, {id: connectedNodes[0],color: {border: 'rgba(70,158,255,1)'}}]);
|
|
network.selectNodes([nodeUnderCursor]);
|
|
}
|
|
else {
|
|
network.unselectAll();
|
|
}
|
|
}
|
|
}
|