var g_map;
var g_mapType;
var g_mapWidthPixels;
var g_mapHeightPixels;
var g_sessionId;
var g_language;
var g_pushpins;
var g_icons;
var g_polygonFillColorMoving = new VEColor(133,181,230,1.0);
var g_polygonFillColorMoored = new VEColor(250,181,122,1.0);
var g_polygonOutlineColor = new VEColor(0,0,0,1.0);
var g_timeLastReload;
var g_lastReloadTopLeft;
var g_lastReloadBottomRight;


// short names of Ship owners the should not be rendered MixedCase
var ABBREVS = new Array(
	 "CMA CGM","CMA-CGM","CMACGM","MOL","TK","UBC",
	 "MSC","APL","RMS","CSCL","MV","M/V","M.V.","BCL","RT",
	 "NYK","N.Y.K.","ECL","MF","YM","DT","WS","OOCL",
	 "BRO","MT","M/T","LS","EMS","STX","AB","BBC","BNS","BMS",
	 "HC","CSAV","COSCO","CEC","MS","JRS","IVS","COS",
	 "MT","OPDR","CCNI","UAL","HMS","HS","WMS","VOC","SKS",
	 "II", "III", "IV", "VI", "VII"); // roemische zahlen
	 
function zoomIn() {g_map.ZoomIn();}
function zoomOut() {g_map.ZoomOut();}
function satellite() {g_map.SetMapStyle(VEMapStyle.Aerial);}
function road() {g_map.SetMapStyle(VEMapStyle.Road);}
function hybrid() {g_map.SetMapStyle(VEMapStyle.Hybrid);}
	 
function encodeShipname(name)
{
	var rets = name.toLowerCase();
	for (var i=0; i<ABBREVS.length; i++) 
	{
		var abbrev = ABBREVS[i].toLowerCase() + " ";
		var idx = rets.indexOf(abbrev);
		if (idx>=0 && (idx==0 || rets.charAt(idx-1)==' '))
		{
			rets = rets.replace(abbrev,ABBREVS[i]+" ");
		}
	}
	var retb = "";
	var sp = rets.split(" ");
	
	for (var i=0; i<sp.length; i++) 
	{
		if (sp[i].length==0) continue;
		if(i>0) retb += " ";
		retb = retb 
			+ sp[i].charAt(0).toUpperCase()
		    + sp[i].substr(1);
	}
	return retb;
}

function receiveVesselList(data)
{	
	var markers = eval("("+data+")");
	addVesselPushpins(markers);
}



function encodeShipnameForUrl(name)
{
	var tokens = name.split(" ");
	var size = tokens.length;
	if(size>0)
		ret = tokens[0];
	for(i=1; i<size; i++)
	{
		ret += "-";
		ret += tokens[i];
	}
	return ret;
}	 


function reloaddata() 
{
	var now = new Date();
	var reload = false;
	
	// don't allow user to zoom out too far
	if(g_map.GetZoomLevel()<8) 
		g_map.SetZoomLevel(8);
	
	// reload if we did not reload before ...
	if(!g_timeLastReload)
		reload = true;
		
	// reload if last reload is more than 50 sec ago
	if((!reload) && ((now - g_timeLastReload)>50000)) 
		reload = true;
	
	// determine coordinates of the visible area
	var topLeft = g_map.PixelToLatLong(new VEPixel(0, 0));
	var bottomRight = g_map.PixelToLatLong(new VEPixel(g_mapWidthPixels-1,g_mapHeightPixels-1));
		
	// reload only if new visible area is not contained in old visible area
	if((!reload) && g_lastReloadTopLeft && g_lastReloadBottomRight)
	{
		if( ! ((g_lastReloadTopLeft.Latitude>=topLeft.Latitude) && 
			(g_lastReloadTopLeft.Longitude<=topLeft.Longitude) &&
			(g_lastReloadBottomRight.Latitude<=bottomRight.Latitude) &&
			(g_lastReloadBottomRight.Longitude>=bottomRight.Longitude)))
			reload = true;
	}
	
	// don't reload if last reload is less than 2 sec ago
	if(reload && g_timeLastReload && ((now-g_timeLastReload)<1500))
		reload = false;
	
	if(reload)
	{
		sendAjaxVesselsRequest(topLeft.Latitude, topLeft.Longitude, bottomRight.Latitude, bottomRight.Longitude);
		g_timeLastReload = now;
		g_lastReloadTopLeft = topLeft;
		g_lastReloadBottomRight = bottomRight;
	}
}


function GetMap(lat, long, zoom, type, sessionid, width, height, language)
{
	// make some variables global
	g_mapType = type;
	if(sessionid!="0")
		g_sessionId = sessionid;
	g_mapHeightPixels = height;
	g_mapWidthPixels = width;
	g_language = language;

	// prepare icons	
    g_icons = new Array(12);
    for(var i = 1; i < 10; i++) 
    {
		g_icons[i] = 'http://images.vesseltracker.com/images/googlemaps/icon'+i+'.png';
    }
    g_icons['moored'] = 'http://images.vesseltracker.com/images/googlemaps/icon_moored.png';
    g_icons['anchorage'] = g_icons[5];
    g_icons['waiting'] = 'http://images.vesseltracker.com/images/googlemaps/icon_waiting.png';

	// init map    
    g_map = new VEMap('myMap');
    g_map.LoadMap(new VELatLong(lat, long), zoom , VEMapStyle.Road, false);
    g_map.SetScaleBarDistanceUnit(VEDistanceUnit.Kilometers);
    g_map.HideDashboard();
    
    // start timer to reload every 60 secs
	var time = 2400000;
	if (type == "REALTIME")
	{ 
		time = 60000;
	}
	else if (type == "FREE_ACCOUNT")
	{ 
		time = 900000;
	}
    var aktiv = window.setInterval("reloaddata()",time);
    
    // reload whenever the user scrolls / zooms
    g_map.AttachEvent("onchangeview", reloaddata);

	// "re" load the vessel data for the first time    
	reloaddata();
}

function deg2rad(grad) {return  grad * Math.PI/180.0;}


function calcPoint(lon, lat, dx, dy, sin_angle, cos_angle)
{
	var dy_deg = -((dx*sin_angle + dy*cos_angle)/(1852.0))/60.0;
	var dx_deg = -(((dx*cos_angle - dy*sin_angle)/(1852.0))/60.0)/Math.cos(deg2rad(lat));
	return new VELatLong(lat-dy_deg,lon-dx_deg);
}


function createVesselPolygon(vessel)
{
	var angle_rad;
	if(!vessel.hdg || vessel.hdg==0.0)
	{
		angle_rad = deg2rad(-vessel.cog);
	}
	else
	{
		angle_rad = deg2rad(-vessel.hdg);
	}
	var cos_angle=Math.cos(angle_rad);
	var sin_angle=Math.sin(angle_rad);
	var shippoints = new Array();

	//front left
	var dx = -vessel.left;
	var dy = vessel.front-(vessel.len/10.0);	
    shippoints.push(calcPoint(vessel.lon,vessel.lat, dx, dy,sin_angle,cos_angle));
    
    //rear left
    dx = -vessel.left;
    dy = -(vessel.len-vessel.front);
	shippoints.push(calcPoint(vessel.lon,vessel.lat, dx,dy,sin_angle,cos_angle));
	
	//rear right
    dx =  vessel.wid - vessel.left;
    dy = -(vessel.len-vessel.front);
	shippoints.push(calcPoint(vessel.lon,vessel.lat, dx,dy,sin_angle,cos_angle));
	
	//front right
	dx = vessel.wid - vessel.left;
	dy = vessel.front-(vessel.len/10.0);
	shippoints.push(calcPoint(vessel.lon,vessel.lat,dx,dy,sin_angle,cos_angle));	
    
    //front center
	dx = vessel.wid/2.0-vessel.left;
	dy = vessel.front;
	shippoints.push(calcPoint(vessel.lon,vessel.lat,dx,dy,sin_angle,cos_angle));
	
	return shippoints;
}


function getVesselIcon(vessel)
{
	var icon;
	if (vessel.status == "MOORED")
	{
		icon = 'moored';
	}
	else if (vessel.status == "WAITING")
	{
		icon = 'waiting';
	}
	else if (vessel.status == "ANCHORAGE")
	{
		icon = 'anchorage';
	}
	else if (vessel.status == "MOVING")
	{
		var dir =0;
		if(vessel.cog)
			dir = vessel.cog;
		else if(vessel.hdg)
			dir = vessel.hdg;
		if( (dir<22.5) || (dir>=337.5) )
		{
			icon = 8;
		}
		else if(dir<67.5)
		{
			icon = 9;
		}
		else if(dir<112.5)
		{
			icon = 6;
		}
		else if(dir<157.5)
		{
			icon = 3;
		}
		else if(dir<202.5)
		{
			icon = 2;
		}
		else if(dir<247.5)
		{
			icon = 1;
		}
		else if(dir<292.5)
		{
			icon = 4;
		}
		else if(dir<337.5)
		{
			icon = 7;
		}
		else
		{
			icon = 5;
		}
	} 
	else
	{
		icon = 'waiting';
	}
	return g_icons[icon];
}


function addVesselPushpins(markers)
{
	var theShapeType = (g_map.GetZoomLevel()>14?VEShapeType.Polygon:VEShapeType.Pushpin);
	var sidebarHtml = "";
    
	g_map.DeleteAllShapes();
    
    for (var i=0;i<markers.length;i++)
    {
    	var points;
    	if(markers[i].left && markers[i].front && markers[i].len && markers[i].wid)
    	{
    		shapeType = theShapeType;
    	}
    	else
    	{
    		shapeType = VEShapeType.Pushpin;
    	}
    	if(shapeType==VEShapeType.Polygon)
    	{
    		points = createVesselPolygon(markers[i]);
    	}
    	else
    	{
    		points = new VELatLong(markers[i].lat, markers[i].lon);
    	}
		var pushpin = new VEShape(shapeType, points);



		// title			
		var title = "<a href=\"/"+g_language+"/Ships/"+encodeShipnameForUrl(markers[i].name);
		if(markers[i].imo)
		{
			title += "-"+markers[i].imo+".html";
		}
		else
		{
			title += "-I"+markers[i].id+".html";
		}
		if(g_sessionId)
		{
			title+=";jsessionid="+g_sessionId;
		}
		title +="\">"+markers[i].name+"</a>";
		pushpin.SetTitle(title);
		
		
		// description text		
		var text = createBalloonText(markers[i], g_mapType);
		pushpin.SetDescription(text);


		// polygon colors
		if(shapeType==VEShapeType.Polygon)
		{
		    pushpin.SetLineWidth(1);           
		    if (markers[i].status == "MOVING")
		    {
		        pushpin.SetFillColor(g_polygonFillColorMoving);
		    }               
		    else
		    {
		        pushpin.SetFillColor(g_polygonFillColorMoored);
		    }           
			pushpin.SetLineColor(g_polygonOutlineColor);               
		}    		
				
		// icon		
		var icon = getVesselIcon(markers[i]);
		pushpin.SetCustomIcon(icon);

		// add pushpin to map		
		g_map.AddShape(pushpin);
		
		// add reference to sidebar
		sidebarHtml += 
			"<small><a href='javascript:opener(\"" + pushpin.GetID() + "\")'>" + 
			encodeShipname(markers[i].name) + 
			"</a><br/></small>\n";
    }
    var elemSidebar = document.getElementById("sidebar");
    elemSidebar.innerHTML = sidebarHtml;
}


function opener(id)
{
	var shape = g_map.GetShapeByID(id);
	g_map.HideInfoBox();
	g_map.ShowInfoBox(shape);
}

function getNiceShipTypeName(shiptype)
{
	switch(shiptype)
	{
	  	case "cargo_ships": return "Cargo Ship"; break;			
		case "tankships": return "Tanker";break;			
		case "passenger_ships": return "Passenger Ship";break;			
		case "pleasure_crafts": return "Pleasure Craft";break;			
		case "tugboats": return "Tug Boat";break;			
		case "coast_guard_ships": return "Coast Guard";break;			
		case "dredgers": return "Dredger";break;			
		case "sailing_vessels": return "Sailing Vessel";break;			
		case "fishing_boats": return "Fishing Boat";break;			
		case "pilot_vessels": return "Pilot Vessel";break;			
		case "towing_vessels": return "Towing Vessel";break;			
		case "high-speed_crafts": return "High-Speed Craft";break;			
		case "rescue_vessels": return "Search and Rescue Vessel";break;			
		case "ekranoplans": return "Ekranoplan (Wing in Ground Craft)";break;			
		case "others": return "Unknown / Other type of ship";break;			
		case "anti-pollution_vessels": return "Anti-Pollution Vessel";break;			
	}
	return "Unknown Type of Ship";
}


function createBalloonText(ship, mode)
{
	var text = '<small>';
	text += '<b>'+ getNiceShipTypeName(ship.type) + '</b><br/>';
	
	if(ship.imo!=null){
		text += '<img src=\"http://www.vesseltracker.com/shipPhotoServlet?res=thumbnails&imo='+ship.imo+'\"><br />';
	}else{
		text += '<img src=\"http://www.vesseltracker.com/shipPhotoServlet?res=thumbnails&shipId='+ship.id+'\"><br />';
	}
	
	if(mode=="REALTIME" || mode=="FREE_ACCOUNT")
	{
    	text += "Last seen: " + ship.seen + '<br/>';
    }
    	
    text += '<br/><table>' +
    	'<tr><td>Callsign</td><td>' + ship.call + '</td></tr>';
    	
    if(mode=="REALTIME" || mode=="FREE_ACCOUNT")
    {
    	if (ship.imo != null)
    	{
    		text += '<tr><td>IMO</td><td>' + ship.imo + '</td></tr>';
    	}
    }
    text += '<tr><td>MMSI</td><td>' + ship.mmsi + '</td></tr>';
	    
	if( mode=="REALTIME" ) 
	{
		text += 
			"<tr><td valign=\"top\">Position</td><td valign=\"top\">" + 
			formatLatitude(ship.lat) + "<br/>" + 
			formatLongitude(ship.lon) + "</td></tr>";
			
		if( ship.status=="MOVING" )
		{
			if(ship.sog)
			{
				text += "<tr><td>Speed</td><td>" + ship.sog.toFixed(1) + " kts</td></tr>";
			}
			if(ship.hdg)
			{
				text += "<tr><td>Heading</td><td>" + ship.hdg + " deg</td></tr>";
			}
			if(ship.cog)
			{
				text += "<tr><td>Course</td><td>" + ship.cog.toFixed(1) + " deg</td></tr>";
			}
			if(ship.eta)
			{
				text += "<tr><td>ETA</td><td>" + ship.eta + "</td></tr>";
			}
		}
		if(ship.dest)
		{
		    text += "<tr><td>Destination</td><td>" + ship.dest + '</td></tr>';
		}
		if (ship.port)
		{
			text += '<tr><td>Port</td><td>'+ship.port+'</td></tr>';
		}
		if(ship.berth)
		{
			text += '<tr><td>Berth</td><td>' + ship.berth + '</td></tr>';
		}
		
		if (ship.moored)
		{
			text += '<tr><td>Moored</td><td>' + ship.moored + '</td></tr>';
		}
		
		if (ship.anchor)
		{
			text += '<tr><td>Roadstead</td><td>'+ship.anchor+'</td></tr>';
		}
		if(ship.anchorTime)
		{
			text+= '<tr><td>Anchored</td><td>'+ship.anchorTime+'</td></tr>';
		}
	    if(ship.len)
	    {
			text += "<tr><td>Length x Beam</td><td>" + ship.len + " x " + ship.wid+" m</td></tr>";
		}
	    
		if(ship.dgt)
		{
			text += "<tr><td>Draught</td><td>" + ship.dgt.toFixed(1) + '</td></tr>';
		}
	}
	var m3_r = Math.floor(Math.random()*99999999999);
	text += '</table><br/>' +
		'<a href="http://adserver.vesseltracker.com/www/delivery/ck.php?n=ac7eea73&amp;cb='+m3_r+'" target="_blank"><img src="http://adserver.vesseltracker.com/www/delivery/avw.php?zoneid=13&amp;n=ac7eea73" border="0" alt="" /></a>';
	text += '</small>';
	return text;
}

function formatLatitude(lat)
{
	// S 09° 54' 23.6''
	var ret;
	if(lat<0)
	{
		lat = -lat;
		ret ='S ';
	}
	else
	{
		ret ='N ';
	}
	var deg = Math.floor(lat);
	ret += padDigits(deg,2)+"° ";
	var min = ((lat-deg)*60.0);
	var minF = Math.floor(min);
	
	var sec = ((min - minF) * 60.0).toFixed(2);
	if (sec == 60.00)
	{
		sec = 0.0;
		sec = sec.toFixed(2);
		minF += 1;
	}		
	ret += padDigits(minF, 2) + "' ";
	ret += padDigits(sec, 5) + "\" ";
	return ret;
}

function formatLongitude(lon)
{
	// E 009° 54' 23.6''
	var ret;
	if(lon<0)
	{
		lon=-lon;
		ret='W ';
	}
	else
	{
		ret='E ';
	}
	
	var deg = Math.floor(lon);
	ret += padDigits(deg, 3) + "° ";
	var min = ((lon - deg) * 60.0);
	var minF = Math.floor(min);
	var sec = ((min - minF) * 60.0).toFixed(2);
	if (sec == 60.00)
	{
		sec = 0.0;
		sec = sec.toFixed(2);
		minF += 1;
	}
	ret += padDigits(minF, 2) + "' " + padDigits(sec, 5) + "\"";
	return ret;
	
}

function padDigits(n, totalDigits) 
{ 
	n = n.toString(); 
	var pd = '';
	if (totalDigits > n.length) 
	{ 
		for (var i=0; i < (totalDigits-n.length); i++) 
		{ 
				pd += '0'; 
		} 
	} 
	return pd + n;
} 

