<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
    <link type="text/css" rel="stylesheet" href="style.css"/>
    <style type="text/css">
text {
  font-size: 11px;
  pointer-events: none;
}
text.parent {
  fill: #1f77b4;
}
circle {
  fill: #ccc;
  stroke: #999;
  pointer-events: all;
}
circle.parent {
  fill: #1f77b4;
  fill-opacity: .1;
  stroke: steelblue;
}
circle.parent:hover {
  stroke: #ff7f0e;
  stroke-width: .5px;
}
circle.child {
  pointer-events: none;
}
    </style>
  </head>
  <body>
    <h2>
      Electrode Modules
    </h2>
    <script src="http://d3js.org/d3.v3.min.js"></script>
    <script type="text/javascript" src="http://mbostock.github.com/d3/d3.layout.js"></script>
    <script type="text/javascript">
var w = 1280,
    h = 800,
    r = 720,
    x = d3.scale.linear().range([0, r]),
    y = d3.scale.linear().range([0, r]),
    node,
    root;
var pack = d3.layout.pack()
    .size([r, r])
    .value(function(d) { return d.size; })
var vis = d3.select("body").insert("svg:svg", "h2")
    .attr("width", w)
    .attr("height", h)
  .append("svg:g")
    .attr("transform", "translate(" + (w - r) / 2 + "," + (h - r) / 2 + ")");
d3.json("electrode.json", function(data) {
  node = root = data;
  var nodes = pack.nodes(root);
  vis.selectAll("circle")
      .data(nodes)
    .enter().append("svg:circle")
      .attr("class", function(d) { return d.children ? "parent" : "child"; })
      .attr("cx", function(d) { return d.x; })
      .attr("cy", function(d) { return d.y; })
      .attr("r", function(d) { return d.r; })
      .on("click", function(d) { return zoom(node == d ? root : d); });
  vis.selectAll("text")
      .data(nodes)
    .enter().append("svg:text")
      .attr("class", function(d) { return d.children ? "parent" : "child"; })
      .attr("x", function(d) { return d.x; })
      .attr("y", function(d) { return d.y; })
      .attr("dy", ".35em")
      .attr("text-anchor", "middle")
      .style("opacity", function(d) { return d.r > 20 ? 1 : 0; })
      .text(function(d) { return d.name; });
  d3.select(window).on("click", function() { zoom(root); });
});
function zoom(d, i) {
  var k = r / d.r / 2;
  x.domain([d.x - d.r, d.x + d.r]);
  y.domain([d.y - d.r, d.y + d.r]);
  var t = vis.transition()
      .duration(d3.event.altKey ? 7500 : 750);
  t.selectAll("circle")
      .attr("cx", function(d) { return x(d.x); })
      .attr("cy", function(d) { return y(d.y); })
      .attr("r", function(d) { return k * d.r; });
  t.selectAll("text")
      .attr("x", function(d) { return x(d.x); })
      .attr("y", function(d) { return y(d.y); })
      .style("opacity", function(d) { return k * d.r > 20 ? 1 : 0; });
  node = d;
  d3.event.stopPropagation();
}
    </script>
  </body>
</html>