var map;

var mycolors = new Array();
mycolors[0] = 'D9D919'; //gold
mycolors[1] = 'E6E8EA'; //silver
mycolors[2] = 'CD7F32'; //bronze
mycolors[3] = '5EC734'; //green
mycolors[4] = 'DF1822'; //red
mycolors[5] = 'ECEE2F'; //yellow
mycolors[6] = '9CF5F2'; //light blue
mycolors[7] = 'FFB442'; //orange

var tooltip;
var arrowMarker;


var nearbyTrails;

var ids = [];

var minBoundlat = 90;
var minBoundlng = 180;

var maxBoundlat = -90;
var maxBoundlng = -180;

var batch = [];

var initFlag = "norefresh";

var mapType;

function initMap(mType)  {
    map = new GMap2(document.getElementById("map_canvas"));

    map.removeMapType(G_HYBRID_MAP );
    map.addMapType(G_PHYSICAL_MAP);
    if (mType == 'alltrails' || mType == 'bestphoto') {
      map.setMapType(G_PHYSICAL_MAP);
    } else  {
      map.setMapType(G_SATELLITE_MAP);
    }

    if (mType != "trail")
      map.addControl(new GLargeMapControl());


    map.addControl(new GMapTypeControl());

    mapType = mType;
}



function showTrailMap() {
    //alert("showMap: " + trailid + ", " + trailname);
    //alert("step 0");
    initMap("trail");
    //alert("mapzoom: " + mapzoom);

    tooltip = document.createElement("div");
    document.getElementById("map_canvas").appendChild(tooltip);
    tooltip.style.visibility="hidden";



    if (typeof(lat)!= "undefined" && typeof(lng)!= "undefined" && lat > '' && lng > '')  {
      //alert ("showMap2: " + lat + ", " + lng);
      var latlng = new GLatLng (lat, lng);

      setHomeMarker(latlng);


      if (typeof(gpsTrack)!= "undefined" && gpsTrack > "")  {
        //alert ("gpsTrack1: " + gpsTrack);
        map.setCenter(latlng, 12);
        var geoXml = new GGeoXml(gpsTrack, function() {
          if (geoXml.hasLoaded()) {
            //geoXml.gotoDefaultViewport(map);
            //alert("step g1");
            //alert("zoom: " + map.getBoundsZoomLevel(geoXml.getDefaultBounds()));
            //alert("step g2: " + geoXml.getDefaultBounds());

            if (hasAlbum())  {
              //alert("g3");
              //map.setCenter(geoXml.getDefaultCenter(), map.getBoundsZoomLevel(geoXml.getDefaultBounds()));
              centerTrailMap(geoXml.getDefaultBounds());
              renderPictureAlbum();
            } else  {
              //alert("g4");
              map.setCenter(geoXml.getDefaultCenter(), map.getBoundsZoomLevel(geoXml.getDefaultBounds()));
            }
            
            map.addOverlay(geoXml);
          }


        });


      } else  {
        //alert("step 3");
        //setHomeMarker(latlng);
        //alert("step 4");
        if (hasAlbum())  {
          //alert("step 5");
          map.setCenter(latlng, 15);
          centerTrailMap(map.getBounds());
          renderPictureAlbum();
        } else  {
          //alert("step 6");
          map.setCenter(latlng, mapzoom);
        }
      }

      
      //alert("step 7: " + trailid);
      trailExists(trailid);
      //alert("step 8");
      //initFlag = "widerefresh";
      renderNearbyTrailsByBound(trailid, true, false, false);
      //alert("step 9");
      downloadThumbnails();
      //alert("step 10");
    } else  {
        //alert ("gpsTrack2: " + gpsTrack);
        geoXml = new GGeoXml(gpsTrack, function() {
        if (geoXml.hasLoaded()) {
          //geoXml.gotoDefaultViewport(map);
          //alert("downloaded");

          if (hasAlbum())  {
            centerTrailMap(geoXml.getDefaultBounds());

            renderPictureAlbum();

          } else  {
              map.setCenter(geoXml.getDefaultCenter(), map.getBoundsZoomLevel(geoXml.getDefaultBounds()));
          }


          trailExists(trailid);

          initFlag = "widerefresh";
          renderNearbyTrailsByBound(trailid, true, false, false);

          map.addOverlay(geoXml);
          downloadThumbnails();
        }
      });



    }


    GEvent.addListener(map,"dragend", function() {
      renderNearbyTrailsByBound(trailid, false, false, false);
    });


    GEvent.addListener(map,"zoomend", function(oldLevel, newLevel)
    {
      if (newLevel > 4 && newLevel < 14)
        renderNearbyTrailsByBound('', false, false, false);


      if (newLevel < oldLevel && newLevel > 4)  {
          removeAllMarkers(newLevel + 1);
      }
    });



    var mapZoomControl = new GLargeMapControl();
    var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,40));
    map.addControl(mapZoomControl, topRight);





}


function showRegionMap()  {
    initMap("region");


    if (typeof(defaultLat) != "undefined" && typeof(defaultLng) != "undefined") {

      var defaultCenter = new GLatLng(defaultLat, defaultLng);
      //alert("lat,lng,zoom: " + defaultLat + ", " + defaultLng + ", " + defaultZoom + ", " + defaultCenter);
      
      map.setCenter(defaultCenter, defaultZoom);

      tooltip = document.createElement("div");
      document.getElementById("map_canvas").appendChild(tooltip);
      tooltip.style.visibility="hidden";

      var keyword2 = document.getElementById("tagkeyword");
      //alert("keyword: " + keyword2);
      if (keyword2 && typeof(keyword2) != "undefined") {
        findTags("");
      } else  {
        renderNearbyTrailsByBound('', true, false, false)
      }
      
    } else  {
      populateDefaultAddrLatLng(address, 0, true);
    }

    GEvent.addListener(map,"dragend", function() {
      renderNearbyTrailsByBound('', false, false, false);
    });


    GEvent.addListener(map,"zoomend", function(oldLevel, newLevel)
    {
      if (newLevel < oldLevel)  {

        if (newLevel > 4)  {
          removeAllMarkers(newLevel + 1);
        }
        renderNearbyTrailsByBound('', false, false, false);
      } else  {
        if (newLevel > 4 && newLevel < 10) {
          renderNearbyTrailsByBound('', false, false, false);
        } else {
          calcTrailStats();
        }
      }
    });

}

function showRegionMap2()  {
    initMap("region");


    if (nearbyTrails && typeof(nearbyTrails) != "undefined" && nearbyTrails.trails.length > 0) {
      var minlat = nearbyTrails.trails[0].lat;
      var minlng = nearbyTrails.trails[0].lng;

      var maxlat = nearbyTrails.trails[0].lat;
      var maxlng = nearbyTrails.trails[0].lng;

      var sw = new GLatLng(minlat,maxlng);
      var ne = new GLatLng(maxlat,minlng);
      var bounds = new GLatLngBounds(sw,ne);

      for (i = 0; i < nearbyTrails.trails.length; i++)  {
        var marker = createNearbyMarker(nearbyTrails.trails[i]);
        map.addOverlay(marker);
        batch.push(marker);
        bounds.extend(new GLatLng(nearbyTrails.trails[i].lat,nearbyTrails.trails[i].lng));
      }
       //map.addOverlay(new GMarker(bounds.getSouthWest()));
       //map.addOverlay(new GMarker(bounds.getNorthEast()));

      //alert("bounrds: " + bounds + ", " + bounds.getCenter() + ", " + map.getBoundsZoomLevel(bounds));

      zoomBound = map.getBoundsZoomLevel(bounds);
      zoomBound = zoomBound > 11 ? 11 : zoomBound;

      map.setCenter(bounds.getCenter(), zoomBound);

      //alert("latlng: " + maxlng + ", " + minlng + ", " + maxlat + ", " + minlat + ", " +  latlng);
      calcTrailStats();
      populateTrailList();

    } else if (typeof(defaultLat) != "undefined" && typeof(defaultLng) != "undefined") {

      var defaultCenter = new GLatLng(defaultLat, defaultLng);
      //alert("lat,lng,zoom: " + defaultLat + ", " + defaultLng + ", " + defaultZoom + ", " + defaultCenter);

      map.setCenter(defaultCenter, defaultZoom);

      tooltip = document.createElement("div");
      document.getElementById("map_canvas").appendChild(tooltip);
      tooltip.style.visibility="hidden";

      var keyword2 = document.getElementById("tagkeyword");
      //alert("keyword: " + keyword2);
      if (keyword2 && typeof(keyword2) != "undefined") {
        findTags("");
      } else  {
        renderNearbyTrailsByBound('', true, false, false)
      }
    } else if (typeof(address) != "undefined" && typeof(address) != "undefined") {
      populateDefaultAddrLatLng(address, 0, true);
    }


    tooltip = document.createElement("div");
    document.getElementById("map_canvas").appendChild(tooltip);
    tooltip.style.visibility="hidden";

    GEvent.addListener(map,"dragend", function() {
      renderNearbyTrailsByBound('', false, false, false);
    });


    GEvent.addListener(map,"zoomend", function(oldLevel, newLevel)
    {
      if (newLevel < oldLevel)  {

        if (newLevel > 4)  {
          removeAllMarkers(newLevel + 1);
        }
        renderNearbyTrailsByBound('', false, false, false);
      } else  {
        if (newLevel > 4 && newLevel < 10) {
          renderNearbyTrailsByBound('', false, false, false);
        } else {
          calcTrailStats();
        }
      }
    });

}


function showAllTrailsMap()  {
    initMap("alltrails");


    if (nearbyTrails && typeof(nearbyTrails) != "undefined" && nearbyTrails.trails.length > 0) {
      var minlat = nearbyTrails.trails[0].lat;
      var minlng = nearbyTrails.trails[0].lng;

      var maxlat = nearbyTrails.trails[0].lat;
      var maxlng = nearbyTrails.trails[0].lng;

      var sw = new GLatLng(minlat,maxlng);
      var ne = new GLatLng(maxlat,minlng);
      var bounds = new GLatLngBounds(sw,ne);

      for (i = 0; i < nearbyTrails.trails.length; i++)  {
        var marker = createNearbyMarker(nearbyTrails.trails[i]);
        map.addOverlay(marker);
        batch.push(marker);
        bounds.extend(new GLatLng(nearbyTrails.trails[i].lat,nearbyTrails.trails[i].lng));
      }
    
      bounds = extendBounds(bounds, 0.03);


       //map.addOverlay(new GMarker(bounds.getSouthWest()));
       //map.addOverlay(new GMarker(bounds.getNorthEast()));

      //alert("bounrds: " + bounds + ", " + bounds.getCenter() + ", " + map.getBoundsZoomLevel(bounds));

      zoomBound = map.getBoundsZoomLevel(bounds);

      zoomBound = zoomBound > 11 ? 11 : zoomBound;

      map.setCenter(bounds.getCenter(), zoomBound);

    }

    tooltip = document.createElement("div");
    document.getElementById("map_canvas").appendChild(tooltip);
    tooltip.style.visibility="hidden";


}


function showBestPhotoMap()  {
    initMap("bestphoto");




    var marker = null;

    for (var i = 0; i < album.images.length; i++) {
       //alert("lng, lat: " + album.images[i].piclng + ", " + album.images[i].piclat);

       var picMarker = null;
      if (album.images[i].piclng && album.images[i].piclat)  {
          picMarker = createPictMarker(i);
          album.images[i].marker = picMarker;


      }



      if (picMarker != null)  {
        map.addOverlay(picMarker);

        if (marker == null) {
          marker = picMarker;
        }

      }
    }



    zoomBound = 10; //zoomBound > 11 ? 11 : zoomBound;
    map.setCenter(marker.getLatLng(), zoomBound);


    GEvent.addListener(map,"mouseover", function() {
    //alert("getBounds" + map.getBounds().getSouthWest().x + ", " + map.getZoom());
      marker = album.images[albumIndex].marker;

      if (marker && map.getZoom() == 10)  {
        map.setCenter(marker.getLatLng(), 13);
      }

    });
    GEvent.addListener(map,"mouseout", function() {
      marker = album.images[albumIndex].marker;

      if (marker && map.getZoom() == 13)  {
        map.setCenter(marker.getLatLng(), 10);
      }


    })


    //alert("step 1");
    showPicPointer();


    tooltip = document.createElement("div");
    document.getElementById("map_canvas").appendChild(tooltip);
    tooltip.style.visibility="hidden";




}







function showUserMap()  {
  //alert("showUserMap: " + nearbyTrails.trails.length);
  initMap("user");




  if (nearbyTrails.trails.length > 0) {
    var minlat = nearbyTrails.trails[0].lat;
    var minlng = nearbyTrails.trails[0].lng;

    var maxlat = nearbyTrails.trails[0].lat;
    var maxlng = nearbyTrails.trails[0].lng;

    var sw = new GLatLng(minlat,maxlng);
    var ne = new GLatLng(maxlat,minlng);
    var bounds = new GLatLngBounds(sw,ne);

    for (i = 0; i < nearbyTrails.trails.length; i++)  {
      var marker = createNearbyMarker(nearbyTrails.trails[i]);
      map.addOverlay(marker);

      bounds.extend(new GLatLng(nearbyTrails.trails[i].lat,nearbyTrails.trails[i].lng));
    }


     //map.addOverlay(new GMarker(bounds.getSouthWest()));
     //map.addOverlay(new GMarker(bounds.getNorthEast()));

    //alert("bounrds: " + bounds + ", " + bounds.getCenter() + ", " + map.getBoundsZoomLevel(bounds));

    zoomBound = map.getBoundsZoomLevel(bounds);
    if (nearbyTrails.trails.length <= 3 && zoomBound > 0)  {
      zoomBound--;
    }

    zoomBound = zoomBound > 11 ? 11 : zoomBound;


    map.setCenter(bounds.getCenter(), zoomBound);

    //alert("latlng: " + maxlng + ", " + minlng + ", " + maxlat + ", " + minlat + ", " +  latlng);


  } else  {
    populateDefaultAddrLatLng(address, 0, false);
  }

  tooltip = document.createElement("div");
  document.getElementById("map_canvas").appendChild(tooltip);
  tooltip.style.visibility="hidden";
}


function extendBounds(bounds, $ratio)  {

  var sw = bounds.getSouthWest();
  var ne = bounds.getNorthEast();

  var lngSpan = (sw.lng() - ne.lng()) * $ratio;
  maxlng = sw.lng() + lngSpan;
  minlng = ne.lng() - lngSpan;

  var latSpan = (ne.lat() - sw.lat()) * $ratio;
  maxlat = ne.lat() + latSpan;
  minlat = sw.lat() - latSpan;
  //alert("span: " + lngSpan + ", " + latSpan);
  
  sw = new GLatLng(minlat,maxlng);
  ne = new GLatLng(maxlat,minlng);
  var newBounds = new GLatLngBounds(sw,ne);

  //alert("bounds: " + bounds + ", " + newBounds);

  return newBounds;

}

function populateDefaultAddrLatLng(address2, attempt, populateTrails) {
  //alert("populateDefaultAddrLatLng: address2: " + address2);

  var geocoder = new GClientGeocoder();

  geocoder.getLatLng(
    address2,
    function(latlng) {
      if (!latlng) {
        if (attempt == 0)  {
          populateDefaultAddrLatLng(province, 1, populateTrails);
          return;
        } else  {
          //not found, return default lng, lat
          latlng = new GLatLng(-123.186353, 49.457691);
        }
      }

      //alert("address found: " + latlng);
      map.setCenter(latlng, 6);

      tooltip = document.createElement("div");
      document.getElementById("map_canvas").appendChild(tooltip);
      tooltip.style.visibility="hidden";


      if (populateTrails) {
        map.setCenter(latlng, 6);
        renderNearbyTrailsByBound('', true, false, false);
        //map.setCenter(latlng, 7);
      }
    }
  );
}



function renderNearbyTrailsByBound(_trailid, all, getTrailsAlways, clearMap) {
 //alert("renderNearbyTrailsByBound: " + all + ", " + getTrailsAlways);

 var lat1 = map.getBounds().getSouthWest().y;
 var lng1 = map.getBounds().getSouthWest().x;
 var lat2 = map.getBounds().getNorthEast().y;
 var lng2 = map.getBounds().getNorthEast().x;
 var zoom = map.getZoom();


 var getTrailsFlag = false;
 var mapLayer = false;

 if (initFlag == "refresh" || initFlag == "widerefresh")  {
   var latDiff = 0; //(lat2 - lat1) * 3;
   var lngDiff = 0;//(lng2 - lng1) * 3;

   if (initFlag == "widerefresh") {
    latDiff = (lat2 - lat1) * 3;
    lngDiff = (lng2 - lng1) * 3; 
   }


   lat1 -= latDiff;
   lat2 += latDiff;

   lng1 -= lngDiff;
   lng2 += lngDiff;

   minBoundlat = lat1;
   maxBoundlat = lat2;
   minBoundlng = lng1;
   maxBoundlng = lng2;

   getTrailsFlag = true;
   mapLayer = true;
   initFlag = "nofresh";

 } else {
    if (minBoundlat > lat1) {
      getTrailsFlag = true;
    }

    if (maxBoundlat < lat2) {
      getTrailsFlag = true;
    }

    if (minBoundlng > lng1) {
      getTrailsFlag = true;
    }

    if (maxBoundlng < lng2) {
      getTrailsFlag = true;
    }

 }



  //alert("min: " + minBoundlat + ", " + maxBoundlat + ", " + minBoundlng + ", " + maxBoundlng + ", " + getTrailsFlag);

  if (getTrailsFlag || getTrailsAlways)  {
    var qStartDate;
    if (typeof(startDate) != "undefined") {
      qStartDate = startDate;
    } else  {
      qStartDate = "";
    }
    var url = baseLink + "?renderNearbyTrailsByBound=1&trailid="+_trailid+"&tags="+tags
          +"&lat1="+lat1+"&lng1="+lng1+"&lat2="+lat2+"&lng2="+lng2+"&zoom="+zoom+"&all="+all+"&startDate="+qStartDate;

    jgetMap(url, mapLayer, clearMap);
  } else  {
    calcTrailStats();
  }

}

function jgetMap(url, mapLayer, clearMap) {
  //alert("jget0: " + url);
  showSpinner();
  xmlHttp=ajax2();

  //alert("step 1");
  var map_loading = document.getElementById("map_loading");

  if (map_loading)  {
    setMapLoading(map_loading, "Loading...");
  }
  //alert("step 2");

  xmlHttp.onreadystatechange= function()
  {

      //alert("step 2.5: " + xmlHttp.readyState);
      if (xmlHttp.readyState==4)
      {
          if (clearMap) {
            map.clearOverlays();
          }

          hideSpinner();
          //alert("response: " + xmlHttp.responseText);
          var j =xmlHttp.responseText;
          nearbyTrails = eval('(' + j + ')');
          //alert("step 4");


          if (map_loading)  {
            calcTrailStats();
            clearMapLoading(map_loading);
          }
          //alert("step 5");



          //alert("marker: " + nearbyTrails.trails[1].minZoom + ", " + nearbyTrails.trails[1].maxZoom);
          //alert("zoom: " + map.getZoom());



          for (i = 0; i < nearbyTrails.trails.length; i++)  {
            if (!trailExists(nearbyTrails.trails[i].id))  {
              var marker = createNearbyMarker(nearbyTrails.trails[i]);





              //if (!mapLayer)  {
                  batch.push(marker);
              //}
              map.addOverlay(marker);
              //addAllMarkers(map.getZoom());

            }
          }

          populateTrailList();
          //alert("step 6");



          hideSpinner();
      }
  }

  xmlHttp.open("get",url,true);
  xmlHttp.send(null);

}

function setHomeMarker(latlng)  {
     //alert("setHomeMarker: " + latlng);

    var homeIcon = new GIcon(G_DEFAULT_ICON, "http://chart.apis.google.com/chart?chst=d_map_spin&chld=.85|0|"+mycolors[6]+"|10|_|Here");
    homeIcon.iconSize = new GSize(32, 57);
    homeIcon.iconAnchor = new GPoint(16, 57);


    // Set up our GMarkerOptions object
    markerOptions = { icon:homeIcon};

     var marker = new GMarker(latlng, markerOptions);

     map.addOverlay(marker);


    var tooltipText = "<b>" + trailname + "</b>";


    marker.tooltip = '<div class="tooltip yt-rounded" style="width:140px">'+tooltipText+'</div>';

    GEvent.addListener(marker, "click", function() {
        var href = baseLink + "?viewTrail=1&trailid=" + trailid;
        window.location = href;
    });

    GEvent.addListener(marker,"mouseover", function() {
      showTooltip(marker, 120);
    });
    GEvent.addListener(marker,"mouseout", function() {
      tooltip.style.visibility="hidden"
    })
}




function createNearbyMarker(trail)  {

   var gIcon = new GIcon(G_DEFAULT_ICON);

   var faves = trail.faves;
   var hiked = trail.hiked;

   var last_report_status = trail.status;

   //alert("faves: " + faves);


   var fillColor = mycolors[5];
   if (last_report_status == 'yes')  {
     fillColor = mycolors[3];
   } else if (last_report_status == 'no') {
     fillColor = mycolors[4];
   } else {
    last_report_status = 'maybe';
   }

   //alert("last_report_status: " + last_report_status);

   if (hiked == 0)  {
     fillColor = 'FFFFFF';
     last_report_status = 'zero';
   }

  if (faves > 0)  {
    var starColor = mycolors[2];
    if (faves > 50) {
      starColor = mycolors[0];
    } else if (faves > 10)  {
      starColor = mycolors[1];
    }
    
    gIcon.image = "http://chart.apis.google.com/chart?chst=d_map_xpin_letter&chld=pin_star|"+hiked+"|"+fillColor+"|000000|"+starColor;
  } else  {
    gIcon.image = "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld="+hiked+"|"+fillColor+"|000000";
  }


  gIcon.shadow = "";
  var markerOptions = { icon:gIcon};


  var latlngA = new GLatLng(trail.lat, trail.lng);
  //alert("setMarker: " + latlngA + ", " + trail.trailname);
  var marker = new GMarker(latlngA, markerOptions)

  marker.status = last_report_status;

  var imgLink = "";
  if (trail.img > "")  {
    imgLink = "<img src='"+trail.img+"' width='80' height='80' />";
  }

 tagList = trail.tag_list;
 if (tagList > "")  {
   tagList = tagList.replace(new RegExp(',', 'g'),", ");
 }
 
  var tooltipText = ""
    + "<table width='230'><tr><td valign='top' colspan='2' width='100%'>"
    + "<b>" + trail.name + "</b>"
    +"</td></tr><tr><td valign='top' width='100%'>"
    + "<b>Reports:</b> " + hiked + "<br/>"
    + "<b>Distance:</b> " + trail.dist + "Km<br/>"
    + "<b>Elevation gain:</b> " + trail.elev + "m<br/>"
    + "<b>Last Report:</b> " + trail.ldate  + "<br/>"
    + "<b>Faves:</b> " + trail.faves + "<br/>"
    //+ "Status: " + marker.status + "<br/>"
    //+ "<b>Tags:</b>&nbsp;" + tagList + "</nowrap><br/>"
    + "</td><td valign='top'>"+imgLink+"</td></tr></table>";

  if (hiked > 1)  {
    //tooltipText += "<iframe frameborder='0' marginheight='0' marginwidth='0' height='85' width='225' scrolling='no' src='"+baseLink+"?trailstats="+trail.uid+"&trailid="+trail.id+"&mapType="+mapType+"'></iframe>";
  }


  marker.minZoom = nearbyTrails.trails[i].minZoom;
  marker.trailid = nearbyTrails.trails[i].id;
  marker.tooltip = '<div class="tooltip yt-rounded">'+tooltipText+ '</div>';

  GEvent.addListener(marker, "click", function() {
    goToTrail(marker.getLatLng());
  });


  GEvent.addListener(marker,"mouseover", function() {
    //alert("getBounds" + map.getBounds().getSouthWest().x + ", " + map.getZoom());
    showTooltip(marker,230);
    
  });
  GEvent.addListener(marker,"mouseout", function() {
    tooltip.style.visibility="hidden"
  })

  return marker;
}


 function goToTrail(point)  {
   //alert("goToTrail: " + point.x + ", " + point.y + ", " + nearbyTrails.trails.length);

  for (i = 0; i < nearbyTrails.trails.length; i++)  {

      if (point.x == nearbyTrails.trails[i].lng && point.y == nearbyTrails.trails[i].lat)  {
        //alert("match: " + nearbyTrails.trails[i].name);


        var href = baseLink + "?" + nearbyTrails.trails[i].url;
        //alert("match href: " + href);

        window.location = href;
        break;
      }

  }
 }


function showTooltip(marker,width) {
  tooltip.innerHTML = marker.tooltip;
	var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getSouthWest(),map.getZoom());
	var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
	var anchor=marker.getIcon().iconAnchor;
  //var width=marker.getIcon().iconSize.width;
	var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(offset.x - point.x - anchor.x - width / 2,- offset.y + point.y +anchor.y));
	pos.apply(tooltip);
	tooltip.style.visibility="visible";
}





function trailExists(id) {
  var i = ids.length;
  //alert("ids.length: " + i + ", " + id);
  while (i--) {
    if (ids[i] == id) {
      return true;
    }
  }

  ids.push(id);
  //alert("ids[i]: " + ids[0] + ", " + ids.length);
  return false;
}

function removeAllMarkers(excludeZoom)  {

  for (var i = batch.length - 1; i >= 0; i--) {
    if (batch[i].minZoom > excludeZoom)
      map.removeOverlay(batch[i]);
  }

}


function addAllMarkers(includeZoom)  {
  for (var i = batch.length - 1; i >= 0; i--) {
    //alert("minZoon: " + batch[i].minZoom);
    if (batch[i].minZoom <= includeZoom)
      map.addOverlay(batch[i]);
  }
}

function searchMapByTextArea()  {
  var keyword = document.getElementById("tagkeyword");
  tags = "";
  findTags(keyword.value);
}

function clearTextArea()  {
  tags = "";
  findTags("");
}

function findTags(_tags) {
  //alert("findTags: " + _tags);




  resetMarkers();

  var keyword = document.getElementById("tagkeyword");
  var sticktags = document.getElementById("sticktags");

  //alert("sticktags: " + sticktags);
  //alert("sticktags: " + sticktags.checked);


  if (tags > '' && (_tags == 'green' || _tags == 'red' || _tags ==  'yellow' || _tags ==  'white'))  {
    tags = tags.replace(" green", "");
    tags = tags.replace(" red", "");
    tags = tags.replace(" yellow", "");
    tags = tags.replace(" white", "");
    tags = tags.replace("green ", "");
    tags = tags.replace("red ", "");
    tags = tags.replace("yellow ", "");
    tags = tags.replace("white ", "");
    tags = tags.replace("green", "");
    tags = tags.replace("red", "");
    tags = tags.replace("yellow", "");
    tags = tags.replace("white", "");
  }

  if (sticktags.checked == true )  {
    var index = tags.indexOf(_tags);
    if (index == -1) {
      if (tags > "")  {
        tags += " ";
      }
      tags += _tags;
    } else  {
      var index2 = index + _tags.length + 1 > tags.length ? tags.length : index + _tags.length + 1;
      //alert("tags: " + tags + ", " + _tags + ", " + index);
      tags = tags.substring(0,index) + tags.substring(index2);
      tags = tags.trim();
    }
  } else  {
      tags = _tags;
  }

   keyword.value = tags;
  updateSelectedTags();
  //alert("findTags 1");
  checkRows(keyword, 1);

  //alert("findTags 2");
  renderNearbyTrailsByBound('', true, true, true);
  initFlag = "refresh";

}

function resetMarkers()  {
  batch = [];

  ids = [];  
}


function calcTrailStats() {
  //alert("calcTrailStats 1");
  var mapSearchResult = document.getElementById("map_search_result");

  if (mapSearchResult)  {
    //alert("calcTrailStats 2");
    var trails = 0;
    var greens = 0;
    var yellows = 0;
    var reds = 0;
    var whites = 0;



    if (nearbyTrails) {
      resetMapTags();
      //alert("calcTrailStats 3: " + nearbyTrails.trails.length);
      for (i = 0; i < nearbyTrails.trails.length; i++)  {

        var trailColor = getTrailColor(nearbyTrails.trails[i]);
        

      
        latlng = new GLatLng(nearbyTrails.trails[i].lat, nearbyTrails.trails[i].lng);

        if (map.getBounds().containsLatLng(latlng)) {
          trails++;

          updateMapTags(nearbyTrails.trails[i], trailColor);

         if (trailColor == 'green')  {
           //alert("calcTrailStats green");
           greens++;
         } else if (trailColor == 'red') {
           reds++;
         } else if (trailColor == 'yellow') {
           yellows++;
         } else {
           whites++;
         }
        }
      }

     //alert("populateTagList");
     populateTagList();
     populateMonthTagList();

     var hasTags = " ";
     if (tags > '') {
       hasTags = " that have <b>" + tags + "</b> "
     }

     mapSearchResult.innerHTML = "<b>" + trails + " trails</b>" + hasTags + "in the map bound "
          + "<span id='map_loading' style='font-size:16px;padding:3px;'></span>" + "<br/><b>Attempts: </b>" +
          getCircle('img/greencircle.gif','recent successes', 'green', greens) + ", " +
          getCircle('img/yellowcircle.gif','old successes','yellow', yellows) + ", " +
          getCircle('img/redcircle.gif','failures','red', reds) + ", " +
          getCircle('img/emptycircle.gif','No report','white', whites);
          
    }
  }

}

function getTrailColor(trail) {
   if (trail.status == 'yes')  {
     return "green";
   } else if (trail.status == 'no') {
     return "red";
   } else {
     if (trail.hiked > 0)
      return "yellow";
     else
      return "white";
   }
}

function resetMapTags() {
    for (i = 0; i < maptag.tags.length; i++)  {
      maptag.tags[i].count = 0;
      maptag.tags[i].red = 0;
      maptag.tags[i].yellow = 0;
      maptag.tags[i].green = 0;
    }
}

function updateMapTags(trail, trailColor) {
   tagList = trail.tag_list;

   if (tagList > "")  {
  
    var trailtags = tagList.split(",");
    //alert("list: " + tagList + ", " + trailtags);
    //return;
    for (var j = 0; j < maptag.tags.length; j++)  {

      for (var i = 0; i < trailtags.length;i++) {
        if (maptag.tags[j].name == trailtags[i])  {
          maptag.tags[j].count++;
          if (trailColor == "green")  {
            maptag.tags[j].green++;
          } else if (trailColor == "red") {
            maptag.tags[j].red++;
          } else if (trailColor == "yellow")  {
            maptag.tags[j].yellow++;
          }
        }
      }
    }
  }
}


function updateSelectedTags() {

  var selectedTags = tags.split(" ");
  //alert("list: " + tagList + ", " + trailtags);
  //return;
  for (var j = 0; j < maptag.tags.length; j++)  {
    maptag.tags[j].selected = 0;
    for (i = 0; i < selectedTags.length;i++) {
      if (maptag.tags[j].name == selectedTags[i])  {
        maptag.tags[j].selected = 1;
      }
    }
  }
}


function sortNumber(a,b)
{
return b.count - a.count;
}


function populateTagList()  {
  //alert("populateTagList");


  var html = "";
  var label = "";
  maptag.tags.sort(sortNumber);

  for (i = 0; i < maptag.tags.length; i++)  {
    //var tagId = document.getElementById("t_" + maptag.tags[i].name);
    //tagItem.innerHTML = maptag.tags[i].name + " x" + maptag.tags[i].count;
    var selectedTags = tags > "" ? " and (" + tags + ")" : "";
    var has = tags > "" ? " have " : " has ";

    var title = "";
    if (tags.indexOf(maptag.tags[i].name) < 0)  {
      title = maptag.tags[i].name + selectedTags + has + maptag.tags[i].count + " trails";
    }
    var fontsize = 12;
    if (nearbyTrails.trails.length > 0) {
      if (maptag.tags[i].count == 0)  {
        fontsize = 10;
      } else  {
        fontsize += 14 * maptag.tags[i].count / nearbyTrails.trails.length;
        if (fontsize > 16)  fontsize = 16;
      }
    } else  {
      fontsize = 10;
    }

    var color = "";
    if (maptag.tags[i].red > 0 && maptag.tags[i].red == maptag.tags[i].count) {
      color = "color:#DA1318;";
    } else if (maptag.tags[i].green > 0 && maptag.tags[i].green == maptag.tags[i].count) {
      color = "color:#217C0C;";
    } 


    
    var name = maptag.tags[i].name;

    if (maptag.tags[i].selected == 1) {
      html += "<span class='selectedTag'>";
    } else  {
      html += "<span class='tag'>";
    }


    label = "<span id='$"+name+"' style='font-size:"+fontsize+"px;font-weight:bold;"+color+"'>"+name+"</span>";

    html += "<a id='t_"+name+"' href='#' title='"+title+"' onclick='findTags(\""+name+"\"); return false;'>"+label+"</a>";

    html += "</span> ";
    
  }
  var popular_tags = document.getElementById("popular_tags");
  popular_tags.innerHTML = html;

}


function populateMonthTagList()  {
  //alert("populateTagList");
  var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];

  var html = "";
  var label = "";

  for (i = 0; i < months.length; i++)  {
    //var tagId = document.getElementById("t_" + maptag.tags[i].name);
    //tagItem.innerHTML = maptag.tags[i].name + " x" + maptag.tags[i].count;

    var fontsize = 12;

    var name = months[i];

    if (tags.indexOf(name) >= 0)  {
      html += "<span class='selectedTag'>";
    } else  {
      html += "<span class='tag'>";
    }


    label = "<span id='$"+name+"' style='font-size:"+fontsize+"px;font-weight:bold;'>"+name+"</span>";

    html += "<a id='t_"+name+"' href='#' onclick='findTags(\""+name+"\"); return false;'>"+label+"</a>";

    html += "</span> ";

  }
  var months_tags = document.getElementById("months_tags");
  months_tags.innerHTML = html;

}



function toHex(n){
  var hex = n.toString(16);
  
  if (hex.length == 1)  {
    return "0" + hex;
  } else  {
    return hex;
  }
 }



function getCircle(url, label, cond, stats)  {
  return '<a href="#" onclick="findTags(\''+cond+'\'); return false;"><img style="vertical-align:middle;padding-bottom:3px;" src="'+url+'" alt="'+label+'" title="'+label+'" />'+ " " + stats + " " + label + '</a>';
}


function renderPictureAlbum()
{
  //alert("renderPictureAlbum: " + album.images.length);
  
  for (var i = 0; i < album.images.length; i++) {
     //alert("lng, lat: " + album.images[i].piclng + ", " + album.images[i].piclat);

     var picMarker = null;
    if (album.images[i].piclng && album.images[i].piclat)  {
      if  (album.images[i].gpsType == 0 || album.images[i].gpsType == 2)  {
        picMarker = createPictMarker(i);
        album.images[i].marker = picMarker;
      }
    }

    if (picMarker != null)  {
      map.addOverlay(picMarker);
    }
  }
  showPicPointer();
  restorePhotoLocationLabel();
}

function createPictMarker(index) {
    var picIcon = new GIcon(G_DEFAULT_ICON);
    /*
    picIcon.image = album.images[index].src;
    picIcon.iconSize = new GSize(20,20);
    picIcon.iconAnchor = new GPoint(0, 20);
    picIcon.infoWindowAnchor  = new GPoint(20, 0);
    picIcon.shadow = "";
    // Set up our GMarkerOptions object
    */
   // if (index %2 == 0)  angle = -30;

    ///picIcon.image = "http://chart.apis.google.com/chart?chst=d_map_pin_icon&chld=location|"+mycolors[6];
    picIcon.image = "http://chart.apis.google.com/chart?chst=d_map_spin&chld=0.5|0|"+mycolors[6]+"|10|b|"+(index+1);
    picIcon.iconSize = new GSize(14, 24);
    picIcon.iconAnchor = new GPoint(7, 24);
    picIcon.shadow = "";

    markerOptions = { icon:picIcon, draggable:true};

    var piclatlng = new GLatLng (album.images[index].piclat, album.images[index].piclng);

    var picMarker = new GMarker(piclatlng, markerOptions);
    picMarker.disableDragging();

    //alert("picture: " + album.images[i].src);

    imgLink = "<img src='"+album.images[index].thumbnail +"' width='80' height='80' />";



    picMarker.tooltip = '<div class="tooltip yt-rounded">'+imgLink+'</div>';
    picMarker.albumIndex = index;

    GEvent.addListener(picMarker, "click", function() {
      unhighlightPictureIndex(albumIndex);
      albumIndex = picMarker.albumIndex;

      displayPicture();

      updatepicTracker();
      updateNextThumbnails();
      updatePreviousThumnails();
    });



    GEvent.addListener(picMarker,"mouseover", function() {
      showTooltip(picMarker, 80);
    });
    GEvent.addListener(picMarker,"mouseout", function() {
      tooltip.style.visibility="hidden";
    })
    GEvent.addListener(picMarker,"dragstart", function() {
      tooltip.style.visibility="hidden";
    })

    return picMarker;
}

function formatTime(unixTimestamp) {
    var dt = new Date(unixTimestamp * 1000);

    var hours = dt.getHours();
    var minutes = dt.getMinutes();
    var seconds = dt.getSeconds();

    // the above dt.get...() functions return a single digit
    // so I prepend the zero here when needed
    if (hours < 10)
     hours = '0' + hours;

    if (minutes < 10)
     minutes = '0' + minutes;

    if (seconds < 10)
     seconds = '0' + seconds;

    return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear() + " " + hours + ":" + minutes + ":" + seconds;
}

var setId = null;
var bMarker = null;
var refLatLng = null;
var dir = 0;
var gravity;
var maxHeight;

function showPicPointer() {
  //alert("showPicPointer: " + albumIndex);
  //alert("marker: " + album.images[albumIndex].marker);
  if (typeof(album.images[albumIndex].marker) != "undefined" && album.images[albumIndex].marker) {
    return showPointer(album.images[albumIndex].marker, 7, 55);
  } else  {
    return null;
  }

  
}

function showPointer(marker, width, height)  {

  if (marker) {
    var pmarker = marker;


    var gIcon = new GIcon(G_DEFAULT_ICON, "http://www.livetrails.com/img/orange_arrow.gif");
    gIcon.iconSize = new GSize(15, 30);
    gIcon.iconAnchor = new GPoint(7, height);


    var markerOptions = { icon:gIcon};

    var pRefLatLng = pmarker.getLatLng();

    var pRefPoint = map.getCurrentMapType().getProjection().fromLatLngToPixel(pRefLatLng, map.getZoom());
    //refPoint.y = refPoint.y - 10;

    var platLng = map.getCurrentMapType().getProjection().fromPixelToLatLng(pRefPoint, map.getZoom(), true);

    arrowMarker = new GMarker(platLng, markerOptions);

    map.addOverlay(arrowMarker);




    if (!map.getBounds().containsLatLng(pmarker.getLatLng())) {
       var sw = map.getBounds().getSouthWest();
       var ne = map.getBounds().getNorthEast();

       var span = (ne.lng() - sw.lng()) * 0.25;

       //alert("step 1: " + span);

       var center = new GLatLng(pmarker.getLatLng().lat(), pmarker.getLatLng().lng() - span);

       map.setCenter(center, map.getZoom());
    }



    return arrowMarker;
  } else  {
    arrowMarker = null;
    return null;
  }



}

function hidePointer()  {
  if (arrowMarker)  {
    map.removeOverlay(arrowMarker);
  }
}


function bounce(index)  {
  hidePointer();
  var pmarker = showPicPointer();

  maxHeight = 16;
  gravity = 2;
  resetInterval();

  if (pmarker)  {


    bMarker = pmarker;
    bounceMarker();
  }
}


function bounceTrail(trailid) {
  bounceTrail2(trailid,32)
}

function bounceTrail2(trailid,maxHeightConst) {
  hidePointer();
  //alert("boundTrail2: " + trailid);
  //alert("batch.length: " + batch.length);
  //alert("maxHeightConst: " + maxHeightConst);
  for (var i = batch.length - 1; i >= 0; i--) {
    if (batch[i].trailid == trailid) {
      maxHeight = maxHeightConst;
      gravity = 2;
      resetInterval();

      bMarker = showPointer(batch[i], 10, 60);
      bounceMarker();
    }
  }
}


function resetInterval() {
    if (setId)  {
      clearInterval(setId);

      if (bMarker)
        bMarker.setLatLng(refLatLng);

    }
}


function bounceMarker() {
  //alert("bounce: " + index);
  dir = 0;

  if (bMarker)  {
    refLatLng = bMarker.getLatLng();
    setId = setInterval("generateGravity()", 10);
  }
}

function generateGravity()  {

  var refPoint = map.getCurrentMapType().getProjection().fromLatLngToPixel(refLatLng, map.getZoom());
  var point = map.getCurrentMapType().getProjection().fromLatLngToPixel(bMarker.getLatLng(), map.getZoom());

  diff = refPoint.y - point.y;

  var p;
  var latLng;

  if (diff < maxHeight && dir == 0) {

    p = new GPoint(point.x, point.y - gravity);

    //alert("diff, maxHeight, gravity: " + diff + ", " + maxHeight + ", " + gravity + ", " + point.y + ", " + p.y);
    latLng = map.getCurrentMapType().getProjection().fromPixelToLatLng(p, map.getZoom(), true);
    //alert("latlng: " + latLng);

    bMarker.setLatLng(latLng);
  } else if (diff >= maxHeight && dir == 0) {
    dir = 1;
  } else if (diff > 0 && dir == 1)  {


    p = new GPoint(point.x, point.y + gravity);

    latLng = map.getCurrentMapType().getProjection().fromPixelToLatLng(p, map.getZoom(), true);

    bMarker.setLatLng(latLng);

  } else if (diff <= 0)  {
    //alert("maxHeight: " + maxHeight);
    maxHeight /= 2;
    dir = 0;
    //gravity = 1;

    if (maxHeight <= 1) {
      clearInterval(setId);
      gravity = 1;
      setId = null;
    }
  }

}

function saveDefaultLocation()  {

  var zoom = map.getZoom();
  var lat = map.getCenter().lat();
  var lng = map.getCenter().lng();

  var map_loading = document.getElementById("map_loading");

  if (map_loading)  {
    setMapLoading(map_loading, "Saving...");
  }

  var url ="index.php?saveDefaultLocation=1&tag_list="+tags+"&zoom="+zoom+"&lat="+lat+"&lng="+lng;

  jget("map_loading", url, null, null, "inline");
}
function centerTrailMap(defaultBound) {
   //alert("step 0: " + defaultBound);

   var sw = defaultBound.getSouthWest();
   var ne = defaultBound.getNorthEast();

   var span = (ne.lng() - sw.lng()) * 1.5;
   
   //alert("step 1: " + span);

   var sw2 = new GLatLng(sw.lat(), sw.lng() - span);
   var bound2 = new GLatLngBounds(sw2, ne);

   //setHomeMarker(sw2);
   //setHomeMarker(ne);

   //alert("step 2: " + bound2);
    map.setCenter(bound2.getCenter(), map.getBoundsZoomLevel(bound2));
   //alert("step 3");
}

function clearMapLoading(map_loading)  {
  map_loading.innerHTML = "";
  map_loading.style.background = "white";
}

function setMapLoading(map_loading, label)  {
  map_loading.innerHTML = label;
  map_loading.style.background = "#fbe0d0";
}

function populateTrailList()  {
    //alert("populate 1");

    var trailListElement = document.getElementById("map_trail_list");
    //alert("populate 2: " + trailListElement);


    if (typeof(trailListElement)!= "undefined" && trailListElement)  {
      var trailList = "";
      //alert("populate 3");
      for (i = 0; i < nearbyTrails.trails.length; i++)  {
          if (trailList > "")  trailList += "<br/>";

          trailList += "- <a href='index.php?viewTrail=1&trailid="+nearbyTrails.trails[i].id+"'>"+nearbyTrails.trails[i].name+"</a> <a href='#' style='background:#E0EAF1;font-size:12px;' onClick='bounceTrail("+nearbyTrails.trails[i].id+");return false;'>Map it</a>";

      }
      //alert("populate 4");
      trailListElement.innerHTML = trailList;
      //alert("populate 5");
    }

}

function showTrailLocation(trailid) {
    map.clearOverlays();

    for (i = 0; i < nearbyTrails.trails.length; i++)  {
      if (nearbyTrails.trails[i].id == trailid) {
        var marker = createNearbyMarker(nearbyTrails.trails[i]);
        map.addOverlay(marker);
        var trailCenter = new GLatLng(nearbyTrails.trails[i].lat,nearbyTrails.trails[i].lng);
        map.setCenter(trailCenter, map.getZoom());
        break;
      }
    }
}

function downloadThumbnails() {
  if (hasAlbum()) {
    for (i = 0; i < album.images.length; i++) {
      var picElem = document.getElementById('pic'+i);
      if (picElem)  {
        //alert("unhighlightPictureIndex: " + albumIndex);
        picElem.src = album.images[i].thumbnail;
      }
    }
    unhighlightAll();
    highlightPictureIndex();
  }

}


function removeAllPicMarkers()  {
  for (i = 0; i < album.images.length; i++) {
    if (album.images[i].marker)
      map.removeOverlay(album.images[i].marker);
  }
}

function addAllPicMarkers()  {
  for (i = 0; i < album.images.length; i++) {
    if (album.images[i].marker)
      map.addOverlay(album.images[i].marker);
  }
}

var editMarker = null;
var originalGpsType;
var editDragListener;
var editFlag;
function editPhotoLocation()  {
  editLinkElem = document.getElementById("edit_photo_location");
  html = "<a href='#' onclick='savePhotoLocation();return false'>Save</a>";
  html += " &nbsp;&nbsp;<a href='#' onclick='cancelPhotoLocation();return false'>Cancel</a>";
  html += " &nbsp;&nbsp;<a href='#' onclick='removePhotoLocation();return false'>Remove from map</a>";

  editLinkElem.innerHTML = html;

  pictureHolder = document.getElementById("pictureholder");
  pictureCaption = document.getElementById("picturecaption");
  pictureCaption.style.display = "none";
  pictureHolder.style.display= "none";

  removeAllPicMarkers();


  //alert("editMarkder: " + editMarker);
  if (!album.images[albumIndex].marker) {
    album.images[albumIndex].piclat = map.getCenter().lat();
    album.images[albumIndex].piclng = map.getCenter().lng();

    editMarker = createPictMarker(albumIndex);
    elevationUrl = "http://maps.google.com/maps/api/elevation/json?locations="+editMarker.getLatLng().lat()+","+editMarker.getLatLng().lng()+"&sensor=false";

    jgetElevation(elevationUrl, editMarker);
  } else  {
    editMarker = createPictMarker(albumIndex);

    //var picPoint = map.getCurrentMapType().getProjection().fromLatLngToPixel(editMarker.getLatLng(), map.getZoom());
    if (!map.getBounds().containsLatLng(editMarker.getLatLng()))  {
      map.setCenter(editMarker.getLatLng(), map.getZoom());
    }  
  }
  originalGpsType = album.images[albumIndex].gpsType;
  album.images[albumIndex].gpsType = 2;

  editMarker.enableDragging();
  map.addOverlay(editMarker);

  editMarker.setImage("http://chart.apis.google.com/chart?chst=d_map_spin&chld=0.5|0|"+mycolors[7]+"|10|b|"+(albumIndex+1));
  showTooltip(editMarker, 80);



  editDragListener = GEvent.addListener(editMarker,"drag", function() {
    editFlag = true;
    updatePicGeoTag();
  });

  editDragListener = GEvent.addListener(editMarker,"dragend", function() {
    elevationUrl = "http://maps.google.com/maps/api/elevation/json?locations="+editMarker.getLatLng().lat()+","+editMarker.getLatLng().lng()+"&sensor=false";
    jgetElevation(elevationUrl, editMarker);
  });
  editFlag = false;
}




function restorePhotoLocationLabel()  {
  editLinkElem = document.getElementById("edit_photo_location");
  if (editLinkElem) {
    editLinkElem.innerHTML = "<img src='http://chart.apis.google.com/chart?chst=d_map_spin&chld=0.2|0|9CF5F2|10|b|' style='vertical-align:middle;margin-right:2px;margin-bottom:2px;' alt=''/>";
    editLinkElem.innerHTML += "<a href='#' onclick='editPhotoLocation();return false;'>Edit photo location</a>"
    pictureHolder = document.getElementById("pictureholder");
    pictureCaption = document.getElementById("picturecaption");
    pictureCaption.style.display = "block";
    pictureHolder.style.display= "block";
    addAllPicMarkers();
    tooltip.style.visibility="hidden";
  }
  updatePicGeoTag();
}

function savePhotoLocation()  {

  if (editMarker) {
    GEvent.removeListener(editDragListener);

    editMarker.disableDragging();
    album.images[albumIndex].marker = editMarker;


    album.images[albumIndex].piclat = Math.round(editMarker.getLatLng().lat() * 10000000) / 10000000;
    album.images[albumIndex].piclng = Math.round(editMarker.getLatLng().lng() * 10000000) / 10000000;

    editMarker.setImage("http://chart.apis.google.com/chart?chst=d_map_spin&chld=0.5|0|"+mycolors[6]+"|10|b|"+(albumIndex+1));
    editMarker = null;
    saveNewPhotoLocation("save");
    restorePhotoLocationLabel();
  }

}

function cancelPhotoLocation()  {

  if (editMarker) {
    if (album.images[albumIndex].marker) {
      album.images[albumIndex].marker.setImage("http://chart.apis.google.com/chart?chst=d_map_spin&chld=0.5|0|"+mycolors[6]+"|10|b|"+(albumIndex+1));
      album.images[albumIndex].gpsType = originalGpsType;
    }
    map.removeOverlay(editMarker);
    editMarker = null;

    restorePhotoLocationLabel();
  }

}

function removePhotoLocation()  {

  if (editMarker) {
    map.removeOverlay(editMarker);

    if (album.images[albumIndex].marker) {
      //alert("remove index: " + markerObj.index);
      album.images[albumIndex].marker = null;
      album.images[albumIndex].gpsType = 3;
    }
    editMarker = null;
    //alert("size: " + picMarkers.length);
    saveNewPhotoLocation("remove");
    restorePhotoLocationLabel();
  }



}

function saveNewPhotoLocation(instruction) {
  jget("", baseLink + "?editPicLocation="+instruction+"&hikeid="+hikeid+"&pid="+ album.images[albumIndex].id
          + "&provider="+ album.images[albumIndex].provider +"&lat="+album.images[albumIndex].piclat + "&lng=" +album.images[albumIndex].piclng
          + "&elevation=" + album.images[albumIndex].picalt);
}

function jgetElevation(url, editMarker) {
  editMarker.elevation = "Unknown";
  //alert("elevation: " + editMarker.elevation);
  updatePicGeoTag();

  /*
  url =  baseLink + "?json_url=" + encodeURIComponent(url);
  alert("jgetElevation: " + url);

  xmlHttp=ajax2();

  xmlHttp.onreadystatechange= function()
  {
      if (xmlHttp.readyState==4)
      {

          //alert("response: " + xmlHttp.responseText + ", " + xmlHttp.statusText);
          var j =xmlHttp.responseText;
          if (j)  {
            response = eval('(' + j + ')');
            //alert("response: " + response);
            if (response.status == "OK")  {
              editMarker.elevation = Math.round(response.results[0].elevation) + "m";
              //alert("elevation: " + editMarker.elevation);
              updatePicGeoTag("Unknown",editMarker.elevation,
                editMarker.getLatLng().lat(),
                editMarker.getLatLng().lng());
            }
          }
      }
  }

  xmlHttp.open("get",url,true);
  xmlHttp.send(null);
*/
}

