diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Googlemaps.php b/lib/Haanga/lib/Haanga/Extension/Filter/Googlemaps.php
index 212776e8e0ff1e135220f2819672dbbc040e2cfc..b8b7a1aec7996e7f1d6453252aa6a253787f34d1 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/Googlemaps.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Googlemaps.php
@@ -11,87 +11,85 @@ class Haanga_Extension_Filter_Googlemaps{
   	$names = explode(",", $varname);
   	$north = -90; $south=90; $east=-180; $west = 180;
   	$latArr =""; $longArr=""; $nameArr = "";
-  	$w = "400";
-  	$h = "300";
-  	$zoom = "4";
-  	if($names[3] != null && $names[3] != ""){
-  	  $w = $names[3];
-  	}
-  	if($names[4] != null && $names[4] != ""){
-  	  $h = $names[4];
-  	}
-  	if($names[5] != null && $names[4] != ""){
-  	  $zoom = $names[5];
-  	}
-  	
+  	$options = array();
+  	$options['width'] = 500;
+  	$options['height'] = 500;
+  	$options['zoom'] = 10;
+  	for($z=3; $z < count($names); $z++){
+      $pair = explode("=", $names[$z]);
+      $key = trim($pair[0], "\" '");
+      $value = trim($pair[1], "\" '");
+      $options[$key] = $value;     
+    }
+  	$w = $options['width'];
+  	$h = $options['height'];
+  	$z = intval($options['zoom']);
+
+  	$points = array();
   	foreach($obj as $k){
-  	  if(!$firstColumn){
-  	  	$latArr  .= ', ';
-  	  	$longArr .= ', ';
-  	  	$nameArr .= ', ';
-  	  }
-  	  $latArr  .= $k->$names[0]->value;
+  	  $currentPoint = array();
   	  if($north < $k->$names[0]->value){
   	  	$north = $k->$names[0]->value;
   	  }
+  	  $currentPoint['lat'] = $k->$names[0]->value;
   	  if($south > $k->$names[0]->value){
   	  	$south = $k->$names[0]->value;
   	  }
   	  
-  	  $longArr .= $k->$names[1]->value;
   	  if($west > $k->$names[1]->value){
   	  	$west = $k->$names[1]->value;
   	  }
   	  if($east < $k->$names[1]->value){
   	  	$east = $k->$names[1]->value;
   	  }  	  
+  	  $currentPoint['long'] = $k->$names[1]->value;
   	  
-  	  $nameArr .= '"'.$k->$names[2]->value.'"';
+  	  $currentPoint['label'] = $k->$names[2]->value;
   	  $firstColumn = false;
+  	  array_push($points, $currentPoint);
   	}
-	
-  	$pre = "<div id='map_canvas_".$randId."' style='width: ".$w."px; height: ".$h."px'></div><script type='text/javascript'
-  	src='http://maps.googleapis.com/maps/api/js?sensor=false'></script>
+  	$pre = "<div style='width:".$w."px;height:".$h."px;'><div id='map_canvas' style='height:100%;width:100%;border: 1px solid #333;' ></div></div>
+    <script src='https://maps.googleapis.com/maps/api/js?sensor=false'></script>
     <script type='text/javascript'>
     //<![CDATA[
-    function initialize() {
-	  var myOptions = {
-	  zoom: ".$zoom.",
-	  center: new google.maps.LatLng(0, 0),
-	  mapTypeId: google.maps.MapTypeId.ROADMAP
-	  };
-	  
-	  var map = new google.maps.Map(document.getElementById('map_canvas_".$randId."'),
-	  myOptions);
+    function initialize_$randId() {
 	  
 	  var southWest = new google.maps.LatLng(".$south.", ".$west.");
 	  var northEast = new google.maps.LatLng(".$north.", ".$east.");
 	  
-	  var bounds = new google.maps.LatLngBounds(southWest, northEast);
-	  map.fitBounds(bounds);
 	  
-	  var lngSpan = northEast.lng() - southWest.lng();
-	  var latSpan = northEast.lat() - southWest.lat();
+	  var lngSpan = southWest.lng() - northEast.lng();
+	  var latSpan = southWest.lat() + northEast.lat();
+	  var locations = ".json_encode($points).";
 	  
-	  var latArray = [".$latArr."];
-	  var lonArray = [".$longArr."];
-	  var labelArray = [".$nameArr."];
-	  var marker = new Array();
-	  for (var i = 0; i < labelArray.length; i++) {
-	    var position = new google.maps.LatLng(latArray[i], lonArray[i]);
-	    marker = new google.maps.Marker({position: position,map: map});
-  	    marker.setTitle(labelArray[i]);
-	    var infowindow = new google.maps.InfoWindow({content: i+labelArray[i]});
-	    google.maps.event.addListener(marker, 'click', (function(marker, i) {
+	  var mapOptions = ".json_encode($options).";
+	  mapOptions.mapTypeId= google.maps.MapTypeId.ROADMAP;
+	  
+    var map = new google.maps.Map(document.getElementById('map_canvas'),mapOptions); 
+	  var bounds = new google.maps.LatLngBounds(southWest, northEast);
+	  map.fitBounds(bounds);
+
+    var infowindow = new google.maps.InfoWindow();
+
+    var marker, i;
+
+    for (i = 0; i < locations.length; i++) {  
+      marker = new google.maps.Marker({
+        position: new google.maps.LatLng(locations[i].lat, locations[i].long),
+        title: locations[i].label,
+        map: map
+      });
+
+      google.maps.event.addListener(marker, 'click', (function(marker, i) {
         return function() {
-          infowindow.setContent(labelArray[i]);
+          infowindow.setContent('<p>'+locations[i].label+'</p>')
           infowindow.open(map, marker);
         }
       })(marker, i));
-	  }
     }
-        
-    google.maps.event.addDomListener(window, 'load', initialize);
+	  
+    }
+    initialize_$randId();
     //]]>
     </script>";
     return $pre;
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizbarchart.php b/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizbarchart.php
new file mode 100644
index 0000000000000000000000000000000000000000..80f856393a587eddfa280303aa70a3d8d1fdecfd
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizbarchart.php
@@ -0,0 +1,65 @@
+<?php
+
+class Haanga_Extension_Filter_GoogleVizBarChart{
+  public $is_safe = TRUE;
+  static function main($obj, $varname){
+  	$data = "";
+  	$i = 0;
+  	$j = 0;
+  	$firstColumn = true;
+    $options = array();
+  	$names = explode(",", $varname);
+
+  	$fieldCounter=0;
+  	$varList = array();
+  	foreach($names as $v){
+  	  if(strpos($v,"=")){
+  	    break;
+  	  }
+  	  $fieldCounter++;
+  	  $columnType = 'number';
+  	  if($firstColumn){
+  	  	$columnType = 'string';
+  	  	$firstColumn = false;
+  	  }
+  	  array_push($varList, $v);
+  	  $data .= "        data.addColumn('".$columnType."', '".$v."');\n";
+  	}
+
+  	foreach($obj as $k){  	  
+  	  foreach($varList as $v){
+  	    $value = ($j==0)?"'".$k->$v->value."'":$k->$v->value;
+  	  	$data .="        data.setCell($i, $j, ".$value.");\n";
+  	  	$j++;
+  	  } 
+  	  $i++;
+  	  $j=0;
+  	}
+
+  	
+  	//Getting options
+  	$options['height'] = 400;
+  	$options['width'] = 400;
+    for($z=$fieldCounter; $z < count($names); $z++){
+      $pair = explode("=", $names[$z]);
+      $key = trim($pair[0], "\" '");
+      $value = trim($pair[1], "\" '");
+      $options[$key] = $value;     
+    }
+
+  	$divId = uniqid("columnchart_div");
+  	$pre = "<div id='".$divId."'></div><script type='text/javascript' src='https://www.google.com/jsapi'></script>
+    <script type='text/javascript'>
+    var options_$divId = ".json_encode($options)."; 
+    google.load('visualization', '1', {packages:['corechart']});
+    google.setOnLoadCallback(drawChart);
+    function drawChart() {
+    var data = new google.visualization.DataTable();
+    data.addRows(".$i.");\n
+".$data."    var barchart = new google.visualization.BarChart(document.getElementById('".$divId."'));
+barchart.draw(data, options_$divId);
+    }
+    </script>";
+    return $pre;
+  }
+}
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizcolumnchart.php b/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizcolumnchart.php
index 529334aea740c3bbb88895d1ea53bb2f002dcc24..eb8a53fd58c03e3f4de09b3eaef14ac2696e73d2 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizcolumnchart.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizcolumnchart.php
@@ -7,17 +7,27 @@ class Haanga_Extension_Filter_GoogleVizColumnChart{
   	$i = 0;
   	$j = 0;
   	$firstColumn = true;
+    $options = array();
   	$names = explode(",", $varname);
+
+  	$fieldCounter=0;
+  	$varList = array();
   	foreach($names as $v){
+  	  if(strpos($v,"=")){
+  	    break;
+  	  }
+  	  $fieldCounter++;
   	  $columnType = 'number';
   	  if($firstColumn){
   	  	$columnType = 'string';
   	  	$firstColumn = false;
   	  }
+  	  array_push($varList, $v);
   	  $data .= "        data.addColumn('".$columnType."', '".$v."');\n";
   	}
+
   	foreach($obj as $k){  	  
-  	  foreach($names as $v){
+  	  foreach($varList as $v){
   	    $value = ($j==0)?"'".$k->$v->value."'":$k->$v->value;
   	  	$data .="        data.setCell($i, $j, ".$value.");\n";
   	  	$j++;
@@ -25,16 +35,29 @@ class Haanga_Extension_Filter_GoogleVizColumnChart{
   	  $i++;
   	  $j=0;
   	}
+
+  	
+  	//Getting options
+  	$options['height'] = 400;
+  	$options['width'] = 400;
+    for($z=$fieldCounter; $z < count($names); $z++){
+      $pair = explode("=", $names[$z]);
+      $key = trim($pair[0], "\" '");
+      $value = trim($pair[1], "\" '");
+      $options[$key] = $value;     
+    }
+
   	$divId = uniqid("columnchart_div");
   	$pre = "<div id='".$divId."'></div><script type='text/javascript' src='https://www.google.com/jsapi'></script>
     <script type='text/javascript'>
+    var options_$divId = ".json_encode($options)."; 
     google.load('visualization', '1', {packages:['corechart']});
     google.setOnLoadCallback(drawChart);
     function drawChart() {
     var data = new google.visualization.DataTable();
     data.addRows(".$i.");\n
 ".$data."    var columnchart = new google.visualization.ColumnChart(document.getElementById('".$divId."'));
-columnchart.draw(data, {showRowNumber: true, width: '80%'});
+columnchart.draw(data, options_$divId);
     }
     </script>";
     return $pre;
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizpiechart.php b/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizpiechart.php
index 266354760c16d513c8b85d20ad1ec811d7c7fbad..f52fcbad894ce2e623d6a2aac670242cc317f441 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizpiechart.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizpiechart.php
@@ -5,18 +5,15 @@ class Haanga_Extension_Filter_GoogleVizPieChart{
   static function main($obj, $varname){
   	$data = "";
   	$i = 0;
+    $options = array();
   	$randId = rand();
   	$firstColumn = true;
   	$names = explode(",", $varname);
   	$w = "400";
-  	$h = "300";
+  	$h = "400";
   	
-  	if($names[3] != null && $names[3] != ""){
-  	  $w = $names[3];
-  	}
-  	if($names[4] != null && $names[4] != ""){
-  	  $h = $names[4];
-  	}
+  	$options['width'] = $w;
+  	$options['height'] = $h;
   	
   	$data .= "data.addColumn('string', '".$names[0]."');";
     $data .= "data.addColumn('number', '".$names[1]."');";
@@ -25,16 +22,25 @@ class Haanga_Extension_Filter_GoogleVizPieChart{
   	  $data .="        data.setCell($i, 1, ".$k->$names[1]->value.");\n";
   	  $i++;
   	}
+
+    //Getting options
+    for($j=2; $j < count($names); $j++){
+      $pair = explode("=", $names[$j]);
+      $key = trim($pair[0], "\" '");
+      $value = trim($pair[1], "\" '");
+      $options[$key] = $value;     
+    }
   	
-  	$pre = "<div id='piechart_div_".$randId."' style='width: ".$w."px; height: ".$h."px'></div><script type='text/javascript' src='https://www.google.com/jsapi'></script>
+  	$pre = "<div id='piechart_div_".$randId."'></div><script type='text/javascript' src='https://www.google.com/jsapi'></script>
     <script type='text/javascript'>
+    var options_$randId = ".json_encode($options)."; 
     google.load('visualization', '1', {packages:['corechart']});
     google.setOnLoadCallback(drawChart_".$randId.");
     function drawChart_".$randId."() {
     var data = new google.visualization.DataTable();
     data.addRows(".$i.");\n
     ".$data."    var piechart = new google.visualization.PieChart(document.getElementById('piechart_div_".$randId."'));
-    piechart.draw(data);
+    piechart.draw(data, options_$randId);
     }
     </script>";
     return $pre;
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizscatterchart.php b/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizscatterchart.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c7d882c84e510cc1e32047af4ce0a69d8c9a05a
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Googlevizscatterchart.php
@@ -0,0 +1,61 @@
+<?php
+
+class Haanga_Extension_Filter_GoogleVizScatterChart{
+  public $is_safe = TRUE;
+  static function main($obj, $varname){
+  	$data = "";
+  	$i = 0;
+  	$j = 0;
+  	$firstColumn = true;
+    $options = array();
+  	$names = explode(",", $varname);
+
+  	$fieldCounter=0;
+  	$varList = array();
+  	foreach($names as $v){
+  	  if(strpos($v,"=")){
+  	    break;
+  	  }
+  	  $fieldCounter++;
+  	  $columnType = 'number';
+  	  array_push($varList, $v);
+  	  $data .= "        data.addColumn('".$columnType."', '".$v."');\n";
+  	}
+
+  	foreach($obj as $k){  	  
+  	  foreach($varList as $v){
+  	    $value = $k->$v->value;
+  	  	$data .="        data.setCell($i, $j, ".$value.");\n";
+  	  	$j++;
+  	  } 
+  	  $i++;
+  	  $j=0;
+  	}
+
+  	
+  	//Getting options
+  	$options['height'] = 400;
+  	$options['width'] = 400;
+    for($z=$fieldCounter; $z < count($names); $z++){
+      $pair = explode("=", $names[$z]);
+      $key = trim($pair[0], "\" '");
+      $value = trim($pair[1], "\" '");
+      $options[$key] = $value;     
+    }
+
+  	$divId = uniqid("columnchart_div");
+  	$pre = "<div id='".$divId."'></div><script type='text/javascript' src='https://www.google.com/jsapi'></script>
+    <script type='text/javascript'>
+    var options_$divId = ".json_encode($options)."; 
+    google.load('visualization', '1', {packages:['corechart']});
+    google.setOnLoadCallback(drawChart);
+    function drawChart() {
+    var data = new google.visualization.DataTable();
+    data.addRows(".$i.");\n
+".$data."    var barchart = new google.visualization.ScatterChart(document.getElementById('".$divId."'));
+barchart.draw(data, options_$divId);
+    }
+    </script>";
+    return $pre;
+  }
+}
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Leafletmaps.php b/lib/Haanga/lib/Haanga/Extension/Filter/Leafletmaps.php
new file mode 100644
index 0000000000000000000000000000000000000000..5b48ede6c62f3bc6ead566f21add71634b522e9f
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Leafletmaps.php
@@ -0,0 +1,91 @@
+<?php
+
+class Haanga_Extension_Filter_Leafletmaps{
+  public $is_safe = TRUE;
+  static function main($obj, $varname){
+  	$data = "";
+  	$i = 0;
+  	$j = 0;
+  	$randId = rand();
+  	$firstColumn = true;
+  	$names = explode(",", $varname);
+  	$north = -90; $south=90; $east=-180; $west = 180;
+  	$latArr =""; $longArr=""; $nameArr = "";
+  	$options = array();
+  	$options['width'] = 500;
+  	$options['height'] = 500;
+  	$options['zoom'] = 10;
+  	for($z=3; $z < count($names); $z++){
+      $pair = explode("=", $names[$z]);
+      $key = trim($pair[0], "\" '");
+      $value = trim($pair[1], "\" '");
+      $options[$key] = $value;     
+    }
+  	$w = $options['width'];
+  	$h = $options['height'];
+  	$z = intval($options['zoom']);
+
+  	$points = array();
+  	foreach($obj as $k){
+  	  $currentPoint = array();
+  	  if($north < $k->$names[0]->value){
+  	  	$north = $k->$names[0]->value;
+  	  }
+  	  $currentPoint['lat'] = $k->$names[0]->value;
+  	  if($south > $k->$names[0]->value){
+  	  	$south = $k->$names[0]->value;
+  	  }
+  	  
+  	  if($west > $k->$names[1]->value){
+  	  	$west = $k->$names[1]->value;
+  	  }
+  	  if($east < $k->$names[1]->value){
+  	  	$east = $k->$names[1]->value;
+  	  }  	  
+  	  $currentPoint['long'] = $k->$names[1]->value;
+  	  
+  	  $currentPoint['label'] = $k->$names[2]->value;
+  	  $firstColumn = false;
+  	  array_push($points, $currentPoint);
+  	}
+  	
+  	$centerLat = ($south+$north)/2;
+  	$centerLon = ($east+$west)/2;
+  	$pre = "<div id='map_$randId' style='height: 580px;'></div>
+  	<script src='http://cdn.leafletjs.com/leaflet-0.4/leaflet.js'></script>
+  	<script type='text/javascript'>
+    //<![CDATA[
+    
+    function loadCssFile() {
+     var fileref=document.createElement('link');
+     fileref.setAttribute('rel', 'stylesheet');
+     fileref.setAttribute('type', 'text/css');
+     fileref.setAttribute('href', 'http://cdn.leafletjs.com/leaflet-0.4/leaflet.css');
+     document.getElementsByTagName('head')[0].appendChild(fileref);
+    }
+    
+    
+    function initialize_$randId() {
+ 	   var locations = ".json_encode($points).";	  
+	   var mapOptions = ".json_encode($options).";
+	   mapOptions.attribution = osmAttrib;
+	   
+	   map = new L.Map('map_$randId');
+	   var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
+	   var osmAttrib='Map data &copy; <a href=\"http://openstreetmap.org\">OpenStreetMap</a> contributors';
+	   var osm = new L.TileLayer(osmUrl, mapOptions );			
+	   map.setView([$centerLat, $centerLon],mapOptions.zoom);
+	   map.addLayer(osm);
+	   
+	   for(var i=0;i<locations.length;i++){
+	     L.marker([locations[i].lat, locations[i].long]).addTo(map).bindPopup(locations[i].label)
+	   }
+	  }
+
+//    loadCssFile();
+    initialize_$randId();
+    //]]>
+    </script>";
+    return $pre;
+  }
+}