//extend RGraph.line
RGraph.Line.prototype.add = function(array) {
	//this.data.unshift(array);
	//this.original_data.push(RGraph.array_clone(array));
	this.original_data.push(array);
};

//colours (X11 names - http://en.wikipedia.org/wiki/Web_colors#X11_color_names)
var COLOURS = [
	[255, 0, 0], //red
	[0, 128, 0], //green
	[244, 164, 96], //sandy brown
	[106, 90, 205], //slate blue
	[128, 128, 0], //olive
	[0, 139, 139], //dark cyan
	[128, 0, 0], //maroon
	[0, 0, 255], //blue
	[188, 143, 143], //rosy brown
	[199, 21, 133], //medium violet red
	[255, 215, 0], //gold
	[255, 140, 0], //dark orange
	[128, 0, 128], //purple
	[30, 144, 255], //dodger blue
	[75, 0, 130], //indigo
	[189, 183, 107], //dark khaki
	[255, 69, 0], //orange red
	[0, 255, 0], //lime
	[70, 130, 180], //steel blue
	[255, 20, 147], //deep pink
	[139, 69, 19], //saddle brown
	[220, 20, 60], //crimson
	[128, 128, 0], //olive
	[173, 255, 47] //green yellow
];

var periods = new Array();

var output = new Array();
var capfac = new Array();
var metadata = new Array();
var colours = new Array();

var demand = new Array();
var demandmetadata = {
	'nsw1': { name: 'NSW', colour: 'rgb(0, 0, 200)' },
	'qld1': { name: 'Qld', colour: 'rgb(128, 0, 0)' },
	'sa1': { name: 'SA', colour: 'rgb(200, 0, 0)' },
	'tas1': { name: 'Tas', colour: 'rgb(160, 160, 0)' },
	'vic1': { name: 'Vic', colour: 'rgb(0, 200, 0)' },
	'total': { name: 'Selected', colour: 'rgb(90, 90, 90)' },
	'all': { name: 'All', colour: 'rgb(0, 0, 0)' }
};

var mapmarkers = new Array();

/**
 * Initialise the page.
 */
this.load = function() {

	//date picker
	$("#date").datepicker({
		defaultDate: getPageDate(),
		showOn: 'both',
		//buttonImage: '/themes/default/resources/calendar.gif',
		buttonText: 'change date',
		//buttonImageOnly: true,
		dateFormat: 'yy-mm-dd',
		minDate: '-1m -1d',
		maxDate: '-1d',
		onSelect:
			function(dateStr, inst) {
				var latest = new Date();
				latest.setDate(latest.getDate()-1);
				var date = $("#date").datepicker('getDate');
				var equal = latest.getFullYear() == date.getFullYear() && latest.getMonth() == date.getMonth() && latest.getDate() == date.getDate();
				window.location = '/' + (!equal ? '?date=' + dateStr.toLowerCase() : '');
			}
	});

	$("#data").hide();

	//import the list of plant
	var plant = new Array();
	$("#output thead th.ident").each(function() {
		var p = $(this).text();
		plant.push(p);
	});
	plant.push('total');

	//import the metadata
	var tot = new Array();
	tot['loc_code'] = 'total';
	tot['name'] = 'Selected';
	tot['region'] = '';
	tot['capacity'] = '0';

	$("#metadata tbody tr td").each(function() {
		var id = $(this).parent().attr("class");
		if (id == 'all')
			metadata['total'] = tot;
		if (!metadata[id])
			metadata[id] = new Array();
		metadata[id][$(this).attr("class")] = $(this).text();
	});

	//create colours
	var cnt = 0;
	for (var p in plant) {
		if (plant[p] == 'all') {
			colours[plant[p]] = 'rgb(0, 0, 0)';
		} else if (plant[p] == 'total') {
			colours[plant[p]] = 'rgb(90, 90, 90)';
		} else {
			r = COLOURS[cnt][0];
			g = COLOURS[cnt][1];
			b = COLOURS[cnt][2];
			colours[plant[p]] = 'rgb(' + r + ', ' + g + ', ' + b + ')';
			cnt++;
		}
	}

	//create the controls
	var divs = new Array();
	for (var m in metadata) {
		var reg = metadata[m].region;
		if (!reg || reg.length == 0) reg = 'other';
		else reg = reg.toLowerCase();
		if (!divs[reg]) divs[reg] = '';

		divs[reg] +=
			'<input type="checkbox" id="control_' + metadata[m].loc_code + '" class="checkbox" checked="checked" />' +
			'<label id="label_' + metadata[m].loc_code + '" for="control_' + metadata[m].loc_code + '" style="color: ' + colours[metadata[m].loc_code] + '">' +
			metadata[m].name.replace(' Wind Farm', '') +
			' (' + (metadata[m].loc_code == 'total' ? '<span id="cap_total"></span>' :	Math.round(metadata[m].capacity)) + 'MW)' +
			'</label><br />';
	}

	for (var i in divs) {
		$("#wfo_controls #" + i).append(divs[i]);
	}

	for (var i in demandmetadata) {
		var cb = $("<input/>").attr("type", "checkbox").attr("id", "control_" + i).addClass("checkbox");
		if (i != 'total') cb.attr("checked", "checked");
		var label = $("<label/>").attr("for", "control_" + i).text(demandmetadata[i].name).css("color", demandmetadata[i].colour);
		$("#demand_controls").append(cb).append(label);
	}

	//event the controls
	$("#wfo_controls input.checkbox").click(function() {
		var marker = mapmarkers[$(this).attr("id").substring("control_".length)];
		if (marker)
			marker.setVisible($(this).is(":checked"));
		wind();
	});

	$("#wfo_controls .toggles a").click(function() {
		toggle($(this).text(), $(this).parent().parent().attr("id"));
		return false;
	});

	$("#demand_controls input.checkbox").click(function() {
		demandgraph();
	});

	//grab the data
	// - periods
    $("#output tbody tr th").each(function() {
		periods.push($(this).text());
    });

	// - wind output/cf
	for (var p in plant) {
		capfac[plant[p]] = new Array();
    	$("#output tbody tr td.cf." + plant[p]).each(function() {
			var val = parseFloat($(this).text());
    		capfac[plant[p]].push(val);
    	});
		output[plant[p]] = new Array();
    	$("#output tbody tr td.out." + plant[p]).each(function() {
			var val = parseFloat($(this).text());
    		output[plant[p]].push(val);
    	});
	}
	for (var i in capfac['total']) capfac['total'][i] = 0;
	for (var i in output['total']) output['total'][i] = 0;

	// - demand
	var regions = [ 'nsw1', 'vic1', 'qld1', 'sa1', 'tas1', 'all' ];
	for (var r in regions) {
		demand[regions[r]] = new Array();
    	$("#demand tbody tr td.demand." + regions[r]).each(function() {
			var val = parseFloat($(this).text());
    		demand[regions[r]].push(val);
    	});
	}
	demand['total'] = new Array();
	for (var i in demand['all']) demand['total'][i] = 0;

	map();

	wind();
	demandgraph();

}

/**
 * Draw the wind graphs.
 */
this.wind = function() {

	var id_cf = 'rgraph_wind_cf';
	var id_out = 'rgraph_wind_out';

	RGraph.Clear(document.getElementById(id_cf));
	RGraph.Clear(document.getElementById(id_out));

	var labels = new Array();
	for (var p in periods) {
		var ps = "" + (periods[p]/2)%24;
		while (ps.length < 2)
			ps = '0' + ps;
		if (periods[p]==0 || periods[p]%4 == 0) labels.push(ps + ':00');
		else labels.push("");
	}

	//all wind out
	var lineout = new RGraph.Line(id_out);
	var linecf = new RGraph.Line(id_cf);

	var col = new Array();

	//track totals
	var track_totals = $("#wfo_controls #control_total").is(":checked");

	var cap = 0;
	for (var i in output['total']) output['total'][i] = 0;
	for (var i in capfac['total']) capfac['total'][i] = 0;

	//add individual plant
	$("#wfo_controls input.checkbox").each(function() {
		if ($(this).is(":checked")) {
			var i = $(this).attr("id").substring("control_".length);

			lineout.add(output[i]);
			linecf.add(capfac[i]);
			col.push(colours[i]);

			//track totals
			if (i != 'all' && i != 'total' && track_totals) {
				for (var j in output[i]) {
					output['total'][j] = output['total'][j] ? output['total'][j]+output[i][j] : output[i][j];
				}
				cap += parseFloat(metadata[i]['capacity']);
			}
		}
	});

	//check there's at least one line
	if (lineout.original_data.length == 0) {
		lineout.add(output['total']);
		linecf.add(capfac['total']);
		col.push(colours['total']);
	}

	//calculate CFs
	if (cap > 0) {
		for (var i in output['total']) {
			capfac['total'][i] = (output['total'][i]/cap)*100.;
		}
	}

	$("#cap_total").text(Math.round(cap));

	linecf.Set('chart.ymax', 100);

	lineout.Set('chart.gutter', 45);
	linecf.Set('chart.gutter', 45);

	lineout.Set('chart.linewidth', 2);
	linecf.Set('chart.linewidth', 2);

	lineout.Set('chart.background.barcolor1', '#FFFFFF');
	linecf.Set('chart.background.barcolor1', '#FFFFFF');
	lineout.Set('chart.background.barcolor2', '#FFFFFF');
	linecf.Set('chart.background.barcolor2', '#FFFFFF');

	lineout.Set('chart.colors', col);
	linecf.Set('chart.colors', col);

	if (!$.browser.webkit) {
		lineout.Set('chart.shadow', true);
		linecf.Set('chart.shadow', true);
	}

	lineout.Set('chart.labels', labels);
	linecf.Set('chart.labels', labels);

	lineout.Set('chart.tickmarks', 'cross');
	linecf.Set('chart.tickmarks', 'cross');

	lineout.Set('chart.background.grid.autofit', true);
	linecf.Set('chart.background.grid.autofit', true);
	lineout.Set('chart.background.grid.autofit.numhlines', 5);
	linecf.Set('chart.background.grid.autofit.numhlines', 5);
	lineout.Set('chart.background.grid.autofit.numvlines', 24);
	linecf.Set('chart.background.grid.autofit.numvlines', 24);

	lineout.Set('chart.text.size', 8);
	linecf.Set('chart.text.size', 8);

	//clean the data
	for (var i in lineout.original_data) {
		for (var j in lineout.original_data[i]) {
			var val = lineout.original_data[i][j];
			if (val < 0) val = 0;
			lineout.original_data[i][j] = val;
		}
	}

	for (var i in linecf.original_data) {
		for (var j in linecf.original_data[i]) {
			var val = linecf.original_data[i][j];
			if (val < 0) val = 0;
			if (val > 100) val = 100;
			linecf.original_data[i][j] = val;
		}
	}

	//draw the graphs
	linecf.Draw();
	lineout.Draw();

}

/**
 * Draw the demand graph.
 */
this.demandgraph = function() {

	var id = 'rgraph_demand_total';

	RGraph.Clear(document.getElementById(id));

	var labels = new Array();
	for (var p in periods) {
		var ps = "" + (periods[p]/2)%24;
		while (ps.length < 2)
			ps = '0' + ps;
		if (periods[p]==0 || periods[p]%4 == 0) labels.push(ps + ':00');
		else labels.push("");
	}

	//demand
	var line = new RGraph.Line(id);

	var col = new Array();

	//track totals
	var track_totals = $("#demand_controls #control_total").is(":checked");
	for (var i in demand['total']) demand['total'][i] = 0;

	//add individual regions
	$("#demand_controls input.checkbox").each(function() {
		if ($(this).is(":checked")) {
			var i = $(this).attr("id").substring("control_".length);

			line.add(demand[i]);
			col.push(demandmetadata[i].colour);

			//track totals
			if (i != 'all' && i != 'total' && track_totals) {
				for (var j in demand[i]) {
					demand['total'][j] = demand['total'][j] ? demand['total'][j]+demand[i][j] : demand[i][j];
				}
			}
		}
	});

	//check there's at least one line
	if (line.original_data.length == 0) {
		line.add(demand['total']);
		col.push(colours['total']);
	}

	line.Set('chart.gutter', 45);
	line.Set('chart.linewidth', 2);
	line.Set('chart.background.barcolor1', '#FFFFFF');
	line.Set('chart.background.barcolor2', '#FFFFFF');
	line.Set('chart.colors', col);
	if (!$.browser.webkit) {
		line.Set('chart.shadow', true);
	}
	line.Set('chart.labels', labels);
	line.Set('chart.tickmarks', 'cross');
	line.Set('chart.text.size', 8);
	line.Set('chart.background.grid.autofit', true);
	line.Set('chart.background.grid.autofit.numhlines', 5);
	line.Set('chart.background.grid.autofit.numvlines', 24);

	//draw the graphs
	line.Draw();

}

/**
 * Draw the map.
 */
this.map = function() {
	//init the map
    var map = new google.maps.Map(
		document.getElementById("mapcanvas"),
		{
    	zoom: 4,
    	center: new google.maps.LatLng(-36.5, 143.0),
    	mapTypeId: google.maps.MapTypeId.TERRAIN,
			mapTypeControl: false
    }
	);

	//plot the points
	for (var m in metadata) {
		if (!(isNaN(metadata[m].latitude) || isNaN(metadata[m].longitude))) {
			mapmarkers[metadata[m].loc_code] = new google.maps.Marker({
				icon: new google.maps.MarkerImage('/themes/default/resources/turbine_36x48.png', new google.maps.Size(36, 48), new google.maps.Point(0, 0), new google.maps.Point(14, 44)),
      	position: new google.maps.LatLng(metadata[m].latitude, metadata[m].longitude),
      	map: map,
      	title: metadata[m].name,
				visible: true
  		});
		}
	}
}

/**
 * Toggle a region on/off.
 */
this.toggle = function(type, region) {
	$("#wfo_controls #" + region + " input.checkbox").each(function() {
		if (type == 'on') $(this).attr("checked", "checked");
		else $(this).removeAttr("checked");

		var marker = mapmarkers[$(this).attr("id").substring("control_".length)];
		if (marker)
			marker.setVisible($(this).is(":checked"));
	});
	wind();
}

