// map settings
var cm_image_root = "/publications/special/maps/globalReactorCapacities/img/";
var json_countries = "/publications/special/maps/globalReactorCapacities/json/countries.txt";
var cm_opacity = .35;
var cm_opacity_over = .5;

// spreadsheets
var sx_wsId = "od6";
var sx_ssKey = "pMNgHdCy1vmRc3ObH-QTLWg";
var sx_titleCol = "location";
var sx_descCol = "description";
var sx_latCol = "lat";
var sx_lngCol = "lng";
var sx_rankByCol = "current"; // scenario
var sx_compCol = []; // comparison metric

// globals
var cm_json;
var cm_borders;
var cm_borderMap = [];
var cm_map; 
var cm_regions = [];

// groupings
var sx_oecdCol = "oecdeurope"; // group for OECD Europe
var sx_non_oecdCol = "non-oecdeurope"; // group for Non-OECD Europe
var sx_gulfCol = "gulfcooperationcouncil"; // group for Gulf Cooperation Council
var cm_compColColors = { 
	uraniumenrichment:"#D68019", 
	commercialnuclearfuelreprocessing:"#3D71B7",
	nuclearweaponsstate:"#69A55D",
	chemicalweaponsstate:"#B0815B",
	biologicalweaponsstate:"#949381",
	ballisticmissile:"#C52A21"
}
var grp_cols = [];
var grp_cols_abbr = [ sx_oecdCol, sx_non_oecdCol, sx_gulfCol ];
var grp_cols_long = [ "OECD Europe", "Non-OECD Europe", "Gulf Cooperation Council" ];
for( var i = 0; i < grp_cols_long.length; i++ ) { grp_cols[ grp_cols_long[ i ] ] = []; }

function cm_Region() {
	// one region, one marker, many polygons. 
	this.label = "";
	this.desc = "";
	this.polygons = [];
	this.marker = null;
	this.open = false;
	this.highlighted = false;
	this.enablePolygons = false;
	var region = this;

	this.addMarker = function( marker ) {
		region.marker = marker;
	}

	this.addPolygon = function( polygon ) {
		region.polygons.push( polygon );
	}

	this.addToMap = function( map ) {
		var i;
		if( region.enablePolygons ) { 
			for( i = 0; i < region.polygons.length; i++ ) {
				var polygon = region.polygons[ i ];
				GEvent.addListener( polygon, "click", function() {
					region.toggleBalloon();
				});
				map.addOverlay( polygon );
			}
		}
		GEvent.addListener( region.marker, "click", function() {
			region.toggleBalloon();
		});
		GEvent.addListener( region.marker, "mouseover", function() {
			region.highlight();
		});
		GEvent.addListener( region.marker, "mouseout", function() {
			region.unhighlight();
		});
		GEvent.addListener( this.marker, "infowindowopen", function() {
			region.highlight();
		});
		GEvent.addListener( this.marker, "infowindowclose", function() {
			region.unhighlight();
		});
		map.addOverlay( region.marker );
		cm_sideBarElement( i, region.label, region.toggleBalloon );
	}

	this.highlight = function() {
		if( region.highlighted ) { return; }
		region.highlighted = true;
		region.marker.setImage( region.marker.getIcon().imageOver );
		if( region.enablePolygons ) { 
			for( var i = 0; i < region.polygons.length; i++ ) { 
				region.polygons[ i ].setFillStyle( { opacity: cm_opacity_over } );
				region.polygons[ i ].redraw( true );
			}
		}
	}

	this.unhighlight = function() {
		if( !region.highlighted ) { return; }
		region.highlighted = false;
		region.marker.setImage( region.marker.getIcon().imageOut );
		if( region.enablePolygons ) { 
			for( var i = 0; i < region.polygons.length; i++ ) { 
				region.polygons[ i ].setFillStyle( { opacity: cm_opacity } );
				region.polygons[ i ].redraw( true );
			}
		}
	}

	this.toggleBalloon = function() {
		if( !region.open ) {
			var html = "<strong>" + region.label + "</strong><br/>" + region.desc;
			region.marker.openInfoWindowHtml( html );
			region.marker.setImage( region.marker.getIcon().imageOver );
			region.open = true;
		} else {	
			region.marker.setImage( region.marker.getIcon().imageOut );
			region.marker.closeInfoWindow();
			region.open = false;
		}
	}
}

Array.prototype.contains = function( v ){
	for( var i = 0; i < this.length; i++ ) {
		if( this[ i ] == v ) return true;
	}
	return false;
} 

Array.prototype.addOnMiss = function( key, val ){
	// set the associative array only if key is not present
	for( var item in this ) {
		if( item == key ) { return; }
	}
	this[ key ] = val;
} 

function cm_regionInGroup( region ) {
	for( var grp in grp_cols ) {
		if( grp_cols_long.contains( grp ) && grp_cols[ grp ].contains( region ) ) {
			return grp;
		}
	}
	return "";
}

function cm_load() {  
	if (GBrowserIsCompatible()) {
		cm_map = new GMap2( document.getElementById( "cm-map-container" ) );
		cm_map.addControl( new GSmallMapControl() );
		cm_map.addControl( new GMapTypeControl() );
		cm_map.setCenter( new GLatLng(27.99440,-4.92188), 2 );
		cm_getBorders();
	} else {
		alert("Sorry, the Google Maps API is not compatible with this browser");
	} 
}

function cm_getBorders() {
	$.getJSON( json_countries, 
		function( data, textStatus ) { 
			cm_borders = data;	
			for( var i in cm_borders ) { // cache
				cm_borderMap[ cm_borders[ i ][ 'code' ] ] = i;
			}
			cm_getSpreadsheet();
		});
}

function cm_getSpreadsheet() {
	// Retrieve the JSON feed.
	var script = document.createElement('script');
	script.setAttribute('src', 'http://spreadsheets.google.com/feeds/list'
		               + '/' + sx_ssKey + '/' + sx_wsId + '/public/values' +
		              '?alt=json-in-script&callback=cm_loadMapJSON');
	script.setAttribute('id', 'jsonScript');
	script.setAttribute('type', 'text/javascript');
	document.documentElement.firstChild.appendChild(script);
}

function cm_sortRows( rowA, rowB ) {
	var rowAValue = 0;
	var rowAOrig = rowA[ "gsx$" + sx_rankByCol ].$t; 
	if( rowAOrig ) { rowAValue = parseFloat( rowAOrig ); }
	var rowBValue = 0;
	var rowBOrig = rowB[ "gsx$" + sx_rankByCol ].$t; 
	if( rowBOrig ) { rowBValue = parseFloat( rowBOrig ); }
	return rowBValue - rowAValue;
}

function cm_parseGroups() {
	for( var i = 0; i < cm_json.feed.entry.length; i++ ) {
		var entry = cm_json.feed.entry[i];
		var title = entry["gsx$" + sx_titleCol].$t;
		for( var j = 0; j < grp_cols_abbr.length; j++ ) { 
			var grp = grp_cols_abbr[ j ];
			if( entry["gsx$" + grp].$t ) {
				grp_cols[ grp_cols_long[ j ] ].push( title );
			}
		}
	}
}

function cm_loadMapJSON( json ) {
	cm_json = json;

	// parse out groups
	cm_parseGroups();

	cm_setScenario( sx_rankByCol ); 
}

function cm_sideBarElement( cnt, label, fn ) {
	// sidebar
	var sidebarDIV = document.getElementById( "cm-map-sidebar" );
	var markerDIV = document.createElement( "li" );
	markerDIV.setAttribute( "class", "country" );
	var markerA = document.createElement( "a" );
	$( markerA ).bind( "click",fn );
	markerA.setAttribute( "href","#" );
	markerA.appendChild( document.createTextNode( label ) );
	markerDIV.appendChild( markerA );
	sidebarDIV.appendChild( markerDIV );
}
		

function cm_refreshMap() {
	var sidebarDIV = document.getElementById( "cm-map-sidebar" );
	sidebarDIV.innerHTML = "";
	cm_map.clearOverlays();
	cm_regions = [];
     var json = cm_json;

	for( var k = 0; k < grp_cols_long.length; k++ ) {
		cm_regions.addOnMiss( grp_cols_long[ k ], new cm_Region() );
		cm_regions[ grp_cols_long[ k ] ].label = grp_cols_long[ k ];
	}


	for( var i = 0; i < json.feed.entry.length; i++ ) {
		var entry = json.feed.entry[i];
		if( !entry["gsx$" + sx_latCol] ) {
			continue;
		}

		var label = entry["gsx$"+sx_titleCol].$t;
		var desc = entry["gsx$"+sx_descCol].$t;
		var lat = parseFloat( entry["gsx$" + sx_latCol].$t );
		var lng = parseFloat( entry["gsx$" + sx_lngCol].$t );
		var point = new GLatLng( lat, lng );
		var val = 0;
		if( entry["gsx$" + sx_rankByCol].$t ) {
			val = parseFloat( entry["gsx$" + sx_rankByCol].$t );
		}

		// create the region obj if the region isnt part of a larger group
		if( !cm_regionInGroup( label ) ) {  
			cm_regions.addOnMiss( label, new cm_Region() );
			cm_regions[ label ].label = label;
			cm_regions[ label ].desc = desc;
			var marker = cm_createMarker( point, label, val );
			cm_regions[ label ].addMarker( marker );
		}
				
		// check for current scenario
		var enablePolygons = false;
		if( sx_compCol.length > 0 ) {
			for( var k = 0; k < sx_compCol.length; k++ ) { 
				if( entry["gsx$"+sx_compCol[ k ]].$t == "yes" ) { enablePolygons = true; }
			} 
		}
		try { 
			cm_regions[ label ].enablePolygons = enablePolygons; 
		} catch( e ) { } 
		var regionGroup = cm_regionInGroup( label );
		if( sx_compCol.length > 0 ) {
			for( var k = 0; k < sx_compCol.length; k++ ) {
				var color = cm_compColColors[ sx_compCol[ k ] ];
				if( entry["gsx$"+sx_compCol[ k ]].$t == "yes" ) { 
					try { 
						var polygons = cm_createPolygons( label, color );
						for( var poly = 0; poly < polygons.length; poly++ ) { 
							if( regionGroup ) { 
								cm_regions[ regionGroup ].addPolygon( polygons[ poly ] );
							} else { 
							cm_regions[ label ].addPolygon( polygons[ poly ] );
							}
						}
					} catch( e ) { 
						//console.log( "couldn't make polygons for " + label + " in " + regionGroup + " error:" + e );
					}
				}
			}
		}
	}
	for( var region in cm_regions ) { 
		try { 
			cm_regions[ region ].addToMap( cm_map );
		} catch( e ) { } 
	}
}

function cm_createMarker( point, title, val ) { 
	var icon = new GIcon( G_DEFAULT_ICON );
	var sz = Math.sqrt( (15+val) * 100 / Math.PI );
	if( val == 0 ) { 
		icon.image = cm_image_root + "gray.png";
		icon.imageOver = icon.image;
		icon.imageOut = icon.image;
		sz = 15;
	} else {
		icon.image = cm_image_root + "static/img_" + parseInt( val ) + ".png";
		icon.imageOver = cm_image_root + "hover/img_" + parseInt( val ) + ".png";
		icon.imageOut = cm_image_root + "static/img_" + parseInt( val ) + ".png";
	}
	icon.mozprintImage = icon.image;
	icon.printImage = cm_image_root + "gif/img_" + parseInt(val) + ".gif";
	var sz2 = parseInt( sz * .5 );
	icon.shadow = "";
	sz = parseInt( sz );
	icon.shadowSize = new GSize( 0, 0 );
	icon.iconSize = new GSize( sz, sz ); 
	icon.iconAnchor = new GPoint( sz2, sz2 );
	icon.infoWindowAnchor = new GPoint( sz2, sz2 );	
	icon.imageMap = [ 0,0, sz,0, sz,sz, 0,sz ];

	var markerOpts = {};
	markerOpts.icon = icon;
	markerOpts.title = title;
	markerOpts.zIndexProcess = function() { return 1000 - val; }
	var marker = new GMarker( point, markerOpts );

	return marker;
}

function cm_createPolygons( code, color) {
	var border = cm_borders[ cm_borderMap[ code ] ][ 'coords' ];
	var polygons = [];
	for( var i = 0; i < border.length; i++ ) {
		var gborder = [];
		for( var j = 0; j < border[ i ].length; j += 2 ) { 
			gborder.push( new GLatLng( border[ i ][ j+1 ], border[ i ][ j ] ) );
		}
		var polygon = new GPolygon( gborder, color, 1, .3, color, cm_opacity);
		polygons.push( polygon );
	}
	return polygons;
}

function cm_setScenario( name ) {
	sx_rankByCol = name;
	if( name == "current" ) {
		$( "#comparisons" ).show();
		$( "#comparisons > li > input" )
			.bind( "change", function( e ) { cm_setComparison( $(this).attr( "id" ), $(this).attr("checked") ); } )
			.css( "text-decoration", "underline" );
	} else {
		$( "#comparisons" ).hide();
		$( "#comparisons > li > input" )
			.bind( "change", function( e ) {} )
			.css( "text-decoration", "none" );
		sx_compCol = [];
	}
	cm_refreshMap();
}

function cm_setComparison( name, enable ) {
	if( enable == false ) { 
		var sx_compCol_tmp = [];
		for( var i = 0; i < sx_compCol.length; i++ ) { 
			if( sx_compCol[ i ] != name ) {
				sx_compCol_tmp.push( sx_compCol[ i ] );
			}	
		}
		sx_compCol = sx_compCol_tmp;
	} else { 
		sx_compCol.push( name );
	}
	cm_refreshMap();
}

$(document).ready(function() {
	$( "#comparisons > li > input" ).attr( "checked", false );
});
