cscheid = {};

////////////////////////////////////////////////////////////////////////////////

cscheid.Debugger = function (div_id)
{
    this.div_id = div_id;
    this.enabled = true;
    this.findElement = function() 
    {
	return document.getElementById(this.div_id);
    }

    this.print = function (value) 
    {
	if (!this.enabled) {
	    return;
	}
	var element = this.findElement();
	var t = document.createElement('tt');
	t.appendChild(document.createTextNode(value));
	t.appendChild(document.createElement('br'));
	element.appendChild(t);
    }

    this.enable = function()
    {
	this.enabled = true;
    }

    this.disable = function()
    {
	this.enabled = false;
    }
}

var d = new cscheid.Debugger('debug');
d.disable();

cscheid.rows = {3: 'Commander',
		4: 'Cabinet',
		5: 'Diplomat',
		6: 'US Rep',
		7: 'US Senate',
		8: 'Other',
		9: 'Governor',
		10: 'State Rep',
		11: 'Other'};
cscheid.colors = {3: '#1060c0',
		  4: '#ff0000', 
		  5: '#ff8000',
		  6: '#804000',
		  7: '#aa6600',
		  8: '#ffc060',
		  9: '#20ef20',
		  10: '#008000',
		  11: '#80ff80'};
cscheid.columnList = [0, 3, 4, 5, 6, 7, 8, 9, 10, 11];
cscheid.table = null;

cscheid.fetchChart = function ()
{
    query = new google.visualization.Query("http://spreadsheets.google.com/tq?key=pNrTqyLPLWuOT78WcPE3nMg&range=A3:Q51&gid=1");
    query.setQuery("");
    d.print('Sending query...');
    query.send(cscheid.drawChartCB);
}

cscheid.clearElement = function(el)
{
    while (el.hasChildNodes())
    {
	el.removeChild(el.firstChild);
    }
}

cscheid.findRanking = function(table, name, rowcount, columncount)
{
    // We pick the most optimist ranking for any given candidate
    var ix = -1;

    // First, find the candidate
    for (var i=0; i<rowcount; ++i) {
	if (table.getValue(i, 0) == name) {
	    ix = i;
	    break;
	}
    }

    if (ix == -1) {
	d.print("Cannot find name " + name);
	throw("Name not found");
    }

    var v = table.getValue(i, columncount-1);
    
    for (var i=rowcount-1; i>=0; --i) {
	if (table.getValue(i, columncount-1) == v) {
	    return i;
	}
    }
    throw("Now _that's_ weird");
}

cscheid.drawChart = function()
{
    var table = cscheid.table;
    var rows = table.getNumberOfRows();
    var columns = table.getNumberOfColumns();
    d.print(sprintf("... table dimensions %d r x %d c.", rows, columns));

    for (var i=0; i<rows; ++i) {
	var v = 0;
	for (j=1; j<cscheid.columnList.length; ++j)
	    v += table.getValue(i, cscheid.columnList[j])
	table.setValue(i, columns-1, v);
    }
    table.sort([{column: columns-1}]);

    var dview = new google.visualization.DataView(table);
    d.print(sprintf("%s", cscheid.columnList));
    dview.setColumns(cscheid.columnList); // 3, 4, 5, 6]);

    // put chart on right div
    var el = document.getElementById('chart_div');
    cscheid.clearElement(el);
    var chart = new google.visualization.BarChart(el);
    colors = [];
    for (var i=1; i<cscheid.columnList.length; ++i)
	colors.push(cscheid.colors[cscheid.columnList[i]]);
    d.print(sprintf("Colors: %s", colors));
    chart.draw(dview, {width: 400, height: 550, is3D: false,
		       isStacked: true,
		       colors: colors,
		       title: null,
		       legend: 'none'});

    // put ranking on right div
    var biden = document.getElementById('joebiden');
    cscheid.clearElement(biden);
    var bold = document.createElement('b');
    var rank = cscheid.findRanking(table, "Joe Biden", rows, columns);
    bold.appendChild(document.createTextNode(sprintf("%d", rows-rank)));
    biden.appendChild(bold);
    biden.appendChild(document.createTextNode(sprintf("/%d", rows)));
    var palin = document.getElementById('sarahpalin');
    cscheid.clearElement(palin);
    bold = document.createElement('b');
    rank = cscheid.findRanking(table, "Sarah Palin", rows, columns);
    bold.appendChild(document.createTextNode(sprintf("%d", rows-rank)));
    palin.appendChild(bold);
    palin.appendChild(document.createTextNode(sprintf("/%d", rows)));
}

cscheid.drawChartCB = function (queryResponse) 
{
    err = queryResponse.getMessage();
    if (err) {
	d.print(err);
    } else {
	d.print("Query successful");
    }
    cscheid.table = queryResponse.getDataTable();
    cscheid.table.addColumn('number');
    cscheid.drawChart();
}

cscheid.updatePlot = function () 
{
    var column_map = {
	commander: 3,
	cabinet: 4,
	diplomat: 5,
	usrep: 6,
	ussenate: 7,
	fedother: 8,
	governor: 9,
	staterep: 10,
	stateother: 11};

    var l = [0];
    for (var cb_name in column_map) {
	var cb = document.control_panel[cb_name];
	if (cb.checked) {
	    l.push(column_map[cb_name]);
	}
    }
    d.print(sprintf("%s", l));
    cscheid.columnList = l;
    cscheid.drawChart();
}

google.load("visualization", "1", {packages:["barchart"]});
google.setOnLoadCallback(cscheid.fetchChart);
