//
// APRS Tracking handler, v0.4 -SV1LH- 01/2009.
//
    var sidebar_html = "";
    var gmarkers = [];
    var htmls = [];
    var i = 0;
    var histhours = 3;
    var lmarkers = [];
    var waypointsset = [];
    var links = [];
    var currpoint = "";
    var lcurrpoint = "";
    var currimage = "";
    var currindex = "";
    var bounds;
    var sorted = "callsign";
    var refreshInterval = 60;
    var countDownTime = refreshInterval+1;
    var counter;
    var loadone = 0;
    var trkloadone = 0;
    var laststation="";
    var trackstation="";
    var stations = [];
    var icons = new Array();
    baseIcon = new GIcon();
    baseIcon.image = "images/mm_20_red.png";
    baseIcon.iconSize = new GSize(12, 20);
    baseIcon.iconAnchor = new GPoint(6, 20);
    baseIcon.infoWindowAnchor = new GPoint(5, 10);
    baseIcon.src = 'images/mm_20_red.png';
    icons['red'] = baseIcon;
    icons['purple'] = new GIcon(baseIcon);
    icons['purple'].image = "images/mm_20_purple.png";
    icons['purple'].src = 'images/mm_20_purple.png';
    icons['yellow'] = new GIcon(baseIcon);
    icons['yellow'].image = "images/mm_20_yellow.png";
    icons['yellow'].src = 'images/mm_20_yellow.png';

function createMarker(point, name, html, iconurl) {
        var marker;
        var k=i;
        var icon = new GIcon(baseIcon);
        if (iconurl) {
          icon.image = iconurl;
          icon.iconSize = new GSize(19, 19);
          marker = new GMarker(point, icon);
        } else { marker = new GMarker(point, icons["purple"]); }
        GEvent.addListener(marker, "click", function() {
        showonmap(k);
        });
        gmarkers[i] = marker;
        sidebar_html += '<img src="' + iconurl + '" width="16" height="16" align="left"><a href="javascript:showonmap(' + i + ')">' + name + '</a><br>';
        name2show = name.replace("-","_");	
        html += '<br>&nbsp;...&nbsp;&nbsp;<a href="javascript:showtrack(\''+name2show+'\');"><font size="2">Show track</a>';
        html += '&nbsp;&nbsp;&nbsp;<a href="javascript:hidetrack();">Hide track</a>';
        html += '&nbsp;&nbsp;&nbsp;<a href="javascript:stoptracking();">Stop tracking</a>&nbsp;&nbsp;...';
        htmls[i] = html;
        stations[i] = name;
        waypointsset[i] = 0;
        marker.setTooltip(name2show);
        i++;
        return marker;
}

function showonmap(k) {
      currpoint = gmarkers[k].getPoint();
      var currlat = gmarkers[k].getPoint().lat();
      var currlng = gmarkers[k].getPoint().lng();
      lcurrpoint = new GLatLng(currlat, currlng);
      laststation = stations[k];
      trackstation="";
      currindex = k;
      loadone=0;
//      map.setCenter(currpoint);
      gmarkers[k].openInfoWindowHtml(htmls[k]);
}

function createlMarker(point, name, html, iconurl) {
        var marker;
        var icon = new GIcon(baseIcon);
        if (iconurl) {
          icon.image = iconurl;
          icon.iconSize = new GSize(19, 19);
          icon.iconAnchor = new GPoint(9, 16);
          icon.infoWindowAnchor = new GPoint(8, 10);
          marker = new GMarker(point, icon);
          }
        else { marker = new GMarker(point, icons["yellow"]); }
        GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(html);
        });
        marker.setTooltip(name);
        return marker;
}

function positionOverview(x,y) {
     var omap=document.getElementById("map_overview");
     omap.style.left = x+"px";
     omap.style.top = y+"px";
     omap.firstChild.style.border = "1px solid gray";
     omap.firstChild.firstChild.style.left="4px";
     omap.firstChild.firstChild.style.top="4px";
     omap.firstChild.firstChild.style.width="120px";
     omap.firstChild.firstChild.style.height="120px";
}
   
function loadata() {
     if(links.length > 0) { hidetrack(); }
     map.closeInfoWindow();
     map.clearOverlays();
     sidebar_html = "";
     gmarkers.length = 0;
     lmarkers.length = 0;
     htmls.length = 0;
     waypointsset.length = 0;
     links.length = 0;
     i = 0;
     stations.length = 0;
     loadone = 0;
     bounds = new GLatLngBounds();
    var request = GXmlHttp.create();
//    request.open("GET", "mobile.php?hist="+histhours, true);
    var now=new Date();
    now=parseInt(now.getTime()/1000);
    request.open("GET", 'mobile.php?hist='+histhours+'&sort='+sorted+'&dt='+now, true);
    request.onreadystatechange = function() {
    if (request.readyState == 4) {
       if (request.status == 200) {    
          var xmlDoc = request.responseXML;
          var markers = xmlDoc.documentElement.getElementsByTagName("station");
          var stats = xmlDoc.documentElement.getElementsByTagName("stats");		    
          for (var j = 0; j < markers.length; j++) {
 		var point = new GPoint(parseFloat(markers[j].getAttribute("lon")),
    			           parseFloat(markers[j].getAttribute("lat")));
		var lpoint = new GLatLng(parseFloat(markers[j].getAttribute("lat")),
    			           parseFloat(markers[j].getAttribute("lon")));
		var call = markers[j].getAttribute("call");
		var desc = markers[j].getAttribute("desc");
		var iconurl = markers[j].getAttribute("icon");
		var marker = createMarker(point, call, desc, iconurl);
		map.addOverlay(marker);
		bounds.extend(lpoint);
                }
//            map.setCenter(bounds.getCenter());
//            map.setZoom(map.getBoundsZoomLevel(bounds));
          document.getElementById("sidebar").innerHTML = sidebar_html;
          for (var j = 0; j < stats.length; j++) {
                var mobilestations = stats[j].getAttribute("mobilestations");
                var mrecords = stats[j].getAttribute("mrecords");
                }
                document.getElementById("mobilestations").innerHTML = mobilestations;
                loadone=2;
          } else { alert('Can not access APRS Server.'); }		
        }
      }
      request.send(null);
      clearTimeout(counter);
      setTimeout("countDown()", 1000);
}

function loadhistory() { 
  histhours = document.ref.history.value;
  sorted = document.ref.sortedby.value;
  countDownTime=refreshInterval;
  clearTimeout(counter);
  loadata();
}

function showtrack(callsign) {
//     hidetrack();
     if(links.length > 0) { hidetrack(); }
     map.closeInfoWindow();
     sidebar_html=sidebar_html.replace(/\*/g,'');
     sidebar_html=sidebar_html.replace(/red/g,'');
     var waypoints = 0;
     var totdistance = 0;
     var waypoint=null;
     bounds = new GLatLngBounds();
     var request = GXmlHttp.create();
//     request.open("GET", "mobtrack.php?mobstn="+callsign+'&hist='+histhours, true);
     var now=new Date();
     now=parseInt(now.getTime()/1000);
     request.open("GET", 'mobtrack.php?hist='+histhours+'&mobstn='+callsign+'&dt='+now, true);
     request.onreadystatechange = function() {
     if (request.readyState == 4) {
     if (request.status == 200) {    
	    var xmlDoc = request.responseXML;
	    var markers = xmlDoc.documentElement.getElementsByTagName("waypoint");
            var stats = xmlDoc.documentElement.getElementsByTagName("stats");		    
	    for (var j = 0; j < markers.length; j++) {
		var point = new GPoint(parseFloat(markers[j].getAttribute("lon")),
    			           parseFloat(markers[j].getAttribute("lat")));
		var lpoint = new GLatLng(parseFloat(markers[j].getAttribute("lat")),
    			           parseFloat(markers[j].getAttribute("lon")));
                if(waypoint == null) { waypoint=lpoint; }
		var id = markers[j].getAttribute("id");
		var desc = markers[j].getAttribute("desc");
		var iconurl = markers[j].getAttribute("icon");
                var distance = waypoint.distanceFrom(lpoint);
                totdistance+=distance;
                desc+='<br><font size="2">Distance from previous waypoint : '+parseInt(distance)/1000+'Km';
                desc+='<br><b>Total</b> Distance so far : '+parseInt(totdistance)/1000+'Km</font>';
                links.push(new GPolyline([(waypoint),(lpoint)], "#000000", 2, 0.8));
                waypoint=lpoint;
		var marker = createlMarker(point, id, desc, iconurl);
                lmarkers.push(marker);
                waypoints++;
		bounds.extend(lpoint);
	    }
            var distance = waypoint.distanceFrom(lcurrpoint);
            totdistance+=distance;
            links.push(new GPolyline([(waypoint),(lcurrpoint)], "#000000", 2, 0.8));
            bounds.extend(lcurrpoint);
            map.setCenter(bounds.getCenter());
            map.setZoom(map.getBoundsZoomLevel(bounds));
	    for (var j = 0; j < links.length-1; j++) {     
                map.addOverlay(links[j]);
                map.addOverlay(lmarkers[j]);
            }
	    map.addOverlay(links[j]);
            for (var j = 0; j < stats.length; j++) {
                var minspeed = stats[j].getAttribute("minspeed");
                var maxspeed = stats[j].getAttribute("maxspeed");
                var minalt = stats[j].getAttribute("minalt");		
                var maxalt = stats[j].getAttribute("maxalt");
                var test_db = stats[j].getAttribute("waypoints");
                }
            if(waypointsset[currindex] == 0) {
             if(test_db==0) { waypoints='<b><i>ErroR</i></b>'; }
             htmls[currindex]+='<br><b><u>Statistics</u></b>: '+waypoints+' waypoints';
             htmls[currindex]+='<br><u>min</u>Altitude: '+minalt+'<b>m</b>, <u>max</u>Altitude: '+maxalt+'<b>m</b>';	     
             htmls[currindex]+='<br><u>min</u>Speed: '+minspeed+'<b>Kmh</b>, <u>max</u>Speed: '+maxspeed+'<b>Kmh</b>';
             htmls[currindex]+='<br><u>Total</u> track distance: '+parseInt(totdistance)/1000+'<b>Km</b>';
             waypointsset[currindex] = 1;
             }
              callsign=callsign.replace('_','-');
//              sidebar_html=sidebar_html.replace(callsign,callsign+'*');
              sidebar_html=sidebar_html.replace(callsign,'<font color="red">'+callsign+'*</font>');
              document.getElementById("sidebar").innerHTML = sidebar_html;
              gmarkers[currindex].openInfoWindowHtml(htmls[currindex]);
              laststation="";
	      trackstation=callsign;
          } else { alert('Can not access APRS Server.'); }
       }
     }
     request.send(null);
}

function hidetrack() {
       if(links.length > 0) {
	    for (var j = 0; j < links.length-1; j++) {     
               map.removeOverlay(links[j]);
               map.removeOverlay(lmarkers[j]);
            }
	    map.removeOverlay(links[j]);
	    links.length = 0;
	    lmarkers.length = 0;
       }
}


function countDown() {
    countDownTime--;
    if (document.getElementById("countDownSecs")) { document.getElementById("countDownSecs").innerHTML= countDownTime; }
    if (countDownTime<=0) {
//        soundManager.play('sv1lh');
//        soundManager.play('73');
        countDownTime=refreshInterval;
        clearTimeout(counter);
        loadhistory();
        return;
    }
 counter=setTimeout("countDown()", 1000);
 if(laststation!="" && loadone!=0) { setTimeout("showlast()", loadone); loadone=0; }
 if(trackstation!="" && loadone!=0) { setTimeout("tracklast()", loadone); loadone=0; }
// if(trackstation!="" && trkloadone!=0) { setTimeout("tracklast()", trkloadone); trkloadone=0; }
// if(trackstation!="") { tracklast(); }
}

function showlast() {
  for(var j=0;j<i;j++) {
    if(stations[j] == laststation) { showonmap(j); break; }
  }
}

function tracklast() {
  var trkstation=trackstation.replace('-','_');
  for(var j=0;j<i;j++) {
    if(stations[j] == trackstation) { currindex=j; showtrack(trkstation); break; }
  }
}

function stoptracking() {
  if(links.length > 0) { hidetrack(); }
  map.closeInfoWindow();
  sidebar_html=sidebar_html.replace(/\*/g,'');
  sidebar_html=sidebar_html.replace(/red/g,'');
  document.getElementById("sidebar").innerHTML = sidebar_html;
  laststation="";
  trackstation="";
  loadone=0;
  trkloadone=0;
}

