var map;
var mapUser;
var mapCenter;
var creating;
var legs = new Array();
var totalDistance = 0;
var totalClimb = 0;
var elevSvcUp = true;
var showElevGraph = false;
var cmId;
var clId;
var ls;
var token;
var MSIE  = document.all;
var routeId = '';
var showMarkers = false;
var sGUID;
var bEdit;
var chartYStartDelta;
var iconPath = './images/';

//GPX consts
var GPX_File = 0;
var GPX_Db = 1;
var GPX_Device = 2;

var nextLegId = 0;
var currLegId = 0;

GMarker.prototype.elevation = 0;
GMarker.prototype.climb = 0;
GMarker.prototype.elevDelta= 0;
GMarker.prototype.distanceFromPrev = 0;
GMarker.prototype.distanceFromLegStart = 0;
GMarker.prototype.tipString = '';
GMarker.prototype.markerId = setMarkerId;
GMarker.prototype.place = new String();
GMarker.prototype.direct = new String();
GMarker.prototype.imgUrl = new String();
GMarker.prototype.createDistanceTip = createDistanceTip;
GMarker.prototype.createElevTip = createElevTip;
GMarker.prototype.showLineToHere = showLineToHere;
GMarker.prototype.hideLineToHere = hideLineToHere;
GMarker.prototype.drawLineToHere = drawLineToHere;
GMarker.prototype.removeLineToHere = removeLineToHere;

function gup( name )
{

  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var tmpURL = window.location.href;
  var results = regex.exec( tmpURL );
  if( results == null )
    return "";
  else
    return results[1];
}

var routetype = gup('routetype');

//Graph stuff
var chartXMLHeader = "<graph canvasbgcolor='AFC7C7,FFFFFF' canvasbgalpha='60' canvasbgangle='270' outcnvBaseFontColor='1D8BD1' outCnvBaseFontSize='12'  canvasBorderThickness='1' setAdaptiveYMin='1' setAdaptiveYMax='1' showZeroPlane='1'  zeroPlaneColor='000000'"
    chartXMLHeader += " chartBottomMargin='10' alternateHGridAlpha='30' alternateHGridColor='FFFFFF' animation='0' divlinecolor='FFFFFF' divlinealpha='60' yaxisname='Feet' chartLeftMargin='5' yAxisNamePadding='5'>"
var chartXMLDataSetHeader = "<dataset drawline = '1' showLabels='0' showValues='0' showToolTip='1' lineThickness='2'"
var chartXMLDataSet = new Array();
var chartXMLCategories;

//Trisport consts
var MAP_Bike   = 1;
var MAP_Run    = 2;
var MAP_Swim   = 3;
var MAP_Brick  = 4;
var MAP_Race   = 5;

//sport specific color values for GPolylines
var lineColors = new Array();
  lineColors[MAP_Swim] = '#00008B'
  lineColors[MAP_Bike] = '#008000'
  lineColors[MAP_Run] = '#FF0000'

var MAP_Sports = new Array();
  MAP_Sports[MAP_Swim] = 'Swim'
  MAP_Sports[MAP_Bike] = 'Bike'
  MAP_Sports[MAP_Run] = 'Run'
  MAP_Sports[MAP_Brick] = 'Brick'
  MAP_Sports[MAP_Race] = 'Race'

sportStrAry= new Array()
sportStrAry['bike'] = 1
sportStrAry['run'] = 2
sportStrAry['swim'] = 3


//marker distance consts
var MK_Yards  = 91.44;
var MK_Meters = 100
var MK_Miles = 1609.344
var MK_Kms  = 1000;
var MK_Feet = 3.2808399;

var MAP_Dirs = [
  "Left on",
  "Right on",
  "Straight On",
  "Bear left onto",
  "Bear right onto",
  "Past",
  "Continue On",
  "Becomes",
  "Look for",
  "Comment",
]

//icon stuff
var baseIcon = new GIcon();
baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
baseIcon.iconSize = new GSize(12, 20);
baseIcon.shadowSize = new GSize(37, 34);
baseIcon.iconAnchor = new GLatLng(-5, 20);
baseIcon.infoWindowAnchor = new GLatLng(9, 2);
baseIcon.infoShadowAnchor = new GLatLng(18, 25);

var gicons = [];
gicons["baseIcon"] = new GIcon(G_DEFAULT_ICON);

gicons["baseIcon"].shadow = iconPath + "startShadow.png";
gicons["baseIcon"].iconSize = new GSize(12, 20);
gicons["baseIcon"].shadowSize = new GSize(22, 20);
gicons["baseIcon"].iconAnchor = new GLatLng(18, 5);
gicons["baseIcon"].infoWindowAnchor = new GLatLng(6, 1);
gicons["baseIcon"].infoShadowAnchor = new GLatLng(13, 13);

gicons["nodeIcon"] = new GIcon(G_DEFAULT_ICON);
gicons["nodeIcon"].iconSize = new GSize(5,5);
gicons["nodeIcon"].iconAnchor = new GLatLng(2,2);
gicons["nodeIcon"].infoWindowAnchor = new GLatLng(6, 1);
gicons["nodeIcon"].shadowSize = new GSize(0, 0);

gicons["node"+MAP_Swim] = new GIcon(gicons["nodeIcon"],iconPath + "swimNode.png");
gicons["node"+MAP_Bike] =  new GIcon(gicons["nodeIcon"],iconPath + "bikeNode.png");
gicons["node"+MAP_Run] = new GIcon(gicons["nodeIcon"],iconPath + "runNode.png");
gicons["nodeCue"] = new GIcon(gicons["nodeIcon"],iconPath + "cueNode.png");

gicons["disticon"] = new GIcon(baseIcon)
gicons["disticon"].iconSize = new GSize(20, 34);
gicons["disticon"].iconAnchor = new GLatLng(34,10);
gicons["disticon"].infoWindowAnchor = new GLatLng(6, 1);
gicons["disticon"].shadowSize = new GSize(0, 0);

  for (var iC=1;iC<100;iC++){
    gicons["run"+iC] = new GIcon( gicons["disticon"],iconPath + "run"+iC+".png" );
    gicons["bike"+iC] = new GIcon( gicons["disticon"],iconPath + "bike"+iC+".png"  );
    gicons["swim"+iC] = new GIcon( gicons["disticon"],iconPath + "swim"+iC+".png"  );
  }

//tooltip stuff
  var opacity = parseFloat(.8);
  var tooltip = document.createElement("div");
  tooltip.id = "tooltip"
  tooltip.style.position   = "absolute";
  tooltip.style.background = "#fff";
  tooltip.style.padding    = "1";
  tooltip.style.margin     = "2";
  tooltip.style.MozOpacity = opacity;
  tooltip.style.width      = '240px';
  tooltip.style.border     = '1px solid #CFCFFF';
  tooltip.style.fontFamily = 'arial,sans-serif';
  tooltip.style.fontSize   = '8pt';
  tooltip.style.opacity    = opacity;
  tooltip.style.zIndex     = 50000;

//member object
var member = function () {
  //properties
  this.addr;
  this.city;
  this.state;
  this.postal;
  this.country;
  this.lat;
  this.lng;
  this.zoom;
  this.bHasAddr;
  //methods
  this.getLocation = getMemberLocation;
  this.setLocation = setMemberGeoCode;
}

//leg object
var leg = function (iSport) {
  //properties
  this.legId = nextLegId;
  currLegId = this.legId;
    nextLegId++;
  this.sport = iSport         // sport the leg represents. int from
  this.sportIter = getLegSportIter(this.legId,this.sport);   //which occurrence of this sport in this map
  this.markers = new Array(); // array of markers
  this.mgr = new MarkerManager(map);  // GMarkerManager
  this.distanceMarkers = new Array();
  this.distance = 0;           // sum of distances between points in the leg
  this.climb  = 0;             // sum of elevation gains between points in the leg
  this.outBackPtNum;
  this.currMarkerId = 0;
  this.nextMarkerId = 0;
  this.points = new Array();                    // used for creating polyline w/o markers
  chartXMLDataSet[currLegId] = new Array();;
}

function getLegSportIter(sport){
  var match=1;
  legs.each(function(leg) {
    if(leg.sport==sport){
      match++
    }
  });
  return match;
}

//Leg Selector stuff
function legSelectorControl (printable, selectable) {
  GControl.call(this, printable, selectable);
  this.currLeg = -1;
}

legSelectorControl.prototype = new GControl();

legSelectorControl.prototype.initialize = function(map) {
  var container = document.createElement("div");
  this.setStyle(container);
  this.container = container;
  map.getContainer().appendChild(container);
  return container;
}

legSelectorControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7,34));
}

legSelectorControl.prototype.setStyle = function(cntnr) {
  cntnr.style.backgroundColor = "white";
  cntnr.style.font = "small Arial";
  cntnr.style.border = "1px solid black";
  cntnr.style.padding = "0px";
  cntnr.style.marginBottom = "0px";
  cntnr.style.textAlign = "left";
  cntnr.style.width = "6em";
  cntnr.style.cursor = "pointer";
}

legSelectorControl.prototype.addLeg = function(legId){
 var rbText;

var p = document.createElement('p');
var rb_label   = document.createElement('label');
  if(MSIE){
      var rb = document.createElement(
        '<input type="radio" name="displayLeg="'
      + 'id="currLeg'+legId+'" onclick="'
      + 'ls.setDisplayLeg(ls,'+legId+');'
      + '">');
    } else {
      // code for the rest
      var rb         = document.createElement('input');
      rb.setAttribute('type', 'radio');
      rb.id = 'displayLeg' + legId;
      rb.setAttribute('value',null);
      rb.setAttribute('name','legSelect');
      rb.setAttribute('onclick',
                      'ls.setDisplayLeg(ls,'+ legId + ');');
  }
  if(legId == -1){
    rbText = 'All Legs';
    rb.checked = true;
  }
  else{
    rbText = MAP_Sports[legs[legId].sport] + " " + multSportLegs(legs[legId].sport,legId);
  }

  rb_label.appendChild(rb);
  rb_label.appendChild(document.createTextNode(rbText));
  p.appendChild(rb_label);
  this.container.appendChild(p);
}

legSelectorControl.prototype.removeLeg = function(legId){

    var p = this.container.getElementsByTagName('p');
    this.container.removeChild(p[legId+1]);
}

legSelectorControl.prototype.setDisplayLeg = function(y,legId){
  if(legId == this.currLeg){return;}

  //if legIdId == -1, show all that aren't currently shown
  if(legId == -1){
    for(i=0;i<=currLegId;i++){

        if (i != y.currLeg){
            y.displayLeg( i)
        }
    }
    y.currLeg = legId;
    chartElevation();
  }
  else{
    if(!isNaN(legId)){
        for(i=0;i<=currLegId;i++){
            if (i != legId){
                y.unDisplayLeg(i);
            }
        }
        y.displayLeg(legId);
        chartElevation(legId);
    }
    y.container.selectedIndex = legId + 1;
    y.currLeg = legId;
  }
  distMarkers();
}

legSelectorControl.prototype.displayLeg = function(legId){
  if(!bEdit && $('showMarkersSelect').selectedIndex == 0){
    map.addOverlay(legs[legId].line)
  }
  else{
      legs[legId].markers.each( function(x){
        x.show();
        x.showLineToHere();
        this.currLeg = legId;
      });
      if ( $('units').selectedIndex > 0){
        distUnit = getDistanceMultiplier(legId)
        plotDistance(legId,distUnit);
      }
  }
  return true;
}

legSelectorControl.prototype.unDisplayLeg = function(legId){
  if(!bEdit && $('showMarkersSelect').selectedIndex == 0){
    map.removeOverlay(legs[legId].line)
  }
  else {
    legs[legId].markers.each(function (x){
        x.hide();
        x.hideLineToHere();
    });
    if ( $('units').selectedIndex > 0){
        removeDistanceMarkers(legId);
    }
  }
  return true;
}


function getRoute(routeId,type,activity){
  var url;
  var urlStart;
  var request;
  var gpxFile = "";

  if (type == GPX_Db){
    urlStart =  "map-getmap.asp?routeID=";
   }
  if (type == GPX_File){ 
    urlStart = "routeTmpUpload/"
  }
  url = urlStart + routeId;

  if (type == GPX_File || type == GPX_Device) {
    //changeShowElev();
    showElevGraph = false;
    bEdit=true;
    Element.hide("showMarkersSelect");
    url += ".txt";
  }

var message = "Getting Route Data..."
showStatusMsg(message);

if (type == GPX_Device) {
	gpxFile = activity
	Element.hide("garminDisplay")
	processGpxFile(gpxFile,type);
	hideStatusMsg();
}
else {
	GDownloadUrl(url, function(data, responseCode) {
	 if (responseCode != 200) {
	    hideStatusMsg();
	    window.location = "map.asp?"
	  }
	 if (data.length > 0){
		gpxFile = GXml.parse(data);
		processGpxFile(gpxFile,type);
		hideStatusMsg();
		}
	 else {
		newRoute();
	    }
	 });
 }
 }

function processGpxFile(gpxFile,type){
  var chartDist = 0;
  var distFromLastPointOk = true;
  var minDist = 40;
  var oDSport;
  
 //here   
 message = "Loading Route Data..."
  showStatusMsg(message);

  setBtnSport(0)
  var gMapType = "Map"

    if (type == GPX_Db){
    

      showMarkers = $('showMarkersSelect').selectedIndex

      totalDistance = parseFloat(gpxFile.getElementsByTagName("distance")[0].firstChild.nodeValue)
      totalClimb = parseFloat(gpxFile.getElementsByTagName("climb")[0].firstChild.nodeValue)

      var centerLat = parseFloat(gpxFile.getElementsByTagName("centerlat")[0].firstChild.nodeValue)
      var centerLng = parseFloat(gpxFile.getElementsByTagName("centerlng")[0].firstChild.nodeValue)
      mapCenter = new GLatLng(centerLat,centerLng)
      if (gpxFile.getElementsByTagName("gmaptype").length > 0){
             gMapType = gpxFile.getElementsByTagName("gmaptype")[0].firstChild.nodeValue
      }
      var mapZoom = gpxFile.getElementsByTagName("zoom")[0].firstChild.nodeValue
      map.setCenter(mapCenter, parseInt(mapZoom));

      switch(gMapType){
        case 'Map':
          map.setMapType(G_NORMAL_MAP);
          break;
        case 'Satellite':
          map.setMapType(G_HYBRID_MAP);
          break;
        case 'Hybrid':
          map.setMapType(G_SATELLITE_MAP);
          break;
        case 'Terrain':
          map.setMapType(G_PHYSICAL_MAP);
          break;
        default:
          map.setMapType(G_NORMAL_MAP);
      }

    } else {
      var minlat        = 0;
      var   minlon      = 0;
      var   maxlat      = 0;
      var   maxlon      = 0;
      var bounds = gpxFile.documentElement.getElementsByTagName("bounds");
        if( bounds && bounds.length ) {
            minlat = parseFloat(bounds[0].getAttribute("minlat"));
            minlon = parseFloat(bounds[0].getAttribute("minlon"));
            maxlat = parseFloat(bounds[0].getAttribute("maxlat"));
            maxlon = parseFloat(bounds[0].getAttribute("maxlon"));  
            var centerLat   = minlat+(maxlat-minlat)/2;
            var centerLng = minlon+(maxlon-minlon)/2;
            mapCenter = new GLatLng(centerLat,centerLng)
            map.setCenter(mapCenter, 13);
        }

        if (!map.isLoaded()) {
            map.setCenter(new GLatLng(39.809722, -98.555278), 4);
        }
    }

      var gpxType;
      var legsNode;

      var rteNode = gpxFile.getElementsByTagName("rte")
      if (rteNode && rteNode.length > 0) {
        gpxType = "rte";
        legsNode = rteNode;
      } else {
        var trkNode = gpxFile.getElementsByTagName("trkseg")
        if (trkNode && trkNode.length > 0) {
          gpxType = "trk";
          legsNode = trkNode;
        }
      }

      //loop through the rte nodes
      for (var i = 0; i < legsNode.length; i++ ){
          message = "Loading leg " + i + "..."
          showStatusMsg(message);

        var legNode = legsNode[i];
        var iLegSport =  2;
        var fLegDist = 0;
        var fLegClimb = 0;

        legs[nextLegId] = new leg(iLegSport);
        if(type==GPX_Db)
        {
          iLegSport = legNode.getElementsByTagName("type")[0].firstChild.nodeValue
          fLegDist  = legNode.getElementsByTagName("distance")[0].firstChild.nodeValue
          fLegClimb = legNode.getElementsByTagName("climb")[0].firstChild.nodeValue
          legs[currLegId].distance = parseFloat(fLegDist);
          legs[currLegId].climb = parseFloat(fLegClimb);
          setBtnSport(iLegSport)
        }

        if (type == GPX_File || type == GPX_Device){
          sSport = routetype;
          if ( sSport != 'swim' && sSport.toLowerCase() != 'bike' && sSport.toLowerCase() != 'run')
          {
            sSport = 'run';
          }
          iLegSport = sportStrAry[sSport];
          setBtnSport(iLegSport);
        }
          if (i == 0) {
          legs[0].sport = iLegSport;
          setDistanceDisplay(legs[0])
        }
        if (i == 1) {
          legs[i].sport = iLegSport;
          addDistElevRows(legs[0].sport);
          setDistanceDisplay(legs[0])
          setClimbingDisplay(legs[0])
          ls = new legSelectorControl();
          token = map.addControl(ls);
          ls.addLeg(-1);
          ls.addLeg(0);
        }
        if (i > 0) {
          legs[i].sport = iLegSport;
          addDistElevRows(legs[i].sport);
          setDistanceDisplay(legs[i])
          setClimbingDisplay(legs[i])
          ls.addLeg(currLegId);
        }

        var rtepts
        if (gpxType == "rte"){
          rtepts = legNode.getElementsByTagName("rtept")
        }
        else {
          rtepts = legNode.getElementsByTagName("trkpt")
        }
        for(var j = 0;j < rtepts.length; j++ ){
          var pt = rtepts[j];
          var ptLat;
          var ptLon;
          var mrkDir = '';
          var mrkPlace = '';
          var mrkImg  = '';
          var mrkElev;
          var mrkClimb;
          var mrkDist;
          var mrkElevDelta;

          if(pt.getElementsByTagName("lat").length > 0) {
            ptLat = parseFloat(pt.getElementsByTagName("lat")[0].firstChild.nodeValue)
          } else {
            ptLat = parseFloat(pt.getAttribute("lat"))
          }

          if(pt.getElementsByTagName("lon").length > 0 ){
            ptLon = parseFloat(pt.getElementsByTagName("lon")[0].firstChild.nodeValue)
          } else {
            ptLon = parseFloat(pt.getAttribute("lon"))
          }

          if ((type==GPX_File || type == GPX_Device) && j==0){
            mapCenter = new GLatLng(ptLat,ptLon)
            map.setCenter(mapCenter, 13);
          }

          if (pt.getElementsByTagName("ele").length > 0){
            mrkElev =  parseFloat(pt.getElementsByTagName("ele")[0].firstChild.nodeValue)
			if(type == GPX_Device) { mrkElev = (mrkElev * .3048).toFixed(0) }			
          }
          if (pt.getElementsByTagName("climb").length > 0){
            mrkClimb =   parseFloat(pt.getElementsByTagName("climb")[0].firstChild.nodeValue)
          }
          if (pt.getElementsByTagName("distFromPrev").length > 0){
            mrkDist =   parseFloat(pt.getElementsByTagName("distFromPrev")[0].firstChild.nodeValue)
          }

          if (pt.getElementsByTagName("elevDelta").length > 0){
            mrkElevDelta =   parseFloat(pt.getElementsByTagName("elevDelta")[0].firstChild.nodeValue)
          }

          if (pt.getElementsByTagName("dir").length > 0){
            if (pt.getElementsByTagName("dir")[0].firstChild != null){
                mrkDir =   pt.getElementsByTagName("dir")[0].firstChild.nodeValue
            }
          }

          if (pt.getElementsByTagName("place").length > 0){
            if (pt.getElementsByTagName("place")[0].firstChild != null){
                mrkPlace =   pt.getElementsByTagName("place")[0].firstChild.nodeValue
            }
          }

          if (pt.getElementsByTagName("imgUrl").length > 0){
            if (pt.getElementsByTagName("imgUrl")[0].firstChild != null){
                mrkImg =   pt.getElementsByTagName("imgUrl")[0].firstChild.nodeValue
            }
          }
          var newPt = (new GLatLng(ptLat, ptLon));

          //prevent gpx files from loading too many points
          if (type == GPX_File && legs[currLegId].markers.length > 0){
            var distFromLastPoint = newPt.distanceFrom(legs[currLegId].markers[legs[currLegId].currMarkerId].getPoint());
            if (distFromLastPoint < minDist){
              distFromLastPointOk = false;
            }
            else {
              distFromLastPointOk = true;
              
            }
          }

          if (type == GPX_Db || distFromLastPointOk){
              map.bounds.extend(newPt);         
            
              var marker= createMarker(newPt, currLegId);
                message = "Loading points: " + marker.markerId
                showStatusMsg(message);

              if (typeof mrkElev != "undefined"){marker.elevation = mrkElev;}
              if (typeof mrkClimb != "undefined"){marker.climb = mrkClimb};
              if (typeof mrkDist != "undefined"){marker.distanceFromPrev = mrkDist};
              if (typeof mrkElevDelta != "undefined"){marker.elevDelta = mrkElevDelta};
              if (typeof mrkDir != "undefined"){marker.direct = mrkDir};
              if (typeof mrkPlace != "undefined"){marker.place= mrkPlace};
              if (typeof mrkImg != "undefined"){marker.imgUrl = mrkImg};            
            
              if(marker.direct.length>0 || marker.place.length>0 || marker.imgUrl.length>0 ) {Element.show("CueSheetDiv");}
            
              legs[currLegId].markers.push(marker);
              if (!showMarkers){
                legs[currLegId].points.push(marker.getPoint());
              }
              if (type==GPX_File || type == GPX_Device){
                addClimb(marker);
                if (typeof distFromLastPoint != "undefined"){ marker.distanceFromPrev = distFromLastPoint};             
                calcDistance(marker,false);
              }
              else{
                calcDistance(marker,true);
              }
              marker.createElevTip();
              if(type == GPX_Db) {
                  if (creating || showMarkers){
                    legs[currLegId].mgr.addMarker(marker,0,17);
                    if( legs[currLegId].currMarkerId > 0) {
                        marker.drawLineToHere()
                    }
                    setCueNode(currLegId,legs[currLegId].currMarkerId);
                 }
             }

           }
         }
          if((type == GPX_File || type == GPX_Device) || (!creating && !showMarkers)){
            legs[currLegId].line = new GPolyline(legs[currLegId].points,lineColors[legs[currLegId].sport],3,.7);
            map.addOverlay(legs[currLegId].line);
          }
      }

      var displayClimb = elevInUnits(totalClimb, oDSport);
      setOverallElevDisplay(displayClimb)

     if(type == GPX_File || type == GPX_Device) {
        var displayDist = distInUnits(totalDistance, oDSport);
        setOverallDistanceDisplay(displayDist)
      }
      listeners(creating)
      setButtonsState(!bEdit)
      chartElevation();
 //here
}

function reload(){
    clearMap(true);
    map = null;
    $('units').selectedIndex = 0;
    load();
}

 //start this mess
 function load(){
    if (GBrowserIsCompatible()) {
      initMap();
      mapUser = new member();

    routeId = new String(getQueryVariable('routeId'));
    sGUID = new String(getQueryVariable('g'));
    bEdit = new String(getQueryVariable('e'));
    if(bEdit=="undefined"){bEdit=false;}
    creating = getMapState(routeId, bEdit);
    

    if(!isNaN(routeId)){
        if(!creating){
            Element.show("showMarkersDiv");
            Element.hide("saveButton");
            Element.hide("resetElevId");
            Element.hide("uploadDiv");
        }
        else {
            Element.hide("showMarkersDiv");
            Element.show("saveButton");
            Element.show("resetElevId");
            Element.show("uploadDiv");
            //changeShowElev();
            //noElevEditMessage();
        }
        getRoute(routeId,GPX_Db);
        showSaveToMyRoute();        
    } else if ( sGUID != "undefined") {
      getRoute(sGUID,GPX_File)
      delTempFile(sGUID)
    }
    else {
        newRoute();
    }
  }
 }

function unload(){
  if (mapUser.lat != null && mapUser.lng != null && mapUser.zoom != null ) {
    mapUser.setLocation();
  }
  GUnload();
}

function initMap(){
    map = new GMap2($("map"),
      {draggableCursor: 'crosshair', draggingCursor: 'move'});
    map.addControl(new GLargeMapControl());
//    map.addControl(new GMapTypeControl());            
      map.addMapType(G_PHYSICAL_MAP);
      // Create a Hierercical map type control
      var hierarchy = new GHierarchicalMapTypeControl();
      // make Google Satellite Hybrid be the satellite default
      hierarchy.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, null, true);
      // add that control to the map
      map.addControl(hierarchy);

      kbControl = new GKeyboardHandler(map);
    map.bounds = new GLatLngBounds;
    map.getPane(G_MAP_FLOAT_PANE).appendChild(tooltip);
    tooltip.style.visibility="hidden";
}

function getMapState(r,e){
    var bMapState;
    if (e == "undefined"){ e=false;}
    bMapState = (!isNaN(r) && e == 0) ? false : true
   return bMapState;
}

function ownsMap(){
    var iOwnerID = $("routeOwner").value
    var iViewerID = $("routeViewer").value

    return iOwnerID == iViewerID;
}

function showSaveToMyRoute(){
        var myRoute = ownsMap();
        if (myRoute == false ){
            $("saveRoute").value = "Save to My Routes"
            Element.show("saveButton");
    }       
}       

function newRoute(){
    Element.hide("showMarkersDiv");
    bEdit = true;
    mapUser.getLocation();
    listeners(true);
}

function noElevMessage(){
  var chartDiv = $('chart1div');
  chartDiv.innerHTML = 'The service used to retrieve elevation data is currently offline.'
}

function noElevEditMessage(){
  var chartDiv = $('chart1div');
  chartDiv.innerHTML = 'For performance reasons, the Elevation Graph is not available in Edit Mode.'
}

function showStatusMsg(message){
  $('statusCell').innerHTML = '';
  new Insertion.Top('statusCell', message);
  Element.show("statusMessageDiv");
}

function hideStatusMsg(){
  $('statusCell').innerHTML = '';
  Element.hide("statusMessageDiv");
}

function listeners(creating){
  GEvent.addListener(map, "click", function (marker, point) {
    if (marker) {
      tooltip.style.visibility = "hidden";
      if (creating) {
        loopGoHomeButtons(marker.legId, marker.markerId);
      }
    }
    else {
      if (creating) {
        btnSport = $('sportClicked').value
        if (legs.length == 0) {
          legs[nextLegId] = new leg(btnSport);
        }
        if (legs[currLegId].sport != btnSport) {
          if (legs[currLegId].markers.length === 0) {
            legs[currLegId].sport = btnSport
          } else {
            if (currLegId === 0) {
              addDistElevRows(legs[currLegId].sport);
              totalsToFirstRow();
              ls = new legSelectorControl();
              token = map.addControl(ls);
              ls.addLeg(-1);
              ls.addLeg(currLegId);
            }
            legs[nextLegId] = new leg(btnSport);
            ls.addLeg(currLegId);
            addDistElevRows(btnSport);
          }
        }

        map.bounds.extend(point);
        reCenter(point);
        //if flwRds is checked, get each point, add to the array. Reverse it as the last step
        if ($('flwRds').checked  == true && legs[currLegId].markers.length>0) {
          //get the intermediate points
          calcIntermediatePoints(point)
        } else {
          addToMap(new Array(point));
        }
        //iterate through the array, doing everything except maybe not mgr.addmarker for the last
      }
    }
  });

  GEvent.addListener(map,"zoomend",function(){
    distMarkers();
  });

}

function addToMap(pnts) {
    pnts.each(function(pnt,i){
          var marker = createMarker(pnt, currLegId);
          legs[currLegId].markers.push(marker);
          calcDistance(marker, false);
          getElevation(marker, false, false);
          //show every marker for now. This may change to show based on zoom level.
          if (i == pnts.length-1) {
            legs[currLegId].mgr.addMarker(marker, 0, 17);
          }
          if (legs[currLegId].currMarkerId > 0) {
            marker.drawLineToHere()
          }
        });
     distMarkers();
 }

function subtractClimb(marker){
  legs[marker.legId].climb -= Math.max(0,marker.elevDelta * MK_Feet);
  totalClimb -= Math.max(0,marker.elevDelta * MK_Feet);
}

function createMarker(point, legId) {
  var icon = new GIcon();
  var opts= new Object();
  var flwRds = $('flwRds').checked;
  legs[legId].points.push(point);  
  //assign it an image
  icon = gicons["node" + legs[legId].sport];
  opts.icon = icon;
  opts.draggable = creating;
  opts.bouncy = false;
  var marker = new GMarker( point, opts );
  marker.markerId(legId);
  marker.legId = legId;
  GEvent.addListener(marker,"mouseover", function() {
    showTooltip(marker);
  });

  GEvent.addListener(marker,"mouseout", function() {
    tooltip.style.visibility = "hidden";
  });

      GEvent.addListener(marker,"drag",function(){
            var clickedPoint =marker.getPoint();
            mId = marker.markerId;
        lId = marker.legId;
            if(mId > 0){
                marker.removeLineToHere();                  
                var prePoint=legs[marker.legId].markers[mId-1].getPoint();
                marker.lineToHere = new GPolyline([prePoint,clickedPoint],lineColors[legs[marker.legId].sport],3)
                marker.drawLineToHere();
          dragDistance(marker)
        }
            if(mId != legs[lId].markers.length-1){ //this isn't the last marker on this leg
                legs[lId].markers[mId+1].removeLineToHere();        
                var nextPoint= legs[lId].markers[mId+1].getPoint();         
                legs[lId].markers[mId+1].lineToHere=new GPolyline([clickedPoint,nextPoint],lineColors[legs[lId].sport],3);
                legs[lId].markers[mId+1].drawLineToHere();
                dragDistance(legs[lId].markers[mId+1]);
            }
        distMarkers();
        });

    GEvent.addListener(marker,"dragstart",function(){
      tooltip.style.visibility = "hidden";
      map.closeInfoWindow()
    });

    GEvent.addListener(marker,"dragend",function(){
        mId = marker.markerId;
        lId = marker.legId;
        for(j=mId+2;j<legs[lId].markers.length;j++){
            calcDistance(legs[lId].markers[j],true);
      }
      getElevation(legs[lId].markers[mId],true,false);
      chartElevation();
    });

    GEvent.addListener(marker,"click",function(){
        if (isNaN(marker.markerId)== false){
            marker.openInfoWindowTabsHtml([new GInfoWindowTab("Directions",listDirs(this)), new GInfoWindowTab("Image",infoWindowImage(this))]);
        }
     });

  return marker;
}

function calcIntermediatePoints(endpoint) {

  // One at a time, please
  if (this.map.gDirectionsObj) {
    return;
  }
  var points = legs[currLegId].points;
  if (points.length > 0) {
    var frompoint = points[points.length - 1];

    map.gDirectionsService = new GDirections();

    GEvent.addListener(map.gDirectionsService, "load",
                GEvent.callbackArgs(this, intermediatePointsLoaded,
                map.gDirectionsService, points.length - 1));

    var self = this;
    GEvent.addListener(map.gDirectionsService, "error", function () { $('flwRds').checked = false; delete self.gDirectionsService; });

    map.gDirectionsService.loadFromWaypoints([frompoint, endpoint], { preserveViewport: false, getPolyline: true, getSteps: false });
  }
}

function intermediatePointsLoaded (pnts, idxLastpoint) {
  var mapPoints = new Array()
  var polyline = pnts.getPolyline();
  var len = polyline.getVertexCount();
  var lastpoint = legs[currLegId].points[legs[currLegId].points.length - 1]
  for (var x = 1; x < len ; x++) {
    var step = polyline.getVertex(x);
    if (step.distanceFrom(lastpoint) > 15) {
      mapPoints.push(step)
    }
  }
  addToMap(mapPoints);
  delete map.gDirectionsObj;
}


function showTooltip(marker) {
  tooltip.innerHTML = marker.tipString;
  var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());
  var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
  var anchor=marker.getIcon().iconAnchor;
  var width=marker.getIcon().iconSize.width;
  var ttWidth=240;
  var ttHeight=tooltip.clientHeight;
  //if map bounds contains the point 240px to the right of marker anchor,
  //place it to the right of the anchor. Else the left.
  if (offset.x-point.x > ( ttWidth * 1.5 ) ){
    offset.x -= ttWidth
  }
  if (offset.y-point.y < ttHeight) {
    ttHeight = -5
  }
  var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y - anchor.y - ttHeight));
  pos.apply(tooltip);
  tooltip.style.visibility="visible";
}


//btMarker object
function setMarkerId (legId) {
  this.markerId = legs[legId].nextMarkerId;
  legs[legId].currMarkerId = this.markerId;
    legs[legId].nextMarkerId++;
}


//creates the template for marker tooltip
function createDistanceTip() {
  var dpM = parseFloat(this.distanceFromPrev) / MK_Miles;
  var dpK = parseFloat(this.distanceFromPrev) / MK_Kms;
  var dlM = parseFloat(this.distanceFromLegStart) / MK_Miles;
  var dlK = parseFloat(this.distanceFromLegStart) / MK_Kms;
  var dpmMult;
  var dplMult;

  dpM == 1? dpmMult='': dpmMult='s';
  dlM == 1? dlmMult='': dlmMult='s';

  var t = '<table style="border: 0; padding: 2; border-collapse: collapse">'
  t += '<tr><td colspan="3" style="font-size: 10px;text-align: left"><u>Distance</u></td></tr>'
  t += '<tr><td cellpadding-right="0" style="font-size: 10px;text-align: left">from Last Point: </td><td style="font-size: 10px">' + dpM.toFixed(2) + ' mile' + dpmMult + '</td><td style="font-size: 10px">&nbsp;&nbsp;'+ dpK.toFixed(2) +' km</td></tr>'   //distFromPrev in miles and kms
  t += '<tr><td cellpadding-right="0" style="font-size: 10px;text-align: left">from Leg Start: </td><td style="font-size: 10px">' + dlM.toFixed(2) + ' mile' + dlmMult + '</td><td style="font-size: 10px">&nbsp;&nbsp;'+ dlK.toFixed(2) +' km</td></tr>' //leg Dist in miles and kms
  t += '<tr><td colspan="3">  </td></tr>'
  t += '</table>'
  this.tipString = t;
}

function createElevTip() {
    var lC= parseFloat(this.climb);
    var e = parseFloat(this.elevation * MK_Feet)

    var t = '<tr><td colspan="3">  </td></tr>'
    t += '<tr><td cellpadding-right="0" colspan="3" style="font-size: 10px;text-align: left"><u>Elevation</u></td></tr>'
    if(this.markerId>0){
      var g = ((this.elevDelta * MK_Feet) / ((parseFloat(this.distanceFromPrev) / MK_Miles) *5280)) * 100;
      t += '<tr><td cellpadding-right="0" style="font-size: 10px;text-align: left">Climbing:  </td><td style="font-size: 10px">' + Math.round(lC,0) + ' ft'+  '</td><td style="font-size: 10px">'  + (lC * .3048).toFixed(0)  +' m</td></tr>' //leg Climb in meters and feet
      t += '<tr><td cellpadding-right="0" style="font-size: 10px;text-align: left">From last point:  </td><td style="font-size: 10px"> ' + Math.round(this.elevDelta * MK_Feet,0) + ' ft' +  '</td><td style="font-size: 10px">' + Math.round(this.elevDelta,0)  +' m</td></tr>'//point climb in meters and feet
      t += '<tr><td cellpadding-right="0" style="font-size: 10px;text-align: left">Grade:  </td><td colspan="2" style="font-size: 10px">' + Math.round(g,0) +'%</td></tr>'; //grade from last point
    }
    t += '<tr><td cellpadding-right="0" style="font-size: 10px;text-align: left">Above sea level:  </td><td style="font-size: 10px">' + Math.round(e,0) + ' ft' +  '</td><td style="font-size: 10px">' + (e * .3048).toFixed(0) +' m</td></tr>' //point elevation in meters and feet
    t += '<tr><td colspan="3">  </td></tr>'
    t +='</table>'
    this.tipString = this.tipString.gsub(/<tr><td colspan=\"3\">.*<\/td><\/tr><\/table>/,t)
}

function showLineToHere(){
    if (this.markerId > 0){
        this.lineToHere.show();
    }
}

function hideLineToHere(){
    if (this.markerId > 0){
        this.lineToHere.hide();
    }
}

function drawLineToHere(){
  var point = this.getPoint()
  var prevPt = legs[this.legId].markers[this.markerId-1].getPoint()
  this.lineToHere = new GPolyline([prevPt,point],lineColors[legs[this.legId].sport],3)
    if (this.markerId > 0){
        map.addOverlay(this.lineToHere);
    }
  return;
}


function removeLineToHere(){
    if (this.markerId > 0){
        map.removeOverlay(this.lineToHere);
    }
}

// get what we know about the viewer
  function getMemberLocation(){
    var locationUrl = "map-memberlocation.asp";
      var request = GXmlHttp.create();
    var reasons=[];
    var mbrAddress = "";
    var geoCoder= new GClientGeocoder();
    mapCenter;
    new Ajax.Request(locationUrl,{
      method:'get',
      onSuccess: function(request){
        var response = request.responseText;
          if (response) {
            var root = request.responseXML.documentElement; 
            var addrNode =  root.getElementsByTagName("addr1")[0];
            if (addrNode != null){this.addr = addrNode.firstChild.data;}
            var stateNode =  root.getElementsByTagName("state")[0];
            if (stateNode != null){this.state = stateNode.firstChild.data;}
            var cityNode = root.getElementsByTagName("city")[0];
            if (cityNode != null){this.city = cityNode.firstChild.data;}
            var countryNode = root.getElementsByTagName("country")[0];
            if (countryNode != null){this.country = countryNode.firstChild.data;}
            if (this.country == "spacer"){this.country = "";}
            var postalNode = root.getElementsByTagName("zip")[0];
            if (postalNode != null){this.postal = postalNode.firstChild.data;}
            var lngNode = root.getElementsByTagName("Lng")[0];
            if (lngNode != null){this.lng = lngNode.firstChild.data;}
            var latNode = root.getElementsByTagName("Lat")[0];
            if (latNode != null){this.lat = latNode.firstChild.data;}
            var zoomNode = root.getElementsByTagName("Zoom")[0];
            if (zoomNode != null){this.zoom = zoomNode.firstChild.data;}
            //do we  have lat,lng & zoom setCenter elsedo a geocode request with the other info
            if (this.lat != null && this.lng != null && this.zoom != null ) {
              mapCenter = new GLatLng(this.lat,this.lng)
              map.setCenter(mapCenter, parseInt(this.zoom));
            }
            else  { //assemble the address string. This could be functionified with a str array
              if (typeof this.addr != "undefined"){mbrAddress = this.addr+" ";}
              if (typeof this.city != "undefined" ){mbrAddress += this.city+", ";}
              if (typeof this.state != "undefined" ){mbrAddress += this.state+" ";}
              if (typeof this.postal != "undefined" ){mbrAddress += this.postal+" ";}
              if (typeof this.country != "undefined" ){mbrAddress += this.country;}

              if (mbrAddress.length == 0 || (mbrAddress.length == 2 && this.country == 'US')){
                mapCenter = new GLatLng(39.809722, -98.555278)
                map.setCenter(mapCenter,4);
              } else if(this.country == 'UK' || this.country == 'England' || this.country == 'Wales' || this.country == 'Scotland' ){
                mapCenter = new GLatLng(53.800650, -1.889648)
                map.setCenter(mapCenter,5);
              }
              else{
                geoCoder.getLatLng(mbrAddress, function(coderResponse){
                  if(coderResponse){
                    mapUser.bHasAddr = 1;
                    gLat = coderResponse.lat();
                    gLng = coderResponse.lng();
                    gZoom = 13;
                    mapCenter = new GLatLng(gLat,gLng)
                    map.setCenter(mapCenter, gZoom);
                   }
                  else{
                    var result=geoCoder.getCache().get(mbrAddress);
                    if (result) {
                      var reason="Code "+result.Status.code;
                      if (reasons[result.Status.code]) {
                        reason = reasons[result.Status.code]
                      }else {
                        var reason = "";
                      }
                    }
                  }
                });
               }
              }
            }
        else {
            mapCenter = new GLatLng(39.809722, -98.555278);
            map.setCenter(mapCenter,3);
        }
    }
	
  });
  return true;
}


//change the display of distance markers
function distMarkers(){
  var distUnit;

  legs.each(function(x,i) {     
      removeDistanceMarkers(i);
  });

  if(legs.length>1 && ls.currLeg != -1){
     if ( $('units').selectedIndex > 0){
       distUnit = getDistanceMultiplier(ls.currLeg)
       plotDistance(ls.currLeg,distUnit);   
    }
  } else {
    legs.each(function(x,i) {   
      if ( $('units').selectedIndex > 0){
        distUnit = getDistanceMultiplier(i)
        plotDistance(i,distUnit);
      }
    });
  }
}

function removeDistanceMarkers(legNum) {
  for(j = legs[legNum].distanceMarkers.length; j>0; j--){
    map.removeOverlay(legs[legNum].distanceMarkers[j-1]);
    legs[legNum].distanceMarkers.pop();
  }
}

function getDistanceMultiplier(legNum){
  var distUnitType = $('units');
  var distUnitIndex = distUnitType.selectedIndex;
  var distUnit;

  if (distUnitIndex == 1) {
    if (legs[legNum].sport == 3) {
      distUnit = MK_Yards
    } else {
      distUnit = MK_Miles
    }
  } else if (distUnitIndex == 2) {
    if (legs[legNum].sport == 3) {
      distUnit = MK_Meters
    } else {
      distUnit = MK_Kms
    }
  }
  return distUnit;
}

function autoZoom(){
  var zoom = map.getBoundsZoomLevel(map.bounds);
  var zLat = (map.bounds.getNorthEast().lat() + map.bounds.getSouthWest().lat()) /2;
  var zLng = (map.bounds.getNorthEast().lng() + map.bounds.getSouthWest().lng()) /2;
  var zCen = new GLatLng(zLat,zLng)
  map.setCenter(zCen,zoom);
}

function loopGoHomeButtons(legId, markerId){
  var loopBtn = $('loopBtn')
  var goHomeBtn = $('goHomeBtn')
  if (markerId == null ){
    loopBtn.innerHTML = '<img src="images/LoopINACTIVE.png" alt="Loop Inactive.gif" alt ="Go Home" />'
    goHomeBtn.innerHTML = '<img src="images/GoHomeINACTIVE.png" alt="Go Home" /> '
  } else {
    loopBtn.innerHTML = '<input type="image" name="loop" id="loop"  src="images/LoopUp.gif" onmousedown="this.src=\'images/LoopDown.gif\'" onmouseup="this.src=\'LoopUp.gif \'" alt="Loop" onclick="extendRoute(\'loop\','+legId+","+markerId+')"/>'
    if(markerId>0){
     goHomeBtn.innerHTML = '<input type="image" name="goHome" id="goHome"  src="images/GohomeUp.gif" onmousedown="this.src=\'images/GohomeDown.gif\'" onmouseup="this.src=\'images/GoHomeUp.gif\'" alt="Loop" onclick="extendRoute(\'goHome\','+legId+","+markerId+')"/>'
    }
  }
}

function undo(){

    mId = legs[currLegId].currMarkerId;
    

    removeDistanceMarkers(currLegId)

    if(legs[currLegId].markers.length > 1) {
      var distToSubtr = legs[currLegId].markers[mId].distanceFromPrev
      legs[currLegId].distance -= distToSubtr
      totalDistance -= distToSubtr;

      var elevToSubtr = legs[currLegId].markers[mId].elevDelta
      if (elevToSubtr > 0){
        totalClimb -= (elevToSubtr * MK_Feet);
        legs[currLegId].climb -= (elevToSubtr * MK_Feet);
      }
    }
    legs[currLegId].markers[mId].removeLineToHere();
    legs[currLegId].mgr.removeMarker(legs[currLegId].markers[mId]);
    legs[currLegId].markers.pop();
    legs[currLegId].currMarkerId--
    legs[currLegId].nextMarkerId--

    if(legs[currLegId].markers.length == 0){
      if(currLegId > 0){
        legs.pop();
        removeDistElevRow(currLegId+2);
        ls.removeLeg(currLegId);        
         if (currLegId == 1){
          removeDistElevRow(currLegId+1)
          ls.displayLeg(0);
          map.removeControl(ls);
          }
      }
      currLegId = legs[legs.length-1].legId
      nextLegId = currLegId + 1;
      setBtnSport(legs[currLegId].sport);
    }
  else  { 
    distUnit = getDistanceMultiplier(currLegId)
    plotDistance(currLegId,distUnit);
    setDistanceDisplay(legs[currLegId])
    setClimbingDisplay(legs[currLegId])
  }
   chartElevation();
}


function clearMap(reloading) {

    map.clearOverlays();

    map.removeControl(token);
    for (var x = currLegId; x >= 0; x--){
      if(legs[x]){
        legs[x].mgr.clearMarkers();
      }
      legs.pop();
      if (x > 0){
        removeDistElevRow(x+2)
        if (x==1){
          removeDistElevRow(x+1)
        }
      }
    }
    $('dist_eng_0').innerHTML = '0 miles';
    $('dist_metric_0').innerHTML = '0 kms'

    $('elev_eng_0').innerHTML = '0 feet';
    $('elev_metric_0').innerHTML = '0 meters'

    if(currLegId>0){
        map.removeControl(ls);
    }
    nextLegId = 0;
    currLegId = 0;
    totalDistance = 0;
    totalClimb = 0;
    loopGoHomeButtons(null);
    if(!reloading){
      legs[currLegId] = new leg;
    }
    

  return true;
}

function removeDistElevRow(row){
    var tableDistRef = $('distTbl');
    var tableElevRef = $('elevTbl');

    tableDistRef.deleteRow(row);
    tableElevRef.deleteRow(row);
  }

function plotDistance(legNum, meters) {
  var numMarkers = 0;
  var numUnits = 0;
  var dist = 0;
  var zoom = map.getZoom()

  legs[legNum].markers.each(function(x,i) {
    if(i>0){
      var p1 = legs[legNum].markers[i-1].getPoint();
      var p2 = x.getPoint();
      var thisdist = p1.distanceFrom(p2);
      while (dist+thisdist > meters) {
        var step = meters-dist;
        var ratio = step/thisdist;
        var dx = (p2.lng() - p1.lng()) * ratio;
        var dy = (p2.lat() - p1.lat()) * ratio;
        var p = new GLatLng(p1.lat()+dy, p1.lng()+dx);

        numUnits++
          if (zoom > 11){
            numMarkers = legs[legNum].distanceMarkers.push(createDistMarker(p, legs[legNum], numUnits));
            map.addOverlay(legs[legNum].distanceMarkers[numMarkers-1]);
           }
          else if (zoom === 11){
            if (numUnits % 2 === 0){
              numMarkers = legs[legNum].distanceMarkers.push(createDistMarker(p, legs[legNum], numUnits));
              map.addOverlay(legs[legNum].distanceMarkers[numMarkers-1]);
            }
          }
          else if ((zoom ===  9)|| (zoom === 10)){
            if (numUnits % 5 === 0){
              numMarkers = legs[legNum].distanceMarkers.push(createDistMarker(p, legs[legNum], numUnits));
              map.addOverlay(legs[legNum].distanceMarkers[numMarkers-1]);
            }
          }
          else if (zoom <= 8){
            if (numUnits % 10 === 0){
              numMarkers = legs[legNum].distanceMarkers.push(createDistMarker(p, legs[legNum], numUnits));
              map.addOverlay(legs[legNum].distanceMarkers[numMarkers-1]);
            }
          }
        dist = 0;
        thisdist -= step;
        p1 = p;
      }
      dist += thisdist;
    }
  });
  return;
}

function addDistElevRows(iSport) {
    var distCells = [3];
    var elevCells = [3];
    var sportText = document.createTextNode(MAP_Sports[iSport]);
    var sportText2 = document.createTextNode(MAP_Sports[iSport]);

    var englishDistText = document.createTextNode("0.00 miles");
    var metricDistText = document.createTextNode("0.00 kms");
    var tableDistRef = $('distTbl');
    var nextDistRowNum = tableDistRef.rows.length;
    var newDistRow   = tableDistRef.insertRow(nextDistRowNum);

    var englishElevText = document.createTextNode("0 feet");
    var metricElevText = document.createTextNode("0.0 ms");
    var tableElevRef = $('elevTbl');
    var nextElevRowNum = tableElevRef.rows.length;
    var newElevRow  = tableElevRef.insertRow(nextElevRowNum);

    for(var i = 0; i < 3; i++){
      distCells[i] = newDistRow.insertCell(i);
      distCells[i].style.textAlign = "center";
      elevCells[i] = newElevRow.insertCell(i);
      elevCells[i].style.textAlign = "center";
    }

    distCells[0].appendChild(sportText);
    distCells[0].className="messagecellheader2";
    distCells[1].id = 'dist_eng_'+(nextDistRowNum-1);
    distCells[1].appendChild(englishDistText);
    distCells[2].id = 'dist_metric_'+(nextDistRowNum-1);
    distCells[2].appendChild(metricDistText);

    if (iSport != 0){
      elevCells[0].appendChild(sportText2);
      elevCells[0].className="messagecellheader2";
      elevCells[1].id = 'elev_eng_'+(nextElevRowNum-1);
      elevCells[1].appendChild(englishElevText);
      elevCells[2].id = 'elev_metric_'+(nextElevRowNum-1);
      elevCells[2].appendChild(metricElevText);
    }
}

function changeShowElev(){
  var btnImg = $('elevGraphBtn')

  var elevGraphDiv = $("chart1div");
  var mapDiv = $("map")

      if (!showElevGraph) {
        showElevGraph = true
        btnImg.src = 'images/elevGraphDown.gif';
        elevGraphDiv.style.height = '270px';
        elevGraphDiv.show();
        mapDiv.style.height = '400px';
        chartElevation();
      }
      else {
        showElevGraph = false
        btnImg.src = 'images/elevGraphUp.gif';
        elevGraphDiv.style.height = '0px';
        //elevGraphDiv.hide();
        mapDiv.style.height = '670px';
        //elevGraphDiv.innerHTML = ""
      }
}

function totalsToFirstRow(){
  $('dist_eng_1').innerHTML = $('dist_eng_0').innerHTML;
  $('dist_metric_1').innerHTML = $('dist_metric_0').innerHTML;

  $('elev_eng_1').innerHTML = $('elev_eng_0').innerHTML;
  $('elev_metric_1').innerHTML = $('elev_metric_0').innerHTML;
}

function distInUnits ( iSrc, sport){
    var convertedVals = new Array();
    if (isNaN(iSrc)== true){
        return "Error.";
    } else {
      if( sport == MAP_Swim ) {
          convertedVals["english"] = Number(iSrc * 1.0936133).toFixed(2) + " yds";
          convertedVals["metric"] =  Number(iSrc).toFixed(2) + " m";
      }else {
          convertedVals["english"] =  Number(iSrc * 0.000621371192).toFixed(2) + " miles";
          convertedVals["metric"] =  Number(iSrc * .001).toFixed(2) + " km";
      }
    }
  return convertedVals;
}

function calcDistance(marker,reset){
//there is all kinds of processing going on here that doesn't need to be done if we're just displaying the line. 
  if (marker.markerId > 0) {
    var distFromPrev = 0;
    var m1 = legs[marker.legId].markers[marker.markerId-1];
    var p1 = m1.getPoint();
    var p2 = marker.getPoint();
    var thisdist = p1.distanceFrom(p2);

    distFromPrev = parseFloat(Math.max(p1.distanceFrom(p2),0));

    legs[marker.legId].markers[marker.markerId].distanceFromPrev = distFromPrev;
    legs[marker.legId].markers[marker.markerId].distanceFromLegStart = m1.distanceFromLegStart + distFromPrev

    if(bEdit && !reset){
      if ("undefined" != totalDistance) {
        totalDistance += distFromPrev;
      } else {
        totalDistance = distFromPrev;
      }

    legs[marker.legId].distance += distFromPrev;
    setDistanceDisplay(legs[marker.legId]);
    }
  }
  else {
     legs[marker.legId].markers[marker.markerId].distanceFromPrev = 0;
  }
    marker.createDistanceTip();
  return true;
}

function dragDistance(marker){
    totalDistance -= marker.distanceFromPrev
    legs[marker.legId].distance -= marker.distanceFromPrev;
    setDistanceDisplay(legs[marker.legId]);
    calcDistance(marker,false);         
}

function setBtnSport(iSport) {
  var swimBtn = $('swimBtn');
  var bikeBtn = $('bikeBtn');
  var runBtn = $('runBtn');

 if (iSport == 0) {
    bikeBtn.src="images/bikeUp.png";
    runBtn.src="images/runUp.png";
    swimBtn.src="images/swimUp.png";
  }
  if (creating){
      var sportClicked = $('sportClicked');
      sportClicked.value = iSport
      switch (parseFloat(iSport)) {
          case 1:
            bikeBtn.src="images/bikeDown.png";
            runBtn.src="images/runUp.png";
            swimBtn.src="images/swimUp.png";
            break;
          case 2:
            bikeBtn.src="images/bikeUp.png";
            runBtn.src="images/runDown.png";
            swimBtn.src="images/swimUp.png";
            break;
          case 3:
            bikeBtn.src="images/bikeUp.png";
            runBtn.src="images/runUp.png";
            swimBtn.src="images/swimDown.png";
            break;
      }
  }
  else {
      if (iSport == MAP_Bike){bikeBtn.src="images/bikeDown.png";}
      if (iSport == MAP_Run){runBtn.src="images/runDown.png";}
      if (iSport == MAP_Swim){swimBtn.src="images/swimDown.png";}
  }
   return true;
}

//
function createDistMarker(point, leg, dist) {
  var icon = new GIcon();
  var opts= new Object();
  var sport =   MAP_Sports[leg.sport]
  icon = gicons[sport.toLowerCase()+dist];
  opts.icon = icon;
  opts.draggable = false;
  opts.bouncy = false;

  var marker = new GMarker(point,opts);
  return marker;
}

function setMemberGeoCode(){
 var url = "map-memberlocation.asp"
 var pars = '?lat=' + this.lat + '&lng=' + this.lng +'&zoom=' + this.zoom
 var request = new Ajax.Request(
            url,
            {
                method: 'get',
                parameters: pars
            });
}

function setRecenter(){
  var btnImg = $('reCenter')
    if (btnImg.value === "false") {
      btnImg.value = "true";
      btnImg.src = 'images/recenterDown.gif';
     }
     else {
      btnImg.value = "false";
      btnImg.src = 'images/recenterUp.gif';
     }

}

function reCenter (point){
    var reCenterCk = $('reCenter').value
    if (reCenterCk === "true") {
      map.setCenter(point, map.getZoom())
    }
}

function getElevation(marker,dragging, reset){
  var elevation;

  var url;
  var urlStart =  "map-getElevation.asp?";
  var yValueStr = "Y_Value=" + marker.getPoint().lat();
  var xValueStr = "X_Value=" + marker.getPoint().lng()

  url = urlStart + xValueStr
  url = url + "&" + yValueStr

  if (elevSvcUp){
        new Ajax.Request(url,{
      method:'get',
      onSuccess: function(request){
        if(dragging){
            subtractClimb(marker);
        }
        var resp = GXml.parse(request.responseText);
        elevation = resp.documentElement.childNodes[0].nodeValue
        var elevFt = elevation;
        elevation *= 0.3048
        addElevation(elevation,marker);         
        if (marker.markerId>0){
          setClimbingDisplay(legs[marker.legId])
        }
        if(dragging || reset) {         
            if (marker.markerId < legs[marker.legId].markers.length-1) {
                getElevation(legs[marker.legId].markers[marker.markerId+1],dragging,reset)
          }
          else{
                hideStatusMsg();
          }       
        }
            chartElevation()
      },
      onFailure: function(request){
          elevSvcUp = false;
          noElevMessage();
        addElevation(0,marker);
      }
      })
  }
   else {
       addElevation(0,marker);
       if (legs[marker.legId].markers.length >1){
        setClimbingDisplay(legs[marker.legId])
      }
  }
}

function resetElevation() {
  if (elevSvcUp){
  var message = "Resetting Elevation Data..."
  showStatusMsg(message);

    totalClimb = 0;
      legs.each(function(leg){
        leg.climb = 0;
//        leg.markers.each(function(marker){
          getElevation(leg.markers[0],false,true);
//        });        
      });	  
  }
  else {
    alert('The elevation service is currently unavailable.')
  }
}

function addElevation(elevation,marker){
  var elev
    if(isNaN(elevation)){
      elev = 0;
    }else if (marker.markerId > 0 && elevation < -999 ){
      elev = Math.max(legs[marker.legId].markers[marker.markerId-1].elevation,0)
    }else if (marker.markerId == 0 && elevation < -999 ){
      elev = Math.max(legs[marker.legId].markers[marker.markerId-1].elevation,0)
    }else {
      elev = Number(elevation);
    }
    legs[marker.legId].markers[marker.markerId].elevation = elev
    addClimb(marker)
    marker.createElevTip();
}

function addClimb(marker){
    var climb = 0;
    var prevElev = 0;
    lId = marker.legId
    mId = marker.markerId
    var elev = legs[lId].markers[mId].elevation
    if (marker.markerId > 0){
      prevElev = legs[lId].markers[mId-1].elevation//elevation data is in meters
      legs[lId].markers[mId].elevDelta = Math.round((elev - prevElev),2);
      climb = Math.max(0,legs[lId].markers[mId].elevDelta * MK_Feet) //climbing data is in feet
    }
    else{
      climb = 0;
    }
    if(climb >= 0) {
      if (marker.markerId > 0){
        legs[marker.legId].markers[marker.markerId].climb = legs[marker.legId].markers[marker.markerId-1].climb + climb;
      }
      legs[marker.legId].climb += climb;
      totalClimb += climb;  
  }
}

function setDistanceDisplay(leg){
    var iSport;

    iSport = distSport(leg.sport);
    displayDist = distInUnits(totalDistance, iSport);
    setOverallDistanceDisplay(displayDist);
    if (currLegId>0) {
      setLegDistanceDisplay(leg,iSport);
    }
 return true;
}

function distSport(sport){
    if (sport == MAP_Swim && legs.length > 1){
      return 2;
    }
    else {
      return sport;
    }
}


function setOverallDistanceDisplay(displayDist){
    var distBoxEng;
    var distBoxMetric;

    $("dist_eng_0").innerHTML = displayDist["english"];
    $("dist_metric_0").innerHTML  = displayDist["metric"];
}

function setLegDistanceDisplay(leg,iSport){
      var rowNum = leg.legId+1;
      var displayDist;

      displayDist = distInUnits(leg.distance, leg.sport);
      $("dist_eng_" + rowNum).innerHTML = displayDist["english"];;
      $("dist_metric_" + rowNum).innerHTML = displayDist["metric"];
}

function setLegElevDisplay(leg,iSport){
      var rowNum = leg.legId+1;
      var displayElev;

      displayElev = elevInUnits(leg.climb, leg.sport);
      $("elev_eng_" + rowNum).innerHTML = displayElev["english"];
      $("elev_metric_" + rowNum).innerHTML = displayElev["metric"];
}

function setClimbingDisplay(leg){
    var elevSport;

    elevSport = leg.sport;
    displayElev = elevInUnits(totalClimb, elevSport);
    setOverallElevDisplay(displayElev);
    if (currLegId>0) {
      setLegElevDisplay(leg,elevSport);
    }
   return true;
 }

 function elevInUnits(elev, elevSport){
  var elevArray = new Array();
  if (isNaN(elev)== true){
        return "Error.";
    } else {
      elevArray["english"] = Number(elev).toFixed(0) + " feet";
      elevArray["metric"] =  Number(elev * .3048).toFixed(1) + " ms";
  }
  return elevArray;
}

function chartElevation(legToChart){
 if (showElevGraph && legs[0]) {
    
    chartXMLCategories= '';
    
    var chartLegStart = 0;
    var chartLegEnd;
    var cdRound;
    
    if(legs.length > 1 && !(isNaN(legToChart))){
        chartYStartDelta = Math.round(legs[legToChart].markers[0].elevation,0)* MK_Feet;
        chartLegStart = legToChart;
        chartLegEnd = legToChart;
        var cdRound = Math.round(legs[legToChart].distance * MK_Feet,0);
    }
    else {
        chartYStartDelta = Math.round(legs[0].markers[0].elevation * MK_Feet,0);
        chartLegEnd = legs.length-1;
        chartLegStart = 0;
        var cdRound = Math.round(totalDistance* MK_Feet,0);
    }
    
      var chartObj = getChartFromId("chart1Id");
        if (chartObj) {
          var chartDist=0;
          var chartXMLData = "";        

          mapDistUnit = Math.round(MK_Miles*MK_Feet,0);
          var mult = 1;
          if (cdRound/mapDistUnit > 20 ){ mult=2};
          if (cdRound/mapDistUnit > 50 ){ mult=5};
          if (cdRound/mapDistUnit > 119 ){ mult=10};

          for(var lId = chartLegStart;lId <= chartLegEnd; lId++){
              chartXMLCategories = "<categories>"
              for(var c=0; c<=cdRound; c=c+10){
                if ((c/mapDistUnit) % mult == 0){
                  chartXMLCategories += "<category label ='" + c/mapDistUnit + "' x='" + c + "' showVerticalLine='1'/>"
                }
              }
              chartXMLCategories += "</categories>"
              chartXMLData += chartXMLDataSetHeader + "lineColor='"+lineColors[legs[lId].sport]+"' >"                       
              if(lId > 0 && chartLegStart < 1) {
                chartDist+=legs[lId-1].distance * MK_Feet;
              }
              
              legs[lId].markers.each( function(mrk,idx) {
                var relElevation = (Math.round((mrk.elevation * MK_Feet)- chartYStartDelta,0) )                 
                chartXMLData += "<set y='" + relElevation + "' x='" + Math.round(chartDist + (mrk.distanceFromLegStart * MK_Feet),0) + "' toolText = '"+ relElevation + "'  /> ";
                });
            chartXMLData += "</dataset>"
          }
          var chartXML = chartXMLHeader + chartXMLCategories + chartXMLData + "</graph>"
          chartObj.setDataXML(chartXML);
        }
    }
}

function  setButtonsState(btnState){
  $("clearMap").disabled=btnState;
  $("undo").disabled=btnState;
  $("outBack").disabled=btnState;
  $("reCenter").disabled=btnState
  return true;
}

function saveRoute(saveAs){
  var str = new String();
  str = "";
  if (currLegId = 0 && legs[0].markers.length < 2){
    alert('Map must have data to save.')
  } else {
    autoZoom(); 
    if (legs.length == 1 && $('saveRouteTbl').rows.length < 10){  
       var x=$('saveRouteTbl').insertRow(2)
       var y=x.insertCell(0)
       var z=x.insertCell(1)       
       y.setAttribute('align', 'left')
       z.setAttribute('align', 'left')     
       y.className = 'messagecellheader2';
       y.innerHTML = "Sport:"

    var sportSel = "<select onchange='changeRouteType(this)' id='changeRouteSel'>"
        sportSel += "<option value='3'"
        if (legs[0].sport == 3) {sportSel += " selected";}
        sportSel += ">Swim</option>"
        sportSel += "<option value='1'"
        if (legs[0].sport == 1) {sportSel += " selected";}
        sportSel += ">Bike</option>"
        sportSel += "<option value='2'"       
        if (legs[0].sport == 2) {sportSel += " selected";}
        sportSel += ">Run</option></select>"
        z.innerHTML = sportSel      

    }

    setButtonsState(true);

    var saveRouteDiv =$("saveRouteDiv");

    saveRouteDiv.style.display="block"
    saveRouteDiv.style.position="absolute"
    saveRouteDiv.style.width="340px";
    saveRouteDiv.style.height="200px";
    saveRouteDiv.style.top="400px";
    saveRouteDiv.style.right="240px";
    saveRouteDiv.style.border.width="2px";
    saveRouteDiv.style.border.color="black";
    saveRouteDiv.style.zIndex = 50000;
        if (saveAs) {
            $("routeID").value = 0
        }

   }
 }
function cancelSaveRoute(){
  setButtonsState(false);
  var saveRouteDiv = $("saveRouteDiv");
  saveRouteDiv.style.display="none"
}

function cancelImportGPX(){
  var importGPXDiv = $("importGPXDiv");
  importGPXDiv.style.display="none"
}

function changeRouteType(thing){
    legs[0].sport = thing.value;
}

//If there's more than 1 leg it's a brick, else it's the sport of the first leg
 function getMapType(){
    if (legs.length > 1){
      return MAP_Brick;
    } else {
      return legs[0].sport
    }
 }

function showImportGPXDiv() {
    //when this is redone, make the the showxxxDiv generic with one CSS for all
    var importDiv =$("importGPXDiv");

       importDiv.style.display="block"
       importDiv.style.position="absolute"
       importDiv.style.width="305px";
       importDiv.style.height="93px";
       importDiv.style.top="400px";
       importDiv.style.right="200px";
       importDiv.style.border.width="2px";
       importDiv.style.border.color="black";
       importDiv.style.backgroundColor = "white";
       importDiv.style.zIndex = 50000;     
    }


function showGarminDiv() {
    var GarminDiv =$("garminDisplay");
       GarminDiv.style.display="block"
}

function hideGarminDiv() {
    var GarminDiv =$("garminDisplay");
    GarminDiv.style.display="none"	
}
 function createGPX(destination){
  var iRouteID;
	var ret = new Array();
  var strXML = "strXML=";
	var str = new String();
  var imgUrl = "&imgUrl=";  

  iRouteID = $('routeID').value 
	strXML += createGPXHeader(destination,iRouteID);
	ret=createGPXroutes();
	strXML+=ret[0];
	imgUrl+=ret[1];
	strXML += createGPXFooter(destination);
	str=strXML+imgUrl
	sendRouteToDb(str);
}

function  createGPXHeader(destination,routeId){
  var mapOwner = $('routeOwner').value
  var mapName = $F("routeName");
  var mapDesc = $F("routeDescr")
  var mapCity = $F("LNK_r_city");
  var mapState = $F("LNK_r_state");
  var mapCountry = $F("LNK_r_country");
  var mapPrivate = $("privateRoute").checked;
  var mapIsRace = $("isRace").checked;
  var mapType = getMapType();
  var gMapType = map.getCurrentMapType().getName();
  var mCenter = map.getCenter()
  var hdr="";

  if (destination == GPX_File) {
    hdr += '<?xml version="1.0"?>' +
    '<gpx version="1.1"' +
    ' creator="BeginnerTriathlete Route Creator - http://www.beginnertriathlete.com"' +
    ' xmlns="http://www.topografix.com/GPX/1/1"' +
    ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
    ' xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">'
  }

  hdr += '<gpx><name>'+ escape(mapName) + '</name>' +
  ' <desc>'+ escape(mapDesc) + '</desc>' +
  ' <type>'+ mapType +'</type> ' + //tags?
  ' <bounds>'+map.getBounds()+'</bounds>' +
  ' <time></time>'  +
    '<url> www.beginnertriathlete.com/discussion/training/routes.asp?'+routeId + '</url> ' +
    '<urlname> BeginnerTriathelete.com route - '+ escape(mapName) + '</urlname>'  +
    '<city>' + escape(mapCity) +  '</city>'+
    '<state>' + escape(mapState) +  '</state>'+
    '<country>' + escape(mapCountry) +  '</country>'+
    '<routeid>' + routeId +  '</routeid>'+
    '<distance>' + escape(totalDistance) +  '</distance>'+
    '<climb>' + totalClimb.toFixed(2) + '</climb>' +
    '<owner>' + escape(mapOwner) + '</owner>' +
    '<private>' + escape(mapPrivate) + '</private>' +
    '<israce>' + escape(mapIsRace) + '</israce>' +
    '<centerlat>' + mCenter.lat() + '</centerlat>' +
    '<gmaptype>' + escape(gMapType)+ '</gmaptype>' +
    '<centerlng>' + mCenter.lng() + '</centerlng>' +
    '<zoom>' + map.getZoom() + '</zoom>'
  return hdr;
}


function createGPXroutes(){
  var x;
	var ret = new Array();
  var routes = new String();
  var imgUrlPaths = new String();
  // loop through legs[]
  legs.each( function(x,i)  {
    // create a <rte>  for each leg
	imgUrlPaths +='rgb:0x' + lineColors[x.sport].substr(1) +',weight:2'
	routes += '<rte>' +
    '<number>'+ i +'</number>' +
    '<type>'+ x.sport + '</type>' +
    '<distance>'+ x.distance + '</distance>' +
    '<climb>'+ parseFloat(x.climb).toFixed(2) + '</climb>'
		ret=createGPXroutePoints(x)
    routes += ret[0];
		imgUrlPaths+=ret[1];
    routes += '</rte>'
  });  
  return [routes,imgUrlPaths];
}

function createGPXroutePoints(l){
  var rtepts = "";
  var img;
	var path=new String();
	var pathPts=0;
  l.markers.each( function(x,i){
     var y = x.getPoint();
		 var hasDir = false;
     if (x.imgUrl== "undefined"){
        img = 1;
     }
     else {
        img = 0;
     }
		 var lat=y.lat().toFixed(6)
		 var lng=y.lng().toFixed(6)
     rtepts += "<rtept>" +
     "<lat>" + lat +"</lat>" +
     "<lon>" + lng +"</lon>"  +
     "<ele>"+ parseFloat(x.elevation).toFixed(2) +"</ele>"  +
     "<climb>" + parseFloat(x.climb).toFixed(2) +"</climb>"  +
     "<elevDelta>" + x.elevDelta + "</elevDelta>"  +
     "<distFromPrev>" + parseFloat(x.distanceFromPrev).toFixed(2) + " </distFromPrev>";
     if (!x.direct.empty()) {
			rtepts += "<dir>"+ x.direct+ "</dir>";
			hasDir = true;
			} 
     if (!x.place.empty()) {
			rtepts += "<place>"+ x.place+ "</place>";
			hasDir = true	;
			} 
     if (!x.imgUrl.empty()) {
			rtepts += "<imgUrl>"+ x.imgUrl+ "</imgUrl>"
		 }
     rtepts += "</rtept>";
		 if(i===0 || l.markers.length < 51 || (l.markers.length>50 && i===l.markers.length)){
			path += '|' + lat + ',' + lng;
			pathPts++;
			}
			else if(hasDir){
		  path += '|' + lat + ',' + lng;
			pathPts++;
		}
			else if(i%Math.ceil(l.markers.length/50)===0 ){
			if(pathPts===i/Math.ceil(l.markers.length/50)){
				path += '|' + lat + ',' + lng;
				pathPts++;			
				}
			else{
				pathPts = i/Math.ceil(l.markers.length/50)
			}
		 }
		 else{
		 }
   });

   return [rtepts,path]
}

function createGPXFooter(destination){
  var ftr;
  ftr = '</gpx>'
  if (destination = GPX_File){
    ftr += '</xml>'
  }

  return ftr
}

function sendRouteToDb(str){
  var request = GXmlHttp.create();

   var url = "map-save.asp"
   request.open('POST',url, false);
   request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
   request.setRequestHeader('Content-length',str.length);
   request.setRequestHeader("Connection", "close");
    request.onreadystatechange = function() {
      var response=null;
      if((request.readyState == 4)&&(request.status != 200)){
          alert( 'Saving your route failed. We apologise for the inconvenience. Please report this in the Training Log and Site Support forum.');
      }
    }
   request.send(encodeURI(str));
}


function extendRoute(operation,legId,loopToMarker){
  var legSlice = new Array();
  var point;
  var srcMarker;
  var newMarker;

  map.closeInfoWindow()
  if(legId==null){legId = currLegId};
  if(loopToMarker==null){loopToMarker = legs[legId].currMarkerId};

  switch(operation){
    case 'outBack':
      if (!legs[legId].outBackPtNum){
        legSlice = legs[legId].markers.reverse(false);
        legs[legId].outBackPtNum = legs[legId].markers.length*2-1;
      }
      else {
        legSlice = legs[legId].markers.slice(legs[legId].length-legs[legId].outBackPtNum);
        legSlice.reverse(true);
      }
      legSlice.shift(); 
      break;
    case 'loop':
      legSlice = legs[legId].markers.slice(loopToMarker);
      point = new GLatLng(legSlice[0].getPoint().lat()-0.00004,legSlice[0].getPoint().lng()-0.00004);
      //newMarker = createMarker(point, legId);
      //newMarker.elevation = legSlice[0].elevation;
      legSlice.push(legSlice[0]);
      break;
    case 'goHome':
      legSlice = legs[legId].markers.slice(0,loopToMarker+1);
      legSlice.reverse();
      break;
    default:
      return;
  }
  for(var x = 0 ; x < legSlice.length; x++){
    srcMarker = legSlice[x];
    point= new  GLatLng(srcMarker.getPoint().lat()-0.00004,srcMarker.getPoint().lng()-0.00004);
    newMarker= createMarker(point, legId);
    legs[legId].markers.push(newMarker);
    calcDistance(legs[legId].markers[legs[legId].currMarkerId],false);
    newMarker.elevation = legSlice[x].elevation;
    addClimb(newMarker)	
    newMarker.createElevTip();
    legs[legId].mgr.addMarker(newMarker,0,17);
    legs[legId].markers[legs[legId].currMarkerId].drawLineToHere();
    chartElevation()
  }
  loopGoHomeButtons(null);
  setClimbingDisplay(legs[legId])
  distMarkers();
  return;
}


function setOverallElevDisplay(displayElev){
    var elevBoxEng;
    var elevBoxMetric;

    elevBoxEng = $("elev_eng_0");
    elevBoxMetric = $("elev_metric_0");
    elevBoxEng.innerHTML = displayElev["english"];
    elevBoxMetric.innerHTML = displayElev["metric"];
}


function delTempFile(sGUID) {
  var url =  "map-saveFile.asp?action=del&g=" + sGUID;
  GDownloadUrl(url)
}

// Cue Sheet directions
function listDirs (marker){
  var dirString
  if (creating) {
  dirString = '<table ><tbody>'
  dirString +=  '<tr><td class="messagecellheader2" ><b>Direction</b></td><td class="messagecellheader2" ><b>Place</b></td><td></td></tr>'
  dirString += '<tr><td>'
    dirString += '<select id="direction" name="direction" size="1">'
    dirString += '<option></option>'    
  if(marker.markerId == 0){
    dirString +=  '<option value="Start at"'
    if(marker.direct== "Start at"){ dirString += 'selected' }
    dirString += '>Start at</option>'
  }
  else {
  MAP_Dirs.each (function(dir){
    dirString +=  '<option value="'+dir+'"'
    if(marker.direct== dir){ dirString += 'selected' }
    dirString += '>' + dir + '</option>'
    });
    if(marker.markerId == legs[marker.legId].markers.length-1){
    dirString +=  '<option value="End at"'
    if(marker.direct== "End at"){ dirString += 'selected' }
      dirString += '>End at</option>'
    }
  }
  dirString += '</select></td>'
    dirString += '<td><input maxlength="50" id="place" name="place" type="text" value="'+marker.place+'"></td></tr>'
    dirString += '<tr><td colspan="3" align="center"><input type="button"  class="bbsbutton" value="Save" onclick= "saveDirs('+ marker.legId+','+ marker.markerId +')";></td>'
    dirString += '</tr></tbody></table>'
 }
 else {
    dirString = marker.direct+"<br />"+marker.place
 }
return dirString;
}

function saveDirs(legId,markerId){
 legs[legId].markers[markerId].direct = $("direction").value,
 legs[legId].markers[markerId].place = $("place").value;

 setCueNode(legId,markerId);
  map.closeInfoWindow()
}

function setCueNode(lId, mId){
    var cueStr = legs[lId].markers[mId].direct + legs[lId].markers[mId].place
    if(cueStr.length>0 ) {Element.show("CueSheetDiv");}
    

    var imgStr = legs[lId].markers[mId].imgUrl
    if (cueStr.length>0 || imgStr.length > 0 ) {
        legs[lId].markers[mId].setImage( iconPath + "cueNode.png");
    }
    else {
        legs[lId].markers[mId].setImage(gicons["node"+legs[lId].sport]);
    }
}

function createCueSheet(){
  var cuesheetStr =  "<html><title>BeginnerTriathlete.com Cue Sheet</title>";
  cuesheetStr += "<body bgcolor=\"#FFFFFF\">";
  legs.each( function(x,i) {
    if(i>0){
      cuesheetStr += "<DIV style='page-break-before:always'></DIV>";
    }
    cuesheetStr += cueSheetHeader();
    cuesheetStr += cueSheetLeg(x,i);
  });
  cuesheetStr += "<br /><center><a href=javascript:window.close()>close this window</a></center>"
  cuesheetStr += cueSheetFooter();
  var cuesheetWindow =  window.open('','cueShWin','menubar=1,status=1,resizable=1,scrollbars=1,height=480,width=640');
  cuesheetWindow.document.write(cuesheetStr);
  cuesheetWindow.document.close();
}

function cueSheetHeader(){
  var hdrStr = "<table align='center' border='1' cellspacing='0' cellpadding='0' width='90%' >";
  hdrStr += "<tr><td colspan='3' align='center'><img src='/discussion/images/affiliates/0/report.jpg'></td></tr>"
  if(!creating){
    hdrStr += "<tr><td colspan='3' class='messagecellheader2' >"+$F('routeName')+"</td></tr>";
    hdrStr += "<tr><td colspan='3' >"+$F('LNK_r_city')+", "+$F('routeState')+", "+$F('LNK_r_country')+"</td></tr>"
    hdrStr += "<tr><td colspan='3' >"+$F('routeDescr')+"</td></tr>"
  }
  hdrStr += "<tr><td><b>Distance:</b></td><td>"+$('dist_eng_0').innerHTML +"</td><td>" + $('dist_metric_0').innerHTML + "</td></tr>"
  hdrStr += "<tr><td><b>Climbing:</b></td><td>"+$('elev_eng_0').innerHTML +"</td> <td>" + $('elev_metric_0').innerHTML + "</td></tr>"
  hdrStr += "</table>";
  return hdrStr;
}

function cueSheetLeg(x,i){
  var cueDist = 0;
  var cueDistCum = 0;
  var cueClimb = 0;
  var iter = 0;

   var lStr = "<p><table align='center' border='1' cellspacing=0 cellpadding=1 width='90%' >"
  if(legs.length>1){
    i++;
    var deElem = 'dist_eng_' + i;
    var dmElem = 'dist_metric_' + i;
    var ceElem = 'elev_eng_' + i;
    var cmElem = 'elev_metric_' + i;
    var mult = multSportLegs(x.sport,i-1);

    lStr += "<tr><td colspan='6' align='center'><b>"+MAP_Sports[x.sport]+ mult + "</b></td></tr>"
    lStr += "<tr><td><b>Distance:</b></td><td colspan='3'>"+$(deElem).innerHTML +"</td><td colspan='2'>" + $(dmElem).innerHTML + "</td></tr>"
    lStr += "<tr><td><b>Climbing:</b></td><td colspan='3'>"+$(ceElem).innerHTML +"</td> <td colspan='2'>" + $(cmElem).innerHTML + "</td></tr>"
  }
  lStr += "<tr><td></td><td><b>Direction</b></td><td><b>Place</b></td><td><b>Total Dist.</b></td><td><b>Segment Dist.</b></td><td><b>Climbing<b></td></tr>"
  x.markers.each(function(l,m) {
      cueDist = sumDistMarkers(l)
      cueDistCum = l.distanceFromLegStart;
      cueClimb += Math.max(0,l.elevDelta);
    if((l.direct.length + l.place.length)>0){
      printDistCum = distInUnits(cueDistCum, x.sport);
      printDist = distInUnits(cueDist, x.sport);
      pdEc = printDistCum["english"]
      pdMc = printDistCum["metric"]
      pdE = printDist["english"]
      pdM = printDist["metric"]
      peE = (cueClimb * MK_Feet).toFixed(0)
      peM = cueClimb.toFixed(1)
      lStr += "<tr><td>"+ ++iter +"</td>"
      lStr += "<td>"+l.direct+"</td>";
      lStr += "<td>"+l.place+"</td>";
      lStr += "<td>"+pdEc+"<br/>"+pdMc+"</td>"
      lStr += "<td>"+pdE+"<br/>"+pdM+"</td>"
      lStr += "<td>"+peE+" feet<br/>"+peM+" meters</td></tr>"
      cueDist = 0;
      cueClimb = 0;
    }
  });
  lStr += "</table><br /><br />"
  return lStr;
}

//adds the distanceFromPrev of markers until one is found with a direction value
function sumDistMarkers(mrk){
    var totDist = 0;
    var lId = mrk.legId;

    var mId = mrk.markerId;
    totDist = mrk.distanceFromPrev;
    mId--;

    while((mId >= 0) &&(legs[lId].markers[mId].place.length + legs[lId].markers[mId].direct.length == 0)){      
        totDist += legs[lId].markers[mId].distanceFromPrev
        mId--
    }   
    return totDist; 
}

function cueSheetFooter(){
  return ("</body></html>");
}

function multSportLegs(sport,legId){
  legs.each(function(l) {
      if (l.sport == sport && l.sportIter > 1){
        return ' #' + legs[legId].sportIter;
      }
  });
  return '';
}

function infoWindowImage(marker){

    var imgTable = document.createElement("table");
    var tblBody = document.createElement("tbody");
    var imgRow = document.createElement("tr");
    var btnRow = document.createElement("tr");  
    var imgCell = document.createElement("td");
    var btnCell = document.createElement("td");
        
    imgTable.style.width = '200px'
    imgTable.style.align = 'center'
    imgCell.style.align = 'center'
    btnCell.style.align = 'center'
    btnCell.style.height = '20px'
    btnCell.style.width = '100%'

    if (marker.imgUrl.length > 0){
        imgCell.height = '200px'
            var imgUrlStr = '<img src="' + marker.imgUrl +'" height="200" width="200"/>'
            new Insertion.Bottom(imgCell,imgUrlStr);
    }
    if (creating ){
        var btnStr;
        if (marker.imgUrl.length > 0){
            btnStr = '<input type="button"  class="bbsbutton" value="Delete" onclick= "delImgUrl('+ marker.legId+','+ marker.markerId +')";>'
        }
        else {
            btnStr = '<input maxlength="85" id="imgUrlTxt" name="imgUrlTxt" type="text" style="background-color:#FFFFCC;" value="image URL" onfocus="this.value=\'\'"/>'
            btnStr += '<input type="button"  class="bbsbutton" value="Save" onclick= "saveImgUrl('+ marker.legId+','+ marker.markerId+')";>'
        }

        new Insertion.Bottom(btnCell,btnStr);           
    }   

    imgRow.appendChild(imgCell);
    btnRow.appendChild(btnCell);

    tblBody.appendChild(imgRow);
    tblBody.appendChild(btnRow);
    imgTable.appendChild(tblBody);

    return imgTable;
}

function delImgUrl(lId,mId){        
    legs[lId].markers[mId].imgUrl = '';
    setCueNode(lId,mId);
    map.closeInfoWindow();
}

function saveImgUrl(lId,mId){
    legs[lId].markers[mId].imgUrl = $('imgUrlTxt').value;
    setCueNode(lId,mId);

    map.closeInfoWindow();
}



//Find coordinates for value in Location text box and setCenter
//from Mike Williams
  function locate() {
    var geo = new GClientGeocoder(new GGeocodeCache());
    var search = $("locateTextBox").value;
    // ====== Perform the Geocoding ======
    geo.getLatLng(search, function (point)
      {
        // ===== If that was successful, plot the point and centre the map ======
        if (point) {
          map.setCenter(point,13);
          if (!mapUser.bHasAddr) {
            gLat = point.lat();
            gLng = point.lng();
            gZoom = 13;
            mapUser.lat = gLat;
            mapUser.lng = gLng;
            mapUser.zoom = gZoom;
            mapUser.setLocation();
          }
        }
        // ====== Decode the error status ======
        else {
          // ==Look to see if the query was cached ==
          var result=geo.getCache().get(search);
          if (result) {
            var reason="Code "+result.Status.code;
            if (reasons[result.Status.code]) {
              reason = reasons[result.Status.code]
            }
          } else {
            var reason = "";
          }
          alert('Could not find "'+search+ '" ' + reason);
          var  mapCenter = new GLatLng(39.809722, -98.555278)
          map.setCenter(mapCenter,3);
        }
      }
    );
  }

//found at www.livescripts.net
function getQueryVariable(variable) {
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i=0;i<vars.length;i++) {
      var pair = vars[i].split("=");
      if (pair[0].toLowerCase() === variable.toLowerCase()) { return pair[1]; }
  }
  }

function setFollowRoads() {
  var url = "map-saveFlwRds.asp"
  var pars = "?f=" + (($("flwRds").checked == true) ? "1" : "0").toString();
  var request = new Ajax.Request(
          url,
          {
            method: 'get',
            parameters: pars
          });
}
