<!DOCTYPE html>
<html>
    <head>
        <title>Simple Tree and Cluster Demo</title>
        <script src="http://d3js.org/d3.v2.js"></script>     
        <style>
            svg {
                border: solid 1px #ccc;
                font: 10px sans-serif;

            }
            .link {
                fill: none;
                stroke: #ccc;
                stroke-width: 1.5px;
            }
        </style>

    </head>
    <body>
        <button id="tree">Tree</button>
        <button id="cluster">Cluster</button>
        <div id="viz"></div>

        <script type="text/javascript">

            //JSON object with the data
            var treeData = {"name" : "A", "info" : "tst", "children" : [
                    {"name" : "A1", "children" : [ 
                            {"name" : "A12" }, 
                            {"name" : "A13" }, 
                            {"name" : "A14" }, 
                            {"name" : "A15" }, 
                            {"name" : "A16" }
                        ] }, 
                    {"name" : "A2", "children" : [ 
                            {"name" : "A21" }, 
                            {"name" : "A22", "children" : [ 
                                    {"name" : "A221" }, 
                                    {"name" : "A222" }, 
                                    {"name" : "A223" }, 
                                    {"name" : "A224" }
                                ]}, 
                            {"name" : "A23" }, 
                            {"name" : "A24" }, 
                            {"name" : "A25" }] }, 
                    {"name" : "A3", "children": [
                            {"name" : "A31", "children" :[
                                    {"name" : "A311" }, 
                                    {"name" : "A312" }, 
                                    {"name" : "A313" }, 
                                    {"name" : "A314" }, 
                                    {"name" : "A315" }
                                ]}] }
                ]};

            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", 400)
                .attr("height", 300)
                .append("svg:g")
                .attr("transform", "translate(40, 0)"); 


                if (type==1) 
                    var layout = d3.layout.cluster().size([300,300]);
                else
                    var layout = d3.layout.tree().size([300,300]);

                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", 3.5);

                // place the name atribute 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>