var yieldUnit = 'kt';
var D = 0.05;
var F = 0.35;
var Visibility = 170;
var units = 'metric';
var updateOnChange = false;
var mapW = 0;
var mapH = 0;
var sporadicStormRad = 0;
var fireStormRad = 0;
var conversionFactor = '1.6';
var metreToFeetConversion = '3.28';
var map;
var found = false;
var meterUnit;
var feetUnit;
var kmUnit;
var mileUnit;

var showPopup = true;

function getWeaponSize(){
	if($('#yield').val()== '')
		return 0;
	else
		return $('#yield').val();
}

function drawCircle(center, radius, nodes, liColor, liWidth, liOpa, fillColor, fillOpa)
{
	// Esa 2006
	//calculating km/degree
	var latConv = center.distanceFrom(new GLatLng(center.lat()+0.1, center.lng()))/100;
	var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng()+0.1))/100;
	var bounds = new GLatLngBounds();

	//Loop 
	var points = [];
	var step = parseInt(360/nodes)||10;
	for(var i=0; i<=360; i+=step)
	{
		var pint = new GLatLng(center.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), center.lng() + 	(radius/lngConv * Math.sin(i * Math.PI/180)));
		points.push(pint);
		bounds.extend(pint); //this is for fit function
	}
	map.setZoom(map.getBoundsZoomLevel(bounds));
	map.setZoom(map.getZoom() - 1);
	// Closes the circle, thanks Martin
	points.push(points[0]); 
	fillColor = fillColor||liColor||"#0055ff";
	liWidth = liWidth || 2;
	var poly = new GPolygon(points,liColor,liWidth,liOpa,fillColor,fillOpa);
	map.addOverlay(poly);
	return poly;
}
/////////////////////////////////////////////////////////////////////

function updateMap(){		
	nukePlace(getWeaponSize());
}
	
function goToLocation(Loc){
	var geocoder = new GClientGeocoder();
		geocoder.getLatLng(
		Loc,
		function(point) {
			if (!point) {
				alert(Loc + " not found");
			} 
			else {
				map.setCenter(point, 15);
			}
	}); 
}
	
function latscale(latitude) {
	var m1 = 111132.92;
	var m2 = -559.82;
	var m3 = 1.175;
	var m4 = -0.0023;
	var lat = latitude * ((2.0 * Math.PI)/360.0);
	var latlen = m1 + (m2 * Math.cos(2 * lat)) + (m3 * Math.cos(4 * lat)) + (m4 * Math.cos(6 * lat));
	return (latlen / 12 * 39.370079) / 5280;
}

function getFirebalHeight(Y){
	return (225)*Math.pow(Y, 0.333333333);
}

function lonscale(latitude) {
	var p1 = 111412.84;
	var p2 = -93.5;
	var p3 = 0.118;
	var lat = latitude * ((2.0 * Math.PI)/360.0);
	longlen = (p1 * Math.cos(lat)) + (p2 * Math.cos(3 * lat)) + (p3 * Math.cos(5 * lat));
	return (longlen / 12 * 39.370079) / 5280;
}

function updateFireballHeight(Y){
	H = getFirebalHeight(Y);		
	$('#fireballHeight').html((H/metreToFeetConversion).toFixed(0) + ' ' + meterUnit );
	$('#fireballHeight').append("<br/>"+(H).toFixed(0) + ' ' + feetUnit );	
}

function updateMapArea(){
	A = mapW*mapH*conversionFactor*conversionFactor;
	A2 = mapW*mapH;
	$('#mapArea').html(A.toFixed(0)+ ' ' + kmUnit + '<sup class="nukeUnits">2</sup><br />');
	$('#mapDimensions').html((mapW*conversionFactor).toFixed(1) + ' ' + kmUnit +' X ' + (mapH*conversionFactor).toFixed(1) +' ' + kmUnit + '<br />');
	$('#mapArea').append(A2.toFixed(0)+ ' ' + mileUnit + '<sup class="nukeUnits">2</sup>');
	$('#mapDimensions').append((mapW).toFixed(1) + '  ' + mileUnit +' X ' + (mapH).toFixed(1) +' ' + mileUnit);
}
	
function updateFireStormArea(){
	AImp = Math.pow(fireStormRad, 2)*Math.PI;
	AImp2 = Math.pow(sporadicStormRad, 2)*Math.PI;
	
	AMetric = Math.pow(fireStormRad*conversionFactor,2)*Math.PI;
	AMetric2 = Math.pow(sporadicStormRad*conversionFactor,2)*Math.PI;
	
	$('#firestormArea').html( AMetric.toFixed(0) + ' ' + kmUnit + '<sup  class="nukeUnits">2</sup><br />');
	$('#firestormArea').append( AImp.toFixed(0) + ' ' + mileUnit + '<sup  class="nukeUnits">2</sup>');
	$('#firestormRadius').html(radiusWord + ' ' + (conversionFactor*fireStormRad).toFixed(2) + ' ' + kmUnit + '<br />');
	$('#firestormRadius').append(radiusWord + ' ' + (fireStormRad).toFixed(2) + ' ' + mileUnit );
	$('#sporadicFiresArea').html( AMetric2.toFixed(0) + ' ' + kmUnit  +'<sup  class="nukeUnits">2</sup><br />');
	$('#sporadicFiresArea').append( AImp2.toFixed(0) + ' ' + mileUnit  +'<sup  class="nukeUnits">2</sup>');
	$('#sporadicFiresRadius').html(radiusWord + ' ' + (conversionFactor*sporadicStormRad).toFixed(2) + ' ' + kmUnit  + '<br />');
	$('#sporadicFiresRadius').append(radiusWord + ' ' + (sporadicStormRad).toFixed(2) + ' ' + mileUnit);
}

function nukePlace(bombYield){	

	map.clearOverlays();
	fireStormRad = (getFireDistance(20, bombYield));
	sporadicStormRad = (getFireDistance(10, bombYield));
	D3 = (getFireDistance(5, bombYield));	
	
	c2 = drawCircle(map.getCenter(), sporadicStormRad, 60, "#F55", 1, 0.8, '#F00',0.3);
	
	GEvent.addListener(c2, 'mouseover', function(){ 
		if(showPopup) {
		$('#FSPArea').show('fast');
	 }
	});
	GEvent.addListener(c2, 'mouseout', function(){ 
		if(showPopup) {																						
		$('#FSPArea').hide('fast');
		}
	});
	
	GEvent.addListener(map, 'mouseout', function(){
			$('#FSArea').hide('fast');																						 
			$('#FSPArea').hide('fast');																				 
		});
	
	var c1 = drawCircle(map.getCenter(), fireStormRad, 60, "#F00", 1, 0.8, '#F00',0.5);	

	getMapDim();
	updateMapArea();
	updateFireballHeight(bombYield);
	updateFireStormArea();
}
			
function  getMapDim(){
	r = 6371;					
	//var bounds = new GLatLngBounds();
	bounds = map.getBounds();
	SW = bounds.getSouthWest();
	NE = bounds.getNorthEast();
	dist = SW.distanceFrom(NE)/1000;				
	mapW = dist * Math.sin(Math.PI/4);
	mapH = dist * Math.cos(Math.PI/4);							
}

function getFireDistance(QV, Y){
	D = 0.001;
	e = 1000;
	while(e>0.5){    
		Q = 3.07*F*Y*(1+(1.4*(D/Visibility)))*Math.exp(-2*(D/Visibility))/Math.pow(D,2)
		e = Q - QV;  
		D = D + 0.05; 
	}
	return D;
}