<!doctype html>
							 | 
						|
								<html>
							 | 
						|
								<head>
							 | 
						|
								  <title>Network | Animation</title>
							 | 
						|
								
							 | 
						|
								  <style type="text/css">
							 | 
						|
								    body {
							 | 
						|
								      font: 10pt sans;
							 | 
						|
								    }
							 | 
						|
								    #mynetwork {
							 | 
						|
								      width: 600px;
							 | 
						|
								      height: 600px;
							 | 
						|
								      border: 1px solid lightgray;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    div.left {
							 | 
						|
								      position:relative;
							 | 
						|
								      float:left;
							 | 
						|
								      width:300px;
							 | 
						|
								      border: 1px #c7c7c7 solid;
							 | 
						|
								      height:590px;
							 | 
						|
								      padding:5px;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    div.right {
							 | 
						|
								      padding-left:10px;
							 | 
						|
								      float:left;
							 | 
						|
								      width:600px;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    div.bottom {
							 | 
						|
								      position:absolute;
							 | 
						|
								      bottom:5px;
							 | 
						|
								    }
							 | 
						|
								  </style>
							 | 
						|
								
							 | 
						|
								  <script type="text/javascript" src="../../dist/vis.js"></script>
							 | 
						|
								  <link href="../../dist/vis.css" rel="stylesheet" type="text/css" />
							 | 
						|
								
							 | 
						|
								  <script type="text/javascript">
							 | 
						|
								    var nodes = null;
							 | 
						|
								    var edges = null;
							 | 
						|
								    var network = null;
							 | 
						|
								
							 | 
						|
								    var doButton, focusButton, showButton;
							 | 
						|
								    var statusUpdateSpan;
							 | 
						|
								    var finishMessage = '';
							 | 
						|
								
							 | 
						|
								    function destroy() {
							 | 
						|
								      if (network !== null) {
							 | 
						|
								        network.destroy();
							 | 
						|
								        network = null;
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    function draw() {
							 | 
						|
								      destroy();
							 | 
						|
								      statusUpdateSpan = document.getElementById('statusUpdate');
							 | 
						|
								      doButton = document.getElementById('btnDo');
							 | 
						|
								      focusButton = document.getElementById('btnFocus');
							 | 
						|
								      showButton = document.getElementById('btnShow');
							 | 
						|
								      nodes = [];
							 | 
						|
								      edges = [];
							 | 
						|
								      var connectionCount = [];
							 | 
						|
								
							 | 
						|
								      // randomly create some nodes and edges
							 | 
						|
								      var nodeCount = 25;
							 | 
						|
								      for (var i = 0; i < nodeCount; i++) {
							 | 
						|
								        nodes.push({
							 | 
						|
								          id: i,
							 | 
						|
								          label: String(i)
							 | 
						|
								        });
							 | 
						|
								
							 | 
						|
								        connectionCount[i] = 0;
							 | 
						|
								
							 | 
						|
								        // create edges in a scale-free-network way
							 | 
						|
								        if (i == 1) {
							 | 
						|
								          var from = i;
							 | 
						|
								          var to = 0;
							 | 
						|
								          edges.push({
							 | 
						|
								            from: from,
							 | 
						|
								            to: to
							 | 
						|
								          });
							 | 
						|
								          connectionCount[from]++;
							 | 
						|
								          connectionCount[to]++;
							 | 
						|
								        }
							 | 
						|
								        else if (i > 1) {
							 | 
						|
								          var conn = edges.length * 2;
							 | 
						|
								          var rand = Math.floor(Math.random() * conn);
							 | 
						|
								          var cum = 0;
							 | 
						|
								          var j = 0;
							 | 
						|
								          while (j < connectionCount.length && cum < rand) {
							 | 
						|
								            cum += connectionCount[j];
							 | 
						|
								            j++;
							 | 
						|
								          }
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								          var from = i;
							 | 
						|
								          var to = j;
							 | 
						|
								          edges.push({
							 | 
						|
								            from: from,
							 | 
						|
								            to: to
							 | 
						|
								          });
							 | 
						|
								          connectionCount[from]++;
							 | 
						|
								          connectionCount[to]++;
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								
							 | 
						|
								      // create a network
							 | 
						|
								      var container = document.getElementById('mynetwork');
							 | 
						|
								      var data = {
							 | 
						|
								        nodes: nodes,
							 | 
						|
								        edges: edges
							 | 
						|
								      };
							 | 
						|
								      var options = {
							 | 
						|
								        physics: {
							 | 
						|
								          stabilization: {
							 | 
						|
								            iterations: 1200
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								      };
							 | 
						|
								      network = new vis.Network(container, data, options);
							 | 
						|
								
							 | 
						|
								      // add event listeners
							 | 
						|
								      network.on('select', function(params) {
							 | 
						|
								        document.getElementById('selection').innerHTML = 'Selection: ' + params.nodes;
							 | 
						|
								      });
							 | 
						|
								      network.on('stabilized', function (params) {
							 | 
						|
								        document.getElementById('stabilization').innerHTML = 'Stabilization took ' + params.iterations + ' iterations.';
							 | 
						|
								      });
							 | 
						|
								      network.on('animationFinished', function() {
							 | 
						|
								        statusUpdateSpan.innerHTML = finishMessage;
							 | 
						|
								      })
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    function zoomExtentAnimated() {
							 | 
						|
								      var offsetx = parseInt(document.getElementById('offsetx').value);
							 | 
						|
								      var offsety = parseInt(document.getElementById('offsety').value);
							 | 
						|
								      var duration = parseInt(document.getElementById('duration').value);
							 | 
						|
								      var easingFunction = document.getElementById('easingFunction').value;
							 | 
						|
								
							 | 
						|
								      var options = {offset: {x:offsetx,y:offsety},
							 | 
						|
								        duration: duration,
							 | 
						|
								        easingFunction: easingFunction
							 | 
						|
								      };
							 | 
						|
								      statusUpdateSpan.innerHTML = 'Doing ZoomExtent() Animation.';
							 | 
						|
								      finishMessage = 'Animation finished.';
							 | 
						|
								      network.fit(options);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    function doDefaultAnimation() {
							 | 
						|
								      var offsetx = parseInt(document.getElementById('offsetx').value);
							 | 
						|
								      var offsety = parseInt(document.getElementById('offsety').value);
							 | 
						|
								      var scale = parseFloat(document.getElementById('scale').value);
							 | 
						|
								      var positionx = parseInt(document.getElementById('positionx').value);
							 | 
						|
								      var positiony = parseInt(document.getElementById('positiony').value);
							 | 
						|
								      var easingFunction = document.getElementById('easingFunction').value;
							 | 
						|
								
							 | 
						|
								      var options = {
							 | 
						|
								        position: {x:positionx,y:positiony},
							 | 
						|
								        scale: scale,
							 | 
						|
								        offset: {x:offsetx,y:offsety},
							 | 
						|
								        animation: true // default duration is 1000ms and default easingFunction is easeInOutQuad.
							 | 
						|
								      };
							 | 
						|
								      statusUpdateSpan.innerHTML = 'Doing Animation.';
							 | 
						|
								      finishMessage = 'Animation finished.';
							 | 
						|
								      network.moveTo(options);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    function doAnimation() {
							 | 
						|
								      var offsetx = parseInt(document.getElementById('offsetx').value);
							 | 
						|
								      var offsety = parseInt(document.getElementById('offsety').value);
							 | 
						|
								      var duration = parseInt(document.getElementById('duration').value);
							 | 
						|
								      var scale = parseFloat(document.getElementById('scale').value);
							 | 
						|
								      var positionx = parseInt(document.getElementById('positionx').value);
							 | 
						|
								      var positiony = parseInt(document.getElementById('positiony').value);
							 | 
						|
								      var easingFunction = document.getElementById('easingFunction').value;
							 | 
						|
								
							 | 
						|
								      var options = {
							 | 
						|
								        position: {x:positionx,y:positiony},
							 | 
						|
								        scale: scale,
							 | 
						|
								        offset: {x:offsetx,y:offsety},
							 | 
						|
								        animation: {
							 | 
						|
								          duration: duration,
							 | 
						|
								          easingFunction: easingFunction
							 | 
						|
								        }
							 | 
						|
								      };
							 | 
						|
								      statusUpdateSpan.innerHTML = 'Doing Animation.';
							 | 
						|
								      finishMessage = 'Animation finished.';
							 | 
						|
								      network.moveTo(options);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    function focusRandom() {
							 | 
						|
								      var nodeId = Math.floor(Math.random() * 25);
							 | 
						|
								      var offsetx = parseInt(document.getElementById('offsetx').value);
							 | 
						|
								      var offsety = parseInt(document.getElementById('offsety').value);
							 | 
						|
								      var duration = parseInt(document.getElementById('duration').value);
							 | 
						|
								      var scale = parseFloat(document.getElementById('scale').value);
							 | 
						|
								      var easingFunction = document.getElementById('easingFunction').value;
							 | 
						|
								
							 | 
						|
								      var options = {
							 | 
						|
								        // position: {x:positionx,y:positiony}, // this is not relevant when focusing on nodes
							 | 
						|
								        scale: scale,
							 | 
						|
								        offset: {x:offsetx,y:offsety},
							 | 
						|
								        animation: {
							 | 
						|
								          duration: duration,
							 | 
						|
								          easingFunction: easingFunction
							 | 
						|
								        }
							 | 
						|
								      };
							 | 
						|
								      statusUpdateSpan.innerHTML = 'Focusing on node: ' + nodeId;
							 | 
						|
								      finishMessage = 'Node: ' + nodeId + ' in focus.';
							 | 
						|
								      network.focus(nodeId, options);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    var showInterval = false;
							 | 
						|
								    var showPhase = 1;
							 | 
						|
								    function startShow() {
							 | 
						|
								      if (showInterval !== false) {
							 | 
						|
								        showInterval = false;
							 | 
						|
								        showButton.value = 'Start a show!';
							 | 
						|
								        network.fit();
							 | 
						|
								      }
							 | 
						|
								      else {
							 | 
						|
								        showButton.value = 'Stop the show!';
							 | 
						|
								        var duration = parseInt(document.getElementById('duration').value);
							 | 
						|
								        focusRandom();
							 | 
						|
								        setTimeout(doTheShow, duration);
							 | 
						|
								        showInterval = true;
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    function doTheShow() {
							 | 
						|
								      if (showInterval == true) {
							 | 
						|
								        var duration = parseInt(document.getElementById('duration').value);
							 | 
						|
								        if (showPhase == 0) {
							 | 
						|
								          focusRandom();
							 | 
						|
								          showPhase = 1;
							 | 
						|
								        }
							 | 
						|
								        else {
							 | 
						|
								          zoomExtentAnimated();
							 | 
						|
								          showPhase = 0;
							 | 
						|
								        }
							 | 
						|
								        setTimeout(doTheShow, duration);
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								  </script>
							 | 
						|
								  <script src="../googleAnalytics.js"></script>
							 | 
						|
								</head>
							 | 
						|
								
							 | 
						|
								<body onload="draw();">
							 | 
						|
								<h2>Camera animations</h2>
							 | 
						|
								<div style="width:700px; font-size:14px;">
							 | 
						|
								  You can move the view around programmatically using the .moveTo(options) function. The options supplied to this function can
							 | 
						|
								  also be (partially) supplied to the .zoomExtent() and .focusOnNode() methods. These are explained in the docs.
							 | 
						|
								  <br /><br/>
							 | 
						|
								  The buttons below take the fields from the table when they can. For instance, the "Animate with default settings." takes the position, scale and offset while using
							 | 
						|
								  the default animation values for duration and easing function. The focusOnNode takes everything except the position and the zoomExtent takes only the duration and easing function.
							 | 
						|
								  <br/><br/>
							 | 
						|
								  Here you can see a full description of the options you can supply to moveTo:
							 | 
						|
								</div>
							 | 
						|
								<pre>
							 | 
						|
								var moveToOptions = {
							 | 
						|
								    position: {x:x, y:x},    // position to animate to (Numbers)
							 | 
						|
								    scale: 1.0,              // scale to animate to  (Number)
							 | 
						|
								    offset: {x:x, y:y},      // offset from the center in DOM pixels (Numbers)
							 | 
						|
								    animation: {             // animation object, can also be Boolean
							 | 
						|
								      duration: 1000,                 // animation duration in milliseconds (Number)
							 | 
						|
								      easingFunction: "easeInOutQuad" // Animation easing function, available are:
							 | 
						|
								    }                                   // linear, easeInQuad, easeOutQuad, easeInOutQuad,
							 | 
						|
								}                                       // easeInCubic, easeOutCubic, easeInOutCubic,
							 | 
						|
								                                        // easeInQuart, easeOutQuart, easeInOutQuart,
							 | 
						|
								                                        // easeInQuint, easeOutQuint, easeInOutQuint
							 | 
						|
								</pre>
							 | 
						|
								<div class="left">
							 | 
						|
								  <table>
							 | 
						|
								    <tr>
							 | 
						|
								      <td>position x</td><td><input type="text" value="300" id="positionx" style="width:170px;"></td>
							 | 
						|
								    </tr>
							 | 
						|
								    <tr>
							 | 
						|
								      <td>position y</td><td><input type="text" value="300" id="positiony" style="width:170px;"></td>
							 | 
						|
								    </tr>
							 | 
						|
								    <tr>
							 | 
						|
								      <td>scale</td><td><input type="text" value="1.0" id="scale" style="width:170px;"></td>
							 | 
						|
								    </tr>
							 | 
						|
								    <tr>
							 | 
						|
								      <td>offset x</td><td><input type="text" value="0" id="offsetx" style="width:170px;"> px</td>
							 | 
						|
								    </tr>
							 | 
						|
								    <tr>
							 | 
						|
								      <td>offset y</td><td><input type="text" value="0" id="offsety" style="width:170px;"> px</td>
							 | 
						|
								    </tr>
							 | 
						|
								    <tr>
							 | 
						|
								      <td>duration</td><td><input type="text" value="2500" id="duration" style="width:170px;"> ms</td>
							 | 
						|
								    </tr>
							 | 
						|
								    <tr>
							 | 
						|
								      <td>easingFunction</td><td>
							 | 
						|
								      <select id="easingFunction" style="width:174px;">
							 | 
						|
								        <option value="linear">linear</option>
							 | 
						|
								        <option value="easeInQuad">easeInQuad</option>
							 | 
						|
								        <option value="easeOutQuad">easeOutQuad</option>
							 | 
						|
								        <option value="easeInOutQuad" selected="selected">easeInOutQuad</option>
							 | 
						|
								        <option value="easeInCubic">easeInCubic</option>
							 | 
						|
								        <option value="easeOutCubic">easeOutCubic</option>
							 | 
						|
								        <option value="easeInOutCubic">easeInOutCubic</option>
							 | 
						|
								        <option value="easeInQuart">easeInQuart</option>
							 | 
						|
								        <option value="easeOutQuart">easeOutQuart</option>
							 | 
						|
								        <option value="easeInOutQuart">easeInOutQuart</option>
							 | 
						|
								        <option value="easeInQuint">easeInQuint</option>
							 | 
						|
								        <option value="easeOutQuint">easeOutQuint</option>
							 | 
						|
								        <option value="easeInOutQuint">easeInOutQuint</option>
							 | 
						|
								      </select>
							 | 
						|
								    </td>
							 | 
						|
								    </tr>
							 | 
						|
								  </table>
							 | 
						|
								  <div class="bottom">
							 | 
						|
								    <span id="statusUpdate"></span><br />
							 | 
						|
								    Examples:
							 | 
						|
								    <input type="button" onclick="doAnimation();" value="Animate with above settings." style="width:300px;" id="btnDo"> <br/>
							 | 
						|
								    <input type="button" onclick="doDefaultAnimation();" value="Animate with default settings." style="width:300px;" id="btnDoDefault"> <br/>
							 | 
						|
								    <input type="button" onclick="zoomExtentAnimated();" value="Animated ZoomExtent()." style="width:300px;" id="btnZoom"> <br/>
							 | 
						|
								    <input type="button" onclick="focusRandom();" value="Focus on random node." style="width:300px;" id="btnFocus"><br/>
							 | 
						|
								    <input type="button" onclick="startShow();" value="Start a show!" style="width:300px;" id="btnShow"><br/>
							 | 
						|
								  </div>
							 | 
						|
								</div>
							 | 
						|
								<div class="right">
							 | 
						|
								  <div id="mynetwork"></div>
							 | 
						|
								
							 | 
						|
								  <p id="selection"></p>
							 | 
						|
								  <p id="stabilization"></p>
							 | 
						|
								</div>
							 | 
						|
								</body>
							 | 
						|
								</html>
							 |