<!doctype html>
<html>
<head>
  <title>Network | Groups</title>

  <style>
    body {
        color:#ffffff;
        font: 10pt arial;
        background-color:#222222;
    }
    #mynetwork {
      width: 600px;
      height: 600px;
      border: 1px solid lightgray;
      background-color:#222222;
    }
  </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 nodesData = null;

    function destroy() {
      if (network !== null) {
        network.destroy();
        network = null;
      }
    }

    function draw() {
      destroy();

      var from, to;

      nodes = [];
      edges = [];

      var color = 'gray';
      var len = undefined;

      // randomly create some nodes
      var nodeCount = parseInt(document.getElementById('nodeCount').value);
      var nodeOffset = 0;
      var groupMin = 0;
      var groupMax = parseInt(document.getElementById('groupCount').value);
      var group = groupMin;
      var groupLeader = []; // will contain the node id with the most links of each group
      while (group < groupMax) {
        // randomly create some nodes
        var i = 0;
        var cols = parseInt(Math.sqrt(nodeCount));
        var connectionCount = [];
        while (i < nodeCount) {
          nodes.push({
            id: i + nodeOffset,
            label: String(i + nodeOffset),
            group: group
          });
          connectionCount[i] = 0;

          // create links in a scale-free-network way
          if (i == 1) {
            from = i;
            to = 0;
            edges.push({
              from: from + nodeOffset,
              to: to + nodeOffset,
              length: len
            });
            connectionCount[from]++;
            connectionCount[to]++;
          }
          else if (i > 1) {
            var conn = (i - 1) * 2;
            var rand = Math.floor(Math.random() * conn);
            var cum = 0;
            var j = 0;
            while (j < connectionCount.length && cum < rand) {
              cum += connectionCount[j];
              j++;
            }

            from = i;
            to = j;
            edges.push({
              from: from + nodeOffset,
              to: to + nodeOffset,
              length: len
            });
            connectionCount[from]++;
            connectionCount[to]++;
          }

          i++;
        }

        // calculate the node with the most number of connections
        var leader = 0;
        for (var c in connectionCount) {
          if (connectionCount.hasOwnProperty(c)) {
            if (connectionCount[c] > connectionCount[leader]) {
              leader = parseInt(c);
            }
          }
        }

        if (group > groupMin) {
          // connect to the leader of this group to the leader of a random other group
          from = leader + nodeOffset;
          to = groupLeader[groupMin + parseInt(Math.random() * (group - groupMin))];
          edges.push({
            from: from,
            to: to,
            length: len
          });
        }

        // add this leader to the list
        groupLeader[group] = leader + nodeOffset;

        nodeOffset += nodeCount;
        group++;
      }
      nodesData = new vis.DataSet(nodes);
      // create a network
      var container = document.getElementById('mynetwork');
      var data = {
        nodes: nodesData,
        edges: edges
      };
      var options = {
        nodes: {
            shape: 'dot',
            radius:30,
            font:{color:'#ffffff'},
            borderWidth:2
        }
      };
      network = new vis.Network(container, data, options);
    }

  </script>
<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create', 'UA-61231638-1', 'auto');ga('send', 'pageview');</script></head>

<body onload="draw()">
<form onsubmit= "javascript: draw(); return false;">
  Number of groups:
  <input type="text" value="10" id="groupCount" style="width: 50px;">
  Number of nodes per group:
  <input type="text" value="3" id="nodeCount" style="width: 50px;">
  <input type="submit" value="Go">
</form>
<br>
<div id="mynetwork"></div>

</body>
</html>