﻿var map; var texttip = []; var areatext = []; var areatext_back = []; var area = []; var section = []; var x = []; var y = []; var prevx = []; var prevy = []; var course = []; var speed = []; var shiptype = []; var shipcolor = []; var trackcolor = []; var shipname = []; var flag = []; var mmsi = []; var length = []; var elapsed = []; var ship = []; var wp = []; var portdiv = []; var portcount = 0; var stationdiv = []; var stationcount = 0; var lightdiv = []; var winddiv = []; var mypointdiv = []; var stpoint = []; var markerstation; var photodiv = []; var predictedpoly = []; var areapoly = [];
var n = 100; var k = 0; var t = 0; var shipsshown = 0; var realcount = 0; var refreshInterval = 100; var countDownTime = refreshInterval + 1; var counter; var currenttrack = 0; var currenttracktype; var urlmmsi = 0; var oldmmsi = 0; var replaymmsi = 0; var replaytrack = null; var olddate = ""; var fleet = ""; var station = 0; var stationpoints = 0; var remember = "true"; var maptype = google.maps.MapTypeId.ROADMAP; var firstload = true; var movetype = ""; var isOpenedInfo = false; var infodiv; var previous_lat = 0, previous_lon = 0; var email = ""; var overlay; var projection;
var infowindow, smallbox; var track; var sw_x = -180, sw_y = -90, ne_x = 180, ne_y = 90, prev_zoom = 0; var sw_x_l = 0, sw_y_l = 0, ne_x_l = 0, ne_y_l = 0; var loading = false; var legendpos = 0; var inter1 = 0; var inter2 = 0; var inter1_index; var inter2_index; var showprojected = false; var changeShipContent = true; var geocoder; var addressmarker; var arVersion = navigator.appVersion.split("MSIE"); var version = parseFloat(arVersion[1]); var adUnitDiv; MyOverlay.prototype = new google.maps.OverlayView; MyOverlay.prototype.onAdd = function () { };
MyOverlay.prototype.onRemove = function () { }; MyOverlay.prototype.draw = function () { }; function MyOverlay(mymap) { this.setMap(mymap) }
function mapload() {
    if (getUrlParam("mmsi") != "") urlmmsi = parseInt(getUrlParam("mmsi")); if (getUrlParam("oldmmsi") != "") oldmmsi = parseInt(getUrlParam("oldmmsi")); if (getUrlParam("replaymmsi") != "") replaymmsi = parseInt(getUrlParam("replaymmsi")); if (getUrlParam("olddate") != "") olddate = getUrlParam("olddate"); if (getUrlParam("fleet") != "") fleet = getUrlParam("fleet"); if (getUrlParam("station") != "") station = parseInt(getUrlParam("station")); if (getUrlParam("stationpoints") != "") stationpoints = parseInt(getUrlParam("stationpoints"));
    if (getUrlParam("remember") != "") remember = getUrlParam("remember"); if (getUrlParam("inter1") != "") inter1 = parseInt(getUrlParam("inter1")); if (getUrlParam("inter2") != "") inter2 = parseInt(getUrlParam("inter2")); var mapcenterx = 30; var mapcentery = 25; var zoom = 2; if (readCookie("centerx") != null) mapcenterx = parseFloat(readCookie("centerx")); if (readCookie("centery") != null) mapcentery = parseFloat(readCookie("centery")); if (readCookie("zoom") != null) zoom = parseFloat(readCookie("zoom")); if (readCookie("maptype") != null) maptype =
readCookie("maptype"); if (maptype != google.maps.MapTypeId.SATELLITE && maptype != google.maps.MapTypeId.HYBRID && maptype != google.maps.MapTypeId.TERRAIN) maptype = google.maps.MapTypeId.ROADMAP; restoreCheckBoxes(); if (document.URL.search("/embed") == -1 || remember == "false" || readCookie("centerx") == null || urlmmsi > 0 || oldmmsi > 0) {
        if (getUrlParam("centerx") != "") mapcenterx = parseFloat(getUrlParam("centerx")); if (getUrlParam("centery") != "") mapcentery = parseFloat(getUrlParam("centery")); if (getUrlParam("zoom") != "") zoom = parseInt(getUrlParam("zoom"));
        if (getUrlParam("maptype") != "") maptype = getUrlParam("maptype")
    } if (document.URL.search("embed.aspx") == -1 && document.URL.search("/m/") == -1) document.getElementById("map_area").style.height = document.body.clientHeight - 160 + "px"; if (maptype == null || parseInt(maptype) == 0 || parseInt(maptype) > 3) maptype = google.maps.MapTypeId.ROADMAP; else if (parseInt(maptype) == 1) maptype = google.maps.MapTypeId.SATELLITE; else if (parseInt(maptype) == 2) maptype = google.maps.MapTypeId.HYBRID; else if (parseInt(maptype) == 3) maptype = google.maps.MapTypeId.TERRAIN;
    var center = new google.maps.LatLng(mapcentery, mapcenterx); var mapOptions = { zoom: zoom, center: center, mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DEFAULT, position: google.maps.ControlPosition.TOP_RIGHT }, streetViewControl: false, overviewMapControl: true, navigationControl: true, navigationControlOptions: { style: google.maps.NavigationControlStyle.DEFAULT, position: google.maps.ControlPosition.TOP_LEFT }, scaleControl: true, scaleControlOptions: { position: google.maps.ControlPosition.BOTTOM_LEFT },
        mapTypeId: maptype
    }; map = new google.maps.Map(document.getElementById("map_area"), mapOptions); if (document.URL.search("/m/") != -1) map.setOptions({ mapTypeControl: false }); if (document.getElementById("map_area").clientWidth > 500 && window.location.href.search("embed_comar") == -1) {
        adUnitDiv = document.createElement("div"); var adUnitOptions = { format: google.maps.adsense.AdFormat.HALF_BANNER, position: google.maps.ControlPosition.RIGHT_BOTTOM, map: map, visible: true, channelNumber: "8203674964", publisherId: "pub-1312707765089516" };
        adUnit = new google.maps.adsense.AdUnit(adUnitDiv, adUnitOptions)
    } geocoder = new google.maps.Geocoder; MapCursorControl(); overlay = new MyOverlay(map); shipcolor[0] = "lightgray"; shipcolor[1] = "pink"; shipcolor[3] = "cyan"; shipcolor[4] = "yellow"; shipcolor[6] = "blue"; shipcolor[7] = "lightgreen"; shipcolor[8] = "red"; shipcolor[9] = "magenta"; trackcolor[0] = "#808080"; trackcolor[1] = "#808080"; trackcolor[3] = "#00FFFF"; trackcolor[4] = "#FFFF00"; trackcolor[6] = "#0000FF"; trackcolor[7] = "#00AA00"; trackcolor[8] = "#FF0000"; trackcolor[9] = "#FF00FF";
    google.maps.event.addListener(map, "zoom_changed", function () {
        if (oldmmsi == 0 && replaymmsi == 0 && stationpoints == 0) { if (loading == false && map.getZoom() > 7 && map.getZoom() != 10 && map.getZoom() != 12 && map.getBounds().getSouthWest().lng() > sw_x && map.getBounds().getSouthWest().lat() > sw_y && map.getBounds().getNorthEast().lng() < ne_x && map.getBounds().getNorthEast().lat() < ne_y) setTimeout("refreshPositions();", 100); else setTimeout("getData();", 100); isOpenedInfo = false } else if (oldmmsi >= 2E3 || oldmmsi < 0) getOldPos(); else if (replaymmsi >
0) refreshPositions()
    }); google.maps.event.addListener(map, "dragend", function () { if (oldmmsi == 0 && stationpoints == 0 && loading == false && (map.getBounds().getSouthWest().lng() < sw_x || map.getBounds().getSouthWest().lat() < sw_y || map.getBounds().getNorthEast().lng() > ne_x || map.getBounds().getNorthEast().lat() > ne_y)) getData(); else if (oldmmsi >= 2E3) { isOpenedInfo = false; refreshPositions() } else if (oldmmsi == 0 && stationpoints == 0) refreshPositions() }); google.maps.event.addListener(map, "drag", function () {
        if (oldmmsi == 0 && stationpoints ==
0 && loading == false && (Math.abs(map.getBounds().getSouthWest().lng() - sw_x) > (ne_x - sw_x) / 2 || Math.abs(map.getBounds().getSouthWest().lat() - sw_y) > (ne_y - sw_y) / 2)) if (map.getZoom() > 12) refreshPositions(); else hideAll()
    }); google.maps.event.addListener(map, "mouseover", function () { showControls() }); google.maps.event.addListener(map, "mouseout", function (event) { if (!map.getBounds().contains(event.latLng)) hideControls() }); google.maps.event.addListener(map, "idle", function () {
        google.maps.event.clearListeners(map, "idle");
        if (oldmmsi == 0 && stationpoints == 0) if (urlmmsi != 0) focusVessel(urlmmsi); else getData(); else if (replaymmsi > 0) getReplay(); else if (oldmmsi > 0 && oldmmsi <= 999) getCoverage(); else if (oldmmsi >= 2E3 || oldmmsi < 0) getOldPos(); else if (stationpoints > 0) getStationPoints()
    }); infowindow = new google.maps.InfoWindow({ content: '<img width="300px" height="300px" src="images/loadinfo.gif"/>' }); google.maps.event.addListener(map, "click", function () {
        if (infowindow && isOpenedInfo) { infowindow.close(); isOpenedInfo = false } if (smallbox && isOpenedInfo) {
            smallbox.style.display =
"none"; isOpenedInfo = false
        } 
    })
}
function getData() {
    oldmmsi = 0; olddate = ""; var roundto = 5; if (map.getZoom() <= 6) roundto = 0.1; else if (map.getZoom() <= 10) roundto = 1; sw_x = Math.floor(map.getBounds().getSouthWest().lng() * roundto) / roundto; sw_y = Math.floor(map.getBounds().getSouthWest().lat() * roundto) / roundto; ne_x = Math.floor(map.getBounds().getNorthEast().lng() * roundto) / roundto + 1 / roundto; ne_y = Math.floor(map.getBounds().getNorthEast().lat() * roundto) / roundto + 1 / roundto; projection = overlay.getProjection(); isOpenedInfo = false; try { getDealer() } catch (err) { } if ((document.URL.search("/m/") ==
-1 && map.getZoom() < 7 || map.getZoom() < 6) && fleet == "") { getSections(); getShipCount(); hidePorts(); hideStations(); hideLights(); hidePoints(); hidePhotos(); hideWind(); return } loading = true; document.getElementById("loading").style.visibility = "visible"; if (document.getElementById("CheckProjected").checked) showprojected = true; else showprojected = false; downloadUrl("/ais/getjson.aspx?sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom() + "&fleet=" + fleet + "&station=" + station, "text", function (data, responseCode) {
    var jsonpos;
    if (data) {
        jsonpos = eval("(" + data + ")"); shipsshown = 0; realcount = 0; inter1_index = -1; inter2_index = -1; n = jsonpos.length; for (var i = 0; i < n; i++) {
            mmsi[i] = jsonpos[i][7]; if (x[mmsi[i]]) prevx[mmsi[i]] = x[mmsi[i]]; else prevx[mmsi[i]] = 0; if (y[mmsi[i]]) prevy[mmsi[i]] = y[mmsi[i]]; else prevy[mmsi[i]] = 0; y[mmsi[i]] = jsonpos[i][0]; x[mmsi[i]] = jsonpos[i][1]; shipname[i] = jsonpos[i][2]; shiptype[i] = jsonpos[i][3]; course[i] = jsonpos[i][4]; speed[i] = jsonpos[i][5]; flag[i] = jsonpos[i][6]; length[i] = jsonpos[i][8]; elapsed[i] = jsonpos[i][9]; if (mmsi[i] ==
inter1 && inter1 != 0) inter1_index = i; if (mmsi[i] == inter2 && inter2 != 0) inter2_index = i
        } 
    } refreshPositions(); document.getElementById("loading").style.visibility = "hidden"; loading = false; changeShipContent = false
}); getShipCount(); clearTimeout(counter); drawDistance(); window.setTimeout("countDown()", 1E3)
}
function getShipCount() { downloadUrl("/ais/getshipcountxml.aspx", "xml", function (data, responseCode) { if (data) { var xmlposition = data.documentElement.getElementsByTagName("V_SHIPCOUNT"); document.getElementById("totalShips").innerHTML = xmlposition[0].getAttribute("SHIPCOUNT") } else document.getElementById("totalShips").innerHTML = "0" }) }
function getAreas() {
    downloadUrl("/ais/getareasxml.aspx", "xml", function (data, responseCode) {
        var xmlposition = data.documentElement.getElementsByTagName("V_AREAS"); k = xmlposition.length; var sw_x, sw_y, ne_x, ne_y, shipcount, area_id, area_name, zoom; for (var i = 0; i < k; i++) {
            sw_x = parseFloat(xmlposition[i].getAttribute("SW_X")); sw_y = parseFloat(xmlposition[i].getAttribute("SW_Y")); ne_x = parseFloat(xmlposition[i].getAttribute("NE_X")); ne_y = parseFloat(xmlposition[i].getAttribute("NE_Y")); shipcount = parseInt(xmlposition[i].getAttribute("SHIPCOUNT"));
            area_id = xmlposition[i].getAttribute("AREA_ID"); area_name = xmlposition[i].getAttribute("AREA_NAME"); zoom = parseInt(xmlposition[i].getAttribute("ZOOM")); var html = '<div class="rect_back"></div>'; html += '<div id="areatext">' + area_name + ": " + shipcount + " Vessels.</div>"; area[i] = createAreaBox(area[i], sw_x, sw_y, ne_x, ne_y, html, zoom)
        } 
    })
}
function createAreaBox(div, sw_x1, sw_y1, ne_x1, ne_y1, content, newzoom) {
    if (!div) { div = document.createElement("div"); div.style.position = "absolute"; div.className = "rectangle"; overlay.getPanes().overlayImage.appendChild(div) } div.innerHTML = content; var sw = projection.fromLatLngToDivPixel(new google.maps.LatLng(sw_y1, sw_x1), map.getZoom()); var ne = projection.fromLatLngToDivPixel(new google.maps.LatLng(ne_y1, ne_x1), map.getZoom()); div.style.top = ne.y + "px"; div.style.left = sw.x + "px"; div.style.width = ne.x - sw.x + "px"; div.style.height =
sw.y - ne.y + "px"; var centerx = (sw_x1 + ne_x1) / 2; var centery = (sw_y1 + ne_y1) / 2; div.setAttribute("onclick", "clusterClick(" + centery + "," + centerx + "," + newzoom + ");"); div.onclick = function () { clusterClick(centery, centerx, newzoom) }; div.onmousedown = function () { sw_x = map.getBounds().getSouthWest().lng() }; div.style.display = "block"; return div
}
function getSections() {
    loading = true; document.getElementById("loading").style.visibility = "visible"; var url = "/ais/getsectionsxml_v3.aspx?sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom(); if (map.getZoom() < 5) url = "/ais/getsectionsxml_v3.aspx?zoom=" + map.getZoom(); downloadUrl(url, "xml", function (data, responseCode) {
        hideAll(); if (!data) return; var xmlposition = data.documentElement.getElementsByTagName("row"); k = xmlposition.length; var pts = []; var x, y, shipcount, html, width, height; for (var i =
0; i < k; i++) { x = parseFloat(xmlposition[i].getAttribute("X")); y = parseFloat(xmlposition[i].getAttribute("Y")); shipcount = parseInt(xmlposition[i].getAttribute("SHIPCOUNT")); var html = '<div class="rect_back"></div>'; if (map.getZoom() > 3) html += '<div id="areatext">' + shipcount + "</div>"; else if (map.getZoom() > 1) html += '<div id="areatext_small">' + shipcount + "</div>"; else html += ""; section[i] = createClusterBox(section[i], x, y, html) } document.getElementById("loading").style.visibility = "hidden"; loading = false
    })
}
function createClusterBox(div, x, y, content) {
    var zoom = map.getZoom(); var sw = overlay.getProjection().fromLatLngToDivPixel(new google.maps.LatLng(y + 8 / zoom, x), zoom); var ne = overlay.getProjection().fromLatLngToDivPixel(new google.maps.LatLng(y, x + 16 / zoom), zoom); if (sw.x >= ne.x || sw.y >= ne.y) return; if (!div) { div = document.createElement("div"); div.style.position = "absolute"; div.className = "rectangle"; overlay.getPanes().overlayImage.appendChild(div) } div.innerHTML = content; div.style.top = sw.y + "px"; div.style.left = sw.x + "px";
    div.style.width = ne.x - sw.x + "px"; div.style.height = ne.y - sw.y + "px"; var centerx = x + 8 / zoom; var centery = y + 4 / zoom; div.setAttribute("onclick", "clusterClick(" + centery + "," + centerx + ",7);"); div.onclick = function () { clusterClick(centery, centerx, 7) }; div.onmousedown = function () { sw_x = map.getBounds().getSouthWest().lng() }; div.style.display = "block"; return div
}
function clusterClick(centery, centerx, zoom) { if (sw_x == map.getBounds().getSouthWest().lng()) { map.setCenter(new google.maps.LatLng(centery, centerx)); map.setZoom(zoom); getData() } }
function getTracking(trackmmsi, tracktype) {
    if (trackmmsi == null || trackmmsi == 0) return; currenttrack = trackmmsi; currenttracktype = tracktype; if (infowindow && urlmmsi == 0 && oldmmsi == 0) infowindow.close(); hideWayPoints(); document.getElementById("loading").style.visibility = "visible"; downloadUrl("/ais/gettrackxml.aspx?mmsi=" + trackmmsi + "&date=" + olddate, "xml", function (data, responseCode) {
        var xmlposition = data.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("TIMESTAMP"); pts[i] = new google.maps.LatLng(lat, lon); if (i == 0 || shipsDistance(lat, lon, prevlat, prevlon) >= 15) { drawWayPoint(lon, lat, course, speed, timestamp, i); prevlat = lat; prevlon = lon } } if (track) track.setMap(null); track = new google.maps.Polyline({ path: pts,
    strokeColor: trackcolor[tracktype], strokeOpacity: 1, strokeWeight: 2
}); track.setMap(map); google.maps.event.addListener(map, "rightclick", function () { clearTracking() }); document.getElementById("loading").style.visibility = "hidden"
    })
} function clearTracking() { google.maps.event.clearListeners(map, "rightclick"); if (track) track.setMap(null); hideWayPoints(); currenttrack = 0 }
function getOldPos() {
    downloadUrl("getoldposxml.aspx?mmsi=" + oldmmsi + "&date=" + olddate, "xml", function (data, responseCode) {
        if (!data) return; projection = overlay.getProjection(); changeShipContent = true; n = 1; var xmlposition = data.documentElement.getElementsByTagName("OLDPOS"); var y1 = parseFloat(xmlposition[0].getAttribute("LAT")); var x1 = parseFloat(xmlposition[0].getAttribute("LON")); var shipname1 = xmlposition[0].getAttribute("SHIPNAME"); var shiptype1 = parseInt(xmlposition[0].getAttribute("SHIPTYPE")); var course1 =
parseFloat(xmlposition[0].getAttribute("COURSE")); var speed1 = parseFloat(xmlposition[0].getAttribute("SPEED")); var timestamp = xmlposition[0].getAttribute("TIMESTAMP"); map.panTo(new google.maps.LatLng(y1, x1)); drawMovingShip(oldmmsi, x1, y1, course1, speed1, shiptype1, shipname1, "", 0, 0, -1); createLegend(oldmmsi, y1, x1, shipname1, -1); document.getElementById("shownShips").innerHTML = "1"; document.getElementById("totalShips").innerHTML = "1"; if (firstload) {
            var infohtml = '<div id="infotitle"><span>' + shipname1 + "</span></div>";
            infohtml += '<div id="infowindow"><span>'; infohtml += "Position Recorded on: <h3>" + timestamp + " (UTC)</h3>"; infohtml += "<br/>Lat/Lon: " + y1 + " / " + x1; infohtml += "<br/>Speed/Course: " + speed1 / 10 + " kn / " + course1 + "&deg;"; if (olddate != "lastknown") infohtml += "<br/>Vessel's track shown for that day."; else infohtml += '<br/><a href="#" onclick="olddate=\'' + timestamp + "';getTracking(" + oldmmsi + "," + shiptype1 + ');">Show Track</a>'; infohtml += "</span></div>"; isOpenedInfo = false; setTimeout("isOpenedInfo = true;", 1E3); infowindow.setContent(infohtml);
            infowindow.setPosition(new google.maps.LatLng(y1, x1)); infowindow.open(map); firstload = false
        } if (olddate != "lastknown") getTracking(oldmmsi, shiptype1)
    })
}
function getCoverage() {
    document.getElementById("loading").style.visibility = "visible"; downloadUrl("/ais/getcoveragexml.aspx?station=" + oldmmsi, "xml", function (data, responseCode) {
        if (!data) return; projection = overlay.getProjection(); var lon, lat, station, station_name, counter; var xmlposition = data.documentElement.getElementsByTagName("STATIONS"); if (xmlposition[0]) {
            lon = parseFloat(xmlposition[0].getAttribute("LON_PUB")); lat = parseFloat(xmlposition[0].getAttribute("LAT_PUB")); station_name = xmlposition[0].getAttribute("STATION_NAME");
            map.setCenter(new google.maps.LatLng(lat, lon)); map.setZoom(7); if (markerstation) markerstation.setMap(null); markerstation = new google.maps.Marker({ map: map, position: new google.maps.LatLng(lat, lon), icon: "/ais/icons/antenna_green.png" })
        } xmlposition = data.documentElement.getElementsByTagName("COVERAGE"); t = xmlposition.length; var lat1, lon1, lat2, lon2; for (var i = 0; i < t; i++) {
            lon1 = parseFloat(xmlposition[i].getAttribute("LON")); lat1 = parseFloat(xmlposition[i].getAttribute("LAT")); counter = parseInt(xmlposition[i].getAttribute("COUNTER"));
            lon2 = lon1 + 0.2; lat2 = lat1 + 0.2; var pts = []; pts[0] = new google.maps.LatLng(lat1, lon1); pts[1] = new google.maps.LatLng(lat2, lon1); pts[2] = new google.maps.LatLng(lat2, lon2); pts[3] = new google.maps.LatLng(lat1, lon2); pts[4] = new google.maps.LatLng(lat1, lon1); var color = "#0000FF"; var trans = 0.1 * counter / 5; if (trans > 0.7) trans = 0.7; else if (trans < 0.1) trans = 0.1; areapoly[i] = new google.maps.Polygon({ path: pts, strokeColor: color, strokeOpacity: 1, strokeWeight: 1, fillColor: color, fillOpacity: trans }); areapoly[i].setMap(map)
        } document.getElementById("loading").style.visibility =
"hidden"
    })
}
function getPorts() {
    downloadUrl("/ais/getportxml.aspx?sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom(), "xml", function (data, responseCode) {
        if (!data) return; var xmlposition = data.documentElement.getElementsByTagName("V_PORTS"); portcount = xmlposition.length; var portx, porty, port_id, portname, portzoom, prevx = 0, prevy = 0; for (var i = 0; i < portcount; i++) {
            portx = parseFloat(xmlposition[i].getAttribute("CENTERX")); porty = parseFloat(xmlposition[i].getAttribute("CENTERY")); port_id = parseInt(xmlposition[i].getAttribute("PORT_ID")); portname =
xmlposition[i].getAttribute("PORT_NAME"); portzoom = parseInt(xmlposition[i].getAttribute("ZOOM")); if (portcount < 30 || shipsDistance(portx, porty, prevx, prevy) > 10) { drawPort(port_id, portx, porty, portname, i); prevx = portx; prevy = porty } 
        } 
    })
}
function getStations() {
    downloadUrl("/ais/getstationsxml.aspx?sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom(), "xml", function (data, responseCode) {
        if (!data) return; var xmlposition = data.documentElement.getElementsByTagName("V_STATION_STATUS"); stationcount = xmlposition.length; var sx, sy, station_id, station_name, station_status, prevx = 0, prevy = 0; for (var i = 0; i < stationcount; i++) {
            sx = parseFloat(xmlposition[i].getAttribute("LON_PUB")); sy = parseFloat(xmlposition[i].getAttribute("LAT_PUB"));
            station_id = parseInt(xmlposition[i].getAttribute("STATION_ID")); station_name = xmlposition[i].getAttribute("STATION_NAME"); station_status = xmlposition[i].getAttribute("STATUS"); if (stationcount < 30 || shipsDistance(sx, sy, prevx, prevy) > 10) { drawStation(station_id, sx, sy, station_name, station_status, i); prevx = sx; prevy = sy } 
        } 
    })
}
function getStationPoints() {
    downloadUrl("/ais/getstationpointsjson.aspx?station=" + stationpoints, "text", function (data, responseCode) {
        var jsonpos; if (data) {
            var iconA = new google.maps.MarkerImage("/ais/icons/bullet_green.png", null, null, new google.maps.Point(8, 8)); var iconB = new google.maps.MarkerImage("/ais/icons/bullet_red.png", null, null, new google.maps.Point(8, 8)); var iconC = new google.maps.MarkerImage("/ais/icons/bullet_yellow.png", null, null, new google.maps.Point(8, 8)); jsonpos = eval("(" + data + ")"); n = jsonpos.length;
            for (var i = 0; i < n; i++) {
                var lat = jsonpos[i][0]; var lon = jsonpos[i][1]; var status = jsonpos[i][2]; var image, title; if (status == 14) { image = iconC; title = "Base Station" } else if (status == 99) { image = iconB; title = "Class B" } else { image = iconA; title = "Class A" } if (i == 0) { stpoint[0] = new google.maps.Marker({ position: new google.maps.LatLng(lat, lon), map: map, icon: "/ais/icons/antenna_green.png", title: "Station id " + status }); map.setCenter(new google.maps.LatLng(lat, lon)); map.setZoom(9) } else stpoint[i] = new google.maps.Marker({ position: new google.maps.LatLng(lat,
lon), map: map, icon: image, title: title
                })
            } 
        } 
    })
}
function getLights() {
    downloadUrl("/ais/getlightsxml.aspx?sw_x=" + sw_x_l + "&sw_y=" + sw_y_l + "&ne_x=" + ne_x_l + "&ne_y=" + ne_y_l + "&zoom=" + map.getZoom(), "xml", function (data, responseCode) {
        if (!data) return; var xmlposition = data.documentElement.getElementsByTagName("row"); var lightcount = xmlposition.length; var lightx, lighty, light_id, light_name, fl, fn, color, interval, focal, range, characteristic, portzoom, prevx = 0, prevy = 0; hideLights(); for (var i = 0; i < lightcount; i++) {
            lightx = parseFloat(xmlposition[i].getAttribute("LON")); lighty =
parseFloat(xmlposition[i].getAttribute("LAT")); if (lightcount < 30 || (map.getBounds().getSouthWest().lng() < lightx && map.getBounds().getNorthEast().lng() > lightx || map.getBounds().getSouthWest().lng() > map.getBounds().getNorthEast().lng() && (map.getBounds().getSouthWest().lng() < lightx || map.getBounds().getNorthEast().lng() > lightx)) && map.getBounds().getSouthWest().lat() < lighty && map.getBounds().getNorthEast().lat() > lighty) {
                light_id = parseInt(xmlposition[i].getAttribute("ID")); light_name = xmlposition[i].getAttribute("N");
                fl = xmlposition[i].getAttribute("FL"); fn = parseInt(xmlposition[i].getAttribute("FN")); color = xmlposition[i].getAttribute("C"); interval = parseFloat(xmlposition[i].getAttribute("I")); focal = parseFloat(xmlposition[i].getAttribute("F")); range = parseInt(xmlposition[i].getAttribute("R")); characteristic = fl + (fn > 1 ? "(" + fn + ")" : "") + (color != "" ? " " + color : "") + (interval > 0 ? " " + interval + "s" : "") + (focal > 0 ? " " + focal + "m" : "") + (range > 0 ? " " + range + "M" : ""); drawLight(light_id, lightx, lighty, light_name, characteristic, i); prevx = lightx;
                prevy = lighty
            } 
        } 
    })
}
function getWind() {
    document.getElementById("loading").style.visibility = "visible"; downloadUrl("/ais/getwindxml.aspx?sw_x=" + sw_x_l + "&sw_y=" + sw_y_l + "&ne_x=" + ne_x_l + "&ne_y=" + ne_y_l + "&zoom=" + map.getZoom() + "&time=" + document.getElementById("WindList").value, "xml", function (data, responseCode) {
        if (!data) { document.getElementById("loading").style.visibility = "hidden"; return } var xmlposition = data.documentElement.getElementsByTagName("row"); var windcount = xmlposition.length; var wx, wy, ws, wa, wt, prevx = 0, prevy, prevs, preva;
        hideWind(); for (var i = 0; i < windcount; i++) {
            wx = parseFloat(xmlposition[i].getAttribute("LON")); wy = parseFloat(xmlposition[i].getAttribute("LAT")); if (windcount < 30 || (map.getBounds().getSouthWest().lng() < wx && map.getBounds().getNorthEast().lng() > wx || map.getBounds().getSouthWest().lng() > map.getBounds().getNorthEast().lng() && (map.getBounds().getSouthWest().lng() < wx || map.getBounds().getNorthEast().lng() > wx)) && map.getBounds().getSouthWest().lat() < wy && map.getBounds().getNorthEast().lat() > wy) {
                ws = parseInt(xmlposition[i].getAttribute("S"));
                wa = parseInt(xmlposition[i].getAttribute("A")); wt = parseInt(xmlposition[i].getAttribute("T")); drawWind(wx, wy, ws, wa, wt, i); if (map.getZoom() >= 11 && i > 0) { if (prevx != 0) drawWind((wx + prevx) / 2, (wy + prevy) / 2, Math.floor((ws + prevs) / 2), Math.abs(wa - preva) < 180 ? Math.floor((wa + preva) / 2) : wa, wt, i + windcount); prevx = wx; prevy = wy; prevs = ws; preva = wa } 
            } 
        } document.getElementById("loading").style.visibility = "hidden"
    })
}
function getPoints() {
    email = readCookie("EMAIL"); if (email == "") return; downloadUrl("getmypointsxml.aspx?email=" + email, "xml", function (data, responseCode) {
        if (!data) return; var xmlposition = data.documentElement.getElementsByTagName("row"); pointcount = xmlposition.length; var point_id, point_name, pointy, pointx, color; for (var i = 0; i < pointcount; i++) {
            pointx = parseFloat(xmlposition[i].getAttribute("LON")); pointy = parseFloat(xmlposition[i].getAttribute("LAT")); point_id = parseInt(xmlposition[i].getAttribute("POINT_ID")); point_name =
xmlposition[i].getAttribute("POINT_NAME"); color = xmlposition[i].getAttribute("MARKER_COLOR"); drawPoint(point_id, pointx, pointy, point_name, color, i)
        } 
    })
}
function getPhotos() {
    downloadUrl("/ais/getphotosxml.aspx?sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom(), "xml", function (data, responseCode) {
        if (!data) return; hidePhotos(); var xmlposition = data.documentElement.getElementsByTagName("row"); var photocount = xmlposition.length; var mmsi, photox, photoy, photoid, photoname, copyright, date_taken, place, vote_average, vote_counter, photoprevx = 0, photoprevy = 0; for (var i = 0; i < photocount; i++) {
            mmsi = parseInt(xmlposition[i].getAttribute("MMSI")); photoy =
parseFloat(xmlposition[i].getAttribute("LAT")); photox = parseFloat(xmlposition[i].getAttribute("LON")); photoid = parseInt(xmlposition[i].getAttribute("PHOTOID")); photoname = xmlposition[i].getAttribute("SHIPNAME"); copyright = xmlposition[i].getAttribute("COPYRIGHT"); date_taken = xmlposition[i].getAttribute("DATE_TAKEN"); place = xmlposition[i].getAttribute("PLACE"); vote_average = parseInt(xmlposition[i].getAttribute("VOTE_AVERAGE")); vote_counter = parseInt(xmlposition[i].getAttribute("VOTE_COUNTER")); if (shipsDistance(photoy,
photox, photoprevy, photoprevx) > 200) { drawPhoto(mmsi, photoid, photox, photoy, photoname, copyright, date_taken, place, vote_average, vote_counter, i, false); photoprevx = photox; photoprevy = photoy } else drawPhoto(mmsi, photoid, photox, photoy, photoname, copyright, date_taken, place, vote_average, vote_counter, i, true)
        } 
    })
}
function focusPort(port_id) {
    if (port_id == 0) port_id = document.getElementById("PORT").value; downloadUrl("/ais/getportxml.aspx?port_id=" + port_id, "xml", function (data, responseCode) {
        var xmlposition = data.documentElement.getElementsByTagName("V_PORTS"); if (xmlposition.length == 0) return; var lon, lat, zoom; lon = parseFloat(xmlposition[0].getAttribute("CENTERX")); lat = parseFloat(xmlposition[0].getAttribute("CENTERY")); zoom = parseInt(xmlposition[0].getAttribute("ZOOM")); map.setCenter(new google.maps.LatLng(lat, lon)); map.setZoom(zoom -
2)
    })
}
function focusArea(area_id) {
    if (area_id == 0) area_id = document.getElementById("AREA").value; downloadUrl("/ais/getareaxml.aspx?area_id=" + area_id, "xml", function (data, responseCode) {
        var xmlposition = data.documentElement.getElementsByTagName("row"); if (xmlposition.length == 0) return; var lon, lat, zoom; lon = parseFloat(xmlposition[0].getAttribute("CENTERX")); lat = parseFloat(xmlposition[0].getAttribute("CENTERY")); zoom = parseInt(xmlposition[0].getAttribute("ZOOM")); map.setCenter(new google.maps.LatLng(lat, lon)); map.setZoom(zoom -
2)
    })
}
function focusVessel(vessel_id) {
    if (vessel_id == 0) vessel_id = document.getElementById("searchvessel").value; downloadUrl("/ais/getvesselxml.aspx?mmsi=" + vessel_id + "&id=" + Math.random(), "xml", function (data, responseCode) {
        var xmlposition = data.documentElement.getElementsByTagName("V_POS"); if (xmlposition.length == 0) { getData(); return } var lon, lat; lon = parseFloat(xmlposition[0].getAttribute("LON")); lat = parseFloat(xmlposition[0].getAttribute("LAT")); urlmmsi = vessel_id; firstload = true; if (map.getZoom() < 14) map.setZoom(14); map.panTo(new google.maps.LatLng(lat,
lon)); firstload = true; getData()
    })
}
function getSound() {
    email = readCookie("EMAIL"); downloadUrl("/ais/getsoundxml.aspx?email=" + email, "xml", function (data, responseCode) {
        if (!data) return; var mmsi, lat, lon, shipname, portname, movetypeint; try {
            var xmlposition = data.documentElement.getElementsByTagName("V_SOUNDS"); if (xmlposition.length == 0) return; mmsi = parseInt(xmlposition[0].getAttribute("MMSI")); lon = parseFloat(xmlposition[0].getAttribute("LON")); lat = parseFloat(xmlposition[0].getAttribute("LAT")); shipname = xmlposition[0].getAttribute("SHIPNAME"); portname =
xmlposition[0].getAttribute("PORT_NAME"); movetypeint = parseInt(xmlposition[0].getAttribute("MOVETYPE"))
        } catch (err) { return } if (lat && lon) { urlmmsi = mmsi; firstload = true; if (movetypeint == 0) movetype = " - Arrival at: " + portname; else movetype = " - Departure from: " + portname; if (map.getZoom() > 10) { map.setZoom(10); map.setCenter(new google.maps.LatLng(lat, lon)) } else { map.setZoom(10); map.setCenter(new google.maps.LatLng(lat, lon)); firstload = true; getData() } } 
    })
}
function refreshOnZoom() { shipsshown = 0; for (i = 0; i < n; i++) createship(mmsi[i], y[mmsi[i]], x[mmsi[i]], status[i], course[i], speed[i], shiptype[i], shipname[i], flag[i], length[i], elapsed[i], i) }
function refreshPositions() {
    var sw_x1 = map.getBounds().getSouthWest().lng() - 50 / (map.getZoom() * map.getZoom()); var sw_y1 = map.getBounds().getSouthWest().lat() - 50 / (map.getZoom() * map.getZoom()); var ne_x1 = map.getBounds().getNorthEast().lng() + 50 / (map.getZoom() * map.getZoom()); var ne_y1 = map.getBounds().getNorthEast().lat() + 50 / (map.getZoom() * map.getZoom()); projection = overlay.getProjection(); shipsshown = 0; totalshipno = n; if (document.getElementById("CheckProjected").checked) showprojected = true; else showprojected =
false; hideAll(); for (i = 0; i < n; i++) { if ((x[mmsi[i]] > sw_x1 && x[mmsi[i]] < ne_x1 || sw_x1 > ne_x1 && (x[mmsi[i]] > sw_x1 || x[mmsi[i]] < ne_x1)) && y[mmsi[i]] > sw_y1 && y[mmsi[i]] < ne_y1) createship(mmsi[i], y[mmsi[i]], x[mmsi[i]], course[i], speed[i], shiptype[i], shipname[i], flag[i], length[i], elapsed[i], i); if (mmsi[i] == urlmmsi && urlmmsi != 0 && firstload == true) { currenttrack = urlmmsi; currenttracktype = shiptype[i]; showInfoWindow(mmsi[i], shipname[i]); firstload = false } } getTracking(currenttrack, currenttracktype); if (inter1 > 0 && inter2 > 0 && inter1_index >=
0 && inter1_index >= 0) drawIntersection(inter1_index, inter2_index); if (map.getZoom() < 10 && map.getZoom() >= 7 && fleet == "") getAreas(); document.getElementById("shownShips").innerHTML = shipsshown; if (remember != "false") storeUserSettings(); refreshLayers()
}
function refreshLayers() {
    if (map.getBounds().getSouthWest().lng() < sw_x_l || map.getBounds().getSouthWest().lat() < sw_y_l || map.getBounds().getNorthEast().lng() > ne_x_l || map.getBounds().getNorthEast().lat() > ne_y_l) { sw_x_l = Math.floor(map.getBounds().getSouthWest().lng() / 10) * 10; sw_y_l = Math.floor(map.getBounds().getSouthWest().lat() / 10) * 10; ne_x_l = Math.floor(map.getBounds().getNorthEast().lng() / 10) * 10 + 10; if (ne_x_l < -170) ne_x_l = 180; ne_y_l = Math.floor(map.getBounds().getNorthEast().lat() / 10) * 10 + 10 } if (document.getElementById("CheckPorts").checked) getPorts();
    if (document.getElementById("CheckStations").checked) getStations(); if (document.getElementById("CheckPoints").checked) getPoints(); if (document.getElementById("CheckPhotos").checked) getPhotos(); if (document.getElementById("CheckLights").checked) getLights(); if (document.getElementById("CheckWind").checked) getWind()
}
function refreshFleet() { email = readCookie("EMAIL"); if (document.getElementById("CheckFleet").checked && email != "") { fleet = email; if (map.getZoom() != 2) map.setZoom(2); else getData() } else if (email != "") { fleet = ""; getData() } }
function createship(currentmmsi, lat, lon, angle, speed, shiptype, shipname, flag, length, elapsed, shipindex) {
    var mindistance = 8; var mintextdistance = 30; if (n > 300) mindistance = 30; if (currentmmsi == urlmmsi || currentmmsi == oldmmsi || document.getElementById("CheckType0").checked && (shiptype == 0 || shiptype == 2 || shiptype == 5) || document.getElementById("CheckType1").checked && shiptype == 1 || document.getElementById("CheckType3").checked && shiptype == 3 || document.getElementById("CheckType4").checked && shiptype == 4 || document.getElementById("CheckType6").checked &&
shiptype == 6 || document.getElementById("CheckType7").checked && shiptype == 7 || document.getElementById("CheckType8").checked && shiptype == 8 || document.getElementById("CheckType9").checked && shiptype == 9) if (currentmmsi == urlmmsi || currentmmsi == oldmmsi || speed > 5 && document.getElementById("CheckMoving").checked || speed <= 5 && document.getElementById("CheckStopped").checked) {
        if (true) {
            if (document.getElementById("CheckLegends").checked && (shipindex == 0 || map.getZoom() >= 12 || shipsDistance(lat, lon, previous_lat, previous_lon) > mintextdistance)) createLegend(currentmmsi,
lat, lon, shipname, shipindex); drawMovingShip(currentmmsi, lon, lat, angle, speed, shiptype, shipname, flag, length, elapsed, shipindex); previous_lat = lat; previous_lon = lon
        } if (map.getBounds().getSouthWest().lng() < lon && map.getBounds().getSouthWest().lat() < lat && map.getBounds().getNorthEast().lng() > lon && map.getBounds().getNorthEast().lat() > lat) shipsshown++
    } 
}
function drawMovingShip(currentmmsi, x, y, angle, speed, shiptype, shipname, flag, length, elapsed, shipindex) {
    realcount++; if (!ship[currentmmsi] || changeShipContent) {
        var imgsrc; if (speed <= 5 || shiptype == 1) imgsrc = "shipicons/" + shipcolor[shiptype] + "0.png"; else { if (angle >= 360) angle = 0; var angle5 = Math.floor(angle / 5) * 5; imgsrc = "/ais/shipicons/" + shipcolor[shiptype] + "1_"; if (length > 0 && length <= 80) imgsrc += "s_"; else if (length > 150) imgsrc += "l_"; imgsrc += angle5 + ".png" } var offsetx = 0; var offsety = 36 * 24; if (speed > 5 && shiptype != 1) {
            offsety =
Math.floor((angle + 4) / 10) * 24; if (offsety >= 36 * 24) offsety = 0
        } if (shiptype == 0) offsetx = 4 * 24; else if (shiptype == 3) offsetx = 5 * 24; else if (shiptype == 4) offsetx = 2 * 24; else if (shiptype == 6) offsetx = 0; else if (shiptype == 7) offsetx = 3 * 24; else if (shiptype == 8) offsetx = 1 * 24; else if (shiptype == 9) offsetx = 6 * 24; else if (shiptype == 1) offsetx = 7 * 24; var size = "medium"; if (speed > 5 && shiptype != 1 && length > 0 && length <= 80) size = "small"; else if (speed > 5 && shiptype != 1 && length > 150) size = "large"; var shiphtml = "<div "; if (version >= 5.5 && version < 7 && document.body.filters) shiphtml +=
' id="ship" style="display:inline-block;width:24px;height:24px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader' + "(src='" + imgsrc + "', sizingMethod='scale');\"" + ' title="' + shipname.replace('"', "") + " [" + flag + "] " + speed / 10 + " knots / " + angle + '&deg;"' + ' onclick="showInfoWindow(' + currentmmsi + ",'" + shipname + "',0," + shipindex + ');">'; else {
            shiphtml += ' id="ship_' + size + '" style="background-position:-' + offsetx + "px -" + offsety + 'px;"' + ' title="' + shipname.replace('"', "") + " [" + flag + "] " + speed / 10 + " knots / " +
angle + '&deg;"' + ' onclick="showInfoWindow(' + currentmmsi + ",'" + shipname + "',0," + shipindex + ');"' + ' oncontextmenu="initDistance(' + y + "," + x + "," + speed / 10 + ');return false;"'; if (elapsed > 30) shiphtml += ' class="ship_trans"'; shiphtml += ">"
        } shiphtml += "</div>"
    } ship[currentmmsi] = createMapDiv(ship[currentmmsi], x, y, -12, -12, shiphtml, 5, changeShipContent); if (showprojected) predictedpoly[shipindex] = drawPredicted(shipindex, parseInt(document.getElementById("ProjectedMins").value))
}
function drawWayPoint(x, y, angle, speed, timestamp, wpindex) {
    var angle5 = Math.floor(angle / 5) * 5; var imgsrc = "/ais/shipicons/waypoint_" + angle5 + ".png"; var offsetx = 0; var offsety = Math.floor((angle + 2) / 5) * 11; if (offsety >= 360 / 5 * 11) offsety = 0; var wphtml = "<div "; if (version >= 5.5 && version < 7 && document.body.filters) wphtml += ' id="ship" style="display:inline-block;width:11px;height:11px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader' + "(src='" + imgsrc + "', sizingMethod='scale');\"" + ' title="' + speed / 10 + " knots / " +
angle + "&deg;\n" + timestamp + '">'; else wphtml += ' id="ship_wp" style="background-position:-' + offsetx + "px -" + offsety + 'px;"' + '" title="' + speed / 10 + " knots / " + angle + "&deg;\n" + timestamp + '">'; wphtml += "</div>"; wp[wpindex] = createMapDiv(wp[wpindex], x, y, -6, -6, wphtml, 5, true)
}
function drawPort(port_id, x, y, portname, portindex) {
    var imgsrc = "icons/anchor.png"; var shiphtml = '<div id="ship"><span '; if (version >= 5.5 && version < 7 && document.body.filters) shiphtml += ' style="display:inline-block;width:13px;height:18px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader' + "(src='" + imgsrc + "', sizingMethod='scale');\"" + ' title="' + portname + " (Port)" + '" onclick="showInfoPort(' + port_id + ",'" + portname + "'," + x + "," + y + ');">'; else shiphtml += '><img width="13" height="18" src="' + imgsrc + '" title="' +
portname + " (Port)" + '" onclick="showInfoPort(' + port_id + ",'" + portname + "'," + x + "," + y + ');">'; shiphtml += "</span></div>"; portdiv[port_id] = createMapDiv(portdiv[port_id], x, y, -6, -10, shiphtml, 5, false)
}
function drawStation(station_id, x, y, stationname, stationstatus, stationindex) {
    var imgsrc; if (stationstatus == "ONLINE") imgsrc = "icons/antenna_green.png"; else imgsrc = "icons/antenna_red.png"; var shiphtml = '<div id="ship"><span '; if (version >= 5.5 && version < 7 && document.body.filters) shiphtml += ' style="display:inline-block;width:13px;height:18px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader' + "(src='" + imgsrc + "', sizingMethod='scale');\"" + ' title="' + stationname + " (Station id: " + station_id + ")" + '" onclick="showInfoStation(' +
station_id + ",'" + stationname + "'," + x + "," + y + ');">'; else shiphtml += '><img width="13" height="18" src="' + imgsrc + '" title="' + stationname + " (Station id: " + station_id + ")" + '" onclick="showInfoStation(' + station_id + ",'" + stationname + "'," + x + "," + y + ');">'; shiphtml += "</span></div>"; stationdiv[station_id] = createMapDiv(stationdiv[station_id], x, y, -6, -18, shiphtml, 5, false)
}
function drawLight(light_id, x, y, light_name, characteristic, lightindex) { var imgsrc = "icons/light_red_25.png"; var shiphtml = '<div id="ship"><span><img width="10" height="25" src="' + imgsrc + '" title="' + light_name + " &#13;" + characteristic + '" onclick="showInfoUrl(\'' + light_name + " (Light)','lightinfo.aspx?light_id=" + light_id + "'," + x + "," + y + ');">' + "</span></div>"; lightdiv[light_id] = createMapDiv(lightdiv[light_id], x, y, -5, -25, shiphtml, 5, false) }
function drawWind(x, y, speed, angle, temp, windex) {
    if (speed > 90) speed = 90; var offsetx = 0; var divid = ""; if (speed <= 42) { offsetx = Math.floor((speed + 2) / 5) * 40; divid = "wind_low" } else { offsetx = Math.floor((speed + 2 - 45) / 5) * 40; divid = "wind_high" } if (angle > 352) angle = 352; var offsety = Math.floor((angle + 7) / 15) * 40; var dir; if (angle >= 21 && angle <= 69) dir = "NE"; else if (angle >= 70 && angle <= 110) dir = "E"; else if (angle >= 111 && angle <= 159) dir = "SE"; else if (angle >= 160 && angle <= 200) dir = "S"; else if (angle >= 201 && angle <= 249) dir = "SW"; else if (angle >= 250 &&
angle <= 290) dir = "W"; else if (angle >= 291 && angle <= 339) dir = "NW"; else dir = "N"; var select_wind = document.getElementById("WindList"); var shiphtml = '<div id="' + divid + '" style="background-position:-' + offsetx + "px -" + offsety + 'px;"' + '" title="Wind: ' + speed + " knots, " + dir + " (" + angle + "&deg;), " + temp + "&deg;C (" + select_wind.options[select_wind.selectedIndex].text + ')">' + "</div>"; winddiv[windex] = createMapDiv(winddiv[windex], x, y, -20, -20, shiphtml, 5, true)
}
function drawPoint(point_id, x, y, point_name, color, pointindex) { if (color == "") color = "red"; var imgsrc = "icons/marker_" + color + ".png"; var shiphtml = '<div id="ship"><span '; shiphtml += '><img width="12" height="20" src="' + imgsrc + '" title="' + point_name + " (My Point)" + '" onclick="showInfoPoint(' + point_id + ",'" + point_name + "'," + x + "," + y + ');">'; shiphtml += "</span></div>"; mypointdiv[point_id] = createMapDiv(mypointdiv[point_id], x, y, -6, -20, shiphtml, 5, false) }
function drawPhoto(mmsi, photoid, photox, photoy, photoname, copyright, date_taken, place, vote_average, vote_counter, photoindex, icon) {
    var isnew = !photodiv[photoid] || icon == true && photodiv[photoid].innerHTML.indexOf("<div") == 0 || icon == false && photodiv[photoid].innerHTML.indexOf("<img") == 0; var photohtml = ""; if (isnew) {
        if (!icon) { var imgsrc = "http://photos.marinetraffic.com/ais/showphoto.aspx?size=thumb&photoid=" + photoid; photohtml = '<div id="photoonmap">'; photohtml += '<img width="50" height="36" src="' + imgsrc } else photohtml =
'<img style="cursor:pointer;" src="icons/photomap.png"'; photohtml += '" title="' + photoname + '" onclick="showInfoPhoto(' + mmsi + "," + photoid + "," + photox + "," + photoy + ",'" + photoname + "','" + copyright + "','" + date_taken + "','" + place + "'," + vote_average + "," + vote_counter + ');"/>'; if (!icon) photohtml += "</div>"
    } var d; if (icon) photodiv[photoid] = createMapDiv(photodiv[photoid], photox, photoy, -8, -8, photohtml, 5, isnew); else photodiv[photoid] = createMapDiv(photodiv[photoid], photox, photoy, -25, -18, photohtml, 5, isnew)
}
function shipsDistance(x1, y1, x2, y2) { var ship1 = overlay.getProjection().fromLatLngToDivPixel(new google.maps.LatLng(x1, y1), map.getZoom()); var ship2 = overlay.getProjection().fromLatLngToDivPixel(new google.maps.LatLng(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 }
function showInfoWindow(mmsi, shipname, extra, shipindex) {
    if (mmsi && replaymmsi == 0) {
        if (!infowindow) infowindow = new google.maps.InfoWindow({ content: '<div id="infowindow" style="text-align:center"><br/><br/><img src="images/loadinfo.gif"/></div>' }); else infowindow.close(); isOpenedInfo = false; setTimeout("isOpenedInfo = true;", 1E3); var header = window.location.href.search("embed_comar") == -1; if (document.URL.search("/m/") == -1 && document.getElementById("map_area").clientHeight > 300) {
            var infohtml = '<div id="infotitle"><span>' +
shipname.replace('"', "") + '</span></div><div id="infowindow" style="text-align:center"><br/><br/><img src="images/loadinfo.gif"/></div>'; infowindow.setContent(infohtml); infowindow.setPosition(new google.maps.LatLng(y[mmsi], x[mmsi])); infowindow.open(map); var url = "shipinfo.aspx?mmsi=" + mmsi + "&header=" + header + "&shipname=" + shipname.replace('"', "") + "&lat=" + x[mmsi] + "&lon=" + y[mmsi]; if (extra) url += "&extra=true"; downloadUrl(url, "text", function (html, responseCode) {
    var infohtml = '<div id="infotitle"><span>' + shipname.replace('"',
"") + movetype + "</span></div>"; infohtml += '<div id="infowindow"><span>'; infohtml += html; infohtml += "</span></div>"; infowindow.setContent(infohtml); movetype = ""
})
        } else {
            var infohtml = '<div id="smallbox" onclick=\'document.location="shipdetails.aspx?mmsi=' + mmsi + "\";'><b>" + shipname.replace('"', "") + "</b>"; if (flag[shipindex] != "--") infohtml += '&nbsp;<img src="flags/png/' + flag[shipindex] + '.png"/>'; infohtml += "<br/>" + speed[shipindex] / 10 + " knots / " + course[shipindex] + "&deg;"; infohtml += "<br/>" + elapsed[shipindex] + " minute(s) ago</div>";
            smallbox = createMapDiv(smallbox, x[mmsi], y[mmsi], -80, -90, infohtml, 6, true)
        } 
    } 
}
function showInfoPhoto(mmsi, photoid, x, y, photoname, copyright, date_taken, place, vote_average, vote_counter) {
    isOpenedInfo = false; setTimeout("isOpenedInfo = true;", 1E3); var infohtml = '<div id="infotitle">' + photoname + "</div>"; infohtml += '<div id="infophoto">'; infohtml += '<div id="infopic"><a href="showallphotos.aspx?mmsi=' + mmsi + "&photoid=" + photoid + '"><img src="http://photos.marinetraffic.com/ais/showphoto.aspx?size=thumb&photoid=' + photoid + '"/></a></div>'; infohtml += '<div id="infotext" style="font-size:10pt;">&copy; ' +
copyright + "<br/>" + date_taken + "<br/>Place: " + place + "<br/>"; if (vote_average > 0) infohtml += '<img src="icons/' + vote_average + 'star.gif"/> (' + vote_counter + " votes)"; infohtml += "</div>"; infowindow.setContent(infohtml); infowindow.setPosition(new google.maps.LatLng(y, x)); infowindow.open(map)
}
function showInfoPort(port_id, portname, x, y) { isOpenedInfo = false; setTimeout("isOpenedInfo = true;", 1E3); var header = window.location.href.search("embed_comar") == -1; downloadUrl("portinfo.aspx?port_id=" + port_id + "&header=" + header, "text", function (data, responseCode) { var infohtml = '<div id="infotitle"><span>' + portname + " (Port)</span></div>"; infohtml += '<div id="infowindow"><span>'; infohtml += data; infohtml += "</span></div>"; infowindow.setContent(infohtml); infowindow.setPosition(new google.maps.LatLng(y, x)); infowindow.open(map) }) }
function showInfoUrl(title, url, x, y) {
    isOpenedInfo = false; setTimeout("isOpenedInfo = true;", 1E3); var header = window.location.href.search("embed_comar") == -1; var infohtml = '<div id="infotitle"><span>' + title.replace('"', "") + '</span></div><div id="infowindow" style="text-align:center"><br/><br/><img src="images/loadinfo.gif"/></div>'; infowindow.setContent(infohtml); infowindow.setPosition(new google.maps.LatLng(y, x)); infowindow.open(map); downloadUrl(url, "text", function (html, responseCode) {
        var infohtml = '<div id="infotitle"><span>' +
title.replace('"', "") + movetype + "</span></div>"; infohtml += '<div id="infowindow"><span>'; infohtml += html; infohtml += "</span></div>"; infowindow.setContent(infohtml)
    })
}
function showInfoPoint(point_id, pointname, x, y) { isOpenedInfo = false; setTimeout("isOpenedInfo = true;", 1E3); downloadUrl("pointinfo.aspx?point_id=" + point_id, "text", function (data, responseCode) { var infohtml = '<div id="infotitle"><span>' + pointname + " (My Point)</span></div>"; infohtml += '<div id="infowindow"><span>'; infohtml += data; infohtml += "</span></div>"; infowindow.setContent(infohtml); infowindow.setPosition(new google.maps.LatLng(y, x)); infowindow.open(map) }) }
function showInfoStation(station_id, station_name, x, y) {
    isOpenedInfo = false; setTimeout("isOpenedInfo = true;", 1E3); var header = window.location.href.search("embed_comar") == -1; downloadUrl("stationinfo.aspx?station_id=" + station_id + "&header=" + header + "&id=" + Math.random(), "text", function (data, responseCode) {
        var infohtml = '<div id="infotitle"><span>' + station_name + " (Receiving Station Id: " + station_id + ")</span></div>"; infohtml += '<div id="infowindow"><span>'; infohtml += data; infohtml += "</span></div>"; infowindow.setContent(infohtml);
        infowindow.setPosition(new google.maps.LatLng(y, x)); infowindow.open(map)
    })
}
function createLegend(mmsi, y, x, titletext, shipindex) {
    var lowertext = titletext.toLowerCase(); var front_style = "texttip"; var back_style = "texttip_back"; if (map.getMapTypeId() == google.maps.MapTypeId.HYBRID || map.getMapTypeId() == google.maps.MapTypeId.SATELLITE) { var front_style = "texttip_back"; var back_style = "texttip" } var title_front = '<div id="' + back_style + '" style="top:0px;left:0px;">' + lowertext + "</div>"; title_front += '<div id="' + back_style + '" style="top:0px;left:2px;">' + lowertext + "</div>"; title_front += '<div id="' +
back_style + '" style="top:2px;left:0px;">' + lowertext + "</div>"; title_front += '<div id="' + back_style + '" style="top:2px;left:2px;">' + lowertext + "</div>"; title_front += '<div id="' + front_style + '" style="top:1px;left:1px;">' + lowertext + "</div>"; var offsetx = 0; var offsety = 4; if (legendpos == 1) offsetx = -titletext.length * 6; else if (legendpos == 2) { offsetx = -titletext.length * 6; offsety = -7 } else if (legendpos == 3) { offsetx = -titletext.length * 6; offsety = -18 } else if (legendpos == 4) offsety = -18; else if (legendpos == 5) {
        offsetx = 8; offsety =
-6; legendpos = -1
    } legendpos++; texttip[mmsi] = createMapDiv(texttip[mmsi], x, y, offsetx, offsety, title_front, 1, false)
}
function createMapDiv(div, x, y, offsetx, offsety, content, pane, changeContent) {
    if (!div) {
        div = document.createElement("div"); div.style.position = "absolute"; var mappane; if (pane == 0) mappane = overlay.getPanes().mapPane; else if (pane == 1) mappane = overlay.getPanes().overlayLayer; else if (pane == 2) mappane = overlay.getPanes().overlayShadow; else if (pane == 3) mappane = overlay.getPanes().overlayImage; else if (pane == 4) mappane = overlay.getPanes().floatShadow; else if (pane == 5) mappane = overlay.getPanes().overlayMouseTarget; else if (pane ==
6) mappane = overlay.getPanes().floatPane; mappane.appendChild(div); div.innerHTML = content
    } else if (changeContent) div.innerHTML = content; var mapoffset = projection.fromLatLngToDivPixel(new google.maps.LatLng(y, x), map.getZoom()); div.style.top = mapoffset.y + offsety + "px"; div.style.left = mapoffset.x + offsetx + "px"; div.style.display = "block"; return div
}
function hideAll() {
    hideShips(); hideAreaLegends(); hideLegends(); hideWayPoints(); hidePorts(); hideStations(); hidePoints(); if (track) track.setMap(null); if (markerstation) markerstation.setMap(null); for (var i in predictedpoly) if (predictedpoly[i]) predictedpoly[i].setMap(null); for (var i in areapoly) if (areapoly[i]) areapoly[i].setMap(null); for (var i in stpoint) if (stpoint[i]) stpoint[i].setMap(null); for (var i in area) if (area[i]) area[i].style.display = "none"; for (var i in section) if (section[i]) section[i].style.display =
"none"
} function showLegends() { if (document.getElementById("CheckLegends").checked) refreshPositions() } function hideLegends() { for (var i in texttip) if (texttip[i]) texttip[i].style.display = "none" } function hideAreaLegends() { for (var i in areatext) if (areatext[i]) areatext[i].style.display = "none" } function hideShips() { for (var i in ship) if (ship[i]) ship[i].style.display = "none" } function hideWayPoints() { for (var i in wp) if (wp[i]) wp[i].style.display = "none"; wp = new Array }
function changeLegends() { if (document.getElementById("CheckLegends").checked) showLegends(); else hideLegends() } function changePorts() { if (document.getElementById("CheckPorts").checked) getPorts(); else hidePorts() } function changeStations() { if (document.getElementById("CheckStations").checked) getStations(); else hideStations() } function changeLights() { if (document.getElementById("CheckLights").checked) getLights(); else hideLights() }
function changeWind() { if (document.getElementById("CheckWind").checked) getWind(); else hideWind() } function changePoints() { if (document.getElementById("CheckPoints").checked) getPoints(); else hidePoints() } function changePhotos() { if (document.getElementById("CheckPhotos").checked) getPhotos(); else hidePhotos() } function hidePorts() { for (var i in portdiv) if (portdiv[i]) portdiv[i].style.display = "none" } function hideStations() { for (var i in stationdiv) if (stationdiv[i]) stationdiv[i].style.display = "none" }
function hideLights() { for (var i in lightdiv) if (lightdiv[i]) lightdiv[i].style.display = "none" } function hideWind() { for (var i in winddiv) if (winddiv[i]) winddiv[i].style.display = "none" } function hidePoints() { for (var i in mypointdiv) if (mypointdiv[i]) mypointdiv[i].style.display = "none" } function hidePhotos() { for (var i in photodiv) if (photodiv[i]) photodiv[i].style.display = "none" }
function countDown() { countDownTime--; if (document.getElementById("countDownSecs")) document.getElementById("countDownSecs").innerHTML = countDownTime; if (countDownTime <= 0) { countDownTime = refreshInterval; clearTimeout(counter); changeShipContent = true; getData(); getSound(); return } clearTimeout(counter); counter = setTimeout("countDown()", 1E3) }
function getUrlParam(name) { name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); var regexS = "[\\?&]" + name + "=([^&#]*)"; var regex = new RegExp(regexS); var results = regex.exec(window.location.href); if (results == null) return ""; else return decodeURIComponent(results[1]) }
function MapCursorControl() {
    var container = document.createElement("div"); var ptr = document.createElement("div"); ptr.id = "LatLonTxt"; ptr.style.padding = "3px"; container.appendChild(ptr); var tim = 0; google.maps.event.addListener(map, "mousemove", function (event) {
        var tim2 = new Date; if (tim2.getTime() > tim) {
            var ws = fixedLlString(event.latLng.lat(), event.latLng.lng()); if (map.getMapTypeId() == google.maps.MapTypeId.HYBRID || map.getMapTypeId() == google.maps.MapTypeId.SATELLITE) ptr.style.color = "White"; else ptr.style.color =
"Black"; ptr.innerHTML = ws; tim = tim2.getTime() + 50
        } 
    }); map.controls[google.maps.ControlPosition.BOTTOM_LEFT].push(container); return container
}
function fixedLlString(la, lo) {
    var s = "N"; var w = "E"; if (la < 0) { la = -la; s = "S" } if (lo < 0) { lo = -lo; w = "W" } var lai = Math.floor(la); var laf = Math.round((la - lai) * 1E4); 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); var lof = Math.round((lo - loi) * 1E4); var lois = loi.toString(); while (lois.length < 3) lois = "0" + lois; var lofs = lof.toString(); while (lofs.length < 4) lofs = "0" + lofs; var lamin = Math.floor((la - lai) * 60); var lasec = ((la - lai) * 60 - lamin) *
60; var laseci = Math.floor(lasec); var lasecf = Math.floor((lasec - laseci) * 100); if (lamin.toString().length == 1) lamin = "0" + lamin; if (laseci.toString().length == 1) laseci = "0" + laseci; if (lasecf.toString().length == 1) lasecf = "0" + lasecf; var lomin = Math.floor((lo - loi) * 60); var losec = ((lo - loi) * 60 - lomin) * 60; var loseci = Math.floor(losec); var losecf = Math.floor((losec - loseci) * 100); if (lomin.toString().length == 1) lomin = "0" + lomin; if (loseci.toString().length == 1) loseci = "0" + loseci; if (losecf.toString().length == 1) losecf = "0" + losecf; var res =
""; res = s + lais + "&deg;" + lamin + "'" + laseci + "." + lasecf + '"<br/>'; res += w + lois + "&deg;" + lomin + "'" + loseci + "." + losecf + '"<br/>'; res += "(" + (s == "S" ? "-" : "") + lais + "." + lafs + ", " + (w == "W" ? "-" : "") + lois + "." + lofs + ")"; return res
} function createCookie(name, value, days) { if (days) { var date = new Date; date.setTime(date.getTime() + days * 24 * 60 * 60 * 1E3); var expires = "; expires=" + date.toGMTString() } else var expires = ""; document.cookie = name + "=" + value + expires + "; path=/; domain=.marinetraffic.com;" }
function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(";"); for (var i = 0; i < ca.length; i++) { var c = ca[i].split("&")[0]; while (c.charAt(0) == " ") c = c.substring(1, c.length); if (c.indexOf(nameEQ) >= 0) return c.substring(c.indexOf(nameEQ) + nameEQ.length, c.length) } return null }
function storeUserSettings() {
    createCookie("maptype", map.getMapTypeId(), 10); createCookie("centerx", (map.getBounds().getSouthWest().lng() + map.getBounds().getNorthEast().lng()) / 2, 10); createCookie("centery", (map.getBounds().getSouthWest().lat() + map.getBounds().getNorthEast().lat()) / 2, 10); createCookie("zoom", map.getZoom(), 10); createCookie("CheckLegends", document.getElementById("CheckLegends").checked, 10); createCookie("CheckPoints", document.getElementById("CheckPoints").checked, 10); createCookie("CheckProjected",
document.getElementById("CheckProjected").checked, 10); createCookie("CheckType6", document.getElementById("CheckType6").checked, 10); createCookie("CheckType7", document.getElementById("CheckType7").checked, 10); createCookie("CheckType8", document.getElementById("CheckType8").checked, 10); createCookie("CheckType4", document.getElementById("CheckType4").checked, 10); createCookie("CheckType3", document.getElementById("CheckType3").checked, 10); createCookie("CheckType9", document.getElementById("CheckType9").checked,
10); createCookie("CheckType1", document.getElementById("CheckType1").checked, 10); createCookie("CheckType0", document.getElementById("CheckType0").checked, 10); createCookie("CheckMoving", document.getElementById("CheckMoving").checked, 10); createCookie("CheckStopped", document.getElementById("CheckStopped").checked, 10)
}
function restoreCheckBoxes() {
    var check = "false"; if (getUrlParam("shownames") != "") check = getUrlParam("shownames") == "true" ? "true" : "false"; else check = readCookie("CheckLegends"); if (check) document.getElementById("CheckLegends").checked = check == "true"; if (getUrlParam("showpoints") != "") check = getUrlParam("showpoints") == "true" ? "true" : "false"; else check = readCookie("CheckPoints"); if (check) document.getElementById("CheckPoints").checked = check == "true"; if (getUrlParam("showlights") != "") check = getUrlParam("showlights") ==
"true" ? "true" : "false"; else check = readCookie("CheckLights"); if (check) document.getElementById("CheckLights").checked = check == "true"; check = readCookie("CheckProjected"); if (check) document.getElementById("CheckProjected").checked = check == "true"; check = readCookie("CheckType6"); if (check) document.getElementById("CheckType6").checked = check == "true"; check = readCookie("CheckType7"); if (check) document.getElementById("CheckType7").checked = check == "true"; check = readCookie("CheckType8"); if (check) document.getElementById("CheckType8").checked =
check == "true"; check = readCookie("CheckType4"); if (check) document.getElementById("CheckType4").checked = check == "true"; check = readCookie("CheckType3"); if (check) document.getElementById("CheckType3").checked = check == "true"; check = readCookie("CheckType9"); if (check) document.getElementById("CheckType9").checked = check == "true"; check = readCookie("CheckType1"); if (check) document.getElementById("CheckType1").checked = check == "true"; check = readCookie("CheckType0"); if (check) document.getElementById("CheckType0").checked = check ==
"true"; check = readCookie("CheckMoving"); if (check) document.getElementById("CheckMoving").checked = check == "true"; check = readCookie("CheckStopped"); if (check) document.getElementById("CheckStopped").checked = check == "true"
} function hideControls() { map.setOptions({ navigationControl: false }); var latlondiv = document.getElementById("LatLonTxt"); if (latlondiv) latlondiv.style.visibility = "hidden"; if (adUnitDiv) adUnitDiv.style.display = "none" }
function showControls() { map.setOptions({ navigationControl: true }); var latlondiv = document.getElementById("LatLonTxt"); if (latlondiv) latlondiv.style.visibility = "visible"; if (adUnitDiv) adUnitDiv.style.display = "block" } function createXmlHttpRequest() { try { if (typeof ActiveXObject != "undefined") return new ActiveXObject("Microsoft.XMLHTTP"); else if (window["XMLHttpRequest"]) return new XMLHttpRequest } catch (e) { changeStatus(e) } return null }
function downloadUrl(url, text_or_xml, callback) { var status = -1; var request = createXmlHttpRequest(); if (!request) return false; request.onreadystatechange = function () { if (request.readyState == 4) { try { status = request.status } catch (e) { } if (status == 200) { if (text_or_xml == "text") callback(request.responseText, request.status); else callback(request.responseXML, request.status); request.onreadystatechange = function () { } } else callback(null, request.status) } }; request.open("GET", url, true); try { request.send(null) } catch (e) { changeStatus(e) } }
function xmlParse(str) { if (typeof ActiveXObject != "undefined" && typeof GetObject != "undefined") { var doc = new ActiveXObject("Microsoft.XMLDOM"); doc.loadXML(str); return doc } if (typeof DOMParser != "undefined") return (new DOMParser).parseFromString(str, "text/xml"); return createElement("div", null) } function showmore() { var morediv = document.getElementById("MoreOptions"); if (morediv.style.display == "block") morediv.style.display = "none"; else morediv.style.display = "block" }
function geocode() { var address = document.getElementById("address").value; infowindow.close(); geocoder.geocode({ "address": address }, function (results, status) { if (status == google.maps.GeocoderStatus.OK) { map.setCenter(results[0].geometry.location); map.setZoom(9); addressmarker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); setTimeout("addressmarker.setMap(null)", 5E3) } }) }
function fullscreen() {
    document.getElementById("menuholder").style.display = "none"; document.getElementById("holderleft").style.display = "none"; document.getElementById("logo").style.display = "none"; document.getElementById("footer").style.display = "none"; document.getElementById("minscreen").style.display = "block"; document.getElementById("map_area").style.marginLeft = "20px"; document.getElementById("map_area").style.height = document.body.clientHeight + "px"; adUnit.setFormat(google.maps.adsense.AdFormat.MEDIUM_RECTANGLE);
    adUnit.setChannelNumber("4590675348"); google.maps.event.trigger(map, "resize")
}
function minscreen() {
    document.getElementById("menuholder").style.display = "block"; document.getElementById("holderleft").style.display = "block"; document.getElementById("logo").style.display = "block"; document.getElementById("footer").style.display = "block"; document.getElementById("minscreen").style.display = "none"; document.getElementById("map_area").style.marginleft = "0"; document.getElementById("map_area").style.height = document.body.clientHeight - 160 + "px"; adUnit.setFormat(google.maps.adsense.AdFormat.HALF_BANNER);
    adUnit.setChannelNumber("8203674964"); google.maps.event.trigger(map, "resize")
} function showcallout(text, posy, posx) { var calloutdiv = document.getElementById("callout"); calloutdiv.style.display = "block"; calloutdiv.innerHTML = text; calloutdiv.style.top = posy + "px"; calloutdiv.style.left = posx + "px" } function hidecallout() { document.getElementById("callout").style.display = "none" };
