
    <script type="text/javascript" src="//www.google.com/jsapi"></script>
	<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css">
    <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);});
}
      

    </script>
    <div id="dashboard" class="container">
		<div class="row">
			<div class="col-md-8">
				<div class="col-md-4" id="control2"></div>
				<div class="col-md-4" id="control1"></div>
				<!--<div class="col-md-4" id="control3"></div>-->
			</div>
		</div>
		<div class="row">
			<div class="col-md-8">
				<div class="col-md-4" id="chart1">
				</div>
				<div class="col-md-4" id="chart2">
				</div>
				<!--
				<div class="col-md-4" id="chart3">
				</div>-->
			</div>
		</div>
		<div class="row">
			<div class="col-md-8">
				<div class="col-md-4" id="chart4">
				</div>
				<!--
				<div class="col-md-4" id="chart5">
				</div>-->
				<div class="col-md-4" id="chart6">
				</div>
			</div>
		</div>
    </div>
	<div id="chart7" style="display:none"></div>
