<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSON into tree layout</title> <!-- http://bl.ocks.org/anotherjavadude/2964485 -->
    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>

    <style>

    body {font-family: monospace; line-height: 160%; font-size: 18px; }

    svg {     
      font: 14px monospace;
      fill       : #333;
    }
    .link {
        fill: none;
        stroke: #eee;
        stroke-width: 1.5px;
    }
    button {border: 1px dotted #ccc; background: white; font-family: monospace; padding: 10px 20px; font-size: 18px; margin: 20px 10px 20px 0; color: red;}
    button:focus { background-color:yellow; outline: none;}
    nav {display: block; position: fixed; left: 10px; top: 10px; background: transparent; ;}
  
    </style>

</head>

<body>

  <nav>
    <button id="tree">Tree</button>
    <button id="cluster">Cluster</button>
  </nav>

  <div id="viz"></div>

  <script type="text/javascript">

      //JSON object with the data
      var treeData = {"name" : "ROOT", "info" : "test", "children" : [
              {"name" : "A", "children" : [ 
                      {"name" : "A 01" }, 
                      {"name" : "A 02" }, 
                      {"name" : "A 03" }, 
                      {"name" : "A 04" }, 
                      {"name" : "A 05" }
                  ] }, 
              {"name" : "B", "children" : [ 
                      {"name" : "B 01" }, 
                      {"name" : "B 02", "children" : [ 
                              {"name" : "B 02.1" }, 
                              {"name" : "B 02.2" }, 
                              {"name" : "B 02.3" }, 
                              {"name" : "B 02.4" }
                          ]}, 
                      {"name" : "B 03" }, 
                      {"name" : "B 04" }, 
                      {"name" : "B 05" }] }, 
              {"name" : "C", "children": [
                      {"name" : "C 01", "children" :[
                              {"name" : "C 01.1" }, 
                              {"name" : "C 01.2" },
                              {"name" : "C 01.3" },
                              {"name" : "C 01.4" },
                              {"name" : "C 01.5" }
                          ]}] },
              {"name" : "D", "children" : [ 
                      {"name" : "D 01" }, 
                      {"name" : "D 02" }, 
                      {"name" : "D 03", "children" : [ 
                              {"name" : "D 03.1" }, 
                              {"name" : "D 03.2" }
                          ]},  
                      {"name" : "D 04" }
                  ] }
          ]};

      // width and height
      var w = 900;
      var h = 500;

      update(2);

      d3.select("#tree")
      .on("click", function(d,i) {
          update(2)});
      d3.select("#cluster")
      .on("click", function(d,i) {
          update(1)});


      function update(type) {
      
          d3.select("svg")
          .remove();

          // Create a svg canvas
          var vis = d3.select("#viz").append("svg:svg")
          .attr("width", w)
          .attr("height", h)
          .append("svg:g")
          .attr("transform", "translate(60, 0)"); 


          if (type==1) 
              var layout = d3.layout.cluster().size([h,w-100]);
          else
              var layout = d3.layout.tree().size([h,w-100]);

          var diagonal = d3.svg.diagonal()
          // change x and y (for the left to right tree)
          .projection(function(d) { return [d.y, d.x]; });

          // Preparing the data for the tree layout, convert data into an array of nodes
          var nodes = layout.nodes(treeData);
          // Create an array with all the links
          var links = layout.links(nodes);

          var link = vis.selectAll("pathlink")
          .data(links)
          .enter().append("svg:path")
          .attr("class", "link")
          .attr("d", diagonal)

          var node = vis.selectAll("g.node")
          .data(nodes)
          .enter().append("svg:g")
          .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; })

          // Add the dot at every node
          node.append("svg:circle")
          .attr("r", 1.5);

          // place the name attribute left or right depending if children
          node.append("svg:text")
          .attr("dx", function(d) { return d.children ? -8 : 8; })
          .attr("dy", 3)
          .attr("text-anchor", function(d) { return d.children ? "end" : "start"; })
          .text(function(d) { return d.name; });
      }

  </script>
</body>
</html>