// Code to load the coords.xml file and create the map
// with a route line and the distances 

   function init() {}

   function convertGps(deg,min)
   {
	if (deg == "" || min == ""){
			alert("Enter a value for GPS degrees and GPS min.");
	}
	else if (deg > 180 || deg < 0){
			alert("Degrees should be between 0 and 180.");
	}
	else if (min > 60 || min < 0){
				alert("Minutes should be between than 0 and 60.");
	}
	else {
	       return ( (deg*1.0) + min/60.0 );
	}
   } // convertGps

   function toRad(x) 
   {  // convert degrees to radians
	return x * Math.PI / 180;
   }

   function calc_distance(point1,point2)
    {
	var lat1 = point1.lat();
	var lon1 = point1.lng();
	var lat2 = point2.lat();
	var lon2 = point2.lng();
	var R = 3438.461; // Nautical miles
	var dLat = toRad(lat2-lat1);
	var dLon = toRad(lon2-lon1); 
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
       	 	Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * 
       		 Math.sin(dLon/2) * Math.sin(dLon/2); 
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
	var d = R * c;
	return d;
   } // calc_distance

  function getCoord(str)
  {
     var deg=-999;
     if ( str.match( /^-?\d{2,3}.\d+$/ ) )
     {
	deg = parseFloat(str);
     }
     else if ( str.match( /^\d{2,3} \d\d\.\d+/ ) )
     {
        var parts = str.split(' ') ;
	deg =  convertGps( parts[0],parts[1] );
     }
     else if ( str.match( /^\-\d{2,3} \d\d\.\d+/ ) )
     {
	var parts = str.split(' ') ;
        deg =  -1 * convertGps( (-1 * parts[0]),parts[1] );
     }    
     else alert( "Not a valid coord "+str);

     return deg;
  } // getCoord 

	//<![CDATA[

    if (GBrowserIsCompatible()) {
      // Some constants
      var MAP_ZOOM=4;

      var MAP_CENTRE_LAT= 45; //  48; 
      var MAP_CENTRE_LNG=-30; // -44;
      var MAP_XML_FILE="coords.xml";
      var point_t=new GLatLng(51.947638,-10.233293); // Kerry
      var point_p=new GLatLng(38.543013,-28.62726);  // Horta

      // Load a new icon
	var icon = new GIcon();
	icon.image = "/images/marker_sailboat.png";
	icon.shadow = "/images/marker_sailboat_shadow.png";
	icon.iconSize = new GSize(25, 25);
	icon.shadowSize = new GSize(38, 25);
	icon.iconAnchor = new GPoint(12, 25);
	icon.infoWindowAnchor = new GPoint(25, 12);
     
      // A function to create the marker and set up the event window
      function createMarker(point,name,html) {
        var marker = new GMarker(point,icon);
        GEvent.addListener(marker, "click", function() {
          marker.openInfoWindowHtml(name + "<br />" + html);
        });
        return marker;
      }

      // create the map
      var map = new GMap2(document.getElementById("map"));
      map.addControl(new GLargeMapControl());
      map.addControl(new GMapTypeControl());
      map.setCenter(new GLatLng( MAP_CENTRE_LAT, MAP_CENTRE_LNG ), MAP_ZOOM );
      
      // Setup the Marker Manager 
      var mgr = new GMarkerManager(map);

      // Read the data from xml file
      var request = GXmlHttp.create();
      request.open("GET", MAP_XML_FILE , true);
      request.onreadystatechange = function() {
        if (request.readyState == 4) {
	  // array of GLatLng points for the polyline
	  var points = [];

          // obtain the array of markers and loop through it
          var xmlDoc = GXml.parse(request.responseText);
          var markers = xmlDoc.documentElement.getElementsByTagName("marker");
	  // previous point
	  var prev_point=null;
	  var total_distance=0;
          for (var i = 0; i < markers.length; i++) {
            // obtain the attributes of each marker
            var lat = markers[i].getAttribute("lat");
            var lng = markers[i].getAttribute("lng");
            var zoom = parseFloat(markers[i].getAttribute("zoom"));
            var point = new GLatLng(getCoord(lat),getCoord(lng));

	    // calculate distance
	    var distance=0;
	    var to_turn  = calc_distance(point,point_p);
	    var to_target= calc_distance(point,point_t);
	    if ( prev_point != null ) 
            {
		distance = calc_distance(prev_point,point);
		total_distance += distance;
	    }
	    prev_point = point;

	    // create marker text and label
            var label = markers[i].getAttribute("date");
	    var print_total = total_distance;
	    if (print_total.toFixed) // check if the browser supports toFixed
	    {    
		print_total = print_total.toFixed(2);
            	distance = distance.toFixed(2);
		to_turn  = to_turn.toFixed(2);
            	to_target= to_target.toFixed(2);
	    }
            var html = "Lat: "+lat+" Lng: "+lng+"<br />"
			+ "Distance Today: " + distance + " Nautical miles<br />" 
			+ "Total Distance: " + print_total + " Nautical miles<br />"
			+ "Azores are: "+to_turn+ " Nautical miles away<br />"
			+ "Kerry is: "+to_target+" Nautical miles away<br /><br />"
			+ markers[i].getAttribute("text");

            // create the marker
            var marker = createMarker(point,label,html);
	    mgr.addMarker(marker,zoom)
	    
	    // add the point to the array for the polyline
	     points[i] = point;
          }

	  /* var polyline = new GPolyline.fromEncoded({
  				color: "#0000ff",
  				weight: 3,
  				opacity: 0.5,
				points: points
  				points: "crreG`xowOmo[wtGeg[kvJeqLkyHgofAmvHogbAe`IheFkrbBo|Hu}o@kaAyajAmg@~vCqenDmotCax]gkLwvPckFglPqnFykSuiAanIchCyoBc|YyrLecEmwC}}@g|I`OavCwqKv@amO_`@meBiePm`hBf}h@e}hB~w@_bIteDu}I~|CgrOvuHs`[n{EwhWd{CqqQjnKehYdxN}wSvuH}`Ht_LsgFtqY_qSnmdBbeGrqBe|D~WrSptKtyJnwH?rbOo{EvqKmaEvzFawDfwFymGluPq|UiqC}}Zt`GaaWnzCe~GbiKcfOh__@ckFtrSwoPrhGxnObaXoxIpw_@_}CvpQu{GvvInxBfrOg|Dd|u@`{LhpOcl@z|XfjIvsQbha@fu@~{JhqGvvIrkCatAt|Hr_L~j[h|p@ZtCZ{Oxms@oqPl}GkaLpxBcmHprCaoJlbFprJhtCmc@xoBso@n~AzgAhmOcxn@xsAo}_An{Ekkm@jgDqlKg{Cw`d@ypCmhc@jy[{r@sqc@qhSarr@yfNzfG{{^ptEc~MsdJimv@{gOi``@gvEabYe}@amCw|Modd@vyCoadAsub@{jV{_NwtNsdJsli@}u@{w@kqQavVigY}dq@{eF}wLysF_|I{dEykL{m@wsM}hByhIgrGoeP",
  				levels: "PHIKFNKJNJLEDJHKKDINIIFPJHHFHEKINHHLJKCKIFNHIKKIHLJOLIIJJLJJNIJJIJCMFLI@LJFIPJJIKDLNJNHLJIIELMILJEI?HKIHIP",
  				zoomFactor: 2, 
  				numLevels: 18
			}); 
	  map.addOverlay(polyline); 
	*/
	  // draw the route to date
	  map.addOverlay(new GPolyline(points),'#0000ff',1,0.5); 
	  // draw the route via "Point P"
	  //map.addOverlay(new GPolyline( [ prev_point,point_p,point_t], '#ff0000',1,0.4)); 
	  // draw the direct route
	  // map.addOverlay(new GPolyline( [ prev_point,point_t], '#ff0000',1,0.4)); 
        }
      }
      request.send(null);
    }

    else {
      alert("Sorry, the Google Maps API is not compatible with this browser");
    }
    // This Javascript is based on code provided by the
    // Blackpool Community Church Javascript Team
    // http://www.commchurch.freeserve.co.uk/   
    // http://www.econym.demon.co.uk/googlemaps/

    //]]>

