
/*  PAD  --  Pad a string to a given length with a given fill character.  */

function pad(str, howlong, padwith) {
    var s = str.toString();

    while (s.length < howlong) {
        s = padwith + s;
    }
    return s;
}

//
// round rounds the number num to dp decimal places
// the second line is some C like jiggery pokery I
// found in an O'Reilly book which means if dp is null
// you get 2 decimal places.
//
function round(num, dp)
{
   if (dp == 0) return Math.round(num);
   num = Math.round (num * Math.pow(10, dp))  / Math.pow(10, dp);
   var x = Math.abs(num);
   var s = num < 0 ? '-' : '';
   s += (Math.floor(x) + '.');
   x = Math.floor(Math.pow(10, dp) * (x - Math.floor(x)) + 0.5);
   s += pad(x.toString(),dp, '0');
   return s;

//   return Math.round (num * Math.pow(10, dp)) / Math.pow(10, dp);
}


//***************************************************************
function hmstring(t, accuracy, type)
{
    var prefix = '';
    var allseconds = Math.abs(t*3600);
    if (accuracy == 1)
        allseconds += 30;
    else if (accuracy == 2)
        allseconds += 3;
    else if (accuracy == 3)
        allseconds += 0.5;
    else if (accuracy >= 4)
        allseconds += 0.05;
    var seconds = allseconds % 60;
    var minutes = Math.floor(((allseconds - seconds) / 60)%60);
    var hours   = Math.floor(allseconds/3600)
    hmstr = hours + ":" + pad(minutes,2,"0");
    if (accuracy == 2)
        hmstr += '.' + Math.floor(seconds/6);
    else if (accuracy == 3)
        hmstr += ":" + pad(""+Math.floor(seconds),2,"0");
    else if (accuracy >= 4)
        hmstr += ":" + round(seconds,1);
    if (arguments.length == 2)
        return (t < 0 ? '-' : '') + hmstr;
    else if (type == 1)
        return hmstr + (t < 0 ? ' S' : ' N');
    else if (type == 2)
        return hmstr + (t < 0 ? ' W' : ' E');
}

function convertcoord(g_coords)
{
    var corners = new Array(4);

    var locations = new Array("upper left", "upper right", "lower left", "lower right");
    corners[0] = new Array(g_coords.lat1, g_coords.lon2);
    corners[1] = new Array(g_coords.lat1, g_coords.lon1);
    corners[2] = new Array(g_coords.lat2, g_coords.lon2);
    corners[3] = new Array(g_coords.lat2, g_coords.lon1);
//alert(corners[0]);
    var s = "";
    for (var i=0; i<corners.length; i++)
    {
        s += locations[i] + "&nbsp;<b>";
        s += hmstring(corners[i][0],4,1);
        s += "&nbsp;";
        s += hmstring(corners[i][1],4,2);
        s += "<\/b><p>";
    }
    s = s.replace(/\:/g, ' ');
    document.getElementById('corners').innerHTML = s;
 }


//<![CDATA[


var isinfowindow=false;

function googlemapsload()
{
  map = new GMap2(document.getElementById("map"));
  maptypes = map.getMapTypes();

  GEvent.addListener(map, "infowindowclose", function()
  {
    isinfowindow = false;
  });

  GEvent.addListener(map, "infowindowopen", function()
  {
    isinfowindow = true;
  });

  GEvent.addListener(map, "moveend", function()
  {
     if (isinfowindow) return;
     var center = map.getCenter();
     setmaptype(map,maptypes);

      // Create our "waypoint" marker icon
      var wpticon = new GIcon();
      wpticon.image = g_wpticon;
      wpticon.iconSize = new GSize(17, 13);
      wpticon.iconAnchor = new GPoint(8,9);
      wpticon.infoWindowAnchor = new GPoint(5, 1);

      // Create our "tiny" marker wpticon
      car.image = g_rteicon;
      car.iconSize=new GSize(32,32);
      car.iconAnchor=new GPoint(16,16);
      //car.shadowSize = new GSize(22, 20);
      car.infoWindowAnchor = new GPoint(5, 1);


     var bounds = map.getBounds();
     var southwest = bounds.getSouthWest();
     var northeast = bounds.getNorthEast();

     map.clearOverlays();
     // show marker when moving
     if (typeof(marker) != 'undefined')
       map.addOverlay(marker);

     if (typeof(trackline) != 'undefined')
       map.addOverlay(trackline);

     map.addControl(new GMapTypeControl());
     map.addControl(new GLargeMapControl());
     map.addControl(new GScaleControl());

     // definition of track
     if (g_definetrack)
     {
       for (i in g_newmarkers)
         map.addOverlay(g_newmarkers[i]);
     }
     else
     {
     // display markers
       createmarkers(map, wpticon, southwest, northeast);
     }
  });
  var mapcenter = g_mapcenter;
  var coords = mapcenter.split(',');
  map.setCenter(new GLatLng(coords[0], coords[1]), g_zoom);
  if (getcookievalue('gmaptype'))
  {
     newmaptype = maptypes[getcookievalue('gmaptype')]
     map.setMapType(newmaptype);
  }
}

// Set map type according to last type set
function setmaptype(map, maptypes)
{
   // save type in cookie
   var mt = map.getCurrentMapType();
   setcookievalue('gmaptype', 0);
   for (var t in maptypes)
   {
      if (mt == maptypes[t])
      {
         setcookievalue('gmaptype', t);
         break;
      }
   }
}

// Creates a marker at the given point with the given number label
function createmarker(map, wpticon,  min, max, lat, lon, name, descr)
{

  name = name.replace(/\[/g, '<');
  name = name.replace(/\]/g, '>');


  if (lat > min.lat() && lat < max.lat() && lon > min.lng() && lon < max.lng())
  {
     var point = new GLatLng(lat, lon);
     var marker = new GMarker(point, {title: descr, icon: wpticon});

     GEvent.addListener(marker, "click", function() {
       var wptfile = location.href.replace(/^.+(wptfile=[^&]+).*$/,"$1");
       if (wptfile == location.href) wptfile = ''; else wptfile = '&' + wptfile;

       var url = "";
       marker.openInfoWindowHtml("" + url  + name + "");
     });
     GEvent.addListener(marker, "click", function() {
     });
     map.addOverlay(marker);
  }
}



function animatebytrackpoint()
{
  var tp1 = trackpoints[trackpointindex];
  var tp2 = trackpoints[trackpointindex+1];

  if (typeof(tp1) != 'undefined' && tp1 && typeof(tp2) != 'undefined' && tp2)
  {
    var gl1 = tracklatlng[trackpointindex];
    var gl2 = tracklatlng[trackpointindex+1];

    var tracklastpandist = tracklastpanpoint.distanceFrom(tracklastinterpolated);
    tracksectiondist = gl1.distanceFrom(gl2);


    if (tracklastpandist > pandistance)
    {
      tracklastpanpoint = tracklastinterpolated;
      map.panTo(tracklastpanpoint);
    }


    var dist = trackpointdist;
    var time = (new Date()).getTime()-tracklasttime;
    var totaldist = (time/tick) * dist;

    var frac = totaldist / tracksectiondist;

//      map.clearOverlays();

    if (frac >= 1)
    {
      trackpointindex++;
      tracklasttime = (new Date()).getTime();
      tracklastinterpolated = gl2;
    }
    else
    {
      var dlat = gl2.lat() - gl1.lat();
      var dlng = gl2.lng() - gl1.lng();

      // Use parseFloat() otherwise the numbers are pasted together rather than added !!!
      var latint = parseFloat(gl1.lat())+ dlat * frac;
      var lngint = parseFloat(gl1.lng())+ (dlng * frac);
      tracklastinterpolated = new GLatLng(latint, lngint);
    }
    marker.setPoint(tracklastinterpolated);
    map.addOverlay(marker);
    if (running)
      timer = setTimeout("animatebytrackpoint()", tick);
  }
}

function restart()
{
//    document.getElementById('animatecontrol').style.display='block';
  running = true;
  document.getElementById('runstop').value = "Stop";


  trackpointindex=0;
  tracklasttime = (new Date()).getTime();
  tracklastinterpolated = tracklatlng[0];
  tracklastpanpoint = tracklatlng[0];

  map.panTo(tracklastpanpoint);

  animatebytrackpoint();
}

function runstop()
{
  if (running)
  {
    clearTimeout(timer);
    document.getElementById('runstop').value = "Ga verder";
    running = false;
  }
  else
  {
    running = true;
    animatebytrackpoint();
    document.getElementById('runstop').value = "Stop";
  }
}

function clicklistener(marker, point)
{
  if (marker)
  {

    var x = new Array();
    for (i in g_newmarkers)
    {
      if (marker === g_newmarkers[i])
      {
        point = g_newmarkers[i].getPoint();
        g_coord.innerHTML = g_coord.innerHTML.replace(point.lat() + "," + point.lng() + ",15\n", "");
        g_newmarkers.splice(i,1);
      }
      x.push(g_newmarkers[i]);
    }
    g_newmarkers = x;
    map.removeOverlay(marker);

  }
  else
  {
    var lat = point.lat();
    var lng = point.lng();
    g_coord.innerHTML+= (lat + "," + lng + ",15\n");

    var marker = new GMarker(point);
    g_newmarkers.push(marker);
    map.addOverlay(marker);
  }
}

function p_r(s)
{
  if (typeof(g_d) == "undefined" || !g_d)
    return;

  if (typeof(s) == 'object')
    s = 'object';
  else if (typeof(s) != 'string')
    s = '' + s;
  s = s.replace(/&/g, '&amp;');
  s = s.replace(/</g, '&lt;');
  s = s.replace(/>/g, '&gt;');
  if (g_d)
    g_d.innerHTML+= (s + '\n');
}


 //]]>
