//<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false&amp;key=ABQIAAAAtLJmBB0PxXRJ96hwdIW_PRR18vZJ2ILpf-F2enrwIYE3rd86ChRlDpJ2NoRa68bGxmDtCXk8El_wvg" type="text/javascript"></script>
//local: <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false&amp;key=ABQIAAAAtLJmBB0PxXRJ96hwdIW_PRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQ-rVhDL1adRvkypmROQm1rBY2ioQ" type="text/javascript"></script>

var periodicalUpdater;
var map;
var aircrafts = new Array();
var detailAircraft = null;

var statusText = new Array();
statusText[0] = 'Notruf';
statusText[1] = 'Einsatzbereit, unterwegs';
statusText[2] = 'Einsatzbereit, am Stützpunkt';
statusText[3] = 'Unterwegs zum Einsatzort';
statusText[4] = 'Einsatzort erreicht';
statusText[5] = 'Sprechwunsch';
statusText[6] = 'Nicht einsatzbereit';
statusText[7] = 'Unterwegs mit Patient';
statusText[8] = 'Zielklinik erreicht';
statusText[9] = 'Verlasse Funkverkehrsbereich';


function Aircraft(id)
{
    this.id = id;
    this.icaroId = 0;
    this.aircraftClass = 0;
    this.callsign = "";
    this.addinfo = "";
    this.lastName = "";
    this.firstName = "";
    this.latitude = 0;
    this.longitude = 0;
    this.lastLatitude = 0;
    this.lastLongitude = 0;
    this.bearing = 0;
    this.altitude = 0;
    this.groundSpeed = 0;
    this.fmsStatus = 0;
    this.marker = null;
    this.label = null;
    this.destinationMarker = null;
    this.destinationLabel = null;
    this.destinationAddress = '';
    this.aircraftType = '';
    this.aircraftTypeName = '';
    this.assignmentId = -1;
    this.assignmentCity = '';
    this.assignmentStreet = '';
    this.assignmentInfo = '';
    this.assignmentPatient = '';
    this.assignmentIndicationGroup = '';
    this.assignmentIndicationItem = '';
    this.assignmentType = '';
    this.assignmentDestination = '';
    this.lastUpdate = new Date();
}

//CLASS LabelOverlay extends GOverlay
//(http://www.google.com/apis/maps/documentation/overlays.html#Custom_Overlays)
function LabelOverlay(point, label)
{
  this.point = point;
  this.label = label;
}
function initializeLabelOverlay()
{
  LabelOverlay.prototype = new GOverlay();
  LabelOverlay.prototype.initialize = function(map)
  {
    //create label div
    this.div = document.createElement('div');
    this.div.style.display = 'none';  //don't show the label before positioning in method redraw()
    this.div.style.position = 'absolute';
    this.div.style.backgroundColor = 'white';
    //this.div.style.backgroundImage = 'url(/images/white_transparent.png)';
    this.div.style.color = 'red';
    this.div.style.fontFamily = 'Verdana, Arial';
    this.div.style.fontSize = '8pt';
    this.div.style.fontWeight = 'bold';
    this.div.style.whiteSpace = 'nowrap'; //no line-breaks in label
    this.div.innerHTML = this.label;
    map.getPane(G_MAP_MARKER_PANE).appendChild(this.div); //add label to Google map
  };

  LabelOverlay.prototype.remove = function()
  {  
    this.div.parentNode.removeChild(this.div);
  };

  LabelOverlay.prototype.copy = function()
  {
    return new LabelOverlay(this.point, this.label);
  };

  LabelOverlay.prototype.redraw = function(force)
  {
    var p = map.fromLatLngToDivPixel(this.point);
    this.div.style.left = p.x + 24 + 'px';  
    this.div.style.top = p.y - 15 + 'px';
    this.div.style.display = 'block';  //make the label visible after positioning
  };
}

function resize()
{
	if (window.innerHeight)
	{
	    $('map_canvas').style.height = (window.innerHeight) + 'px';
	    $('map_canvas').style.width = (window.innerWidth) + 'px';
	}
	else
	{
	    $('map_canvas').style.height = (document.documentElement.clientHeight) + 'px'; 
	    $('map_canvas').style.width = (document.documentElement.clientWidth) + 'px';
	}
}

function initialize()
{
	resize();

	if (GBrowserIsCompatible())
	{
	    map = new GMap2(document.getElementById("map_canvas"));
	    map.addControl(new GLargeMapControl());
	    map.addControl(new GScaleControl());
	    map.addControl(new GMapTypeControl());
	
	    map.enableScrollWheelZoom();
	    
	    
	    map.setCenter(new GLatLng(40, 8), 3);
	
	    initializeLabelOverlay();
	
	    var aircraftIcon = new GIcon();
	    aircraftIcon.image = 'aircraft_red.png';
	    aircraftIcon.iconSize = new GSize(30, 31);
	    aircraftIcon.iconAnchor = new GPoint(15, 15);
	          
	    periodicalUpdater = new PeriodicalExecuter(updatePositions, 3);
	    
	    updatePositions();
	}
}

function updateAircraftData(aircraft, data)
{
	  aircraft.latitude = data['Latitude'];
	  aircraft.longitude = data['Longitude'];
	  aircraft.lastUpdate = new Date();
	  aircraft.altitude = data['Altitude'];
	  aircraft.groundSpeed = data['GroundSpeed'];
	  aircraft.aircraftClass = data['AircraftClass'];
	  
	  aircraft.bearing = Math.round(data['TrueHeading']);
	  
	  aircraft.fmsStatus = data['FmsStatus'];
	  
	  if (aircraft.id.startsWith('1'))
	  {
		  var altitude = Math.round(aircraft.altitude / 100.0).toString();
		  var groundSpeed = Math.round(aircraft.groundSpeed).toString();
		  
		  if (altitude.length == 1)
		  {
			  altitude = "00" + altitude;
		  }
		  else if (altitude.length == 2)
		  {
			  altitude = "0" + altitude;
		  }
		  
		  if (groundSpeed.length == 1)
		  {
			  groundSpeed = "00" + groundSpeed;
		  }
		  else if (groundSpeed.length == 2)
		  {
			  groundSpeed = "0" + groundSpeed;
		  }
		  
		  aircraft.addinfo = altitude + '  ' + groundSpeed;
	  }
}

function isFms(aircraft)
{
	if (aircraft.id.startsWith('2'))
	{
		return true;
	}
	else
	{
		return false;
	}
}

function updateAircraftMarker(aircraft)
{
	  var bearingString = aircraft.bearing.toString();

	  if (bearingString.length == 1)
	  {
		  bearingString = "00" + bearingString;
	  }
	  else if (bearingString.length == 2)
	  {
		  bearingString = "0" + bearingString;
	  }
	  
	  
      var aircraftIcon = new GIcon();
	  if (aircraft.aircraftClass == 1)
	  {
          aircraftIcon.image = 'images/heli_black/heli_black_' + bearingString + '.png';
          aircraftIcon.iconSize = new GSize(48, 48);
          aircraftIcon.iconAnchor = new GPoint(24, 24);
	  }
	  else
	  {
          aircraftIcon.image = 'images/plane_black/plane_black_' + bearingString + '.png';
          aircraftIcon.iconSize = new GSize(36, 36);
          aircraftIcon.iconAnchor = new GPoint(18, 18);
	  }
      
      var point = new GLatLng(aircraft.latitude, aircraft.longitude);
      aircraft.marker = new GMarker(point, aircraftIcon);
      GEvent.addListener(aircraft.marker, "click", function() {  openCloseAircraftInfoBox(aircraft.id); });
      
      if (isFms(aircraft))
      {
	      var fmsIcon = $('aircraftListFmsSymbol-' + aircraft.id);
	      if (fmsIcon != null)
	      {
	    	  fmsIcon.src = 'images/status-'+aircraft.fmsStatus+'.png';
	      }
	      
	      if (detailAircraft == aircraft)
	      {
	    	  $('aircraftInfoStatusSymbol').src = 'images/status-'+detailAircraft.fmsStatus+'.png';
	    	  $('aircraftInfoStatusText').innerHTML = statusText[detailAircraft.fmsStatus];
	      }
	      showUpdateFmsDestination(aircraft);
      }
      
      var aircraftIcon = $('aircraftListSymbol-' + aircraft.id);
      if (aircraftIcon != null)
      {
    	  aircraftIcon.src = 'images/status-'+aircraft.fmsStatus+'.png';
    	  
      	if (aircraft.aircraftClass == 1)
    	{
      		aircraftIcon.src = 'images/heli_black_045.png';
    	}
    	else
    	{
    		aircraftIcon.src = 'images/plane_black_045.png';
    	}
      }
}


function createAircraftList()
{
	$('aircraftList').innerHTML = '';
	//$('aircraftList').insert( { top: '<p>'+aircrafts[j].latitude+'</p>' } );
	
    var j = 0;
    while (j < aircrafts.length)
    {
    	var image;
    	if (aircrafts[j].aircraftClass == 1)
    	{
    		image = '<img class="aircraftListSymbol" id="aircraftListSymbol-'+aircrafts[j].id+'" src="images/heli_black_045.png" onclick="openCloseAircraftInfoBox(\'' + aircrafts[j].id + '\'); event.cancelBubble=true;"></img>';
    	}
    	else
    	{
    		image = '<img class="aircraftListSymbol" id="aircraftListSymbol-'+aircrafts[j].id+'" src="images/plane_black_045.png" onclick="openCloseAircraftInfoBox(\'' + aircrafts[j].id + '\'); event.cancelBubble=true;"></img>';
    	}
    	
    	var imageFms = '';
    	if (isFms(aircrafts[j]))
    	{
    		imageFms = '<img class="aircraftListFmsSymbol" id="aircraftListFmsSymbol-'+aircrafts[j].id+'" src="images/status-'+aircrafts[j].fmsStatus+'.png" width="48" height="48"></img>';
    	}
    	
    	var text = '<div><span class="aircraftListItemCallsign">'+aircrafts[j].callsign+'</span><br/><span class="aircraftListItemName">'+ aircrafts[j].firstName + ' ' + aircrafts[j].lastName + '</span></div>';

    	
    	var item = '<div class="aircraftListItem" onmouseover="this.style.backgroundColor=\'#FFF2CC\';" onmouseout="this.style.backgroundColor=\'#FFFFFF\';" onclick="zoomTo(\'' + aircrafts[j].id + '\')">' + image + text + imageFms + '</div>';
    	$('aircraftList').insert( { top: item } );
    	j++;
    }
}

function zoomTo(aircraftId)
{
    var j = 0;
    while (j < aircrafts.length)
    {
    	if (aircraftId == aircrafts[j].id)
	    {
	    	break;
	    }
      j++;
    }
    
    if (j < aircrafts.length)
    {
    	map.setCenter(new GLatLng(aircrafts[j].latitude, aircrafts[j].longitude), 13);
    }
}

function openCloseAircraftInfoBox(aircraftId)
{
    var j = 0;
    while (j < aircrafts.length)
    {
    	if (aircraftId == aircrafts[j].id)
	    {
	    	break;
	    }
      j++;
    }
    
    if (j < aircrafts.length)
    {
    	if (detailAircraft == aircrafts[j])
    	{
    		closeAircraftInfoBox();
    	}
    	else
    	{
    		createAircraftInfoBox(aircrafts[j]);
    		updateAircraftInfoBox();
    	}
    }
}

function showFmsDestinationAddress(aircraft)
{
	aircraft.destinationMarker.openInfoWindowHtml('<b>Einsatzort ' + aircraft.callsign + "</b><br/>" + aircraft.assignmentStreet+ "<br/>" + aircraft.assignmentCity);
}

function showUpdateFmsDestination(aircraft)
{
	var newDestAddress = aircraft.assignmentStreet + ', ' + aircraft.assignmentCity;
	if (aircraft.assignmentId > 0 && aircraft == detailAircraft)
	{
		if (aircraft.destinationAddress != newDestAddress)
		{
			aircraft.destinationAddress = newDestAddress;
			var geocoder = new GClientGeocoder();
	
			geocoder.getLatLng(
				aircraft.assignmentStreet + ', ' + aircraft.assignmentCity,
			    function(point)
			    {
					if (!point)
					{
						//alert("Einsatzort nicht gefunden");
					}
					else
					{
						//map.setCenter(point, 13);
						if (aircraft.destinationMarker != null)
						{
							map.removeOverlay(aircraft.destinationMarker);
							aircraft.destinationMarker = null;
						}
						aircraft.destinationMarker = new GMarker(point);
						map.addOverlay(aircraft.destinationMarker);
						GEvent.addListener(aircraft.destinationMarker, "click", function() {  showFmsDestinationAddress(aircraft); });
					}
			    }
			);
		}
	}
	else
	{
		if (aircraft.destinationMarker != null)
		{
			map.removeOverlay(aircraft.destinationMarker);
			aircraft.destinationMarker = null;
			aircraft.destinationAddress = '';
		}
	}
}

function closeAircraftInfoBox()
{
	detailAircraft = null;
	$('aircraftInfo').innerHTML = '';
	$('aircraftInfo').hide();
}

function createAircraftInfoBox(aircraft)
{
	detailAircraft = aircraft;
	
	//updateDetailedData(detailAircraft);
	
	$('aircraftInfo').innerHTML = '';
	
	var title = '<div class="aircraftInfoCallsign" onclick="closeAircraftInfoBox()">' + aircraft.callsign + '</div>';
	
	var userTable = '<table width="100%" class="aircraftInfoDataTable">'+
	'<tr><td width="30%">ICARO ID:</td><td width="70%">' + aircraft.icaroId + '</td></tr>'+
	'<tr><td width="30%">Name:</td><td width="70%">' + aircraft.firstName + ' ' + aircraft.lastName + '</td></tr>'+
	'</table>';
	
	var aircraftTable = '';
	if (aircraft.aircraftType.length > 0)
	{
		aircraftTable = '<div class="aircraftInfoSection">Fluggerät</div>'+
		'<img src="images/aircraft/'+ aircraft.aircraftType +'.png" class="aircraftInfoImage"></img>';
		
		/*aircraftTable = '<div class="aircraftInfoSection">Fluggerät</div>'+
		'<img src="images/aircraft/'+ aircraft.aircraftType +'.png" class="aircraftInfoImage"></img><br/>'+
		'<table width="100%" class="aircraftInfoDataTable">'+
		'<tr><td width="30%">Typ:</td><td width="70%">'+ aircraft.aircraftTypeName +'</td></tr>'+
		'</table>';*/
	}
	
	var flightDataTable = '<div class="aircraftInfoSection">Flugdaten</div>'+
	'<table width="100%" class="aircraftInfoDataTable">'+
	'<tr><td width="30%">Höhe:</td><td width="70%">'+Math.round(aircraft.altitude)+' ft</td></tr>'+
	'<tr><td width="30%">GS:</td><td width="70%">'+Math.round(aircraft.groundSpeed)+' kt</td></tr>'+
	'</table>';
	
	var assignmentTable = '';
	
	if (aircraft.assignmentId > 0)
	{
		assignmentTable = '<tr><td width="30%" valign="top">Ort:</td><td width="70%">'+aircraft.assignmentCity+'</td></tr>'+
		'<tr><td width="30%" valign="top">Strasse:</td><td width="70%">'+aircraft.assignmentStreet+'</td></tr>'+
		'<tr><td width="30%" valign="top">Info:</td><td width="70%">'+aircraft.assignmentInfo+'</td></tr>'+
		'<tr><td width="30%" valign="top">Patient:</td><td width="70%">'+aircraft.assignmentPatient+'</td></tr>'+
		'<tr><td width="30%" valign="top">Typ:</td><td width="70%">'+aircraft.assignmentType+'</td></tr>'+
		'<tr><td width="30%" valign="top">Indikation:</td><td width="70%">'+aircraft.assignmentIndicationGroup+'<br/>'+aircraft.assignmentIndicationItem+'</td></tr>'+
		'<tr><td width="30%" valign="top">Ziel:</td><td width="70%">'+aircraft.assignmentDestination+'</td></tr>';
	}
	else
	{
		//assignmentTable = '<tr><td colspan=2>Nicht im Einsatz</td></tr>';
	}
	//onclick="showLocation(\''+aircraft.id+'\')" 
	var fmsTable = '<div class="aircraftInfoSection">Einsatzdaten</div>'+
	'<table width="100%" class="aircraftInfoDataTable">'+
	'<tr><td width="30%"><img id="aircraftInfoStatusSymbol" src="images/status-'+aircraft.fmsStatus+'.png"/></td><td width="70%" id="aircraftInfoStatusText">'+statusText[aircraft.fmsStatus]+'</td></tr>'
	+assignmentTable+'</table>';
	
	//var item = title + userTable + aircraftTable + flightDataTable + fmsTable;
	var item = title + userTable + aircraftTable;
	if (isFms(aircraft))
	{
		if (aircraft.altitude == -1 && aircraft.groundSpeed == -1)
		{
			item += fmsTable;
		}
		else
		{
			item += flightDataTable + fmsTable;
		}
	}
	else
	{
		item += flightDataTable;
	}
	
	$('aircraftInfo').insert( { top: item } );
	
	$('aircraftInfo').show();
}

function updateAircraftInfoBox()
{
	updateDetailedData(detailAircraft);
	//createAircraftInfoBox(detailAircraft);
	//$('aircraftInfoStatusSymbol').src = 'images/status-'+detailAircraft.fmsStatus+'.png';
}

function updateDetailedData(aircraft)
{
	var timestamp = new Date().getTime();
	var ajaxRequest =
		new Ajax.Request("proxy_details.php?id="+aircraft.id+"&t=" + timestamp,
		{
			method: 'get',
		    onSuccess: function(transport)
		    {
				var result = transport.responseText.evalJSON();
				
				aircraft.assignmentId = result['AssignmentId'];
				aircraft.aircraftType = result['AircraftType'];
				aircraft.aircraftTypeName = result['AircraftTypeName'];
				
				aircraft.assignmentCity = result['AssignmentCity'];
				aircraft.assignmentStreet = result['AssignmentStreet'];
				aircraft.assignmentInfo = result['AssignmentInfo'];
				aircraft.assignmentPatient = result['AssignmentPatient'];
				aircraft.assignmentIndicationGroup = result['AssignmentIndicationGroup'];
				aircraft.assignmentIndicationItem = result['AssignmentIndicationItem'];
				aircraft.assignmentType = result['AssignmentType'];
				aircraft.assignmentDestination = result['AssignmentDestination'];
				
				createAircraftInfoBox(aircraft);
		    }
		}
	);
}

function updatePositions()
{
	var timestamp = new Date().getTime();
	var ajaxRequest =
		  new Ajax.Request("proxy.php?t=" + timestamp, {
		    method: 'get',
		    onSuccess: function(transport)
		    {
			  var result = transport.responseText.evalJSON();

			  for(var i = 0; i < result.length; i++)
		      {

    		      // does this aircrat already exist?
    		      var j = 0;
			      while (j < aircrafts.length)
			      {
			      	if (result[i]['Id'] == aircrafts[j].id)
    			    {
    			    	break;
    			    }
			        j++;
			      }

			      if (j == aircrafts.length) 
			          {
			    	  var aircraft = new Aircraft();
			    	  aircraft.id = result[i]['Id'];
			    	  aircraft.icaroId = result[i]['IcaroId'];
			    	  aircraft.aircraftClass = result[i]['AircraftClass'];
			    	  aircraft.callsign = result[i]['Callsign'];
			    	  aircraft.lastName = result[i]['LastName'];
			    	  aircraft.firstName = result[i]['FirstName'];

			    	  updateAircraftData(aircraft, result[i]);

			    	  updateAircraftMarker(aircraft);
			    	  
			    	  aircrafts[aircrafts.length] = aircraft;

			          map.addOverlay(aircraft.marker);

			          var labeltext = aircraft.callsign;
			          if (aircraft.addinfo.length > 0)
			          {
			        	  labeltext = labeltext + '<br/>' + aircraft.addinfo;
			          }
			          aircraft.label = new LabelOverlay(new GLatLng(aircraft.latitude, aircraft.longitude), labeltext);
			  		  map.addOverlay(aircraft.label);
					  
			  		  createAircraftList();

			          }
			      else
			      {
			    	  updateAircraftData(aircrafts[j], result[i]);
			    	 
			    	  map.removeOverlay(aircrafts[j].marker);
			    	  updateAircraftMarker(aircrafts[j]);
			          map.addOverlay(aircrafts[j].marker);

			          var labeltext = aircrafts[j].callsign;
			          if (aircrafts[j].addinfo.length > 0)
			          {
			        	  labeltext = labeltext + '<br/>' + aircrafts[j].addinfo;
			          }
			          
			    	  //aircrafts[j].marker.setPoint(new GLatLng(aircrafts[j].latitude, aircrafts[j].longitude));
			    	  map.removeOverlay(aircrafts[j].label);
			    	  aircrafts[j].label = new LabelOverlay(new GLatLng(aircrafts[j].latitude, aircrafts[j].longitude), labeltext);
			    	  map.addOverlay(aircrafts[j].label);
			      }
		      }
			  
		    }
		  }
		  );

	var nowDate = new Date();
	for(var j = 0; j < aircrafts.length; j++)
	{
		if (nowDate.getTime() - aircrafts[j].lastUpdate.getTime() > 10000)
		{
			if (aircrafts[j] == detailAircraft)
			{
				detailAircraft = null;
				$('aircraftInfo').innerHTML = '';
				$('aircraftInfo').hide();
			}
			map.removeOverlay(aircrafts[j].marker);
			map.removeOverlay(aircrafts[j].label);
			
			if (aircrafts[j].destinationMarker != null)
			{
				map.removeOverlay(aircrafts[j].destinationMarker);
			}
			
			aircrafts.splice(j--, 1);
			createAircraftList();
		}
	}
	
	if (detailAircraft != null)
	{
		updateAircraftInfoBox();
	}
}