From 3172f7f5bc44e62bac97da8b496f7f822a287cd8 Mon Sep 17 00:00:00 2001
From: alvaro <alvaro@alia.(none)>
Date: Fri, 19 Oct 2012 01:32:15 -0700
Subject: [PATCH] First version of D3dendogram

---
 .../Haanga/Extension/Filter/D3dendrogram.php  | 136 ++++++++++++++++++
 1 file changed, 136 insertions(+)
 create mode 100644 lib/Haanga/lib/Haanga/Extension/Filter/D3dendrogram.php

diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/D3dendrogram.php b/lib/Haanga/lib/Haanga/Extension/Filter/D3dendrogram.php
new file mode 100644
index 00000000..8b8e39ed
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/D3dendrogram.php
@@ -0,0 +1,136 @@
+<?php
+
+class Haanga_Extension_Filter_D3Dendrogram{
+  public $is_safe = TRUE;
+  static function main($obj, $varname){
+
+  	$nodesArr = array();
+  	$n=0;
+  	$first="";
+  	$nodes = array();
+  	$links = array();
+  	$names = explode(",", $varname);
+  	$varList = array();
+  	$randId = uniqid("_ID_");
+
+  	foreach($names as $v){
+  	  if(strpos($v,"=")){
+  	    break;
+  	  }
+  	  $variable['name'] = $v;
+  	  $variable['value'] = 'value';
+  	  if(strpos($v, ".")){
+  	    $aux = explode(".", $v);
+  	    $variable['name'] = $aux[0];
+  	    $variable['value'] = $aux[1];
+  	  }
+  	  $fieldCounter++;
+  	  $columnType = 'number';
+  	  if($firstColumn){
+  	  	$columnType = 'string';
+  	  	$firstColumn = false;
+  	  }
+  	  array_push($varList, $variable);
+  	  //$data .= "        data.addColumn('".$columnType."', '".$variable['name']."');\n";
+  	}
+  	//options
+  	$options = array();
+  	$options['width'] = 960;
+  	$options['height'] = 500;
+  	$options['color'] = '#aec7e8';
+  	$options['highlightedColor'] = '#00477f';
+  	$options['radius'] = 10;
+  	$options['highlightedStrokeWidth'] = '3px';
+  	$options['strokeWidth'] = '1px';
+  	for($z=2; $z < count($names); $z++){
+      $pair = explode("=", $names[$z]);
+      $key = trim($pair[0], "\" '");
+      $value = trim($pair[1], "\" '");
+      $options[$key] = $value;     
+    }
+
+  	$maps = array();
+  	$rootNode = NULL;
+  	$id = $varList[0]['name'];
+  	$parentId = $varList[1]['name'];
+  	foreach($obj as $k){
+  	  if(!isset($k->$parentId)){
+  	    //root
+  	    $rootNode = $k->$id->value;
+  	  }else{
+  	    if(!isset($maps[$k->$parentId->value])){
+  	      $maps[$k->$parentId->value] = array();
+  	    }
+  	    array_push($maps[$k->$parentId->value], $k->$id->value);
+  	  }
+  	}  	
+  	
+  	function travel($node, $tree){
+  	  $total = array();
+  	  foreach($tree[$node] as $v){
+  	    $branch = array();
+  	    if(!isset($tree[$v])){
+  	      $branch['value'] = 1000;
+  	    }else{
+  	      $branch['children'] = travel($v, $tree);
+  	    }
+  	    $branch['name'] = $v;
+  	    array_push($total, $branch);
+  	  }
+  	  return $total;
+  	}
+  	
+  	$json['name'] = $rootNode;
+  	$json['children'] = travel($rootNode, $maps);
+  	
+  	
+  	$pre = '<div id="dendrogram'.$randId.'"><div id="name'.$randId.'" style="font-family:sans-serif;font-size:15px;height:25px"><h2> </h2></div></div><script src="http://d3js.org/d3.v2.min.js?2.9.3"></script>
+<script>
+// Based on http://bost.ocks.org/mike/treemap/ 
+function initD3TreeMaps'.$randId.'(json){
+var width = 600,
+    height = 500;
+  
+  var cluster = d3.layout.cluster()
+      .size([height, width - 200]);
+  
+  var diagonal = d3.svg.diagonal()
+      .projection(function(d) { return [d.y, d.x]; });
+  
+ var vis = d3.select("#dendrogram'.$randId.'").append("svg")
+     .attr("width", width)
+     .attr("height", height)
+   .append("g")
+     .attr("transform", "translate(80, 0)");
+ 
+   var nodes = cluster.nodes(json);
+ 
+   var link = vis.selectAll("path.link")
+       .data(cluster.links(nodes))
+     .enter().append("path").style("fill", "none").style("stroke", "#CCC")
+       .attr("class", "link")
+       .attr("d", diagonal);
+ 
+   var node = vis.selectAll("g.node")
+       .data(nodes)
+     .enter().append("g")
+       .attr("class", "node")
+       .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; })
+ 
+   node.append("circle")
+       .attr("r", 4.5).style("fill", "white").style("stroke", "steelblue").style("stroke-width", "1.5px");
+ 
+   node.append("text").style("font", "10px sans-serif")
+       .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; });
+ 
+}
+    
+var jsonD3'.$randId.' = '.json_encode($json).';
+initD3TreeMaps'.$randId.'(jsonD3'.$randId.')
+</script>';
+  	return $pre.$post;
+  }
+}
-- 
GitLab