From 7057bdcdf59c246f72b7fd4eb66f805ea0b2d4aa Mon Sep 17 00:00:00 2001
From: alvaro <alvaro@alia.(none)>
Date: Fri, 12 Oct 2012 16:59:38 -0700
Subject: [PATCH] Improved version of force graph filter using D3

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

diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/D3forcegraph.php b/lib/Haanga/lib/Haanga/Extension/Filter/D3forcegraph.php
new file mode 100644
index 00000000..1b5885cf
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/D3forcegraph.php
@@ -0,0 +1,126 @@
+<?php
+
+class Haanga_Extension_Filter_D3ForceGraph{
+  public $is_safe = TRUE;
+  static function main($obj, $varname){
+
+  	$nodesArr = array();
+  	$n=0;
+  	$first="";
+  	$nodes = array();
+  	$links = array();
+  	$names = explode(",", $varname);
+  	$varList = array();
+
+  	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";
+  	}
+
+  	
+  	
+  	foreach($obj as $k){
+  	    $nameSource = $varList[0]['name'];
+  	    $valSource = $varList[0]['value'];
+   	    if(!isset($nodesArr[$k->$nameSource->value])){
+   	      $nodesArr[$k->$nameSource->value] = $n++;
+   	      array_push($nodes, array("name" => $k->$nameSource->$valSource));
+   	    }
+   	    $nameTarget = $varList[1]['name'];
+  	    $valTarget = $varList[1]['value'];
+   	    if(!isset($nodesArr[$k->$nameTarget->value])){
+   	      $nodesArr[$k->$nameTarget->value] = $n++;
+   	      array_push($nodes, array("name" => $k->$nameTarget->$valTarget));
+   	    }
+  	    array_push($links, array("source" => $nodesArr[$k->$nameSource->value], "target" => $nodesArr[$k->$nameTarget->value], "type" => "suit"));
+
+  	}  	
+
+  	$json['nodes'] = $nodes;
+  	$json['links'] = $links;
+  	
+  	
+  	$pre = '<script src="http://d3js.org/d3.v2.min.js?2.9.3"></script>
+<script>
+
+var width = 960,
+    height = 500
+
+var svg = d3.select("body").append("svg")
+    .attr("width", width)
+    .attr("height", height);
+
+svg.append("svg:defs").append("svg:marker").attr("id", "marker")
+    .attr("viewBox", "0 -5 10 10")
+    .attr("refX", 15)
+    .attr("refY", -1.5)
+    .attr("markerWidth", 6)
+    .attr("markerHeight", 6)
+    .attr("orient", "auto")
+  .append("svg:path")
+    .attr("d", "M0,-5L10,0L0,5");
+
+    
+var force = d3.layout.force()
+    .gravity(.05)
+    .distance(100)
+    .charge(-100)
+    .size([width, height]);
+
+ function initD3ForceGraph(json) {
+  force
+      .nodes(json.nodes)
+      .links(json.links)
+      .start();
+
+  var link = svg.append("svg:g").selectAll("path")
+    .data(force.links())
+  .enter().append("svg:path")
+    .attr("class", function(d) { return "link " + d.type; })
+    .attr("marker-end", "url(#marker)");
+
+  var node = svg.selectAll(".node")
+      .data(json.nodes)
+    .enter().append("g")
+      .attr("class", "node")
+      .call(force.drag);
+      
+  node.append("circle").attr("r", 10).style("fill", "#aec7e8").style("stroke", "#798ba2")
+ 
+  node.append("text").style("font", "10px sans-serif")
+      .attr("dx", 12)
+      .attr("dy", ".35em")
+      .text(function(d) { return d.name });
+
+  force.on("tick", function() {
+    link.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;
+  });
+    node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
+  });
+}
+var jsonD3 = '.json_encode($json).';
+initD3ForceGraph(jsonD3)
+</script>';
+  	return $pre.$post;
+  }
+}
-- 
GitLab