var MAP ="";
var AIRPORTS = new Array();
MOUSE = {"_0":0,"_over":1,"_click":2,"_dblclick":3};
var WEIGHTS= new Array(10000,1000,100,10,1);

var origAddOverlay = GMap2.prototype.addOverlay;
var origRemoveOverlay = GMap2.prototype.removeOverlay;

GMap2.prototype.addOverlay = function(mapObj,ref){
	if(typeof(this._overlays[ref]) == "undefined" ){
		this._overlays[ref] = 1;
		origAddOverlay.call(this,mapObj);
	}
}

GMap2.prototype.removeOverlay = function(mapObj,ref){
	if(this._overlays[ref] == 1){
		delete this._overlays[ref];
		origRemoveOverlay.call(this,mapObj);
	}
}

function loadData(isOnLoad){
	var bnds = MAP.getBounds();
	sw = bnds.getSouthWest();
	ne = bnds.getNorthEast();
	q="token="+token+"&sw_lat="+sw.lat() +"&sw_lon="+sw.lng()+"&ne_lat="+ne.lat() +"&ne_lon="+ ne.lng();
	if(isOnLoad){q+="&isOnLoad=1"}
	var request = GXmlHttp.create();
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			//temp = request.responseText.substr(0,250);
			//GLog.write(temp)
			unserialize(eval("(" + request.responseText + ")"));
		}
	};
	request.open("GET", "flight-carbon-emissions-db-1.php?"+q, true);
	request.send(null);
}

function kmToCO2(distKm) {
	if(distKm <=500){
		co2 = 0.15;
	}
	else if(distKm<=1600){
		co2 = 0.12;
	}
	else {
		co2 = 0.11;
	}
	return Math.round(distKm * co2);
}

function unserialize(rawData){
	start = AIRPORTS.length;
	if(rawData.airports){
		for(var i=0; i<rawData.airports.length; i++){
			AIRPORTS[start+i]=toAirportObject(rawData.airports[i]);
		}
	}
}

function calcTable(co2W){
		
	var weightIconsDim = new Array(154,96,33,14,8)	
	var eachIcons = new Array();
	
	var remainder=co2W;
	for(i=0;i<WEIGHTS.length;i++){
			eachIcons[i] = parseInt(remainder/WEIGHTS[i]);
			remainder = co2W%WEIGHTS[i];
	}
	htmlImages ='<IMG src="../i/maps/man.gif" width="17" height="48" align=bottom>'
	tablewidth = 18; //man
	
	for(i=0;i<eachIcons.length;i++){
		
		for(j=0;j<eachIcons[i];j++){
			
			htmlImages+= '<IMG src="../i/maps/'+WEIGHTS[i]+'.gif" width="'+weightIconsDim[i]+'" height="'+weightIconsDim[i]+'" align=bottom>';
			tablewidth+=weightIconsDim[i]+1;
		}

	}
	return {"width":tablewidth,"images":htmlImages};
}
function buildTable(co2W,co2U,distL,distU,tableW, htmlImages){
	mapHTML = "<TABLE style='width:"+tableW+"px' cellpadding=0 cellspacing=0><TR><TD nowrap>";
	if(co2U == "lbs"){
		mapHTML += "<B>Imperial</B> | <A href=javascript:units(MAP.met)>Metric</A></TD>"
	}
	else{
		mapHTML += "<A href=javascript:units(MAP.imp)>Imperial</A> | <B>Metric</B></TD>"
	}
	mapHTML += "<TD align=right><A href=javascript:MAP.removeOverlay(MAP.infoBox,'infoBox')><IMG src='../i/close.gif' width='14' height='13' border=0 align=right></A></TD></TR></TABLE>";
	
	if(MAP.passFlightType ==2 ){
		mapHTML += "Return ";
	}
	else{
		mapHTML += "";	
	}
	mapHTML += "Flight: <B>"+MAP.selectedAirport0.code+"</B> to  <B>"+MAP.selectedAirport1.code+"</B><BR>";
	mapHTML += htmlImages;

	
	if(MAP.passengers ==1){
		mapHTML += "<BR>CO2 per Passenger:";
		mapHTML += "<SPAN style='background:#ff0'><b>&nbsp;" + co2W + " "+ co2U +"&nbsp;</b></SPAN>";
	}
	else{
		mapHTML += "<BR>CO2 for "+ MAP.passengers +" Passengers:";
		mapHTML += "<SPAN style='background:#ff0'><B>&nbsp;" + (co2W * MAP.passengers * MAP.passFlightType) + " "+ co2U +"&nbsp;</b></SPAN>";		
	}

	mapHTML += "<BR>Distance: <b>" + distL * MAP.passFlightType + " " + distU+"</B>";
	return mapHTML
}
	
function toAirportObject(airport){
	//253:["DUB","Dublin",53.433,-6.25],

	airport.code = airport[0];
	airport.name = airport[1];
	airport.latLng=new GLatLng(airport[2],airport[3]);

	airport.marker = new GMarker(airport.latLng, MAP.defaultIcon);
	airport.marker = addE_M(airport);

	airport.curState = MOUSE._0;

	airport.label = new ELabel(airport.name+" - "+airport.code,airport.latLng,"labelClass"+airport.curState,2,6);
	airport.label.div.marker = airport.marker ;

	airport.label.div.onclick=function(e){GEvent.trigger(this.marker, "click");cancel(e);}
	airport.label.div.onmouseover=function(e){GEvent.trigger(this.marker, "mouseover");cancel(e);}
	airport.label.div.onmouseout=function(e){GEvent.trigger(this.marker, "mouseout");cancel(e);}
	
	MAP.addOverlay(airport.marker,airport.code);
	
	return airport;
}
function cancel(ev){
	var e = (window.event) ? window.event : ev;
	e.cancelBubble = true;
}
function justTwo(airport){

 	if(MAP.homeAirport){

		if(airport.curState == MOUSE._dblclick){
			if(MAP.selectedAirport1 == airport){
				MAP.selectedAirport1 = MAP.selectedAirport0;
			}
			MAP.selectedAirport0 = airport;
		}
		else{
			if(MAP.selectedAirport1){
				MAP.selectedAirport1.curState  = MOUSE._0;
				redraw(MAP.selectedAirport1,MOUSE._0);
			}
			MAP.selectedAirport1 = airport;
		}
		
 	}
	else{
		if(MAP.selectedAirport0)
		{
			if(MAP.selectedAirport1)
			{
				MAP.selectedAirport1.curState  = MOUSE._0;
				redraw(MAP.selectedAirport1,MOUSE._0);
			}
			MAP.selectedAirport1 = MAP.selectedAirport0;
		}
		MAP.selectedAirport0 = airport;
	}
	
}

function getCO2(){

	if(typeof(MAP.selectedAirport0) != "undefined"  && typeof(MAP.selectedAirport1)  != "undefined" && MAP.selectedAirport0.marker != MAP.selectedAirport1.marker){
		//alert(getLength(MAP.selectedAirport0.marker,MAP.selectedAirport1.marker,true))

		MAP.removeOverlay(MAP.pLine,"pline");
		MAP.removeOverlay(MAP.infoBox,"infoBox");

		var p0 = MAP.selectedAirport0.marker.getPoint();
		var p1 = MAP.selectedAirport1.marker.getPoint();


		var fPoints = new Array();

		with (Math) {
			var lat1 = p0.y * (PI/180);
			var lon1 = p0.x * (PI/180);
			var lat2 = p1.y * (PI/180);
			var lon2 = p1.x * (PI/180);

			var d = 2*asin(sqrt( pow((sin((lat1-lat2)/2)),2) + cos(lat1)*cos(lat2)*pow((sin((lon1-lon2)/2)),2)));
			var bearing = atan2(sin(lon1-lon2)*cos(lat2), cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon1-lon2))  / -(PI/180);
			bearing = bearing < 0 ? 360 + bearing : bearing;


			for (var n = 0 ; n < 51 ; n++ ) {
				var f = (1/50) * n;
				f = f.toFixed(6);
				var A = sin((1-f)*d)/sin(d);
				var B = sin(f*d)/sin(d);
				var x = A*cos(lat1)*cos(lon1) +  B*cos(lat2)*cos(lon2);
				var y = A*cos(lat1)*sin(lon1) +  B*cos(lat2)*sin(lon2);
				var z = A*sin(lat1)           +  B*sin(lat2);

				var latN = atan2(z,sqrt(pow(x,2)+pow(y,2)));
				var lonN = atan2(y,x);
				var p = new GLatLng(latN/(PI/180), lonN/(PI/180));
				fPoints.push(p);
			}

		}
		var dist = d * 6378.137;
		var distKM = parseInt(dist);
		var distMiles =  parseInt(dist * 0.621371192);
		var co2 = kmToCO2(dist);
		var co2Kg = parseInt(co2);
		var co2Lb = parseInt(co2 * 2.20462262);

		tempImp = calcTable(co2Lb* MAP.passengers * MAP.passFlightType)
		tempMet = calcTable(co2Kg* MAP.passengers * MAP.passFlightType)
		
		maxWidth = Math.max(tempImp['width'],tempMet['width'])
		//GLog.write(tempImp['width']+"--"+tempMet['width']+"max is "+maxWidth)
		if(maxWidth < 200){maxWidth = 200;}
		
		MAP.imp = buildTable(co2Lb,"lbs",distMiles,"miles",maxWidth,tempImp['images'])
		MAP.met = buildTable(co2Kg,"kgs",distKM,"kms",maxWidth,tempMet['images'])
		
		MAP.pLine = new GPolyline(fPoints,'#CCC',5,0.7);
		MAP.addOverlay(MAP.pLine,"pline");


 		MAP.infoBox = new ELabel(MAP.imp,MAP.getCenter(),"info",-maxWidth/2,75);
		MAP.addOverlay(MAP.infoBox,"infoBox");
	}
}
function units(changeU){
	MAP.infoBox.setContents(changeU)
}

function deHome(airport){
	MAP.removeOverlay(airport.label,"l"+airport.code);
	redraw(airport,MOUSE._click);
}

function redraw(airport,mouseState){
	if(mouseState == MOUSE._0 || mouseState == MOUSE._over){
		if(airport.curState <= MOUSE._over){
			if(mouseState == MOUSE._over){
				MAP.addOverlay(airport.label,"l"+airport.code);
				airport.label.setClass("labelClass"+mouseState);
			}
			else{
				if(!MAP.showAirportNames){
					MAP.removeOverlay(airport.label,"l"+airport.code);
				}
				else{
					airport.label.setClass("labelClass"+mouseState);
				}
			}
			airport.curState = mouseState;
			airport.marker.setImage("../i/maps/air"+mouseState+".png");
		}
	}
	else{
		airport.marker.setImage("../i/maps/air"+mouseState+".png");
		MAP.addOverlay(airport.label,"l"+airport.code);
		airport.label.setClass("labelClass"+mouseState);
		airport.curState = mouseState;
	}
}

function addE_M(airport) {
	GEvent.addListener(airport.marker,"click", function(){
		if(airport.curState == MOUSE._over){
			redraw(airport,MOUSE._click)
			justTwo(airport);
			getCO2();
		}
		else if(airport.curState == MOUSE._click){
			if(MAP.homeAirport){deHome(MAP.homeAirport);}
			MAP.homeAirport = airport;
			redraw(airport,MOUSE._dblclick);
			justTwo(airport);
			getCO2();
		}
		else if(airport.curState == MOUSE._dblclick){
			deHome(airport);
			MAP.homeAirport = null;
			redraw(airport,MOUSE._click);
			MAP.selectedAirport0 = MAP.selectedAirport1;
			MAP.selectedAirport0 = airport;
getCO2();
		}
	});
	GEvent.addListener(airport.marker, "mouseover", function(){
		redraw(airport,MOUSE._over)
	});
	GEvent.addListener(airport.marker, "mouseout", function(){
		redraw(airport,MOUSE._0)
	});
	return airport.marker;
}

function buildIcon(image,w,h){
	var icon = new GIcon();
	var midPt =	new GPoint(w/2, h/2);
	icon.image = image;
	icon.iconSize = new GSize(w, h);
	icon.iconAnchor = midPt;
	icon.infoWindowAnchor = midPt;
	icon.infoShadowAnchor = midPt;
	return icon;
}

function showNames(bool){
	MAP.showAirportNames = bool;
	if(bool){
		for(i in AIRPORTS){
			MAP.addOverlay(AIRPORTS[i].label,"l"+AIRPORTS[i].code);
		}
	}
	else{
		for(i in AIRPORTS){
			if(!AIRPORTS[i].curState){
				MAP.removeOverlay(AIRPORTS[i].label,"l"+AIRPORTS[i].code);
			}
		}
	}
}
function returnFlights(bool){
	(bool)?MAP.passFlightType=2:MAP.passFlightType=1;
	getCO2();
}
function changePassengers(sel){
	MAP.passengers = parseInt(d.control.passengers.options[d.control.passengers.selectedIndex].value)
	getCO2();
}
function preloadIms(){
	k=0;
	im = {};
	for(i=0;i<WEIGHTS.length;i++){
		im[k] = new Image();
		im[k].src = "..i/maps/"+WEIGHTS[i]+".gif";
		k++;
	}
	for(j=0;j<4;j++){
		im[k] = new Image();
		im[k].src = "..i/maps/air"+j+".png";
		k++;
	}
}
function Gload(){
	//preloadIms();
	if (GBrowserIsCompatible()) {
		MAP = new GMap2(d.getElementById("mapDivID"));

    MAP.addControl(new GLargeMapControl());
    MAP.addControl(new GMapTypeControl());
		MAP._overlays = new Array();
		MAP.showAirportNames = (d.control.shownames.checked == true)?1:0;
		MAP.passFlightType = (d.control.returnflight.checked == true)?2:1;
		MAP.passengers = parseInt(d.control.passengers.options[d.control.passengers.selectedIndex].value)
		MAP.homeAirport = null;
		MAP.defaultCenter = new GLatLng(defaultLat, defaultLon);
		MAP.setCenter(MAP.defaultCenter, defaultZoom, G_SATELLITE_MAP);
		MAP.defaultIcon = buildIcon("../i/maps/air0.png",12,13);
		MAP.zoomed =0;
		loadData(true);

		GEvent.addListener(MAP, 'moveend', function(){ 
			if(MAP.zoomed){
				MAP.zoomed = 0;
			}
			else{
				loadData();
			}
    });
		GEvent.addListener(MAP, 'zoomend', function(oldLevel, newLevel){
			MAP.zoomed =1;
			if(oldLevel>newLevel){
				loadData();
			}
		});

	}
	else{
		d.getElementById("mapDivID").innerHTML = "<P>Browser isn't compatible to view this map.</P>";
	}
}