var points;

function createIcon(image) {
  icon = new GIcon();
  icon.image = image;
  icon.iconSize = new GSize(2, 2);
  icon.iconAnchor = new GPoint(1, 1);
  icon.infoWindowAnchor = new GPoint(1, 1);
  
  return icon;
}

function addTablePoint(table,point,no) {
    var tbody = table.getElementsByTagName("TBODY")[0];
    var row = document.createElement("TR");
    var td1 = document.createElement("TD");
    var cb = document.createElement("INPUT");
    cb.type="checkbox";
    cb.id="cb_"+no;
    cb.name="cb_"+no;
    td1.appendChild(cb);
    var td2 = document.createElement("TD");
    td2.appendChild (document.createTextNode(no));
    var td3 = document.createElement("TD");
    td3.appendChild (document.createTextNode(point.x+", "+point.y));
    row.appendChild(td1);
    row.appendChild(td2);
    row.appendChild(td3);
    tbody.appendChild(row);
}

function removeAllRows(table) {
  var cnt = table.rows.length;
  for(var i=1;i<cnt;i++) {
    table.deleteRow(1);
  }
}

function deleteSelectedPoints() {
  var cnt = document.getElementById("points_table").rows.length;
  var to_delete = [];
  for(var i=cnt-1;i>0;i--) {
    var cb = document.getElementById("cb_"+i-1);
    if (cb.checked) {
      points.splice(i,1);
    }
  }
  showtrail(map);
}

function buildGpx() {
  var trailgpx = "<?xml version=\"1.0\"?>\n\
<gpx\n\
version=\"1.0\"\n\
creator=\"GPSBabel - http://www.gpsbabel.org\"\n\
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\
xmlns=\"http://www.topografix.com/GPX/1/0\"\n\
xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\">\n\
<trk>\n\
<name>Trail 10</name>\n\
<number>13</number>\n\
<trkseg>\n";
  
  for (var x = 0; x < points.length; x++) {
    point = points[x];
    trailgpx += "<trkpt lat=\""+point.y+"\" lon=\""+point.x+"\"></trkpt>\n";
  }
  trailgpx += "</trkseg>\n</trk>\n</gpx>";
  return trailgpx;
}


function checkPoint(no) {
  var cb = document.getElementById("cb_"+no);
  cb.checked = true;
  cb.focus();
}

pointiconimg = new Image();
pointiconimg.src = "/images/icons/redpoint.jpg";

var pointicon = createIcon("/images/icons/redpoint.jpg");

function createPointMarker(point,no) {
  var html = "<B>"+no+"</B>: "+point.x+", "+point.y+"<BR><A href=\"javascript:checkPoint("+no+")\">Check</A>";
  var marker = new GMarker(point,pointicon);
  GEvent.addListener(marker, "click", function() {
      marker.openInfoWindowHtml(html);
    });
  return marker;
}

apticonimg = new Image();
apticonimg.src = "/images/icons/airfield_icon.jpeg";
apticonshadowimg = new Image();
apticonshadowimg.src = "/images/icons/airfield_shadow_icon.png";

var apticon = new GIcon();
apticon.image = "/images/icons/airfield_icon.jpeg";
apticon.iconSize = new GSize(16, 16);
apticon.iconAnchor = new GPoint(8, 8);
apticon.shadow = "/images/icons/airfield_shadow_icon.png";
apticon.shadowSize = new GSize(16, 16);
apticon.shadowAnchor = new GPoint(8, 8);
apticon.infoWindowAnchor = new GPoint(8, 8);

function createMarker(point, code, name) {
  var html = "<b>" + code + "<\/b><br/>" + name;
  var marker = new GxMarker(point, apticon, html);
  return marker;
}

var map;

function parseGpx(trailgpx) {
  var xmlDoc = GXml.parse(trailgpx);
  points = [];
  var trk = xmlDoc.documentElement.getElementsByTagName('trk');
  for (var x = 0; x < trk.length; x++) {
    var trkseg = trk[x].getElementsByTagName('trkseg');
    for (var y = 0; y < trkseg.length; y++) {
      var markers = trkseg[y].getElementsByTagName('trkpt');
      for (var i = 0; i < markers.length; i++) {
        lon = parseFloat(markers[i].getAttribute("lon"));
        lat = parseFloat(markers[i].getAttribute("lat"));
        var point = new GPoint(lon,lat);
        points.push(point);
      }
    }
  }
}

function showtrail(map) {
  min_lat = 90;
  max_lat = -90;
  min_lon = 180;
  max_lon = -180;
  for (var x = 0; x < points.length; x++) {
    point = points[x];
    lon = point.x;
    lat = point.y;
    if (lon>max_lon) max_lon = lon;
    if (lon<min_lon) min_lon = lon;
    if (lat>max_lat) max_lat = lat;
    if (lat<min_lat) min_lat = lat;
  }

  var minZoom = map.getBoundsZoomLevel(new GLatLngBounds(new GLatLng(min_lat,min_lon),new GLatLng(max_lat,max_lon)));
  map.setCenter(new GLatLng((min_lat+max_lat)/2,(min_lon+max_lon)/2),minZoom,G_HYBRID_MAP);

  map.addOverlay(new GPolyline(points, "#FFFFFF", 3, 0.9));

//  var no = 1;
//  for (var x = 0; x < points.length; x++) {
//    point = points[x];
//    map.addOverlay(createMarker(point,no));
//    no++;
//  }
}

function showtrailforedit(map) {
  var div_txt = document.getElementById("message");
  var table = document.getElementById("points_table");
  
  map.clearOverlays();
  removeAllRows(table);

  min_lat = 90;
  max_lat = -90;
  min_lon = 180;
  max_lon = -180;
  for (var x = 0; x < points.length; x++) {
    point = points[x];
    lon = point.x;
    lat = point.y;
    if (lon>max_lon) max_lon = lon;
    if (lon<min_lon) min_lon = lon;
    if (lat>max_lat) max_lat = lat;
    if (lat<min_lat) min_lat = lat;
  }

  var minZoom = map.getBoundsZoomLevel(new GLatLngBounds(new GLatLng(min_lat,min_lon),new GLatLng(max_lat,max_lon)));
  map.setCenter(new GLatLng((min_lat+max_lat)/2,(min_lon+max_lon)/2),minZoom,G_HYBRID_MAP);

  map.addOverlay(new GPolyline(points, "#FFFFFF", 3, 0.9));

  var no = 1;
  for (var x = 0; x < points.length; x++) {
    point = points[x];
    map.addOverlay(createPointMarker(point,no));
    addTablePoint(table,point,no);
    no++;
  }
}

function gettrail(map,trail_link) {
  if (trail_link == "") {
      return false;
  }
  var request = GXmlHttp.create();
  request.open("GET", trail_link, true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
//      document.frm.gpx.value = request.responseText;
//      parseGpx(document.frm.gpx.value);
      parseGpx(request.responseText);
      showtrail(map);
    }
  }
  request.send(null);
}


function gettraillogbook(map,trail_link) {
  if (trail_link == "") {
      return false;
  }
  var request = GXmlHttp.create();
  request.open("GET", trail_link, true);
  request.onreadystatechange = function() {
    if (request.readyState == 4) {
      min_lat = 90;
      max_lat = -90;
      min_lon = 180;
      max_lon = -180;
    
      var xmlDoc = GXml.parse(request.responseText);
      var gpx = xmlDoc.documentElement.getElementsByTagName('gpx');
      for (var a = 0; a < gpx.length; a++) {
        var points = [];
        var trk = gpx[a].getElementsByTagName('trk');
        for (var x = 0; x < trk.length; x++) {
          var trkseg = trk[x].getElementsByTagName('trkseg');
          for (var y = 0; y < trkseg.length; y++) {
            var markers = trkseg[y].getElementsByTagName('trkpt');
            for (var i = 0; i < markers.length; i++) {
              var lat = parseFloat(markers[i].getAttribute("lat"));
              var lon = parseFloat(markers[i].getAttribute("lon"));
              points.push(new GLatLng(lat,lon));
              if (lon>max_lon) max_lon = lon;
              if (lon<min_lon) min_lon = lon;
              if (lat>max_lat) max_lat = lat;
              if (lat<min_lat) min_lat = lat;
            }
          }
        }
        map.addOverlay(new GPolyline(points, "#FFFFFF", 3, 0.6));
      }
      
      var minZoom = map.getBoundsZoomLevel(
        new GLatLngBounds(
          new GLatLng(min_lat,min_lon),
          new GLatLng(max_lat,max_lon)
        ));
      map.setZoom(map.getZoom()>minZoom?map.getZoom():minZoom);
    }
  }
  request.send(null);
}


// Function for creating URL to custom map tiles
function CustomGetTileUrl(a,b) {
	var z = 17 - b;
	var f = "http://www.runwayfinder.com/charts/x"+a.x+"y"+a.y+"z"+z+".jpg";
	return f;
}

// Add custom map type
function AddCustomMap() {
	// Create a copyright for the charts
	var copyCollection = new GCopyrightCollection('Chart');
	var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, "&copy;2006 RunwayFinder");
	copyCollection.addCopyright(copyright);
	
	// Single layer custom chart map
	// If maximum zoom is ever changed, change zoomAirport as well
	var tilelayers = [new GTileLayer(copyCollection, 0, 11)];
	tilelayers[0].getTileUrl = CustomGetTileUrl;
	
	// Create the GMapType
	var custommap = new GMapType(tilelayers, new GMercatorProjection(13), "Chart", {errorMessage:"No chart data available"});
	
	// Add the custom map type to the map
	map.addMapType(custommap);
}

