/*	Ground Zero 2 Mapplet,v.2.1.0
	Carlos Labs Pty, 2007-2009
	PID: 200903A, http://www.carloslabs.com
	
	This code is released under a Creative Commons license. 
	http://creativecommons.org/licenses/by/3.0/legalcode

	You may use this code in any software project, provided you
	do not remove or modify this header and you credit us as the
	original authors of the code.
	
	Thanks and credits on www.carloslabs.com
*/

var grz = {};

	grz.map = null;
	grz.gz = null;
	grz.tg = new Array();
	grz.w = new Array();
	grz.c = new Array();
	grz.d = new Array();	
	grz.mapzoom = 13;
	grz.defz = grz.mapzoom;
	grz.mapzoomprev = grz.mapzoom;	
	grz.autozoom = true;
	grz.maplock = true;
	grz.wind = 90; // 90: north in JS			
	grz.idx = 2;
	grz.y = 0;
	grz.drop = 0;
	grz.cities = 9;
	grz.mode = 0;
	grz.c1 = "";grz.c2 = "";grz.c3 = "";grz.c4 = "";
	
	grz.oW = new Array();
	grz.jW = new Array();
	grz.oC = new Array();
	grz.jC = new Array();
	grz.oD = new Array();
	grz.jD = new Array();				
	grz.n = "";

function loadMap() {
  if (GBrowserIsCompatible()) {
  		grz.map = new GMap2(document.getElementById("map"));
  		
		grz.oC = $.toJSON(cities);
		grz.jC = $.evalJSON(grz.oC);
		grz.oW = $.toJSON(weapons);
		grz.jW = $.evalJSON(grz.oW);		
		grz.oD = $.toJSON(damage);
		grz.jD = $.evalJSON(grz.oD);
  		
  		var r = Math.floor(Math.random() * grz.cities);
		
		grz.tg[0] = parseFloat(grz.jC[r].lt);
		grz.tg[1] = parseFloat(grz.jC[r].ln);
		grz.gz = new GLatLng(grz.tg[0], grz.tg[1]);  
				
        grz.map.setCenter(grz.gz, grz.defz);
        grz.map.addOverlay(new GMarker(grz.gz));
        
        clearAll();
        
        var opt = {
			searchFormHint : grz.jC[r].na,
        	suppressInitialResultSelection : true,
        	resultList : google.maps.LocalSearch.RESULT_LIST_SUPPRESS,
			onMarkersSetCallback : markersSet_callback
        };
        
		grz.map.addControl(new google.maps.LocalSearch(opt), new GControlPosition(G_ANCHOR_TOP_RIGHT,  new GSize(6,8)));
		grz.map.addControl(new GMenuMapTypeControl(),  new GControlPosition(G_ANCHOR_BOTTOM_RIGHT,  new GSize(0,25)));
		grz.map.addControl(new GLargeMapControl());        
		grz.map.addControl(new GScaleControl(),  new GControlPosition(G_ANCHOR_BOTTOM_LEFT,  new GSize(228,25)));
        
		GEvent.addListener(grz.map, "dragstart", function() {
		  grz.map.closeInfoWindow();
		});
        
		GEvent.addListener(grz.map, "dragend", function() {
			grz.gz = grz.map.getCenter();
			grz.mapzoom = grz.map.getZoom();
			
			if (document.forms.fd.fd_d.checked==false) {
				grz.tg[0] = parseFloat(grz.gz.lat());
				grz.tg[1] = parseFloat(grz.gz.lng());			
				grz.map.clearOverlays();
				grz.map.addOverlay(createMarker(grz.gz, buildInfo(grz.mode)));
			}
							
			//alert("Centre: Lat:" + grz.gz.lat().toString() + ", Lng:" + grz.gz.lng().toString());			
			if (grz.drop==1)
				dropBomb(0);	
		});
		document.getElementById('t_1').innerHTML = grz.jW[grz.idx].na;			
  }
  else
  	alert("Critical Error: Your browser does not support Google Maps");
}
function buildInfo(mode){
	var n = "<table cellpadding=\"2\" width=\"370px\" cellspacing=\"1\" border=\"0\">";
	n+="<tr align=\"center\" class=\"gz_c_t\"><th width=\"33%\">Zone</th><th width=\"67%\">Physical Effects</th></tr>";
	n+="<tr align=\"center\"><td style=\"_STY1_\">_KEY1_</td><td class=\"gz_c_p\">_VAL1_</td></tr>";
	n+="<tr align=\"center\"><td style=\"_STY2_\">_KEY2_</td><td class=\"gz_c_p\">_VAL2_</td></tr>";
	n+="<tr align=\"center\"><td style=\"_STY3_\">_KEY3_</td><td class=\"gz_c_p\">_VAL3_</td></tr>";
	n+="<tr align=\"center\"><td style=\"_STY4_\">_KEY4_</td><td class=\"gz_c_p\">_VAL4_</td></tr></table>";

	for (var i=1;i<5;i++)
	{
	n = n.replace("_KEY"+(i).toString()+"_",grz.jD[(mode*4+i)].na);
	n = n.replace("_VAL"+(i).toString()+"_",grz.jD[(mode*4+i)].nb);
	n = n.replace("_STY"+(i).toString()+"_",grz.jD[(mode*4+i)].st);		
	}
	
	return n;
}
function kmToDegX(kms, lat) {
	return (kms / (Math.abs(lat) * 180/112.12 + 112.12));}
function kmToDegY(kms) {
	return (kms / 112); }
function markersSet_callback(markers)	{
	grz.gz = grz.map.getCenter();
	grz.mapzoom = grz.map.getZoom();
	grz.tg[0] = parseFloat(grz.gz.lat());
	grz.tg[1] = parseFloat(grz.gz.lng());
	clearAll();
    grz.map.addOverlay(new GMarker(grz.gz));
	return 1;
}
	
function pa(kt, f)	{
	var A = 1, B = 1;
	if (grz.mode == 0)	{
		if (f==1) {A=0.38;B=1.2;grz.c1="#ff9933";};
		if (f==2) {A=0.4;B=0.88;grz.c2="#cc6666"};
		if (f==3) {A=0.34;B=0.67;grz.c3="#660066"};
		if (f==4) {A=0.3;B=0.55;grz.c4="#333333"};
	}
	if (grz.mode == 1)	{
		if (f==1) {A=0.33;B=1.8;grz.c1="#9370DB";};
		if (f==2) {A=0.33;B=0.71;grz.c2="#007BA7"};
		if (f==3) {A=0.33;B=0.45;grz.c3="#5218FA"};
		if (f==4) {A=0.3;B=0.28;grz.c4="#333333"};
	}
	if (grz.mode == 2)	{	
		if (f==1) {A=0.34;B=1.52;grz.c1="#44944A"};
		if (f==2) {A=0.33;B=1.01;grz.c2="#D1E231"};
		if (f==3) {A=0.32;B=0.65;grz.c3="#3FFF00"};
		if (f==4) {A=0.3;B=0.4;grz.c4="#333333";};
	}	
	return Math.pow(kt,A) * B;
}
				
	
function eX(x, radiusA, radiusB, sinalpha, cosalpha, sinbeta, cosbeta) {
	return x + (radiusA * cosalpha * cosbeta - radiusB * sinalpha * sinbeta);}
function eY(y, radiusA, radiusB, sinalpha, cosalpha, sinbeta, cosbeta) {
	return y + (radiusA * cosalpha * sinbeta + radiusB * sinalpha * cosbeta);}
function radians(degrees) {
	return degrees*Math.PI/180;		}

function createMarker(point, narrative) {
	 var marker = new GMarker(point,{draggable: false, bouncy: false});
	 GEvent.addListener(marker, "click", function() {
	   marker.openInfoWindowHtml(narrative);
	 });  
	return marker;
}
function autoZoom(form) {
	grz.autozoom = form.fd_a.checked;
	return 1;
}
function mapLock(form) {
	grz.maplock = form.fd_d.checked;
	return 1;
}
function procTab(tab)	{
	grz.mode = tab;
	grz.map.closeInfoWindow();
	if (grz.drop==1)
		dropBomb(1);
	return 1;
}
function chgWind(angle)	{
	var b='<img name="wd" src="img/compass_';
	var c='.gif" width="64" height="68" border="0" usemap="#m_compass">';
	if ((angle <= 0) || (angle >= 360)) {grz.wind = 90};
	if ((angle == 180)) {grz.wind = 270;};
	if ((angle == 90)) {grz.wind = 180;};
	if ((angle == 270)) {grz.wind = 0;};
	if ((angle == 45)) {grz.wind = 135;};
	if ((angle == 315)) {grz.wind = 45;};
	if ((angle == 135)) {grz.wind = 225;};
	if ((angle == 225)) {grz.wind = 315;};	
	document.getElementById('wdw').innerHTML = b + angle.toString() + c;
	if (grz.drop==1)
		dropBomb(0);
}

// options
//	0; do not recompute wind direction (use when dragging map)
//  1; recompute wind direction
function dropBomb(options) {
	var vX = 0, vY = 0; wA = 0;step = 36;
	var opt = {geodesic:true};
	var zX = new Array(), zY = new Array();
	
	var aE1 = new Array(), aE2 = new Array(), aE3 = new Array(), aE4 = new Array();
	grz.map.clearOverlays();
	
	if (document.forms.fd.fd_a.checked==false) {grz.mapzoom = grz.map.getZoom();}
		
	grz.map.setCenter(grz.gz, grz.mapzoom);
	grz.gz = new GLatLng(grz.tg[0], grz.tg[1]); 
	grz.map.addOverlay(createMarker(grz.gz, buildInfo(grz.mode)));
				
	zX[0] = kmToDegX(pa((grz.y),1), grz.tg[0]);
	zX[1] = kmToDegX(pa((grz.y),2), grz.tg[0]);
	zX[2] = kmToDegX(pa((grz.y),3), grz.tg[0]);
	zX[3] = kmToDegX(pa((grz.y),4), grz.tg[0]);	
	
	zY[0] = kmToDegY(pa((grz.y),1));
	zY[1] = kmToDegY(pa((grz.y),2));
	zY[2] = kmToDegY(pa((grz.y),3));
	zY[3] = kmToDegY(pa((grz.y),4));

	// thanks to mendicantbug.com for picking this one
	var tV = 0;
	if (zX[1] > zX[0])	{
		tV = zX[1];
		zX[1] = zX[0];
		zX[0] = tV;
	}
	if (zY[1] > zY[0])	{
		tV = zY[1];
		zY[1] = zY[0];
		zY[0] = tV;
	}
	
	wA = grz.wind;
	
	if (grz.mode !=2) wA=0; 
	var sinbeta = Math.sin(radians(wA));
	var cosbeta = Math.cos(radians(wA));
	
	var a = 0, b=0;
	for (var i = 0; i < 360; i += (360 / step)) {	
		var sinalpha = Math.sin(radians(i));
	    var cosalpha = Math.cos(radians(i));
	    
		a=zX[0];b=zY[0];
	    if (grz.mode==2)	{
	    	if ((i >= 180)) {b=(zY[0] * 3.5);} else {b=(zY[0] * 0.65);}
	    }
	    vX = eX(grz.tg[0],a,b,sinalpha,cosalpha,sinbeta,cosbeta);
	    vY = eY(grz.tg[1],a,b,sinalpha,cosalpha,sinbeta,cosbeta);
		aE1[i] = new GLatLng(vX, vY);	
		a=zX[1];b=zY[1];
	    if (grz.mode==2)	{
	    	if ((i >= 180)) {b=(zY[1] * 3.5);} else {b=(zY[1] * 0.85);}
	    }
	    vX = eX(grz.tg[0],a,b,sinalpha,cosalpha,sinbeta,cosbeta);
	    vY = eY(grz.tg[1],a,b,sinalpha,cosalpha,sinbeta,cosbeta);
		aE2[i] = new GLatLng(vX, vY);
		a=zX[2];b=zY[2];
	    if (grz.mode==2)	{
	    	if ((i >= 180)) {b=(zY[2] * 3.5);} else {b=(zY[2] * 0.90);}
	    }
	    vX = eX(grz.tg[0],a,b,sinalpha,cosalpha,sinbeta,cosbeta);
	    vY = eY(grz.tg[1],a,b,sinalpha,cosalpha,sinbeta,cosbeta);
		aE3[i] = new GLatLng(vX, vY);		
		a=zX[3];b=zY[3];
	    if (grz.mode==2)	{
	    	if ((i >= 180)) {b=(zY[3] * 3.5);} else {b=(zY[3] * 0.95);}
	    }
	    vX = eX(grz.tg[0],a,b,sinalpha,cosalpha,sinbeta,cosbeta);
	    vY = eY(grz.tg[1],a,b,sinalpha,cosalpha,sinbeta,cosbeta);
		aE4[i] = new GLatLng(vX, vY);
	}		
	grz.map.addOverlay(new GPolygon(aE1, grz.c1, 2, 0.32, grz.c1, 0.44, opt));
	grz.map.addOverlay(new GPolygon(aE2, grz.c2, 2, 0.32, grz.c2, 0.44, opt));
	grz.map.addOverlay(new GPolygon(aE3, grz.c3, 2, 0.32, grz.c3, 0.44, opt));
	grz.map.addOverlay(new GPolygon(aE4, grz.c3, 2, 0.32, grz.c4, 0.44, opt));
		
	document.getElementById('t_3').innerHTML = "Click the marker for details. Drag map to change the area.";
	grz.drop=1;	
	return 1;
}

function clearAll() {
	grz.map.clearOverlays();		
	
	$("#sl_y").slider({value:grz.idx});	
	grz.y = parseInt(grz.jW[grz.idx].yi);					
	document.getElementById('t_3').innerHTML = "&nbsp;";

	grz.wind=0;	
	grz.mapzoom=13;
	grz.map.closeInfoWindow();
	grz.map.setCenter(grz.gz, grz.mapzoom);
	grz.tg[0] = parseFloat(grz.gz.lat());
	grz.tg[1] = parseFloat(grz.gz.lng());
		
	grz.drop=0;
	return 1;
}   
