function doTheTreeViz(divName, inData) {
width : $(divName).outerWidth(),
height : $(divName).outerHeight()
options.gap = options.gap * options.radius;
var width = options.width;
var height = options.height;
var data = inData.d3.data;
var color = d3.scale.ordinal().range(["#1398ff", "#bdbdbd", "#ffc332", "#daa520", "#00bfff", "#dc143c", "#87cefa", "#90ee90", "#add8e6", "#d3d3d3", "#cf1256", "#12cf5e"]);
var colorStatus = d3.scale.ordinal().range(["#00ff00", "#fff000", "#f40336"]);
var force = d3.layout.force().nodes(nodes).links(links).size([width, height]).linkDistance(options.linkDistance).charge(options.charge).on("tick", tick).start();
var svg = d3.select(divName).append("svg:svg").attr("width", width).attr("height", height);
if (options.styleColumn) {
for (var i = 0; i < links.length; i++) {
if (linkStyles.indexOf( x = links[i][options.styleColumn].toLowerCase()) == -1){
linkStyles[0] = "defaultMarker";
if (options.markerWidth) {
svg.append("svg:defs").selectAll("marker").data(linkStyles).enter().append("svg:marker").attr("id", String).attr("viewBox", "0 -5 10 10").attr("refX", 15).attr("refY", -1.5).attr("markerWidth", options.markerWidth).attr("markerHeight", options.markerHeight).attr("orient", "auto").append("svg:path").attr("d", "M0,-5L10,0L0,5");
var path = svg.append("svg:g").selectAll("path").data(force.links()).enter().append("svg:path").attr("class", function(d) {
return "link " + (options.styleColumn ? d[options.styleColumn].toLowerCase() : linkStyles[0]);
}).attr("marker-end", function(d) {
return "url(#" + (options.styleColumn ? d[options.styleColumn].toLowerCase() : linkStyles[0] ) + ")";
var circle = svg.append("svg:g").selectAll("circle").data(force.nodes()).enter().append("svg:circle").attr("r", function(d) {
}).style("fill", function(d) {
circle.append("title").text(function(d) {
return d[options.nodeLabel];
path.append("title").text(function(d) {
return d[options.linkName];
var text = svg.append("svg:g").selectAll("g").data(force.nodes()).enter().append("svg:g");
text.append("svg:text").attr("x", options.labelFontSize).attr("y", ".31em").attr("class", "shadow").text(function(d) {
return d[options.nodeLabel];
text.append("svg:text").attr("x", options.labelFontSize).attr("y", ".31em").text(function(d) {
return d[options.nodeLabel];
return options.radius * (options.nodeResize ? Math.sqrt(d[options.nodeResize]) / Math.PI : 1);
path.attr("d", function(d) {
var dx = d.target.x - d.source.x, dy = d.target.y - d.source.y, dr = Math.sqrt(dx * dx + dy * dy);
return "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y;
circle.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
text.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
recursiveNode: function(value, nodes, level){
var children = new Array();
if(value.children.length > 0){
for(var c=0;c<value.children.length;c++){
children.push(value.children[c].name);
var orbSizesArray = [125, 55, 5, 1];
var count = orbSizesArray[level];
"linkCount": value.children.length,
if(value.children.length > 0){
for(var c=0;c<value.children.length;c++){
that.recursiveNode(value.children[c], nodes, level);
createNode: function(data){
$.each(data, function(index, value) {
that.recursiveNode(value, nodes, level);
return that.discoverChildren(nodes);
findPosition: function(nodes, c){
$.each(nodes, function(i, x) {
discoverChildren: function(nodes){
$.each(nodes, function( index, value ) {
var childrenPositionArray = new Array();
$.each(value.children, function(i, c) {
childrenPositionArray.push(that.findPosition(nodes, c));
nodes[index]["childrenPositions"] = childrenPositionArray;
nodes[index]["nodePosition"] = index;
createLinks: function(nodes){
$.each(nodes, function(i, val) {
var source = val.nodePosition;
if(val.childrenPositions.length > 0){
for(var c=0;c<val.childrenPositions.length;c++){
var target = val.childrenPositions[c];
var nodes = nodeMaker.createNode(data);
var links = nodeMaker.createLinks(nodes);
console.log("new nodes", nodes);
console.log("new links", links);
window['mcpherTreeData'] = {
$( document ).ready(function() {
doTheTreeViz("#chart", mcpherTreeData);