var map;
var gmarkers = new Array();
var mmsip = null;
var wp = [];        //wp divs
var t = 0;          //number of wps
var track;
var track_set;

function windowHeight() {
  // Standard browsers (Mozilla, Safari, etc.)
  if (self.innerHeight) {
    return self.innerHeight;
  }
  // IE 6
  if (document.documentElement && document.documentElement.clientHeight) {
   return document.documentElement.clientHeight;
  }
  // IE 5
  if (document.body) {
    return document.body.clientHeight;
  }
  return 0;
}

function handleResize() {
  var height = windowHeight() - document.getElementById('toolbar').offsetHeight - 30;
  document.getElementById('map').style.height = height + 'px';
  document.getElementById('sidebar').style.height = height + 'px';
  document.getElementById('content2').style.top = windowHeight() + 'px';
  }

function init() {
  document.getElementById('button-sidebar-hide').onclick = function() { return changeBodyClass('sidebar-right', 'sidebar-off'); };
  document.getElementById('button-sidebar-show').onclick = function() { return changeBodyClass('sidebar-off', 'sidebar-right'); };
  handleResize();
  map = new GMap2(document.getElementById("map"),{mapTypes:[G_NORMAL_MAP,seachart(),G_SATELLITE_MAP,G_PHYSICAL_MAP]});
  map.addControl(new GLargeMapControl());
  map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom);
  map.addControl(new GMapTypeControl());
  map.addControl(new PromoControl());
  map.addControl(new GScaleControl(),
  new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10, 150)));
  map.addControl(new GOverviewMapControl());
  map.setMapType (G_PHYSICAL_MAP);
  map.addControl(new MapCursorControl());
  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("/shipplotter/google/images/lighthouse1.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("/shipplotter/google/images/shiptrkicon.gif", 1); // Added to display replay tracks
  icon_sscout = myicon("/shipplotter/gmap/images/icons/marina.png", 0);
  icon_camp = myicon("/shipplotter/gmap/images/icons/campground.png", 0);
  
  document.getElementById('button-sidebar-hide').onclick = function() { 
	return changeBodyClass('sidebar-right', 'sidebar-off');};
  document.getElementById('button-sidebar-show').onclick = function() { 
	return changeBodyClass('sidebar-off', 'sidebar-right');};
	
    if (mmsip) {
		if (zl) {
	  		aiswaitgo(zl);
		} else {
			aiswaitgo(9);
		}
  }
  GEvent.addListener(map,'zoomend',function(){
                hideWayPoints();
  }); 
  // Populate and update map
  autoUpdate();
};

function autoUpdate() {
  GDownloadUrl(datasource+"?"+Math.random(), function(data, responseCode) {
    var xmlDoc = GXml.parse(data);
    if (!xmlDoc.documentElement) return;
    var xmlmarker = xmlDoc.documentElement.getElementsByTagName("marker");
    var xmlmarker2 = xmlDoc.documentElement.getElementsByTagName("marker2");
    var movehtml = '';
    var dockhtml = '';
    var sepmove = '';
    var sepdock = '';
    var movecnt   = 0;
    var dockcnt   = 0;
	
    if (!htmls)
      htmls = new Array();
    if (!vectors)
      vectors = new Array();

    var Lat, Lon, name, deltax, deltay, type, ais, html, ball, icon, base;

    for (var i = 0; i < xmlmarker.length; i++) {
      Lat = parseFloat(xmlmarker[i].getAttribute("lat"));
      Lon = parseFloat(xmlmarker[i].getAttribute("lon"));
      name = xmlmarker[i].getAttribute("name");
      deltax = parseFloat(xmlmarker[i].getAttribute("dx"));
      deltay = parseFloat(xmlmarker[i].getAttribute("dy"));
      type = parseInt(xmlmarker[i].getAttribute("type"));
      htmls[i] = makeinfo(Lat, Lon, name, type, xmlmarker[i].getAttribute("ais"), i);
      icon = get_colour(type);

      if (gmarkers[i]) {
        GEvent.clearListeners(gmarkers[i], "click");
        GEvent.clearListeners(gmarkers[i], "mouseover");
        GEvent.clearListeners(gmarkers[i], "mouseout");
        map.removeOverlay(gmarkers[i]);
      }
		
      var point = new GLatLng(Lat, Lon); 
      var ais = xmlmarker[i].getAttribute("ais").split('!');
      var mtime = new Date((ais[11])*1000).toLocaleString();
	  
      gmarkers[i] = createMarker(point, name, mtime, htmls[i], icon, ais[0]);
      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;
      }
      }
    for (var j = 0; j < xmlmarker2.length; j++) {
      Lat = parseFloat(xmlmarker2[j].getAttribute("lat"));
      Lon = parseFloat(xmlmarker2[j].getAttribute("lon"));
      name = xmlmarker2[j].getAttribute("name");
      type = parseInt(xmlmarker2[j].getAttribute("type"));
      htmls[j+xmlmarker.length] = makeinfo(Lat, Lon, name, type, xmlmarker2[j].getAttribute("base"), j+xmlmarker.length);
      icon = get_colour(type);
   
      if (gmarkers[j+xmlmarker.length]) {
        GEvent.clearListeners(gmarkers[j+xmlmarker.length], "click");
        GEvent.clearListeners(gmarkers[j+xmlmarker.length], "mouseover");
        GEvent.clearListeners(gmarkers[j+xmlmarker.length], "mouseout");
        map.removeOverlay(gmarkers[j+xmlmarker.length]);
      }
		
      var point = new GLatLng(Lat, Lon); 
      var base = xmlmarker2[j].getAttribute("base").split('!');
      gmarkers[j+xmlmarker.length] = createMarker2(point, name, htmls[j+xmlmarker.length], icon);
    }

    var shipmove = document.getElementById("shipmove");
    if (shipmove)
      shipmove.innerHTML =  '<h3>Ships Underway [' + movecnt + ']: </h3><font size="-1">' + movehtml + '</font>.';
    var shipdock = document.getElementById("shipdocked");
    if (shipdock)
      shipdock.innerHTML =  '<h3>Ships Docked, Anchored or Fixed [' + dockcnt + ']: </h3><font size="-1">' + dockhtml + '</font>.';
    
  });

  // time out after 1hr.
  if (refreshcounter++ < numrefresh)
  window.setTimeout('countDown()', 1000);
  else {
    if (document.getElementById("countDownText"))
    document.getElementById("countDownText").innerHTML = "Press REFRESH to continue updates.";
  }
  hideWayPoints();
}

function ais_type(id) {
  var type1 = new Array('unspecified', 'Reserved', 'Wing In Grnd', '', 'Hi Spd Crft', '', 'Passenger', 'Cargo', 'Tanker', 'Other');
  var type2 = new Array('', // All ships of this type
  	  'Haz A', /* Major Hazard */
	  'Haz B', /* Hazard */
	  'Haz C', /* Minor Hazard */
	  'Haz D', /* Recogniseable Hazard */
	  '',
	  '',
	  '',
	  '',
	  '' // No additional information
	  );

      type3 = new Array('Fishing', 'Towing', 'Towing', 'Dredger', 'Dive Vessel', 'Military Ops', 'Sail', 'Pleasure Craft', 'Reserved', 'Reserved');
      type5 = new Array('Pilot Vessel', 'SAR', 'Tug', 'Port Tender', 'Anti-polution', 'Law enforce', 'Local Vessel', 'Local Vessel', 'Medical Trans', 'Special craft');
      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',
		'Receiving station', // Added to show unique icon for Home AIS
		'Other'); 
		
      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 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 Her 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 14: return '';
      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 'Unkown';
      break;
    case " ": return 'No Data';
      break;
    default: return aisclass;
      break;
  }
}
function makeinfo(Lat, Lon, name, type, aisstr, i) {
  var ais = aisstr.split('!');
  if  (type < 300){
  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 = new Date((ais[11])*1000).toLocaleString();
  var ccode = ais[12]; 
  var cname = ais[13];
  var shareid = ais[14]; // Added to show share code in info balloon
  var aisclass = ais[15]; // Added to show AIS class in info balloon
  } else {
  var ccode  = ais[0];
  var descr  = ais[1];
  var weburl  = ais[2];
  var sitetxt  = ais[3];
  var status   = ais[4];
  }

// 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;
    } 
  }
	
  if ((type < 100) || (type == 133)) {
    callstr = '<tr><td>Callsign:</td><td>'+call+'</td></tr>\n';
    if (dest != '                    ') {
  	  deststr = '<tr><td>Destination:</td><td>'+dest+'</td></tr>\n';
    } else {
      deststr = '';	
    }
    if (eta != '           ') {
  	  etastr = '<tr><td>ETA:</td><td>'+eta+'</td></tr>\n';
    } else {
      etastr = '';	
    }
	imagestr = '<tr><td>Image lookup:&nbsp;&nbsp;</td><td><a target="_blank" href="http://www.ship-info.com/prog/redskip.asp?id='+call+'">Link</a></td></tr>\n';
	trackstr = '<tr><td>Vessel track:&nbsp;&nbsp;</td><td><a href="javascript:getTracking('+mmsi+',3);">3hrs</a> | <a href="javascript:getTracking('+mmsi+',24);">24hrs</a> | <a href="javascript:hideTrack();">Hide</a></td></tr>\n';
  } else {
    callstr = '';
    deststr = '';
    etastr = '';
	imagestr = '';
	trackstr = '';
  }
  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 != null) {
  	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 != null) {
    recstr = '<tr><td>Received:</td><td>'+mtime+'</td></tr>\n';
  } else {
    recstr = '';
  }
  if (descr != null) {
    descrstr = '<tr><td colspan="2">'+descr+'<br></td></tr><tr><td colspan="2">&nbsp;</td></tr>\n';
  } else {
    descrstr = '';
  }
  if (sitetxt != null) {
    txtstr = '<tr><td colspan="2">'+sitetxt+'<br></td></tr><tr><td colspan="2">&nbsp;</td></tr>\n';
  } else {
    txtstr = '';
  }
  if (weburl != null ) {
	if (weburl != '' ) {  
		urlstr = '<tr><td colspan="2">Web: <a href="'+weburl+'"> '+name+'</a></td></tr><tr><td colspan="2">&nbsp;</td></tr>\n';
	} else {
		urlstr = '';
		}
      } else {
	  urlstr = '';
  }
  
  if (ais_type(type) != null) {
    typestr = '<tr><td>Ship Type:</td><td>'+ais_type(type)+'</td></tr>\n';
  } else {
    typestr = '';
  }
  if ( type < 400) {
		if (status != '') {
          statusstr = '<tr><td>Status:</td><td>'+status+'</td></tr>\n';
		} else {
			statusstr = '';
		}
		locstr = '<tr><td>Location:</td><td>'+latstr+'<sup>o</sup> / '+lonstr+'<sup>o</sup></td></tr>\n';
  } else {
	locstr = ''; 
    statusstr = '';
  }
  
   if (cname != '') {
	   if (cname == null) {
		 cnamestr = '<tr><td><br>Flag:  </td><td><img style="border: 1px solid rgb(170, 170, 170);" src="/shipplotter/gmap/flags/'+ccode+'.gif"></td></tr>\n';
	   } else {
  	     cnamestr = '<tr><td><br>Flag:</td><td>'+cname+'&nbsp;&nbsp;<img style="border: 1px solid rgb(170, 170, 170);" src="/shipplotter/gmap/flags/'+ccode+'.gif"></td></tr>\n';
	   }
  } else {
    cnamestr = '';	
  }
  if (aisclass != '') {
    classstr = getaisclass(aisclass)
  	classstr = '<tr><td>AIS Class:</td><td>'+classstr+'</td></tr>\n';
  } else {
    classstr = '';	
  } 
  return '<div class="gpopup"><table cellpadding="0" cellspacing="0">\n'+
    '<tr><td colspan="2">&nbsp;</td></tr>\n'+
    '<tr><td colspan="2" id="title">'+name+'</td></tr>\n'+
    '<tr><td colspan="2">&nbsp;</td></tr>\n'+
    descrstr+
	urlstr+
	txtstr+
	callstr+
    mmsistr+
    imostr+
    statusstr+
    deststr+
    etastr+
    typestr+
    sizestr+
    spdstr+
    locstr+
//	classstr+
    imagestr+
	trackstr+
    cnamestr+
    '<tr><td colspan="2">&nbsp;</td></tr>\n'+
    recstr+
    '</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 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], "#FF0000", 2);
  return polyline;
  hideWayPoints();
}

function get_colour(type) {
if (type == 30)
	return icon_y; 
  if (type == 31)
  	return icon_o;
  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;
  if (type == 37)
  	return icon_b; // "blue"
  if (type == 38)
  	return icon_w;
  if (type == 39)
  	return icon_w;
  if (type == 50)
	return icon_g;
  if (type == 51)
  	return icon_g;
  if (type == 52)
    return icon_o; // "orange"
  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 == 401)
  	return icon_sscout;  
  if (type == 402)
  	return icon_camp;	
  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; // "blue";
    break;
  case 6:
    ball = icon_b; // "blue";
    break;
  default:
    ball = icon_w; // "white";
    break;
  }
  return ball;
}

function createMarker(point, name, mtime, html, iconz, mmsi) {
  var marker = new GMarker(point, iconz);
  marker.tooltip = '<div id="tooltip">'+name+'<br><sup>Updated :'+mtime+'</sup></div>';
  marker.mmsi = mmsi;
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });
  map.addOverlay(marker);

  GEvent.addListener(marker,"mouseover", function() {
    showTooltip(marker);
  });
  GEvent.addListener(marker,"mouseout", function() {
    tooltip.style.visibility="hidden"
  });

  return marker;
}

function createMarker2(point, name, html, iconz) {
  var marker = new GMarker(point, iconz);
  marker.tooltip = '<div id="tooltip">'+name+'</div>';
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });
  map.addOverlay(marker);

  GEvent.addListener(marker,"mouseover", function() {
    showTooltip(marker);
  });
  GEvent.addListener(marker,"mouseout", function() {
    tooltip.style.visibility="hidden"
  });

  return marker;
}

// ====== This function displays the tooltip ======
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 =====
function mymouseover(i) {
  showTooltip(gmarkers[i])
}

// ===== This function is invoked when the mouse leaves an entry in the sidebar =====
function mymouseout() {
  tooltip.style.visibility="hidden";
}

// Open the info box for the specified marker.
function findship(i){
  gmarkers[i].openInfoWindowHtml(htmls[i]);
}

// ***SET Refresh the data after 'refreshInterval' seconds.
var refreshInterval = 120;

// ***SET numrefresh is the number of times to refresh this page before timing out.
var numrefresh = 30;

var tooltip;
var refreshcounter = 0;
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 countDownTime=refreshInterval+1;
var counter;

function countDown(){
  countDownTime--;
  if (document.getElementById("countDownText"))
  document.getElementById("countDownText").innerHTML= "(Refresh in " + countDownTime + " sec.)";
  if (countDownTime<=0){
    countDownTime=refreshInterval;
    clearTimeout(counter)
    autoUpdate()
    return
  }
  counter=setTimeout("countDown()", 1000);
  loaded = true; 
}

var PromoControl = function(url) {
this.url_ = 'http://www.2sandnessjo.no';
};
PromoControl.prototype = new GControl(true);
PromoControl.prototype.initialize = function(map) {
var container = document.createElement("div");
container.innerHTML = '<img style="cursor:pointer" src="http://www.2sandnessjo.no/shipplotter/google/images/providedby.jpg" border="0">';
container.style.width='120px';
container.style.height='50px';
url = this.url_;
GEvent.addDomListener(container, "click", function() {
document.location = url;
});
 
map.getContainer().appendChild(container);
return container;
};
 
PromoControl.prototype.getDefaultPosition = function() {
return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(70, 0));

};

function OnGoMenuFormLink(GoList)
{
   var url = GoList.options[GoList.selectedIndex].value;
   GoList.selectedIndex=0;
   GoList.blur();
   if (url)
   {
      NewWin=window.open(url,'_self');
      window['NewWin'].focus()
   }
}

function changeBodyClass(from, to) {
	document.body.className = document.body.className.replace(from, to);
	return false;
	}

// Extended Tooltip Javascript
var DH = 0;var an = 0;var al = 0;var ai = 0;if (document.getElementById) {ai = 1; DH = 1;}else {if (document.all) {al = 1; DH = 1;} else { browserVersion = parseInt(navigator.appVersion); if ((navigator.appName.indexOf('Netscape') != -1) && (browserVersion == 4)) {an = 1; DH = 1;}}} function fd(oi, wS) {if (ai) return wS ? document.getElementById(oi).style:document.getElementById(oi); if (al) return wS ? document.all[oi].style: document.all[oi]; if (an) return document.layers[oi];}
function pw() {return window.innerWidth != null? window.innerWidth: document.body.clientWidth != null? document.body.clientWidth:null;}
function mouseX(evt) {if (evt.pageX) return evt.pageX; else if (evt.clientX)return evt.clientX + (document.documentElement.scrollLeft ?  document.documentElement.scrollLeft : document.body.scrollLeft); else return null;}
function mouseY(evt) {if (evt.pageY) return evt.pageY; else if (evt.clientY)return evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop); else return null;}
function popUp(evt,oi) {if (DH) {var wp = pw(); ds = fd(oi,1); dm = fd(oi,0); st = ds.visibility; if (dm.offsetWidth) ew = dm.offsetWidth; else if (dm.clip.width) ew = dm.clip.width; if (st == "visible" || st == "show") { ds.visibility = "hidden"; } else {tv = mouseY(evt) + 20; lv = mouseX(evt) - (ew/4); if (lv < 2) lv = 2; else if (lv + ew > wp) lv -= ew/2; if (!an) {lv += 'px';tv += 'px';} ds.left = lv; ds.top = tv; ds.visibility = "visible";}}}

// Build a custom map control to display latitude & longitude of mouse cursor
// Thanks to Bill http://www.bdcc.co.uk/Gmaps/BdccGmapBits.htm
function MapCursorControl() {}

    MapCursorControl.prototype = new GControl();            // Create new map control
    MapCursorControl.prototype.initialize = function(map) { // Setup map container div to display latitude & longitude.
        var container = document.createElement("div");                       
	    var ptr = document.createElement("div");              // Div type, size & id.
    	    ptr.id = "LatLonTxt";
            
    container.appendChild(ptr);                           
    var tim = 0;
    
    GEvent.addListener(map, "mousemove", function(point) {  // Listener for mousemove in map area.
       var tim2 = new Date();
       if (tim2.getTime() > tim) { //avoid continuous run
            var ws = fixedLlString(point.lat(), point.lng());   // Convert mouse point into latitude & longitude.
                var ptr = document.getElementById('LatLonTxt');    // Point to display container overlay div.
            if(map.getCurrentMapType()==G_HYBRID_MAP || map.getCurrentMapType()==G_SATELLITE_MAP)
                ptr.style.color="White";
            else
                ptr.style.color="Black";
            ptr.innerHTML = ws;                                     // Display latitude & longitude of point where mouse cursor in map.
            tim = tim2.getTime() + 50;
       }
    });
    map.getContainer().appendChild(container);              // Add container to map.   
    return container;
}

MapCursorControl.prototype.getDefaultPosition = function() {// Position where latitude & longitude map container div located.
    return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(200, 10));
}

function fixedLlString(la, lo)                              // Convert mouse cursor point to latitude & longitude.
{
	var s = "N";                                            // Want to use N, S, W, E instead of negative signs for latittudes & longitudes.
	var w = "E";
	if (la < 0){                                            // Latitudes are negative in Southern Hemisphere.
		la = -la;
		s = "S";
    }
	
	if(lo < 0){                                             // Longitudes are negative in Northern Hemisphere.
		lo = -lo;
		w = "W";
	}
		
    var lai = Math.floor(la);                               // Following code fixes latitude to 4 decimals & pads with trailing zeros as required.
	    var laf = Math.round((la - lai) * 10000);
	    	var lais = lai.toString();
	while(lais.length < 2)
		lais = "0" + lais;
	var lafs = laf.toString();
	while(lafs.length < 4)
		lafs = "0" + lafs;
	var loi = Math.floor(lo);                               // Following code fixed longitude to 4 decimals & pads with trailing zeros as required.
	    var lof = Math.round((lo - loi) * 10000);
	        var lois = loi.toString();
	while(lois.length < 3)
		lois = "0" + lois;
	var lofs = lof.toString();
	while(lofs.length < 4)
		lofs = "0" + lofs;
	// Return latitude & longitude with N, S, W, E to 4 decimals with padding as required.
	return lais + "." + lafs + s + " " + lois + "." + lofs + w;
}
// end MapCursorControl()

function aiswaitgo(zl) {
	zlx = zl;
	if (loaded == false) {
		setTimeout('aiswaitgo(zlx)',500);
	} else {
        for (var i = 0; i < gmarkers.length; i++) {
            if (gmarkers[i].mmsi == mmsip.toString()) {
                shipid = i;
                break;
			}
		}
		map.setCenter(gmarkers[i].getLatLng(), zl);   
	    findship(shipid);
	}
}

function seachart() {
	if (navigator.appName == 'Netscape')
		var language = navigator.language;
	else
		var language = navigator.browserLanguage;
	if (language.indexOf('en') > -1)
		chtstr = 'Nautical' ;
	else 
		chtstr = 'Nautisk';
	copyrights = new GCopyrightCollection();
	var visibleEarth = new GCopyright('nasabluemarble',new GLatLngBounds(new GLatLng(-90,-180),new GLatLng(90,180)),0,'<a href="http://www.statkart.no">Statens kartverk</a> &amp; <a href="http://www.statkart.no/nor/Land/Fagomrader/Geovekst/">Geovekst</a>' );
	copyrights.addCopyright(visibleEarth);
	var tilelayer = new GTileLayer(copyrights, null, null,{tileUrlTemplate: 'http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=sjo_hovedkart2&zoom={Z}&x={X}&y={Y}',isPng:true,opacity:1.0 });
		return chart = new GMapType([G_PHYSICAL_MAP.getTileLayers()[0], tilelayer], G_PHYSICAL_MAP.getProjection(), chtstr, G_SATELLITE_MAP);
}

function getTracking(mmsi,hrs) {
    hideTrack();
    if(mmsi!=null && mmsi!=0)
    GDownloadUrl("../script/trackxml.php?mmsi=" +mmsi+"&hrs=" +hrs+ "&id=" + Math.random(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("POS");
      t = xmlposition.length;
      var pts = [];
      var lon,lat,speed,course,timestamp,prevlat, prevlon;
      for (var i = 0; i < t; i++) {
        lon = parseFloat(xmlposition[i].getAttribute("LON"));
        lat = parseFloat(xmlposition[i].getAttribute("LAT"));
        speed = parseFloat(xmlposition[i].getAttribute("SPEED"));
        course = parseFloat(xmlposition[i].getAttribute("COURSE"));
        timestamp = xmlposition[i].getAttribute("MTIME");
        pts[i] = new GLatLng(lat, lon);
        //draw waypoint only if the distance is more than 15 pixels from the previous one
        if(i==0 || shipsDistance(lat,lon,prevlat,prevlon)>=15) {
            drawWayPoint(lat,lon,course,speed,timestamp,i);
            prevlat=lat;
            prevlon=lon;
        }
      }
      track = new GPolyline(pts, "blue", 2, 1);
      map.addOverlay(track);
      track_set = 1;
    });
}

function hideWayPoints() {
    for(var i=0; i<t; i++)
        if(wp[i])
            wp[i].style.visibility="hidden";
}

function hideTrack() {
	if (track_set == 1) {
		map.removeOverlay(track);
	}
	hideWayPoints();
}

function drawWayPoint(x, y, angle, speed, timestamp, wpindex) {
	if(!wp[wpindex]) {
   	    wp[wpindex] = document.createElement("div");
        map.getPane(G_MAP_MARKER_SHADOW_PANE).appendChild(wp[wpindex]);
    }  
    var mtime = new Date(timestamp*1000).toLocaleString();
    var angle5 = (Math.floor(angle / 5)) * 5;
    var imgsrc = 'images/wp/wp_' + angle5 + '.png';
    var wphtml = '<div id="ship"><span ';
    wphtml += '><img width="11" height="11" src="' + imgsrc + '" title="' + speed + ' knots / ' + angle + '&deg;  -  ' + mtime + '"/>';
    wphtml += '</span></div>';
    wp[wpindex].innerHTML = wphtml;
    var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());
    var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(new GLatLng(x,y), map.getZoom());
    var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x -5, offset.y - point.y -5)); //icon anchor at 5,5
    pos.apply(wp[wpindex]);
    wp[wpindex].style.visibility="visible";
}

function shipsDistance(x1, y1, x2, y2) {
    var ship1=map.getCurrentMapType().getProjection().fromLatLngToPixel(new GLatLng(x1,y1), map.getZoom());
    var ship2=map.getCurrentMapType().getProjection().fromLatLngToPixel(new GLatLng(x2,y2), map.getZoom());
    var dist = Math.sqrt(Math.pow(Math.abs(ship1.x)-Math.abs(ship2.x),2)+Math.pow(Math.abs(ship1.y)-Math.abs(ship2.y),2));
    return dist;
    }
	
window.onresize = handleResize;
window.onload = init;
window.onunload = GUnload;