From b5cce4d78d192ac32f74c549ba7e319b2b65b499 Mon Sep 17 00:00:00 2001
From: alvaro <alvaro@alia.(none)>
Date: Tue, 23 Oct 2012 00:05:23 -0700
Subject: [PATCH] Adding D3CirclePacking

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

diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/D3circlepacking.php b/lib/Haanga/lib/Haanga/Extension/Filter/D3circlepacking.php
new file mode 100644
index 00000000..62d8d4e3
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/D3circlepacking.php
@@ -0,0 +1,136 @@
+<?php
+
+class Haanga_Extension_Filter_D3CirclePacking{
+  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();
+  	$quantities = array();
+  	$rootNode = NULL;
+  	$id = $varList[0]['name'];
+  	$quantity  = $varList[2]['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();
+  	    }
+  	    if(isset($k->$quantity)){
+  	      $quantities[$k->$id->value] = $k->$quantity->value;
+  	    }
+  	    array_push($maps[$k->$parentId->value], $k->$id->value);
+  	  }
+  	}  
+  	function travelCirclePacking($node, $tree, $quantities){
+  	  $total = array();
+  	  foreach($tree[$node] as $v){
+  	    $branch = array();
+  	    if(!isset($tree[$v])){
+  	      if(isset($quantities[$v])){
+  	        $branch['size'] = $quantities[$v];
+  	      }
+  	    }else{
+  	      $branch['children'] = travelCirclePacking($v, $tree, $quantities);
+  	    }
+  	    $branch['name'] = $v;
+  	    array_push($total, $branch);
+  	  }
+  	  return $total;
+  	}
+  	
+  	$json['name'] = $rootNode;
+  	$json['children'] = travelCirclePacking($rootNode, $maps, $quantities);
+  	
+  	
+  	$pre = '<div id="clusterpacking'.$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 initD3CirclePacking'.$randId.'(json){
+var width = 960,
+    height = 600,
+    format = d3.format(",d");
+
+var pack = d3.layout.pack()
+    .size([width - 4, height - 4])
+    .value(function(d) { return d.size; });
+
+var vis = d3.select("#clusterpacking'.$randId.'").append("svg")
+    .attr("width", width)
+    .attr("height", height)
+    .attr("class", "pack")
+  .append("g")
+    .attr("transform", "translate(2, 2)");
+
+  var node = vis.data([json]).selectAll("g.node")
+      .data(pack.nodes)
+    .enter().append("g")
+      .attr("class", function(d) { return d.children ? "node" : "leaf node"; })
+      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
+
+  node.append("title")
+      .text(function(d) { return d.name + (d.children ? "" : ": " + format(d.size)); });
+
+  node.append("circle")
+      .attr("r", function(d) { return d.r; });
+
+  node.filter(function(d) { return !d.children; }).append("text")
+      .attr("text-anchor", "middle")
+      .attr("dy", ".3em")
+      .text(function(d) { return d.name.substring(0, d.r / 3); });
+
+}
+    
+var jsonD3'.$randId.' = '.json_encode($json, JSON_NUMERIC_CHECK).';
+initD3CirclePacking'.$randId.'(jsonD3'.$randId.')
+</script>';
+  	return $pre.$post;
+  }
+}
-- 
GitLab