

var map;

var arrPoints = [];

var arrNames = [];
//for click and double click
var timeouts = [];


var tooltip;

var gmarkers;

var icon_k;

var icon_b;

var icon_a;

var icon_g;

var icon_r;

var icon_w;

var icon_y;

var icon_m;

var icon_o;

var icon_n;

var htmls;

var vectors;



var maxrange = 0;

var maxname, maxmmsi, maxlat, maxlon, maxbearing, maxindex; 





/***************************************************************************

'args.js', by Charlton Rose

Permission is granted to use and modify this script for any purpose,

provided that this credit header is retained, unmodified, in the script.

****************************************************************************/

// This function creates the args [] array and populates it with data

// found in the URL's search string:

function args_init ()

{

  args = new Array();

  var argstring = window.location.search;

  if (argstring.charAt(0) != '?')

	return;

  argstring = argstring.substring(1, argstring.length);

  var argarray = argstring.split('&');

  var i;

  var singlearg;

  for (i = 0; i < argarray.length; ++ i)

	{

	singlearg = argarray[i].split('=');

	if (singlearg.length != 2)

		continue;

	var index = singlearg[0];

	var value = singlearg[1];

	args[index] = value;

	}

}

// Call the args_init () function to set up the args [] array:

args_init ();

/*************************************************************************/



var maplat = 1 * args['lat'];

var maplon = 1 * args['lon'];

var mapsiz = 1 * args['siz'];

var my_lat = 1 * args['hlt'];

var my_lon = 1 * args['hln'];

var maptyp = args['typ'];





function load() {

    if (GBrowserIsCompatible()) {

      map = new GMap2(document.getElementById('map'));

      map.addControl(new GLargeMapControl());

      map.addControl(new GScaleControl());

      map.addControl(new GOverviewMapControl());

	  map.addControl(new GMapTypeControl());

      map.setCenter(new GLatLng(22.216667,  -97.852778), 12);

	  map.enableDoubleClickZoom();

	  map.setMapType(G_HYBRID_MAP);

	  

	  // ====== set up marker mouseover tooltip div ======

	  tooltip = document.createElement("div");

	  map.getPane(G_MAP_FLOAT_PANE).appendChild(tooltip);

	  tooltip.style.visibility="hidden";

		  



	  icon_k = myicon("http://labs.google.com/ridefinder/images/mm_20_black.png", 0);

	  icon_b = myicon("http://labs.google.com/ridefinder/images/mm_20_blue.png", 0);

	  icon_a = myicon("http://labs.google.com/ridefinder/images/mm_20_gray.png", 0);

	  icon_g = myicon("http://labs.google.com/ridefinder/images/mm_20_green.png", 0);

	  icon_r = myicon("http://labs.google.com/ridefinder/images/mm_20_red.png", 0);

	  icon_w = myicon("http://labs.google.com/ridefinder/images/mm_20_white.png", 0);

	  icon_y = myicon("http://labs.google.com/ridefinder/images/mm_20_yellow.png", 0);

	  icon_m = myicon("http://labs.google.com/ridefinder/images/mm_20_purple.png", 0);

	  icon_o = myicon("http://labs.google.com/ridefinder/images/mm_20_orange.png", 0);

	  icon_n = myicon("http://labs.google.com/ridefinder/images/mm_20_brown.png", 0);

	  //icon_home = myicon("http://www.google.com/mapfiles/marker.png", 0); // Added to display Home AIS

	  icon_track = myicon("shiptrkicon.gif", 1); // Added to display replay tracks

	  

	  //add test physical mareker

	  

	  addPhysicalPoint(map);

	  

	  autoUpdate();
    }

}

function autoUpdate(){
		if(navigator.userAgent.indexOf("MSIE")>0) {
			
			var latTD = document.frames("refresh").document.getElementById('latTD').innerText;
			var arrLat = latTD.split('#');
			var lonTD = document.frames("refresh").document.getElementById('lonTD').innerText;
			var arrLon = lonTD.split('#');
			var nameTD = document.frames("refresh").document.getElementById('nameTD').innerText;
			var arrName = nameTD.split('#');
			var dxTD = document.frames("refresh").document.getElementById('dxTD').innerText;
			var arrDx = dxTD.split('#');
			var dyTD = document.frames("refresh").document.getElementById('dyTD').innerText;
			var arrDy = dyTD.split('#');
			var typeTD = document.frames("refresh").document.getElementById('typeTD').innerText;
			var arrType = typeTD.split('#');
			var aisTD = document.frames("refresh").document.getElementById('aisTD').innerText;
			var arrAis = aisTD.split('#');
		} else {
			//alert("firefox");
			//alert( document.getElementById("refresh").contentWindow.document.getElementById('latTD').textContent);

			var latTD = document.getElementById("refresh").contentWindow.document.getElementById('latTD').textContent;
			var arrLat = latTD.split('#');
			var lonTD = document.getElementById("refresh").contentWindow.document.getElementById('lonTD').textContent;
			var arrLon = lonTD.split('#');
			var nameTD = document.getElementById("refresh").contentWindow.document.getElementById('nameTD').textContent;
			var arrName = nameTD.split('#');
			var dxTD = document.getElementById("refresh").contentWindow.document.getElementById('dxTD').textContent;
			var arrDx = dxTD.split('#');
			var dyTD = document.getElementById("refresh").contentWindow.document.getElementById('dyTD').textContent;
			var arrDy = dyTD.split('#');
			var typeTD = document.getElementById("refresh").contentWindow.document.getElementById('typeTD').textContent;
			var arrType = typeTD.split('#');
			var aisTD = document.getElementById("refresh").contentWindow.document.getElementById('aisTD').textContent;
			var arrAis = aisTD.split('#');
		}
	 


/*
		var latTD = document.getElementById('latTD').innerText;
		var arrLat = latTD.split('#');
		var lonTD = document.getElementById('lonTD').innerText;
		var arrLon = lonTD.split('#');
		var nameTD = document.getElementById('nameTD').innerText;
		var arrName = nameTD.split('#');
		var dxTD = document.getElementById('dxTD').innerText;
		var arrDx = dxTD.split('#');
		var dyTD = document.getElementById('dyTD').innerText;
		var arrDy = dyTD.split('#');
		var typeTD = document.getElementById('typeTD').innerText;
		var arrType = typeTD.split('#');
		var aisTD = document.getElementById('aisTD').innerText;
		var arrAis = latTD.split('#');*/


        var movehtml = '';
        var dockhtml = '';
        var sepmove  = '';
        var sepdock  = '';
	    var movecnt  = 0;
	    var dockcnt  = 0;



        if (!gmarkers)
          gmarkers = new Array();
        if (!htmls)
          htmls = new Array();
        if (!vectors)
          vectors = new Array();



        var Lat, Lon, name, deltax, deltay, type, ais, html, ball, icon, share, allshares;

        for (var i = 0; i < arrLat.length-1; i++) {

              Lat = parseFloat(arrLat[i]);

              Lon = parseFloat(arrLon[i]);

              name = arrName[i];

              deltax = parseFloat(arrDx[i]);

              deltay = parseFloat(arrDy[i]);

              type = parseInt(arrType[i]);

              htmls[i] = makeinfo(Lat, Lon, name, type, arrAis[i], i);

              aiss = arrAis[i];

              aiss = aiss.split('!');

              share = aiss[12];

	          if (type == 132) 

	            allshares = share;

              icon = get_colour(type);

              if (gmarkers[i]) {

                GEvent.clearListeners(gmarkers[i], "click");

                GEvent.clearListeners(gmarkers[i], "mouseover");

                GEvent.clearListeners(gmarkers[i], "mouseout");
                
                GEvent.clearListeners(gmarkers[i], "dblclick");
                map.removeOverlay(gmarkers[i]);

              }



              var point = new GLatLng(Lat, Lon);

              gmarkers[i] = createMarker(point, name, htmls[i], icon);

              if (vectors[i]) map.removeOverlay(vectors[i]);

              vectors[i] = addVector(point, deltax, deltay);

              if (vectors[i]) map.addOverlay(vectors[i]);

              html = "<a href='javascript:findship("+i+")' onmouseover='mymouseover("+i+")' onmouseout='mymouseout()'>"+name+"</a>";

              if (Math.abs(deltax) > 0 || Math.abs(deltay) > 0) {

                movehtml += sepmove + html;

                sepmove = ", ";

		        movecnt += 1;

              } else {

                dockhtml += sepdock + html;

                sepdock = ", ";

		        dockcnt += 1;

              }

          }

         var shipmove = document.getElementById("shipmove");

        if (shipmove)

          shipmove.innerHTML ="<h3 style='color: black; font-weight: bold;'>Underway&nbsp;<small>["+movecnt+"]</small>:</h3>"+movehtml+"."; 



        var shipdock = document.getElementById("shipdocked");

        if (shipdock)

          shipdock.innerHTML ="<h3 style='color: black; font-weight: bold;'>Docked, Anchored or Fixed&nbsp;<small>["+dockcnt+"]</small>:</h3>"+dockhtml+".";



        var shiptime = document.getElementById("shiptime");

        if (shiptime) {

          var currentTime = new Date();

          shiptime.innerHTML = "Ship positions last updated: " + currentTime + '.';

        }



        html = "<a href='javascript:findship("+maxindex+")' onmouseover='mymouseover("+maxindex+")' onmouseout='mymouseout()'>"+maxname+"</a>";



	  



        var shipshare = document.getElementById("shipshare");

        if (shipshare)

          shipshare.innerHTML = allshares + '.';

	    maxrange = 0;

         



      setTimeout("autoUpdate();",60000);

        

}

function createMarker(point, name, html, iconz) {

      var marker = new GMarker(point, iconz);

      marker.tooltip = '<div id="tooltip"  style="background-color:Blue"><span><font color="white">'+name+'</font></span></div>';

      GEvent.addListener(marker, "click", function() {

        timeouts.push( setTimeout( function() { marker.openInfoWindowHtml(html); }, 250 ) );

      });
      
      GEvent.addListener(marker, "dblclick", function() {

        for(var i=0; i < timeouts.length; i++) {
		    clearTimeout(timeouts[i]);
		}
		map.zoomIn();

      });

      map.addOverlay(marker);



      GEvent.addListener(marker,"mouseover", function() {

        showTooltip(marker);

      });

      GEvent.addListener(marker,"mouseout", function() {

        tooltip.style.visibility="hidden"

      });



      return marker;

}

function addVector(from, deltax, deltay) {

  if (deltax == 0 && deltay == 0) return null;

  var to = new GLatLng(from.lat() + deltay, from.lng() + deltax)

  var polyline = new GPolyline([from, to], "#00ff00", 2);

  return polyline;

}

function makeinfo(Lat, Lon, name, type, aisstr, i) {

      var ais = aisstr.split('!');

      var mmsi  = ais[0];

      var imo   = ais[1];

      var call  = ais[2];

      var dest  = ais[3];

      var eta   = ais[4];

      var speed = ais[5];

      var course= ais[6];

      var status= getstatus(ais[7]);

      var length= ais[8];

      var width = ais[9];

      var draft = ais[10];

      var mtime = ais[11];

      var shareid = ais[12]; // Added to show share code in info balloon

      var aisclass = ais[13]; // Added to show AIS class in info balloon

      

    // Convert Lat/Long to NSEW versus +- for display in info balloon

      with (Math) {

        if (Lat < 0) {

        var latstr = abs(Lat);

        latstr = 'S'+latstr;

        } else {

          latstr = 'N'+Lat;

        }

        if (Lon < 0) {

        var lonstr = abs(Lon);

          lonstr = 'W'+lonstr;

        } else {

          lonstr = 'E'+Lon;

        } 



    // Calculate the RANGE from home location.

        var la1 = my_lat * PI / 180;

        var lo1 = my_lon * PI / 180;

        var la2 = Lat * PI / 180;

        var lo2 = Lon * PI / 180;

        var x = (sin(la2) * sin(la1)) + (cos(la2) * cos(la1) * cos(lo2-lo1));

        var range = round((((PI / 2) - atan(x / sqrt(-x * x + 1))) * 60 * 180 / PI) * 10) / 10;

    	

    // Calculate Initial Bearing of ship from home location.

          var y = sin(lo2 - lo1) * cos(la2);

          x = cos(la1) * sin(la2) - sin(la1) * cos(la2) * cos(lo2 - lo1);

	      var bearing = round(((atan2(y, x) * 180 / PI) + 360) % 360);

    	

    // Find farthest ship.

        if (range > maxrange) {

	      maxrange = range;

	      maxname = name;

	      maxmmsi = mmsi;

	      maxlat = Lat;

	      maxlon = Lon;

	      maxbearing = bearing;

	      maxindex = i;

	    }

      }

    	

      if ((type < 100) || (type == 133)) {

        callstr = '<tr><td>Callsign:</td><td>'+call+'</td></tr>\n';

        deststr = '<tr><td>Destination:</td><td>'+dest+'</td></tr>\n';

        etastr = '<tr><td>ETA:</td><td>'+eta+'</td></tr>\n';

      } else {

        callstr = '';

        deststr = '';

        etastr = '';

      }

      if (type < 100) {

  	    spdstr = '<tr><td>Speed&Dir:</td><td>'+speed+' kts / '+course+'<sup>o</sup></td></tr>\n'; 

  	    sizestr = '<tr><td>Size:</td><td>'+length+'m x '+width+'m x '+draft+'m</td></tr>\n';

      } else {

        spdstr = '';	

        sizestr = '';	

      }

      if (mmsi != '') {

  	    mmsistr = '<tr><td>MMSI:</td><td>'+mmsi+'</td></tr>\n';

      } else {

        mmsistr = '';	

      }

      if (imo > 0) {

        imostr = '<tr><td>IMO:</td><td>'+imo+'</td></tr>\n';

      } else {

        imostr = '';

      }

      if (mtime != '') {

        recstr = '<tr><td><sup>Received:&nbsp;</sup></td><td><sup>'+mtime+'</sup></td></tr>\n';

      } else {

        recstr = '';

      }

      if (status != '') {

        statusstr = '<tr><td>Status:</td><td>'+status+'</td></tr>\n';

      } else {

        statusstr = '';

      }

      // Following entries added to show Share Code, Range & Bearing, and AIS Class

      if (shareid != '') {

  	    sharestr = '<tr><td>Share&nbsp;Code:&nbsp;</td><td>'+shareid+'</td></tr>\n';

      } else {

        sharestr = '';	

      }

      if (range != '') {

  	    rangestr = '<tr><td>Range&Bear:&nbsp;&nbsp;</td><td>'+range+'nm / '+bearing+'<sup>o</sup>T</td></tr>\n';

      } else {

        rangestr = '';	

      }

      if (aisclass != '') {

        classstr = getaisclass(aisclass)

  	    classstr = '<tr><td>AIS Class:</td><td>'+classstr+'</td></tr>\n';

      } else {

        classstr = '';	

      }

      

      return '<div class="gpopup"><table style="font-size:12px" cellpadding="0" cellspacing="0">\n'+

        '<tr><td>Name:</td><td>'+name+'</a></td></tr>\n'+

        callstr+

        mmsistr+

        imostr+

        statusstr+

        deststr+

        etastr+

        '<tr><td>Type:</td><td>'+ais_type(type)+'</td></tr>\n'+

        sizestr+

        spdstr+

        '<tr><td>Location:</td><td>'+latstr+'<sup>o</sup> / '+lonstr+'<sup>o</sup></td></tr>\n'+

        rangestr+

	    classstr+

	    '<tr><td colspan="2">&nbsp;</td></tr>\n'+

        recstr+

	    sharestr+

        '</table></div>\n';

}





function myicon(image, i) {

  icon = new GIcon();

  if (i == 1) {

    icon.iconSize = new GSize(4, 4);

    icon.iconAnchor = new GPoint(2, 4);

    icon.shadow = "";

    icon.shadowSize = new GSize(0, 0);

  } else {

    icon.iconSize = new GSize(12, 20);

    icon.iconAnchor = new GPoint(6, 20);

    icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";

    icon.shadowSize = new GSize(22, 20);

  }

  icon.infoWindowAnchor = new GPoint(5, 1);

  icon.image = image;

  return icon;

}

function getstatus(status) {

  switch (parseInt(status)) {

    case 0: return 'Underway';

      break;

    case 1: return 'At Anchor';

      break;

    case 2: return 'Not Under Command';

      break;

    case 3: return 'Restricted Maneuverability';

      break;

    case 4: return 'Constrained by Draught';

      break;

    case 5: return 'Moored';

      break;

    case 6: return 'Aground';

      break;

    case 7: return 'Engaged in Fishing';

      break;

    case 8: return 'Underway by Sail';

      break;

    case 9: return 'Reserved for HSC Category';

      break;

    case 10: return 'Reserved for WIG Category';

      break;

    case 15: return 'Default (15)';

      break;

    default: return status;

      break;

  }

}



function getaisclass(aisclass) {

  switch (aisclass) {

    case "A": return 'AIS Class A';

      break;

    case "B": return 'AIS Class B';

      break;

    case "L": return 'Local GPS';

      break;

    case "N": return 'Navigation Aid';

      break;

    case "P": return 'SAR Aircraft';

      break;

    case "S": return 'AIS Base Station';

      break;

    case "?": return 'Unknown';

      break;

    case "X": return 'No Data';

      break;

    default: return aisclass;

      break;

  }

}

function ais_type(id) {

  var type1 = new Array('unspecified', 'Reserved', 'Wing In Grnd', 

      '', 'Hi Spd Crft', '', 'Passenger', 'Cargo', 'Tanker', 'Other');

  var type2 = new Array('', 'Haz A', 'Haz B', 'Haz C', 'Haz D', '',

	  '', '', '', '');

  var type3 = new Array('Fishing', 'Towing', 'Towing', 'Dredger', 'Dive Vessel', 

	  'Military Ops', 'Sail', 'Pleasure Craft', 'Reserved', 'Reserved');

  var type5 = new Array('Pilot Vessel', 'SAR', 'Tug', 'Port Tender', 'Anti-polution', 

	  'Law enforce', 'Local Vessel', 'Local Vessel', 'Medical Trans', 'Special craft');

  var navaid = new Array('Default Navaid', 'Reference point', 'RACON',

		'Off Shore Structure', 'Spare',	'Light, without sectors',

		'Light, with sectors', 'Leading Light Front', 'Leading Light Rear',

		'Beacon, Cardinal N', 'Beacon, Cardinal E',	'Beacon, Cardinal S',

		'Beacon, Cardinal W', 'Beacon, Port hand', 'Beacon, Starboard hand',

		'Beacon, Preferred Channel port hand', 'Beacon, Preferred Channel starboard hand',

		'Beacon, Isolated danger', 'Beacon, Safe water', 'Beacon, Special mark',

		'Cardinal Mark N', 'Cardinal Mark E', 'Cardinal Mark S', 'Cardinal Mark W',

		'Port hand Mark', 'Starboard hand Mark', 'Preferred Channel Port hand',

		'Preferred Channel Starboard hand',	'Isolated danger', 'Safe Water',

		'Manned VTS', // Special Mark

		'Light Vessel / LANBY',

		'Reference Point'); // Added to show unique icon for Home AIS



      type = Math.floor(id / 10);

      rem = id % 10;

      result = '';

      if (type == 3)

        result = type3[rem];

      else if (type == 5)

        result = type5[rem];

      else if (id >= 100) {

        result = navaid[id-100];

      } else {

        result = type1[type];

        if (id < 100 && type2[rem] != '')

          result = result +' '+type2[rem];

      }

      return result;

}

function get_colour(type) {

  if (type == 30)

	return icon_y;  // "yellow"

  if (type == 31)

  	return icon_o;  // "orange"

  if (type == 32)

  	return icon_o;

  if (type == 33)

  	return icon_o;

  if (type == 34)

  	return icon_y;

  if (type == 35)

  	return icon_k;  // "black"

  if (type == 36)

  	return icon_b;  // "blue"

  if (type == 37)

  	return icon_b; 

  if (type == 38)

  	return icon_w;  // "white"

  if (type == 39)

  	return icon_w;

  if (type == 50)

	return icon_g;  // "green"

  if (type == 51)

  	return icon_g;

  if (type == 52)

    return icon_o; 

  if (type == 53)

  	return icon_o;

  if (type == 54)

  	return icon_o;

  if (type == 55)

  	return icon_k;

  if (type == 56)

  	return icon_w;

  if (type == 57)

  	return icon_w;

  if (type == 58)

  	return icon_g;

  if (type == 59)

  	return icon_g;

  if (type == 132)

    //return icon_home;  // Added to display Home AIS

  if (type == 133)

    return icon_track;  // Added to display replay tracks 

  if (type > 99)

    return icon_a;  // "gray"



  var itype = Math.floor(type/10);

  switch (itype) {

  case 7:

    ball = icon_r;  // "red"

    break;

  case 8:

    ball = icon_m;  // "magenta"

    break;

  case 4:

    ball = icon_b; 

    break;

  case 6:

    ball = icon_b; 

    break;

  default:

    ball = icon_w; 

    break;

  }

  return ball;

}



// ====== This function displays the tooltip ======

// it can be called from an icon mousover or a sidebar mouseover

function showTooltip(marker) {

  tooltip.innerHTML = marker.tooltip;

  var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());

  var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());

  var anchor=marker.getIcon().iconAnchor;

  var width=marker.getIcon().iconSize.width;

  var height=tooltip.clientHeight;

  var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y -anchor.y -height));

  pos.apply(tooltip);

  tooltip.style.visibility="visible";

}



// ===== This function is invoked when the mouse goes over an entry in the sidebar =====

// It launches the tooltip on the icon

function mymouseover(i) {

  showTooltip(gmarkers[i]);

}



// ===== This function is invoked when the mouse leaves an entry in the sidebar =====

// It hides the tooltip

function mymouseout() {

  tooltip.style.visibility="hidden";

}



// Open the info box for the specified marker.

function findship(i){

  gmarkers[i].openInfoWindowHtml(htmls[i]);

}



function ToPoint(lat,log)

{

    var point = new GLatLng(lat,  log);

	map.panTo(point);

	map.setZoom(15);

		

}






