//Copyright of scripts by Dimitris Lekkas
//2007-2011
//Not to be used in public sites, unless a permission is given

    //<![CDATA[
 	var map;
	var texttip = [];   //divs for legends
    var texttip_back = [];  //divs to display back shadow for each text tip or legend
    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 shipstatus = [];
    var shipname = [];
    var flag = [];
    var mmsi = [];
    var length = [];
    var elapsed = [];   //mins elapsed since position received
    var ship = [];      //ship divs
    var wp = [];        //waypoint divs
    var portdiv = [];   //port divs
    var portcount = 0;
    var stationdiv = [];
    var stationcount = 0;
    var photodiv = [];
    var n = 100;        //number of ships - 100 for test data
    var k = 0;          //number of areas
    var t = 0;          //number of waypoints
    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 remember="true";
    var maptype="0";
    var firstload=true;
    var movetype="";
    var sw_x, sw_y, ne_x, ne_y;
    var isOpenedInfo = false;
    var infodiv;
    var previous_lat=0, previous_lon=0;
    var email="";
    var loading=false;
    var legendpos=0;
    var inter1=0;
    var inter2=0;
    var inter1_index;
    var inter2_index;
    var showprojected=false;

    
    var arVersion = navigator.appVersion.split("MSIE");
    var version = parseFloat(arVersion[1]);

    try
    {
    //init sound
    soundManager.url = 'sound/soundmanager2.swf';
    soundManager.debugMode = false;
    soundManager.consoleOnly = false;

    soundManager.onload = function() {
      soundManager.createSound('aDrumSound','sound/demo/mpc/audio/horn3.mp3');
    }
    }
    catch(err)
    {
    }

function mapload() {
      if (GBrowserIsCompatible()) {
              
    //URL params              
    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("remember")!="")
        remember = getUrlParam("remember");
    maptype=readCookie("maptype");
    if(getUrlParam("maptype")!="")
        maptype = getUrlParam("maptype");
    if(getUrlParam("inter1")!="")
        inter1 = parseInt(getUrlParam("inter1"));
    if(getUrlParam("inter2")!="")
        inter2 = parseInt(getUrlParam("inter2"));
        
    //default values
    var mapcenterx=30.0;
    var mapcentery=25.0;
    var zoom=2;    
    if(document.URL.search("syros-observer")!=-1) {
        mapcenterx=24.5;
        mapcentery=38.6;    
        zoom=7;    
    }
    
    //user values
    if(readCookie("centerx")!=null)
        mapcenterx=parseFloat(readCookie("centerx"));
    if(readCookie("centery")!=null)
        mapcentery=parseFloat(readCookie("centery"));
    if(readCookie("zoom")!=null)
        zoom=parseFloat(readCookie("zoom"));
    
    //URL parameters     
    if(document.URL.search("/embed")==-1 || remember=="false" || !remember ||
            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"));
    }
    
        
    //resize map area according to window height
    if(document.URL.search("embed.aspx")==-1)
        document.getElementById('map_area').style.height = (document.body.clientHeight - 130) + 'px';
    map = new GMap2(document.getElementById("map_area"));
    map.setCenter(new GLatLng(mapcentery, mapcenterx), zoom);
    map.addMapType(G_PHYSICAL_MAP);
    nauticalMap();
    if(maptype==null)
        map.setMapType(G_NORMAL_MAP);
	else
	    map.setMapType(map.getMapTypes()[parseInt(maptype)]);
	map.addControl(new GLargeMapControl());
	if(document.getElementById("map_area").clientWidth>500) {
	    map.addControl(new GMapTypeControl());
	    var scalePos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(70,10));
	    map.addControl(new GScaleControl(), scalePos);
	    map.addControl(new GOverviewMapControl());
        MapCursorControl();
        map.addControl(new MapCursorControl());
    }

	//map.enableContinuousZoom();
	//map.enableDoubleClickZoom();
    map.enableScrollWheelZoom();
    //map.setUIToDefault();
    //map.enableGoogleBar();

    //adsense
    if(document.URL.search("syros-observer")==-1 && document.getElementById("map_area").clientWidth>500) {
        var adPos = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(-5, 120));
        var publisher_id = "pub-1312707765089516";
        adsManagerOptions = {
        maxAdsOnMap : 1,
        style: 'adunit',
        channel: '8203674964',
        position: adPos
        };
        adsManager = new GAdsManager(map, publisher_id, adsManagerOptions);
        adsManager.enable();
    }

    shipcolor[0]="lightgray";   //unspecified
    shipcolor[1]="pink";        //Navigation Aids - Shore stations
    shipcolor[3]="cyan";        //Tug, special crafts
    shipcolor[4]="yellow";      //high speed
    shipcolor[6]="blue";        //passenger
    shipcolor[7]="lightgreen";  //cargo
    shipcolor[8]="red";         //tanker
    shipcolor[9]="magenta";     //pleasure yacht - other
    
    //shipstatus[0]="Moving";
    //shipstatus[1]="Anchored";
    //shipstatus[2]="Moored";
      
    //random values - test only
    /*for(i=0; i<n; i++) {
        x[i]=mapcenterx - 0.5 + Math.random();
        y[i]=mapcentery -0.5 + Math.random();
        course[i] = Math.random()*360;
        shiptype[i] = parseInt(Math.random()*7);
        shipstatus[i] = parseInt(Math.random()*3);
        if(shipstatus[i]!=0)
            speed[i]=0;
        else
            speed[i]= parseInt(Math.random()*40);
        
        createship(mmsi[i], x[i], y[i], shipstatus[i], course[i], speed[i], shiptype[i], "TESTSHIP", i);
        }
    */
    
    //refresh ships after zoom
    GEvent.addListener(map,"zoomend", function() {
    if(oldmmsi==0 && replaymmsi==0) {
        if(loading==false && map.getZoom()>7 && map.getZoom()!=9 && map.getZoom()!=12 && map.getZoom()!=15 && (map.getBounds().getSouthWest().lng()>sw_x && map.getBounds().getSouthWest().lat()>sw_y &&
                map.getBounds().getNorthEast().lng()<ne_x && map.getBounds().getNorthEast().lat()<ne_y))
            refreshPositions();
        else
            getData();
        }
    else if(oldmmsi>999)
        getOldPos();
    else if(replaymmsi>0)
        refreshPositions();
            });

    GEvent.addListener(map,"moveend", function() {
    if(oldmmsi==0 && isOpenedInfo==false && 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
        isOpenedInfo=false;
     });

    // Listeners to show/hide map controls depending on mouse cursor position
    GEvent.addListener(map, "mouseover", function(){
        map.showControls();
        if(document.getElementById("map_area").clientWidth>500)
            adsManager.enable();
    });
    GEvent.addListener(map, "mouseout", function(){
        map.hideControls(); 
        if(document.getElementById("map_area").clientWidth>500)
            adsManager.disable();
    });

    //Distance calculator
    //GEvent.addListener(map, "singlerightclick", function(){
    //    clearDistance();
    //});
    

    if(oldmmsi==0 && replaymmsi==0){
        getData();
        if(urlmmsi!=0)
            focusVessel(urlmmsi);
        }
    else if(replaymmsi>0)
        getReplay();
    else if(oldmmsi<=999)
        getCoverage();
    else
        getOldPos();

    }
}

function getData() {
    //restrict data to current map bounds - Lon/Lat rounded
    var roundto=5.0;
    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.0/roundto;
    if(ne_x<-170) ne_x=180;
    ne_y = Math.floor(map.getBounds().getNorthEast().lat()*roundto)/roundto+1.0/roundto;
    //if(map.getZoom()<9)
    //    ne_y++; //avoid reload when infowindow scrolls map up
    isOpenedInfo=false;
    try {
    getDealer();
    }
    catch(err) {
    }
    
    if(map.getZoom()<7 && fleet==""){
        getSections();
        getShipCount();
        hidePorts();
        hideStations();
        hidePhotos();
        return;
    }

    loading=true;
    map.clearOverlays();
    document.getElementById("loading").style.visibility="visible";
    if(document.getElementById("CheckProjected").checked)
        showprojected=true;
    else
        showprojected=false;

    GDownloadUrl("getxml.aspx?id=" + Math.random() + "&sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom() + "&fleet=" + fleet + "&station=" + station, function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("V_POS");
      for(var j=0; j<k; j++)    //clear area listeners
        GEvent.clearListeners(area[j], "click");
      hideAreaLegends();
      hideLegends();
      hideShips();
      shipsshown=0;
      realcount=0;
      inter1_index=-1;
      inter2_index=-1;
      n = xmlposition.length;
      for (var i = 0; i < n; i++) {
        mmsi[i] = parseInt(xmlposition[i].getAttribute("M"));
        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;
        x[mmsi[i]] = parseFloat(xmlposition[i].getAttribute("LAT"));
        y[mmsi[i]] = parseFloat(xmlposition[i].getAttribute("LON"));
        //shipstatus[i] = parseInt(xmlposition[i].getAttribute("ST"));
        shipname[i] = xmlposition[i].getAttribute("N");
        shiptype[i] = parseInt(xmlposition[i].getAttribute("T"));
        course[i] = parseFloat(xmlposition[i].getAttribute("H"));
        speed[i] = parseFloat(xmlposition[i].getAttribute("S"));
        flag[i] = xmlposition[i].getAttribute("F");
        length[i] = parseInt(xmlposition[i].getAttribute("L"));
        elapsed[i] = parseInt(xmlposition[i].getAttribute("E"));
        if(mmsi[i]==urlmmsi && urlmmsi!=0 && firstload==true) {   //mmsi given in URL - show track and details on map, only on first load
            currenttrack=urlmmsi;
            currenttracktype=shiptype[i];
            showInfoWindow(mmsi[i],shipname[i]);
            firstload=false;
            }
        if(mmsi[i]==inter1 && inter1!=0)
            inter1_index=i;
        if(mmsi[i]==inter2 && inter2!=0)
            inter2_index=i;
        }
        
      for (var i = 0; i < n; i++)
          createship(mmsi[i], x[mmsi[i]], y[mmsi[i]], course[i], speed[i], shiptype[i], shipname[i], flag[i], length[i], elapsed[i], i);

      document.getElementById("shownShips").innerHTML = shipsshown;
      if(map.getZoom()<10  && fleet=="")
         getAreas();
      getTracking(currenttrack, currenttracktype);
    if(inter1>0 && inter2>0 && inter1_index>=0 && inter1_index>=0)
        drawIntersection(inter1_index, inter2_index);
              
    document.getElementById("loading").style.visibility="hidden";
    loading=false;
    populateVesselList();
    });
    getShipCount();
    if(document.getElementById("CheckPorts").checked)
        getPorts();
    if(document.getElementById("CheckStations").checked)
        getLights();//getStations();
    if(remember!="false")
        storeUserSettings();
    if(document.getElementById("CheckPhotos").checked)
        getPhotos();

    clearTimeout(counter);
    drawDistance();
    window.setTimeout("countDown()", 1000);
}

function getShipCount() {
    GDownloadUrl("getshipcountxml.aspx?id=" + Math.random(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("V_SHIPCOUNT");
      document.getElementById("totalShips").innerHTML = xmlposition[0].getAttribute("SHIPCOUNT");
    });
}

function getAreas() {
    GDownloadUrl("getareasxml.aspx", function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("V_AREAS");
      k = xmlposition.length;
      var pts = [];
      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"));

        pts = [new GLatLng(sw_y, sw_x), new GLatLng(sw_y, ne_x),
            new GLatLng(ne_y, ne_x), new GLatLng(ne_y, sw_x), new GLatLng(sw_y, sw_x)];
        area[i] = new GPolygon(pts, "#000", 1, 1, "#000", 0.4);

        area[i].area_name = area_name;
        area[i].center_x=(sw_x+ne_x)/2;
        area[i].center_y=(sw_y+ne_y)/2;
        area[i].zoom = zoom;

        GEvent.addListener(area[i], "click", function() {
            map.setCenter(new GLatLng(this.center_y, this.center_x), this.zoom);
            getData();
            });
        GEvent.addListener(area[i],"mouseover", function() {
            map.draggableCursor="crosshair";
            });        

        map.addOverlay(area[i]);

	    var html = area_name + ": " + shipcount + " Vessels.";
        areaLegend(area[i].center_y, area[i].center_x, html, i);
        }
    });
}


function getSections() {
    GDownloadUrl("getsectionsxml.aspx?zoom="+map.getZoom(), function(data, responseCode) {
      hideAreaLegends();
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      map.clearOverlays();
      hideShips();
      hideLegends();
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("row");
      k = xmlposition.length;
      var pts = [];
      var x, y, shipcount, html, width, height;
      if(map.getZoom()<=2) {
        width=8;
        height=5;
      }
      else {
        width=5;
        height=3;
      }
      for (var i = 0; i < k; i++) {
        x = parseInt(xmlposition[i].getAttribute("X"));
        y = parseInt(xmlposition[i].getAttribute("Y"));
        shipcount = parseInt(xmlposition[i].getAttribute("SHIPCOUNT"));

        pts = [new GLatLng(y, x), new GLatLng(y+height, x),
            new GLatLng(y+height, x+width), new GLatLng(y, x+width), new GLatLng(y, x)];
        area[i] = new GPolygon(pts, "#000", 1, 1, "#000", 0.4);
        area[i].center_x=x+width/2.0;
        area[i].center_y=y+height/2.0;

        GEvent.addListener(area[i], "click", function() {
            map.setCenter(new GLatLng(this.center_y, this.center_x), 7);
            getData();
            });
        GEvent.addListener(area[i],"mouseover", function() {
            map.draggableCursor="pointer";
            });        

        map.addOverlay(area[i]);

        if(map.getZoom()>4)
	        html = shipcount + " Ships";
	    else if(map.getZoom()>1)
	        html = "" + shipcount;
	    else
	        html="";
        areaLegend(y, x, html, i);
        }

    });
}

function getTracking(mmsi, tracktype) {
    if(mmsi==null || mmsi==0)
        return;
    currenttrack=mmsi;
    currenttracktype=tracktype;
    map.getInfoWindow().hide();
    hideWayPoints();
    document.getElementById("loading").style.visibility="visible";
    GDownloadUrl("gettrackxml.aspx?mmsi=" + mmsi + "&date=" + olddate + "&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("TIMESTAMP");
        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;
        }
     }
        
        var color=shipcolor[tracktype];
        if(color=="lightgreen")
            color="green";
        else if(color=="lightgray")
            color="gray";
        else if(color=="magenta")
            color="purple";
        else if(color=="cyan")
            color="aqua";
        var track = new GPolyline(pts, color, 2, 1);

        map.addOverlay(track);
       //listener of right click to clear    
        GEvent.addListener(map, "singlerightclick", function(){
            clearTracking();
        });

        document.getElementById("loading").style.visibility="hidden";
    });
}

function clearTracking() {
    GEvent.clearListeners(map, "singlerightclick");
    map.clearOverlays();
    hideWayPoints();
    currenttrack=0;
}

function getReplay() {
    loading=true;
    map.clearOverlays();
    document.getElementById("loading").style.visibility="visible";
    var tim = Date.parse(olddate.replace("-","/").replace("-","/"));
    var nexttim = new Date(tim+4*60*60*1000);
    var prevtim = new Date(tim-4*60*60*1000);
    var nexttimstr=nexttim.getFullYear()+"/"+nexttim.getMonth()+"/"+nexttim.getDate()+" "+nexttim.getHours()+":"+nexttim.getMinutes();
    var prevtimstr=prevtim.getFullYear()+"/"+prevtim.getMonth()+"/"+prevtim.getDate()+" "+prevtim.getHours()+":"+prevtim.getMinutes();
    document.getElementById("refreshTitle").innerHTML="Replaying " + replaymmsi + ": " +
    "<a href=\"default.aspx?replaymmsi=" + replaymmsi + "&olddate=" + prevtimstr + "\"><img src=\"icons/first.gif\" title=\"Replay Previous Timeframe\"/></a>&nbsp;&nbsp;" +
    "<a href=\"default.aspx?replaymmsi=" + replaymmsi + "&olddate=" + olddate + "\"><img src=\"icons/next.gif\" title=\"Replay\"/></a>&nbsp;&nbsp;" +
    "<a href=\"default.aspx?replaymmsi=" + replaymmsi + "&olddate=" + nexttimstr + "\"><img src=\"icons/last.gif\" title=\"Replay Next Timeframe\"/></a>&nbsp;";
    document.getElementById("refreshNow").innerHTML=" ";

    GDownloadUrl("getreplayxml.aspx?id=" + Math.random() + "&mmsi=" + replaymmsi + "&date=" + olddate, function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("row");
      hideAreaLegends();
      hideLegends();
      hideShips();
      shipsshown=0;
      replaytrack=null;
      n = xmlposition.length;
      for (var i = 0; i < n; i++) {
        mmsi[i] = parseInt(xmlposition[i].getAttribute("M"));
        x[i] = parseFloat(xmlposition[i].getAttribute("LAT"));
        x[mmsi[i]]=x[i];
        y[i] = parseFloat(xmlposition[i].getAttribute("LON"));
        y[mmsi[i]]=y[i];
        shipname[i] = xmlposition[i].getAttribute("N");
        shiptype[i] = parseInt(xmlposition[i].getAttribute("T"));
        course[i] = parseFloat(xmlposition[i].getAttribute("H"));
        speed[i] = parseFloat(xmlposition[i].getAttribute("S"));
        length[i] = parseInt(xmlposition[i].getAttribute("L"));
        flag[i] = xmlposition[i].getAttribute("E");
        elapsed[i] = Date.parse(xmlposition[i].getAttribute("E"))/1000;
    }
      
      var j=0;
      while(mmsi[j]!=parseInt(replaymmsi) && j<n)
        j++;
      if(j>0 || mmsi[0]==parseInt(replaymmsi))
        map.setCenter(new GLatLng(x[j], y[j]), 12);
      j=0;
      while(mmsi[j]!=parseInt(replaymmsi) && j<n){
        drawReplayShip(j);
        j++;
        }
      for(var i=j;i<n;i++){
        setTimeout("drawReplayShip(" + i + ")",5*(elapsed[i]-elapsed[j]));
        }      
    document.getElementById("loading").style.visibility="hidden";
    loading=false;
    });
}

function drawReplayShip(m){
    if(parseInt(replaymmsi)==mmsi[m]) {
        map.panTo(new GLatLng(x[m], y[m]));
        drawWayPoint(x[m],y[m],course[m],speed[m],'',m);
        if(!replaytrack){
            var color=shipcolor[shiptype[m]];
            if(color=="lightgreen")
                color="green";
            else if(color=="lightgray")
                color="gray";
            else if(color=="magenta")
                color="purple";
            else if(color=="cyan")
                color="aqua";
            var pts = [];
            pts[0] = new GLatLng(x[m], y[m]);
            replaytrack = new GPolyline(pts, color, 2, 1);
            map.addOverlay(replaytrack);
            }
        else
            replaytrack.insertVertex(replaytrack.getVertexCount(),new GLatLng(x[m], y[m]));
        document.getElementById("countDownSecs").innerHTML = "<b>"+flag[m].replace("T"," ").substring(0,flag[m].length-3) +"</b>";
        }
    if(y[m]>map.getBounds().getSouthWest().lng()-0.1 && y[m]<map.getBounds().getNorthEast().lng()+0.1
            && x[m]>map.getBounds().getSouthWest().lat()-0.1 && x[m]<map.getBounds().getNorthEast().lat()+0.1) {
        drawMovingShip(mmsi[m],x[m],y[m],course[m],speed[m],shiptype[m],shipname[m],flag[m],length[m],1,m);
        if(speed[m]>5 || mmsi[m]==replaymmsi)
            createLegend(x[m], y[m], shipname[m], mmsi[m]);
         }
    else if(ship[mmsi])
        ship[mmsi].style.visibility="hidden";
    }

function getOldPos() {
    GDownloadUrl("getoldposxml.aspx?mmsi=" + oldmmsi + "&date=" + olddate, function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      n=1;
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("OLDPOS");
      var x1 = parseFloat(xmlposition[0].getAttribute("LAT"));
      var y1 = 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"));
      map.setCenter(new GLatLng(x1, y1));
      createship(oldmmsi, x1, y1, course1, speed1, shiptype1, shipname1, "", 0, 0, -1);

      document.getElementById("shownShips").innerHTML = "1";
      document.getElementById("totalShips").innerHTML = "1";
      
        var infohtml = '<div id="infotitle"><span>'+ shipname1 +'</span></div>';
        infohtml += '<div id="infowindow"><span>';
        infohtml += "Position Recorded on: " + olddate + " (UTC)";
        infohtml += "<br/>Lon/Lat: " + y1 + " / " + x1; 
        infohtml += "<br/>Speed/Course: " + speed1/10.0 + " kn / " + course1 + "&deg;";
        infohtml += "<br/>Vessel's track shown for that day.";
        infohtml += '</span></div>';
	    map.openInfoWindowHtml(new GLatLng(x1, y1), infohtml);
      
      getTracking(oldmmsi, shiptype1);

    });

}

function getCoverage() {
    document.getElementById("loading").style.visibility="visible";
    GDownloadUrl("getcoveragexml.aspx?station=" + oldmmsi + "&id=" + Math.random(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      var lon,lat,station,station_name,counter;
      var xmlposition = xmlDoc.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 GLatLng(lat, lon), 7);

          var icon = new GIcon();
          icon.iconSize = new GSize(12, 18); 
          icon.iconAnchor = new GPoint(6, 18); 
          icon.infoWindowAnchor = new GPoint(6, 18); 
          icon.image = "icons/antenna_green.png";

          var markerstation = new GMarker(new GLatLng(lat,lon), icon);
          map.addOverlay(markerstation);
          GEvent.addListener(markerstation, "click", function() {
            showInfoStation(oldmmsi, station_name, lat, lon);
          });
      }
      xmlposition = xmlDoc.documentElement.getElementsByTagName("COVERAGE");
      t = xmlposition.length;
      var pts = [], lat1,lon1,lat2,lon2;
      for (var i = 0; i < t; i++) {
        lon1 = parseFloat(xmlposition[i].getAttribute("LON"));
        lat1 = parseFloat(xmlposition[i].getAttribute("LAT"));
        station = parseInt(xmlposition[i].getAttribute("STATION"));
        counter = parseInt(xmlposition[i].getAttribute("COUNTER"));
        
        lon2=lon1+0.2;
        lat2=lat1+0.2;
        pts[0] = new GLatLng(lat1, lon1);
        pts[1] = new GLatLng(lat2, lon1);
        pts[2] = new GLatLng(lat2, lon2);
        pts[3] = new GLatLng(lat1, lon2);
        pts[4] = new GLatLng(lat1, lon1);

        var color="blue";

        var trans=0.1*counter/5.0;
        if(trans >0.7)
            trans=0.7;
        else if(trans<0.1)
            trans=0.1;
        var area = new GPolygon(pts, color, 1, 0.9, color, trans);

        map.addOverlay(area);
        }
    document.getElementById("loading").style.visibility="hidden";

    });
}

function getPorts() {
    GDownloadUrl("getportxml.aspx?sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      hidePorts();
      var xmlposition = xmlDoc.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++) {
        porty = parseFloat(xmlposition[i].getAttribute("CENTERX"));
        portx = 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() {
    GDownloadUrl("getstationsxml.aspx?sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      hideStations();      
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("V_STATION_STATUS");
      stationcount = xmlposition.length;
      var sx, sy, station_id, station_name, station_ststus, prevx=0, prevy=0;
      for (var i = 0; i < stationcount; i++) {
        sy = parseFloat(xmlposition[i].getAttribute("LON_PUB"));
        sx = 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 getLights() {
    GDownloadUrl("getlightsxml.aspx?sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      hideStations();      
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("row");
      stationcount = xmlposition.length;
      var sx, sy, station_id, station_name, station_ststus, prevx=0, prevy=0;
      for (var i = 0; i < stationcount; i++) {
        sy = parseFloat(xmlposition[i].getAttribute("LON"));
        sx = parseFloat(xmlposition[i].getAttribute("LAT"));
        light_id = parseInt(xmlposition[i].getAttribute("LIGHT_ID"));
        light_name = xmlposition[i].getAttribute("LIGHT_NAME");
        drawStation(light_id, sx, sy, light_name, "ONLINE", i);
        }
    });
}

function getPhotos() {
    GDownloadUrl("getphotosxml.aspx?sw_x=" + sw_x + "&sw_y=" + sw_y + "&ne_x=" + ne_x + "&ne_y=" + ne_y + "&zoom=" + map.getZoom(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      hidePhotos();
      var xmlposition = xmlDoc.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) { //icon or full photo
            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;
    GDownloadUrl("getportxml.aspx?port_id=" + port_id + "&id=" + Math.random(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      var xmlposition = xmlDoc.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"));
        
    //if(map.getZoom()!=zoom-2)    //avoid refreshing twice if zoomed to different level

        map.setCenter(new GLatLng(lat, lon), zoom-2);
        getData();
    });
}

function focusArea(area_id) {
    if(area_id==0)
        area_id = document.getElementById("AREA").value;
    GDownloadUrl("getareaxml.aspx?area_id=" + area_id + "&id=" + Math.random(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      var xmlposition = xmlDoc.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 GLatLng(lat, lon), zoom-2);
        getData();
    });
}

function focusVessel(vessel_id) {
    if(vessel_id==0)
        vessel_id = document.getElementById("VesselList").value;
    GDownloadUrl("getvesselxml.aspx?mmsi=" + vessel_id + "&id=" + Math.random(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc.documentElement) return;
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("V_POS");
      if(xmlposition.length==0) return;
      var lon,lat;
    lon = parseFloat(xmlposition[0].getAttribute("LON"));
    lat = parseFloat(xmlposition[0].getAttribute("LAT"));
        
    urlmmsi=vessel_id;
    firstload=true;
    if(map.getZoom()>10)    //avoid calling getData twice if zoomed to different level
        map.setCenter(new GLatLng(lat, lon), 10);
    else {
        map.setCenter(new GLatLng(lat, lon), 10);
        urlmmsi=vessel_id;
        firstload=true;
        getData();
        }        
        
    });
}

function populateVesselList () {
    var options = [];
    for (var i = 0; i < n; i++)
        options[i] = new Option(
            shipname[i],
            mmsi[i]);
    options.sort(function(a,b){ return (a.text.toLowerCase() < b.text.toLowerCase() ) ? -1 : 1; });
    var pListBox=document.getElementById("VesselList");
    pListBox.options.length = n+1;
    for (var i = 0; i < n; i++)
        pListBox.options[i+1] = options[i];
} 

function getSound() {
    GDownloadUrl("getsoundxml.aspx?id=" + Math.random(), function(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      if (!xmlDoc || !xmlDoc.documentElement) return;
      var xmlposition = xmlDoc.documentElement.getElementsByTagName("V_SOUNDS");
      if(xmlposition.length==0) return;
      var mmsi = parseInt(xmlposition[0].getAttribute("MMSI"));
      var lon = parseFloat(xmlposition[0].getAttribute("LON"));
      var lat = parseFloat(xmlposition[0].getAttribute("LAT"));
      var shipname = xmlposition[0].getAttribute("SHIPNAME");
      var portname = xmlposition[0].getAttribute("PORT_NAME");
      var movetypeint = parseInt(xmlposition[0].getAttribute("MOVETYPE"));
      try {      
        soundManager.play('aDrumSound');
      }
      catch(err) {
      }
        if(lat && lon){
            urlmmsi=mmsi;
            firstload=true;
            if(movetypeint==0)
                movetype = " - Arrival at: " + portname;
            else
                movetype = " - Departure from: " + portname;
            if(map.getZoom()>10)    //avoid calling getData twice if zoomed to different level
                map.setCenter(new GLatLng(lat, lon), 10);
            else {
                map.setCenter(new GLatLng(lat, lon), 10);
                urlmmsi=mmsi;
                firstload=true;
                getData();
                }
        }
    });
}

function refreshOnZoom() {
//reposition of ships after zoom
    shipsshown = 0;
    for(i=0; i<n; i++)
        createship(mmsi[i], x[mmsi[i]], y[mmsi[i]], status[i], course[i], speed[i], shiptype[i], shipname[i], flag[i], length[i], elapsed[i], i);
    }            

function refreshPositions() {
//reposition and hide/show depending on options selected
    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());

    hideLegends();
    hideShips();
    shipsshown = 0;
    totalshipno = n;	
    if(replaymmsi==0)
        map.clearOverlays();
    hideWayPoints();	
    if(document.getElementById("CheckProjected").checked)
        showprojected=true;
    else
        showprojected=false;

    for(i=0; i<n; i++)
    {
        if(y[mmsi[i]]>sw_x1 && x[mmsi[i]]>sw_y1 & y[mmsi[i]]<ne_x1 && x[mmsi[i]]<ne_y1)
            createship(mmsi[i], x[mmsi[i]], y[mmsi[i]], course[i], speed[i], shiptype[i], shipname[i], flag[i], length[i], elapsed[i], i);
        if(mmsi[i]==urlmmsi && firstload==true) {   //mmsi given in URL - show track and details on map, only on first load
            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)
        getAreas();
    document.getElementById("shownShips").innerHTML = shipsshown;

    if(document.getElementById("CheckPorts").checked)
        getPorts();
    if(document.getElementById("CheckStations").checked)
        getLights();//getStations();
    if(document.getElementById("CheckPhotos").checked)
        getPhotos();
}            

function refreshFleet()
{
    email=readCookie("EMAIL");
    //alert(email);
    if(document.getElementById("CheckFleet").checked && email!=""){
        fleet=email;
        getData();
        }
    else if(email!=""){
        fleet="";
        getData();
        }
}

function createship(currentmmsi, lat, lon, angle, speed, shiptype, shipname, flag, length, elapsed, shipindex) {
//drawship, depending on selected(checked) shiptypes and status
var mindistance=8; //in pixels
var mintextdistance=30;
if(n>300)
    mindistance=30;
if ((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((speed>5 && document.getElementById("CheckMoving").checked) || (speed<=5 && document.getElementById("CheckStopped").checked)) { //moving-moveless ships
        if(n<100 || shipindex==0 || map.getZoom()>=10 || shipsDistance(lat, lon, previous_lat, previous_lon)>mindistance) { 
            //show only ships that do not overlap by less than 8 pixels with the next ship
            if(document.getElementById("CheckLegends").checked && (shipindex==0 || map.getZoom()>=12 || shipsDistance(lat, lon, previous_lat, previous_lon)>mintextdistance))
                createLegend(lat, lon, shipname, shipindex);
            drawMovingShip(currentmmsi, lat, lon, angle, speed, shiptype, shipname, flag, length, elapsed, shipindex);
            previous_lat=lat;
            previous_lon=lon;
            //realcount++;
            }
        if(map.getBounds().getSouthWest().lng()<lon && map.getBounds().getSouthWest().lat()<lat &&
            map.getBounds().getNorthEast().lng()>lon && map.getBounds().getNorthEast().lat()>lat)
                shipsshown++;
       }
    }
}

function drawMovingShip(mmsi, x, y, angle, speed, shiptype, shipname, flag, length, elapsed, shipindex) {
	//prepare divs to display the ship icon and the legend of each point
	var newship=false;
	if(!ship[mmsi]) {
   	    ship[mmsi] = document.createElement("div");
        map.getPane(G_MAP_MARKER_MOUSE_TARGET_PANE).appendChild(ship[mmsi]);  //append on top of shadows but under infowindows
        newship=true;
    }
    //ship icon dynamically created only if different from previous position
    if(newship || x!=prevx[mmsi] || y!=prevy[mmsi]) {       
        realcount++;
        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 = 'shipicons/' + shipcolor[shiptype] + '1_' ;
            if(length>0 && length<=80)
                imgsrc+='s_';
            else if(length>150)
                imgsrc+='l_';
            imgsrc+= angle5 + '.png';
        }
	    var shiphtml = '<div id="ship"><span ';
        if ((version >= 5.5) && (version < 7) && (document.body.filters)) 
        {   
            //handle correctly transparent PNG images in IE 5.5 and 6
            shiphtml += ' 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(' + mmsi + ',\'' + shipname + '\');">';
        }
        else
        {
            shiphtml += '><img width="24" height="24" src="' + imgsrc + '"'
	        + ' title="' + shipname.replace('"', '') + ' [' + flag + '] ' + speed/10 + ' knots / ' + angle + '&deg;"';
	        if(shipindex!=-1)
	            shiphtml+= ' onclick="showInfoWindow(' + mmsi + ',\'' + shipname + '\');"';
	        shiphtml+= ' oncontextmenu="initDistance(' + x + ',' + y + ',' + speed/10.0 + ');return false;"';

	        if(elapsed>20)  //semi-transparent ships for old positions
	            shiphtml += ' class="ship_trans"';
	        shiphtml += '/>';
	    }
	    shiphtml += '</span></div>';
        ship[mmsi].innerHTML = shiphtml;
    }

    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 -12, offset.y - point.y -12)); //icon anchor at 12,12
    pos.apply(ship[mmsi]);
    ship[mmsi].style.visibility="visible";
    //projected course
    if(showprojected)
        drawPredicted(shipindex, parseInt(document.getElementById("ProjectedMins").value));
}


function drawCourse(x, y, angle, speed, shiptype) {
    //not used
    //draws line in front of ship, dpending on heading and speed
    if(!speed || speed<=5 || speed>600 )
        return;
    var rad=Math.PI*angle/180;
    var sinf=Math.sin(rad);
    var cosf=Math.cos(rad);
    var scaleunit=0.1/Math.pow(2,map.getZoom());  //size of ship analogue to 2 ^zoom level - to keep same size of ship
    var distorty=1.2;   //x shows longer than y on map - correct it!
    var pts = [new GLatLng(x+(8+speed)*scaleunit*cosf, y+(8+speed)*scaleunit*sinf*distorty),    //speed course
       new GLatLng(x,y)];   //line till center
    var course = new GPolygon(pts, shipcolor[shiptype], 1, 1, shipcolor[shiptype], 1);
    
    map.addOverlay(course);
    

}    

function drawWayPoint(x, y, angle, speed, timestamp, wpindex) {
	//prepare divs to display the wpoint icon and the legend of each point
	if(!wp[wpindex]) {
   	    wp[wpindex] = document.createElement("div");
        map.getPane(G_MAP_MARKER_SHADOW_PANE).appendChild(wp[wpindex]);  //append under ships and above tracks
    }
	
    //wp icon dynamically created
    var angle5 = (Math.floor(angle / 5)) * 5;
    var imgsrc = 'shipicons/waypoint_' + angle5 + '.png';
	var wphtml = '<div id="ship"><span ';
    if ((version >= 5.5) && (version < 7) && (document.body.filters)) 
    {   
        //handle correctly transparent PNG images in IE 5.5 and 6
        wphtml += ' 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 += '><img width="11" height="11" src="' + imgsrc 
	    + '" title="' + speed/10 + ' knots / ' + angle + '&deg;\n' + timestamp + '"/>';
	}
	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 drawPort(port_id, x, y, portname, portindex) {
	//prepare divs to display the port icon and the legend of each point
	if(!portdiv[port_id]) { //if existing, do not process - just reposition
   	    portdiv[port_id] = document.createElement("div");
        map.getPane(G_MAP_MARKER_MOUSE_TARGET_PANE).appendChild(portdiv[port_id]);  //append on top of shadows but under infowindows
	
        var imgsrc = "icons/anchor.png";
	    var shiphtml = '<div id="ship"><span ';
        if ((version >= 5.5) && (version < 7) && (document.body.filters)) 
        {   
            //handle correctly transparent PNG images in IE 5.5 and 6
            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].innerHTML = shiphtml;
    }
    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 -6, offset.y - point.y -10)); //icon anchor
    pos.apply(portdiv[port_id]);
    portdiv[port_id].style.visibility="visible";
}

function drawStation(station_id, x, y, stationname, stationstatus, stationindex) {
	//prepare divs to display the station icon and the legend of each point
	if(!stationdiv[station_id]) { //if existing, do not process - just reposition
   	    stationdiv[station_id] = document.createElement("div");
        map.getPane(G_MAP_MARKER_MOUSE_TARGET_PANE).appendChild(stationdiv[station_id]);  //append on top of shadows but under infowindows
	
        var imgsrc
        if(stationstatus=='ONLINE')
            imgsrc = "icons/light_red.png";
            //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)) 
        {   
            //handle correctly transparent PNG images in IE 5.5 and 6
            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="10" height="25" src="' + imgsrc 
	        + '" title="' + stationname + ' (Station id: ' + station_id + ')'
	        + '" onclick="showInfoStation(' + station_id + ',\'' + stationname + '\',' + x + ',' + y + ');">';
	    }
	    shiphtml += '</span></div>';
        stationdiv[station_id].innerHTML = shiphtml;
    }
    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 -25)); //icon anchor
    pos.apply(stationdiv[station_id]);
    stationdiv[station_id].style.visibility="visible";
}

function drawPhoto(mmsi, photoid, photox, photoy, photoname, copyright, date_taken, place, vote_average, vote_counter, photoindex, icon) {
	//prepare divs to display the port icon and the legend of each point
	var isnew=false;
	if(!photodiv[photoid]) { //if existing, do not create
   	    photodiv[photoid] = document.createElement("div");
        map.getPane(G_MAP_MARKER_MOUSE_TARGET_PANE).appendChild(photodiv[photoid]);  //append on top of shadows but under infowindows
        isnew=true;
    }
    if(isnew || (icon==true && photodiv[photoid].innerHTML.indexOf("<div")==0) || (icon==false && photodiv[photoid].innerHTML.indexOf("<img")==0)) {
	    var photohtml="";
	    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>';
        photodiv[photoid].innerHTML = photohtml;
    }
    
    var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());
    var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(new GLatLng(photoy,photox), map.getZoom());
    var pos;
    if(icon)
        pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - 8, offset.y - point.y -8)); //icon anchor
    else
        pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - 25, offset.y - point.y -18)); //photo anchor
    pos.apply(photodiv[photoid]);
    photodiv[photoid].style.visibility="visible";
}


function shipsDistance(x1, y1, x2, y2) {
    //returns the distance in pixels between two ships
    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;
    }

function showInfoWindow(mmsi, shipname, extra) {
if(mmsi && document.getElementById("map_area").clientHeight>250  && replaymmsi==0)
    {
    isOpenedInfo = true;
    var header = window.location.href.search("embed_comar")==-1;
    if(!infodiv)
        infodiv=document.createElement("div");
    infodiv.innerHTML='<div id="infotitle"><span>'+ shipname.replace('"','') + '</span></div><div id="infowindow" style="text-align:center"><br/><br/><img src=\"images/loadinfo.gif\"/></div>';
    map.openInfoWindow(new GLatLng(x[mmsi], y[mmsi]), infodiv);
    var url="shipinfo.aspx?mmsi=" + mmsi + "&header=" + header + "&shipname=" + shipname.replace('"','') + "&lat=" + x[mmsi] + "&lon=" + y[mmsi] + "&id=" + Math.random();
    if(extra)
        url+="&extra=true";
    GDownloadUrl(url, function(data, responseCode) {
        var infohtml = '<div id="infotitle"><span>'+ shipname.replace('"','') + movetype + '</span></div>';
        infohtml += '<div id="infowindow"><span>';
        infohtml += data;
        infohtml += '</span></div>';
	    infodiv.innerHTML=infohtml;
	    movetype="";
    });
    }
}

function closeInfo() {
    //isOpenedInfo = false;  it fires on Open! It's a reported bug...
}

function showInfoPhoto(mmsi, photoid, x, y, photoname, copyright, date_taken, place, vote_average, vote_counter) {
    isOpenedInfo = true;
    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>';
    map.openInfoWindowHtml(new GLatLng(y, x), infohtml);
}

function showInfoPort(port_id, portname, x, y) {
    isOpenedInfo = true;
    var header = window.location.href.search("embed_comar")==-1
    GDownloadUrl("portinfo.aspx?port_id=" + port_id + "&header=" + header + "&id=" + Math.random() , function(data, responseCode) {
        var infohtml = '<div id="infotitle"><span>'+ portname + ' (Port)</span></div>';
        infohtml += '<div id="infowindow"><span>';
        infohtml += data;
        infohtml += '</span></div>';
	    map.openInfoWindowHtml(new GLatLng(x, y), infohtml);
    });   
}
    
function showInfoStation(station_id, station_name, x, y) {
    isOpenedInfo = true;
    var header = window.location.href.search("embed_comar")==-1
    GDownloadUrl("stationinfo.aspx?station_id=" + station_id + "&header=" + header + "&id=" + Math.random() , 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>';
	    map.openInfoWindowHtml(new GLatLng(x, y), infohtml);
    });
}
    
function createLegend(x, y, titletext, shipindex) {    
	//prepare divs to display the ship icon and the legend of each point
	if(!texttip[shipindex]) {
   	    texttip[shipindex] = document.createElement("div");
        map.getPane(G_MAP_FLOAT_SHADOW_PANE).appendChild(texttip[shipindex]);
    }
	
    //text next to ship
    var lowertext = titletext.toLowerCase();
    //negative in satellite mode
    var front_style="texttip";
    var back_style="texttip_back";
    if(map.getCurrentMapType()==G_HYBRID_MAP || map.getCurrentMapType()==G_SATELLITE_MAP) {
        var front_style="texttip_back";
        var back_style="texttip";
    }
    //same text with diff color as background for better visibility
	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>';
    texttip[shipindex].innerHTML = title_front;
    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 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++;
    var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x + offsetx, offset.y - point.y +offsety)); 
    pos.apply(texttip[shipindex]);
  if(document.getElementById("CheckLegends").checked || replaymmsi>0) {
     texttip[shipindex].style.visibility="visible";
    }
  else {
     texttip[shipindex].style.visibility="hidden";
    }
}

function areaLegend(x, y, text, index) {    
	//prepare divs to display the ship icon and the legend of each point
	if(!areatext_back[index]) {
        areatext_back[index] = document.createElement("div");
        map.getPane(G_MAP_MARKER_MOUSE_TARGET_PANE).appendChild(areatext_back[index]);
   	    areatext[index] = document.createElement("div");
        map.getPane(G_MAP_MARKER_MOUSE_TARGET_PANE).appendChild(areatext[index]);
    }
	
    //text next to area
    if(map.getZoom()<4) {
        var title_front = '<div id="areatext_small"><span>'+ text +'</span></div>';
	    var title_back = '<div id="areatext_back_small"><span>'+ text +'</span></div>';
	    var textoffset = 15;
	}
	else {
	    var title_front = '<div id="areatext"><span>'+ text +'</span></div>';
	    var title_back = '<div id="areatext_back"><span>'+ text +'</span></div>';
	    var textoffset = 25;
	}
    areatext[index].innerHTML = title_front;
    areatext_back[index].innerHTML = title_back;   //same text with diff color as background for better visibility
    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 +1, offset.y - point.y -textoffset)); 
    var pos_back = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x + 2, offset.y - point.y -textoffset - 1)); 
    pos.apply(areatext[index]);
    pos_back.apply(areatext_back[index]);
    areatext[index].style.visibility="visible";
    areatext_back[index].style.visibility="visible";
}

function showLegends() {
    if(document.getElementById("CheckLegends").checked)
        getData();
}

function hideLegends() {
    for(var i in texttip)
        if(texttip[i]) {
            texttip[i].style.visibility="hidden";
            //texttip_back[i].style.visibility="hidden";
        }
}

function hideAreaLegends() {
    for(var i in areatext)
        if(areatext[i]) {
            areatext[i].style.visibility="hidden";
            areatext_back[i].style.visibility="hidden";
            GEvent.clearListeners(area[i], "click");
        }
}

function removeLegends() {
    //removes all Legend divs
    for(var i=0; i<n; i++)
        if(texttip[i]) {
            map.getPane(G_MAP_FLOAT_SHADOW_PANE).removeChild(texttip[i])
            texttip[i]=null;
        }
}

function hideShips() {
    for(var i=0; i<n; i++)
        if(ship[mmsi[i]])
            ship[mmsi[i]].style.visibility="hidden";
}

function hideWayPoints() {
    for(var i in wp)
        if(wp[i])
            wp[i].style.visibility="hidden";
}

function removeShips() {
    //removes all divs with ship icons
    for(var i=0; i<n; i++)
        if(ship[i])
            map.getPane(G_MAP_MARKER_MOUSE_TARGET_PANE).removeChild(ship[i])
            ship[i]=null;
}

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)
        getLights();//getStations();
    else
        hideStations(); 
}

function changePhotos() {
    if(document.getElementById("CheckPhotos").checked)
        getPhotos();
    else
        hidePhotos(); 
}

function hidePorts() {
    for(var i in portdiv)
        if(portdiv[i]) {
            portdiv[i].style.visibility="hidden";
        }
}

function hideStations() {
    for(var i in stationdiv)
        if(stationdiv[i]) {
            stationdiv[i].style.visibility="hidden";
        }
}

function hidePhotos() {
    for(var i in photodiv)
        if(photodiv[i]) {
            photodiv[i].style.visibility="hidden";
        }
}

function countDown(){
    countDownTime--;
    if (document.getElementById("countDownSecs"))
        document.getElementById("countDownSecs").innerHTML= countDownTime;
    if (countDownTime<=0){
        countDownTime=refreshInterval;
        clearTimeout(counter);
        getData();
        getSound();
        return;
    }
    clearTimeout(counter);
    counter=setTimeout("countDown()", 1000);
}



//**** helpers *****

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 fixPNG(myImage) 
{
    if ((version >= 5.5) && (version < 7) && (document.body.filters)) 
    {
       var imgID = (myImage.id) ? "id='" + myImage.id + "' " : "";
	   var imgClass = (myImage.className) ? "class='" + myImage.className + "' " : "";
	   var imgTitle = (myImage.title) ? 
		             "title='" + myImage.title  + "' " : "title='" + myImage.alt + "' "
	   var imgStyle = "display:inline-block;" + myImage.style.cssText;
	   var strNewHTML = "<span " + imgID + imgClass + imgTitle
                  + " style=\"" + "width:" + myImage.width 
                  + "px; height:" + myImage.height 
                  + "px;" + imgStyle + ";"
                  + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
                  + "(src=\'" + myImage.src + "\', sizingMethod='scale');\"></span>";
	   myImage.outerHTML = strNewHTML;
    }
}

// Build a custom map control to display latitude & longitude of mouse cursor
// Based on http://www.bdcc.co.uk/Gmaps/BdccGmapBits.htm
function MapCursorControl() {

    MapCursorControl.prototype = new GControl();

    MapCursorControl.prototype.initialize = function(map) {
        var container = document.createElement("div");
                          
    var ptr = document.createElement("div");
        ptr.id = "LatLonTxt";
//        if(map.getCurrentMapType()!=G_NORMAL_MAP)
//            ptr.style.color="White";
            
    container.appendChild(ptr);                           
    var tim = 0;
    
    GEvent.addListener(map, "mousemove", function(point) {
       var tim2 = new Date();
       if (tim2.getTime() > tim) { //avoid continuous run
            var ws = fixedLlString(point.lat(), point.lng());
                var ptr = document.getElementById('LatLonTxt');
            if(map.getCurrentMapType()==G_HYBRID_MAP || map.getCurrentMapType()==G_SATELLITE_MAP)
                ptr.style.color="White";
            else
                ptr.style.color="Black";

	        ptr.innerHTML = ws;
            tim = tim2.getTime() + 50;
       }
      
    });

    map.getContainer().appendChild(container);
    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){
	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) * 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);
	    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;
    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+"\" ";
	res+=w + lois +"&deg;"+lomin+"'"+loseci+"."+losecf+"\"<br/>";
	res+= "(" + (s=="S"?"-":"") +lais + "." + lafs + ", " + (w=="W"?"-":"") + lois + "." + lofs + ")";
	return res;
}
// end MapCursorControl()


function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		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() {
    //store user settings
    for (var i = 0; i < map.getMapTypes().length; i++)
        if (map.getCurrentMapType() == map.getMapTypes()[i])
            createCookie("maptype", i, 1);
    createCookie("centerx", (map.getBounds().getSouthWest().lng()+map.getBounds().getNorthEast().lng())/2.0, 1);
    createCookie("centery", (map.getBounds().getSouthWest().lat()+map.getBounds().getNorthEast().lat())/2.0, 1);
    createCookie("zoom", map.getZoom(), 1);
    }

    
    function showmore() {
        var morediv = document.getElementById("MoreOptions");
        if(morediv.style.display=="block")
            morediv.style.display="none";
        else
            morediv.style.display="block";
    }
    
    //]]>

