fix time axis, switch from reqs to bandwidth and bytes_sent, get dataSource URL from django, remove dead code, reformat indentation
diff --git a/planetstack/templates/admin/dashboard/hpc_historical.html b/planetstack/templates/admin/dashboard/hpc_historical.html
index 7446ae5..3c34697 100644
--- a/planetstack/templates/admin/dashboard/hpc_historical.html
+++ b/planetstack/templates/admin/dashboard/hpc_historical.html
@@ -4,295 +4,282 @@
     <script type="text/javascript">
 		google.load('visualization', '1', {'packages' : ['controls','table','corechart','geochart']});
     </script>
-	
+
     <script type="text/javascript">
-var queryString = encodeURIComponent("SELECT MINUTE(time) as Time, city, s8 as Node, REGEXP_REPLACE(s8,r'node[0-9]+\.(.*)\.vicci\.org',r'\\1') as Site, AVG(i0) as Cpu, AVG(i1) as Requests FROM [vicci.demoevents] WHERE i0 is not null AND s8 contains 'vicci.org' and not city IN ('princeton','Unknown') and city is not null GROUP BY Time,city,Site,Node ORDER BY Time;");
-			var serverPart = "http://cloud-scrutiny.appspot.com/command?action=send_query&force=ColumnChart&q="
-			var dataSourceUrl = serverPart + queryString;
-			var query;
 
-			var options = {
-	   width: 600,
-	   height: 400,
-	   showRowNumber: false,
-	   pages:true,
-       numRows:9,
-	   backgroundColor: "black"
-			};
-
-google.setOnLoadCallback(function() { sendAndDraw(dataSourceUrl); });
-
-function showNodeAgg(dt) {
-		var tab = new google.visualization.ChartWrapper({
-          'chartType': 'Table',
-          'containerId': 'chart3',
-          'options': {
-            'width': 300,
-            'height': 300,
-            'title': 'Network-wide usage',
-			'page': 'enable',
-			'pageSize': 10
-          },
-          'view': {'columns': [0, 1, 2]}
-        });
-
-        tab.setDataTable(dt);
-        tab.draw();
-}
-
-function showSiteTimeAgg(dt) {
-		var lineChart = new google.visualization.ChartWrapper({
-          'chartType': 'LineChart',
-          'containerId': 'chart4',
-          'options': {
-            'width': 300,
-            'height': 300,
-            'title': 'Network-wide usage',
-			'pages': true,
-			'numRows': 9
-          },
-          'view': {'columns': [0, 1, 2]}
-        });
-        lineChart.setDataTable(dt);
-        lineChart.draw();
-		/*
-		var scatterChart = new google.visualization.ChartWrapper({
-          'chartType': 'ScatterChart',
-          'containerId': 'chart5',
-          'options': {
-            'width': 300,
-            'height': 300,
-          },
-          // from the 'data' DataTable.
-          'view': {'columns': [1, 2]}
-        });
-		scatterChart.setDataTable(dt);
-		scatterChart.draw();*/
-}
-function showSiteAgg(dt) {
-		var barChart = new google.visualization.ChartWrapper({
-          'chartType': 'ColumnChart',
-          'containerId': 'chart1',
-          'options': {
-            'width': 300,
-            'height': 300,
-            'title': 'Site-wise usage',
-			'pages': true,
-			'numRows': 9
-          },
-          // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten)
-          // from the 'data' DataTable.
-          'view': {'columns': [1, 2, 3]}
-        });
-        barChart.setDataTable(dt);
-        barChart.draw();
-		var geoChart = new google.visualization.ChartWrapper({
-          'chartType': 'GeoChart',
-          'containerId': 'chart2',
-          'options': {
-            'width': 300,
-            'height': 300,
-			'displayMode': 'markers',
-			'region':'021',
-            'title': 'Usage map',
-        	colorAxis: {colors: ['green', 'purple', 'red']}
-          },
-          // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten)
-          // from the 'data' DataTable.
-          'view': {'columns': [0, 2,3]}
-        });
-		geoChart.setDataTable(dt);
-		geoChart.draw();
-	
-		var histogram = new google.visualization.ChartWrapper({
-          'chartType': 'Histogram',
-          'containerId': 'chart6',
-          'options': {
-            'width': 300,
-            'height': 300,
-          },
-		  'title': 'Sites by load',
-          // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten)
-          // from the 'data' DataTable.
-          'view': {'columns': [1, 2]}
-        });
-		histogram.setDataTable(dt);
-		histogram.draw();
-		
-}
-
-function handleResponse(response) {
-var supportedClasses = {
-		'Table':google.visualization.Table,
-		'LineChart':google.visualization.LineChart,
-		'ScatterChart':google.visualization.ScatterChart,
-		'ColumnChart':google.visualization.ColumnChart,
-		'GeoChart':google.visualization.GeoChart,
-		'PieChart':google.visualization.PieChart,
-		'Histogram':google.visualization.Histogram
-	};
-
-	/*var slider2 = new google.visualization.ControlWrapper({
-    'controlType': 'NumberRangeFilter',
-    'containerId': 'control3',
-    'options': {
-      'filterColumnLabel': 'Cpu',
-      minValue: 0,
-      maxValue: 100,
-	  ui: { ticks: 10}
-    }
-  });*/
-
-  var timeSlider = new google.visualization.ControlWrapper({
-    'controlType': 'NumberRangeFilter',
-    'containerId': 'control1',
-    'options': {
-      'filterColumnLabel': 'Time',
-	  ui: { ticks: 10}
-    }
-  });
-
-  // Define a bar chart
-  var barChart = new google.visualization.ChartWrapper({
-    'chartType': 'BarChart',
-    'containerId': 'chart1',
-    'options': {
-      'width': 400,
-      'height': 300,
-      'hAxis': {'minValue': 0, 'maxValue': 60},
-      'chartArea': {top: 0, right: 0, bottom: 0}
-    }
-  });
-
-	var categoryPicker = new google.visualization.ControlWrapper({
-          'controlType': 'CategoryFilter',
-          'allowMultiple': true,
-          'containerId': 'control2',
-          'options': {
-            'filterColumnLabel': 'Site',
-            'ui': {
-            'labelStacking': 'vertical',
-              'allowTyping': false
-            }
-          }
-        });
-	//var container = document.getElementById('datatable');
-	//var table = new google.visualization.LineChart(container);
-	//var table = new google.visualization.ColumnChart(container);
-
-	var proxy = new google.visualization.ChartWrapper({
-          'chartType': 'Table',
-          'containerId': 'chart7',
-          'options': {
-            'width': 800,
-            'height': 300,
-			pageSize:5,
-			page:'enable',
-            'legend': 'none',
-            'title': 'Nodes'
-          },
-          // Instruct the piechart to use colums 0 (Name) and 3 (Donuts Eaten)
-          // from the 'data' DataTable.
-          'view': {'columns': [0,1,2,3,4,5]}
-        });
-
-	function core_sum(arr) {
-		var ret = 0;
-		for (var i = 0; i < arr.length; i++) {
-			ret+=arr[i]/1000;
-		}
-		return ret;
-	}
-
-	function scaled_sum(arr) {
-		var ret = 0;
-		for (var i = 0; i < arr.length; i++) {
-			ret+=arr[i]/1000;
-		}
-		return ret;
-	}
-
-	function count_uniq(arr) {
-		var counts = {};
-		var ret = 0;
-		console.log('Starting ret '+ret);
-		for (var i = 0; i < arr.length; i++) {
-				if (!counts[arr[i]]) ret+=1;
-			    counts[arr[i]] = 1;
-		}
-		return ret;
-	}
-	google.visualization.events.addListener(proxy, 'ready', function () {
-        // 0 - time 1 - city 2 - node 3 - site 4 - cpu 5 - bytes
-        var dt = proxy.getDataTable();
-		var groupedData1 = google.visualization.data.group(dt, [0], [{
-            column: 4,
-            type: 'number',
-            label: dt.getColumnLabel(4),
-            aggregation: google.visualization.data.sum
-        },{
-			column: 5,
-            type: 'number',
-            label: dt.getColumnLabel(5),
-            aggregation: google.visualization.data.sum
-		}]);
-
-        showSiteTimeAgg(groupedData1);
-    });
-
-	/*google.visualization.events.addListener(proxy, 'ready', function () {
-        // 0 - time 1 - city 2 - node 3 - site 4 - cpu 5 - bytes
-        var dt = proxy.getDataTable();
-        var groupedData0 = google.visualization.data.group(dt, [2], [{
-            column: 4,
-            type: 'number',
-            label: dt.getColumnLabel(4),
-            aggregation: google.visualization.data.sum
-        },{
-			column: 5,
-            type: 'number',
-            label: dt.getColumnLabel(5),
-            aggregation: google.visualization.data.sum
-		}]);
-        // after grouping, the data will be sorted by column 0, then 1, then 2
-        // if you want a different order, you have to re-sort
-		showNodeAgg(groupedData0);
-		});*/
-
-	google.visualization.events.addListener(proxy, 'ready', function () {
-        // 0 - time 1 - city 2 - node 3 - site 4 - cpu 5 - bytes
-        var dt = proxy.getDataTable();
-        var groupedData0 = google.visualization.data.group(dt, [1,3], [{
-            column: 4,
-            type: 'number',
-            label: 'Cores',
-            aggregation: core_sum
-        },{
-			column: 5,
-            type: 'number',
-            label: dt.getColumnLabel(5),
-            aggregation: scaled_sum
-		}]);
-        // after grouping, the data will be sorted by column 0, then 1, then 2
-        // if you want a different order, you have to re-sort
-		showSiteAgg(groupedData0);
-            });
-
-	data = response.getDataTable();
-	new google.visualization.Dashboard(document.getElementById('dashboard')).
-            // Establish bindings, declaring the both the slider and the category
-            // picker will drive both charts.
-            bind([categoryPicker,timeSlider], [proxy]).
-            // Draw the entire dashboard.
-            draw(data);
-
-}
-function sendAndDraw(queryString) {
-	query = new google.visualization.Query(queryString)
-	query && query.abort();
-	query.send(function(response) {handleResponse(response);});
-}
-      
+     var queryString = "/analytics/bigquery/?sum=@bytes_sent&avg=@cpu&groupBy=Time,city,@hostname,@site";
+

+     var options = {

+         width: 600,

+         height: 400,

+         showRowNumber: false,

+         pages: true,

+         numRows: 9,

+         backgroundColor: "black"

+     };

+

+     // ask django for a data source URL to use for the graphs

+

+     function updateDataSourceUrl() {

+         $.ajax({

+             url: queryString,

+             dataType: 'json',

+             type: 'GET',

+             success: function (newData) {

+                 sendAndDraw(newData["dataSourceUrl"])

+             }

+         });

+     }

+

+     TIME_COL = 0;

+     BANDWIDTH_COL = 2;

+     CPU_COL = 1;

+     CITY_COL = 3;

+     NODE_COL = 4;

+     SITE_COL = 5;

+

+     google.setOnLoadCallback(function () {

+         updateDataSourceUrl();

+     });

+

+     function showSiteTimeAgg(dt) {

+         var lineChart = new google.visualization.ChartWrapper({

+             'chartType': 'LineChart',

+             'containerId': 'chart4',

+             'options': {

+                 'width': 300,

+                 'height': 300,

+                 'title': 'Network-wide usage',

+                 'pages': true,

+                 'numRows': 9

+             },

+             'view': {

+                 'columns': [0, 1, 2]

+             }

+         });

+         lineChart.setDataTable(dt);

+         lineChart.draw();

+     }

+

+     function showSiteAgg(dt) {

+         var barChart = new google.visualization.ChartWrapper({

+             'chartType': 'ColumnChart',

+             'containerId': 'chart1',

+             'options': {

+                 'width': 300,

+                 'height': 300,

+                 'title': 'Site-wise usage',

+                 'pages': true,

+                 'numRows': 9

+             },

+             'view': {

+                 'columns': [1, 2, 3]

+             }

+         });

+         barChart.setDataTable(dt);

+         barChart.draw();

+         var geoChart = new google.visualization.ChartWrapper({

+             'chartType': 'GeoChart',

+             'containerId': 'chart2',

+             'options': {

+                 'width': 300,

+                 'height': 300,

+                 'displayMode': 'markers',

+                 'region': '021',

+                 'title': 'Usage map',

+                 colorAxis: {

+                     colors: ['green', 'purple', 'red']

+                 }

+             },

+             'view': {

+                 'columns': [0, 2, 3]

+             }

+         });

+         geoChart.setDataTable(dt);

+         geoChart.draw();

+

+         var histogram = new google.visualization.ChartWrapper({

+             'chartType': 'Histogram',

+             'containerId': 'chart6',

+             'options': {

+                 'width': 300,

+                 'height': 300,

+             },

+             'title': 'Sites by load',

+             'view': {

+                 'columns': [1, 2]

+             }

+         });

+         histogram.setDataTable(dt);

+         histogram.draw();

+

+     }

+

+     function handleResponse(response) {

+         var timeSlider = new google.visualization.ControlWrapper({

+             'controlType': 'DateRangeFilter',

+             'containerId': 'control1',

+             'options': {

+                 'filterColumnLabel': 'Time',

+                 ui: {

+                     ticks: 10,

+                     step: "minute"

+                 }

+             }

+         });

+

+         // Define a bar chart

+         var barChart = new google.visualization.ChartWrapper({

+             'chartType': 'BarChart',

+             'containerId': 'chart1',

+             'options': {

+                 'width': 400,

+                 'height': 300,

+                 'hAxis': {

+                     'minValue': 0,

+                     'maxValue': 60

+                 },

+                 'chartArea': {

+                     top: 0,

+                     right: 0,

+                     bottom: 0

+                 }

+             }

+         });

+

+         var categoryPicker = new google.visualization.ControlWrapper({

+             'controlType': 'CategoryFilter',

+             'allowMultiple': true,

+             'containerId': 'control2',

+             'options': {

+                 'filterColumnLabel': 'site',

+                 'ui': {

+                     'labelStacking': 'vertical',

+                     'allowTyping': false

+                 }

+             }

+         });

+

+         var proxy = new google.visualization.ChartWrapper({

+             'chartType': 'Table',

+             'containerId': 'chart7',

+             'options': {

+                 'width': 800,

+                 'height': 300,

+                 pageSize: 5,

+                 page: 'enable',

+                 'legend': 'none',

+                 'title': 'Nodes'

+             },

+             'view': {

+                 'columns': [0, 1, 2, 3, 4, 5]

+             }

+         });

+

+         function avg_bandwidth(arr) {

+                var ret = 0;
+                for (var i = 0; i < arr.length; i++) {
+                        ret+=arr[i]*8.0/1024.0/1024.0/1024.0;
+                }
+                if (arr.length==0) {
+                    return 0;
+                }
+                return ret/arr.length;
+         }

+

+         function sum_bytes_sent_as_bw(arr) {

+                var ret = 0;
+                for (var i = 0; i < arr.length; i++) {
+                        ret+=arr[i]*8.0/1024.0/1024.0/1024.0;
+                }
+                return ret/60.0;
+         }

+

+         function sum_bytes_sent_as_GB(arr) {

+                var ret = 0;
+                for (var i = 0; i < arr.length; i++) {
+                        ret+=arr[i]/1024.0/1024.0/1024.0;
+                }
+                return ret;
+         }

+

+         function fixDate2(unixDate) {

+             // not completely sure why we have to do this, as the data was in

+             // javascript Date() objects to start with. If we don't do it,

+             // then the horizontal axis will be blank.

+             return new Date(unixDate);
+         }

+

+         var format0dp = new google.visualization.NumberFormat({fractionDigits:0});

+         var format2dp = new google.visualization.NumberFormat({fractionDigits:2});

+

+         // Create a group for charts that will have a horizontal axis that is

+         // time.

+

+         google.visualization.events.addListener(proxy, 'ready', function () {

+             var dt = proxy.getDataTable();

+             var groupedData1 = google.visualization.data.group(dt, [{

+                 column: TIME_COL,
+                 type: 'datetime',
+                 modifier: fixDate2,
+             }], [{

+                 column: CPU_COL,

+                 type: 'number',

+                 label: "avg cpu",

+                 aggregation: google.visualization.data.avg

+             }, {

+                 column: BANDWIDTH_COL,

+                 type: 'number',

+                 label: "Gbps",

+                 aggregation: sum_bytes_sent_as_bw

+             }]);

+

+             format0dp.format(groupedData1,1);

+             format2dp.format(groupedData1,2);

+

+             showSiteTimeAgg(groupedData1);

+         });

+

+         // Create a group for charts that will have a horizontal axis that is

+         // city or site.

+

+         google.visualization.events.addListener(proxy, 'ready', function () {

+             var dt = proxy.getDataTable();

+             var groupedData0 = google.visualization.data.group(dt, [CITY_COL, SITE_COL], [{

+                 column: CPU_COL,

+                 type: 'number',

+                 label: 'avg cpu',

+                 aggregation: google.visualization.data.avg

+             }, {

+                 column: BANDWIDTH_COL,

+                 type: 'number',

+                 label: "GB sent",

+                 aggregation: sum_bytes_sent_as_GB

+             }]);

+

+             format0dp.format(groupedData0,2);

+             format2dp.format(groupedData0,3);

+

+             showSiteAgg(groupedData0);

+         });

+

+         data = response.getDataTable();

+         new google.visualization.Dashboard(document.getElementById('dashboard')).

+         // Establish bindings, declaring the both the slider and the category

+         // picker will drive both charts.

+         bind([categoryPicker, timeSlider], [proxy]).

+         // Draw the entire dashboard.

+         draw(data);

+

+     }

+

+     function sendAndDraw(queryString) {

+         query = new google.visualization.Query(queryString)

+         query && query.abort();

+         query.send(function (response) {

+             handleResponse(response);

+         });

+     }
 
     </script>
     <div id="dashboard" class="container">