var map;
var markers = [];
var aptlist = Array();
var activeMarker;
var polyline = null;
var pMarkers = [];

var base_icon;
var dep_icon;
var arr_icon;

var w_fronts;
var w_radar;

$(document).ready(function() 
{
	var map_element = document.getElementById("mapContainer");
	if(map_element !== null)
	{
		map_init(map_element);
	}
});


function map_init(map_element)
{
	map = new GMap2(map_element);
	
    map.addControl(new GSmallMapControl());
    map.addControl(new GScaleControl());
    map.setCenter(new GLatLng(32.263601, -9.195557), 2);
	map.setMapType(G_PHYSICAL_MAP);
	initControls(); 
	    
    base_icon = new GIcon();
	base_icon.iconSize=new GSize(32,32);
	base_icon.shadowSize=new GSize(56,32);
	base_icon.iconAnchor=new GPoint(16,32);
	base_icon.infoWindowAnchor=new GPoint(16,0);
	
	plane_icon = new GIcon(base_icon, "http://maps.google.com/mapfiles/kml/pal2/icon56.png", null, "");
	dep_icon = new GIcon(base_icon, "/assets/images/towerdeparture.png", null, "");
	dep_icon.iconSize = new GSize(35, 35);
    arr_icon = new GIcon(base_icon, "/assets/images/towerarrival.png", null, "");
    arr_icon.iconSize = new GSize(35, 35); 
       	
	load_data();
};

function load_data()
{
	clear_map();
    var centerlat = 0; var centerlng = 0;
    
	$("#acars_table").html("<img align=\"center\""
		+" src=\"/assets/images/loading.gif\" alt=\"Loading\" />");
	
	$.ajax({
		type: "GET",
		url: "/livemap/latestflights",
		success: function (data) { processList(data); },
		error: function (x, s, t) { /*console.log(s); console.log(t);*/ },
		dataType: "json"
	});

}

function processList(data)
{
	var centerdata = Array();
	      
	$("#acars_table").html("");
	for(var i=0; i<data.length; i++)
	{			
		var point = new GLatLng(data[i].Acarsdatum.lat, data[i].Acarsdatum.lng);
				
		// Add information about that marker, associate acars info with it
		var statusIcon= new GIcon(G_DEFAULT_ICON);
		statusIcon.image = "/img/inair/"+data[i].Acarsdatum.heading+".png";
		statusIcon.iconSize = new GSize(36,36);
		
		tmp = createMarker(point, statusIcon);
		tmp.acarsdata = data[i].Acarsdatum;
		
		pMarkers.push(tmp);
		map.addOverlay(tmp);
		
		// Append to table		
		if(parseInt(data[i].Airline.logo) == 1) {
			image = "/assets/airlines/"+data[i].Airline.slug+"/logo_small.jpg";
		}
		else {
			image = "/assets/airlines/no_logo.png";
		}
		
		var depicao = data[i].Acarsdatum.depicao;
		var arricao = data[i].Acarsdatum.arricao;
		
		// Cleanup
		if(data[i].Acarsdatum.pilotname == "")
			pilotname = "-";
		else
			pilotname = data[i].Acarsdatum.pilotname;
		
		if(data[i].Acarsdatum.phase == "")
		{
			data[i].Acarsdatum.phase = 'Enroute';
		}
		
		if(data[i].Acarsdatum.phase == "Arrived")
		{
			data[i].Acarsdatum.distremain = '-';
			data[i].Acarsdatum.timeelapsed = '-';
			data[i].Acarsdatum.timeremaining = '-';
		}
		else
		{
			data[i].Acarsdatum.distremain += " mi";
		}
		
		var table = "<tr align=\"center\" class=\"markerlabel map_"+tmp.dp+" acarsmap_table \">"
			+ "<td nowrap><a href=\"/airline/"+data[i].Airline.slug+"\"><img src=\""+image+"\" /></a></td>"
			+ "<td nowrap align=\"left\" style=\"font-size: 12px\"><a href=\"#\" onClick=\"return triggerInfoBubble(" + i + "); return false;\">"
					+data[i].Acarsdatum.flightnum+"</a></td>"
			+ "<td align=\"left\">"+data[i].Acarsdatum.pilot_id+" "+pilotname+"</td>"
			+ "<td align=\"left\">" +data[i].Acarsdatum.depicao + " - " + data[i].Acarsdatum.arricao+"</td>"
			+ "<td>"+data[i].Acarsdatum.alt+"' </td>"
			+ "<td>"+data[i].Acarsdatum.heading+"</td>"
			+ "<td>"+data[i].Acarsdatum.gs+"</td>"
			+ "<td align=\"center\">"+data[i].Acarsdatum.phase+"</td>"
			+ "<td>"+data[i].Acarsdatum.timeelapsed;
				
		// Only add time remaining if it's available
		if(data[i].Acarsdatum.timeremaining != "")
			remain = data[i].Acarsdatum.timeremaining;
		else
			remain = "?";
			
		table = table +  " / " + remain;
		
		table = table +"</td>"
			+ "<td>"+data[i].Acarsdatum.distremain+"</td>"
			+ "</tr>";
		 
		$("#acars_table").append(table);
		
		$("#acars_table tr.markerlabel:even").addClass("o");

		// Save the airports in our list
		aptlist[depicao] = {lat: data[i].DepApt.lat, lng: data[i].DepApt.lng};
		aptlist[arricao] = {lat: data[i].ArrApt.lat, lng: data[i].ArrApt.lng};
	}
}

function createMarker(point, marker_icon)
{	
	markerOptions = { icon: marker_icon };
	var marker = new GMarker(point, markerOptions);
	
	// If a marker is clicked 
	GEvent.addListener(marker, "click", function()
	{ 			
		var htmlText = "<b>"+ marker.acarsdata.pilotname+"</b> - "
					 + "<i>" + marker.acarsdata.depicao + " to " + marker.acarsdata.arricao + "</i>";
			 
		marker.openInfoWindowHtml(htmlText);
		
		// Highlight it
		$("#acars_table tr").removeClass("highlight");
		row_id = "#acars_table .map_"+marker.dp;
		$(row_id).addClass("highlight");		
		
		// Do stuff when we clicky it
		drawPolyline(point, marker.acarsdata.depicao, marker.acarsdata.arricao);
	});
			
	return marker;
};

function drawPolyline(activePoint, depicao, arricao)
{
	clear_flight_details();
	
	var point=null;

	// Polyline options
	if(polyline !== null)
		map.removeOverlay(polyline);
	
	
	polyline = new GPolyline([new GLatLng(aptlist[depicao].lat, aptlist[depicao].lng),
							  new GLatLng(aptlist[arricao].lat, aptlist[arricao].lng)], 
							  "#ff0000", 3, 1, {geodesic:true});
	
	map.addOverlay(polyline); 

 	point = new GLatLng(aptlist[depicao].lat, aptlist[depicao].lng);
	aptmarkers[0]= createMarker(point, dep_icon);
	map.addOverlay(aptmarkers[0]);
	
	//GEvent.addListener(aptmarkers[0], 'click', 
	//	function(){ map.showMapBlowup(point); });
	
 	point = new GLatLng(aptlist[arricao].lat, aptlist[arricao].lng);
	aptmarkers[1]= createMarker(point, arr_icon);
	map.addOverlay(aptmarkers[1]);
	
	//GEvent.addListener(aptmarkers[1], 'click', 
	//	function(){ map.showMapBlowup(point); });
		
};


function triggerInfoBubble(id)
{
	GEvent.trigger(map.tl[id], 'click');
	map.panTo(map.tl[id].ea);
	return false;
};

function clear_map()
{
	GEvent.clearListeners(map, 'click');
	
	for(var i = 0; i < pMarkers.length; i++)
	{
		map.removeOverlay(pMarkers[i]);
	}
	
	pMarkers.length = 0;
};

function clear_flight_details()
{
	console.log(aptmarkers.length);
	if(aptmarkers.length > 0) 
	{
		map.removeOverlay(polyline);
		for(var i = 0; i < aptmarkers.length; i++) {
			map.removeOverlay(aptmarkers[i]);
		}
	}
	
	aptmarkers.length = 0;
};


function initControls() {
	function CustomControls() {
	}
	CustomControls.prototype = new GControl();

	CustomControls.prototype.initialize = function(map) {
		var container = document.createElement("div");

		// FRONTS BUTTON --------------
		var fronts_div = document.createElement("div");
		this.setButtonStyle_(fronts_div);
		container.appendChild(fronts_div);
		fronts_text = fronts_div.appendChild(document.createTextNode("Fronts"));
		GEvent.addDomListener(fronts_div, "click", function() 
		{
			if(w_fronts == null)
			{
				w_fronts = new GGeoXml("http://www.srh.noaa.gov/gis/kml/cod/susLink.kml");
				map.addOverlay(w_fronts);
			}
			else
			{
				map.removeOverlay(w_fronts);
				w_fronts = null;
			}
		});
		
		
		// WEATHER BUTTON ------------
		var weather_div = document.createElement("div");
		this.setButtonStyle_(weather_div);
		container.appendChild(weather_div);
		weather_div.appendChild(document.createTextNode("Weather"));
		GEvent.addDomListener(weather_div, "click", function() 
		{
			if(w_radar == null)
			{
				w_radar = new GGeoXml("http://bbs.keyhole.com/ubb/download.php?Number=42735");
				map.addOverlay(w_radar);
			}
			else
			{
				map.removeOverlay(w_radar);
				w_radar = null;
			}
		});
	  
		map.getContainer().appendChild(container);
		return container;

	};

	CustomControls.prototype.getDefaultPosition = function() {
	  return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 7));
	}

	// Sets the proper CSS for the given button element.
	CustomControls.prototype.setButtonStyle_ = function(button) {
	  button.style.textDecoration = "underline";
	  button.style.color = "#0000cc";
	  button.style.backgroundColor = "white";
	  button.style.font = "x-small Arial";
	  button.style.border = "1px solid black";
	  button.style.padding = "2px";
	  button.style.marginBottom = "3px";
	  button.style.textAlign = "center";
	  button.style.width = "6em";
	  button.style.cursor = "pointer";
	}


	map.addControl(new CustomControls());
}
