// jhm_support.js  V4
// Javascript functions and definitions for jhm_ mapping application.
// Part of the JH Map system

// Copyright 2007, 2010, Jeff Hennick jhm_system AT jeff-h.com

// See jhm_inc.php for GPL license details.

// 10/14/09 moved vars WMS_TOPO_MAP WMS_DOQ_MAP out of function so they work with HMapType('Topo');
// 10/16/09 NoParkingMarker.
//  5/11/10 msrmaps.com was terraserver.microsoft.com.
//  8/30/10 Made HRemove recursive to clear all but the map.
//  8/31/10 Made HRemove remove controls.
//  7/11/11 "Removing" for printing so can be restored.

function say(a) {GLog.write(a)}

 var HTrailLists = [];
 var map = '';
 var Hiframe = '';

 var HmapId = 'HmapDiv';
 var HMapTypes = new Array();

 var HPrintMapSize = {h:'', w:''}; // Original map size
 var HRemoved = new Array; // Print formatting   -- old?
 var HPrintHidIds = new Array; // Print formatting
 var HMapConLeft = 0;  // Print formatting
 var HsuperMainHeight; // Print Formatting

 var HToCcontrolDiv; // ToC
 var HPedControlDiv; // Pedometer

 var HNoShowToc = false; // Show TOC by defualt

// var HMapWidth = '400px';
// var HMapHeight = '300px';

 var HFlag = '!';

// var HMapControl = new GLargeMapControl3D();
// var HTypeControl = new GMapTypeControl();

// var HShowSizeControl = 0;
// var HSizeControlV = '';

 var MapFile = "{$_SERVER['PHP_SELF']}";

 var HNumM = new Array;

 var MapProjection = '';

 var HonLoadListB = new Array; // functions to be called onLoad BEFORE the map
 var HonLoadListA = new Array; // functions to be called onLoad AFTER the map
 var HonUnloadList = new Array; // functions to be called onUnLoad

 HonLoadListA[0]= new Function ("HLoadMap()"); // Loads the Google map
 HonUnloadList[0]= new Function ("GUnload()"); // UnLoads the Google map

function HInitUnCheck() {
 if(typeof(document.getElementById('HUTMG')) != 'undefined') document.getElementById('HUTMG').checked = false;
 if(typeof(document.getElementById('HLLG')) != 'undefined') document.getElementById('HLLG').checked = false;
}

HOnLoadJ('HInitUnCheck');


 ////////////////////////////////  API Functions JS ////////////////////

 function HOnLoadJ(n, before) {  // n is the name of a function to be called,
                           // The function will be called AFTER the page is loaded
                           // and the Google Map is displayed.  If before is TRUE, it will be called BEFORE the map
//alert('71 ' + n + ', ' + before);
  var m = (n.indexOf('(') > -1) ? n : n + "()";
  if (before) HonLoadListB[HonLoadListB.length] = new Function (m);
  else HonLoadListA[HonLoadListA.length] = new Function (m);
 }

 function HOnUnload(n) {  // n is the name of a function to be called
  var m = (n.indexOf('(') > -1) ? n : n + "()";
  HonUnloadList[HonUnloadList.length] = new Function (m);
 }


 function HShowCopyrightJ(m) {
  alert(m);
 }

 ////////////////////////////// Data Loading Functions JS ///////////////

 function HMakeTrailInfoJ(info) {
  HTrailInfo = info;
 }

 function HMakeMarkerJ(num,y,x,type,msg){
  if(y!=0) {
   if (!type) type = HInfoMarker;
   var np = new GMarker(new google.maps.Point(x, y),{icon: type, draggable: true, dragCrossMove: false, bouncy: false});
   np.disableDragging();
//   var but = (type == HTrailMarker && HShowDetails !== null && HPedDisp) ? '<br><button onclick=HMakeProf(' + HPrev +')>Profile</button>' : '';
   var but = '';
   if (msg!='') google.maps.Event.addListener(np, "click", function(overlay,point) {if(!HeditTr)HMarkerClick(np,num,msg,but,point)});
   HOverlayList[num] = np;
   google.maps.Event.addListener(np, "mouseover", function(overlay,point) {HMove(num)});
   google.maps.Event.addListener(np, "mouseout", function(overlay,point) {HMouseOutMk(num)});
  }
  HsegNum = num;
 }

 function HMakeSegJ(num,pathpoints,color,opacity,width,info) {
  width = width || 5;
  opacity = opacity || 1;
  var p = HPts(pathpoints);
  if (typeof(p[1][0]) != 'undefined') {
   HWP[num] = p[1];
   HWPId[num] = p[2];
  }
  var p = p[0];
  HOverlayList[num] = new google.maps.Polyline(p, "#" + color,width,opacity);
  google.maps.Event.addListener(HOverlayList[num], "click", function(point) {HTrailClick(point,num,info)})
  google.maps.Event.addListener(HOverlayList[num], "mouseover", function() {}) // gives pointer cursor
  HPrev = num;
  HsegNum = num;
 }

 function HMakePolygonJ(num,pathpoints,color,opacity,width,fillColor,fillOpacity,info) {
return; // testing 4 no polygons
  width = width || 5;
  opacity = opacity || 1;
  var p = HPts(pathpoints);
  if (typeof(p[1][0]) != 'undefined') {
   HWP[num] = p[1];
   HWPId[num] = p[2];
  }
  var p = p[0];
  var len = p.length - 1;
  if (p[0] != p[len-1] || p[1] != p[len]) {  // close the polygon if start and stop not the same, so border goes all around
   p[len+1] = p[0];
   p[len+2] = p[1];
  }
  HOverlayList[num] = new google.maps.Polygon(p, "#" + color,width,opacity,"#" + fillColor,fillOpacity);
////  if (info != '') google.maps.Event.addListener(HOverlayList[num], "click", function(point) {
////    if (HClickProc) map.openInfoWindowHtml(point,'<div style="white-space: nowrap;">' +  info + '<\/div>');
////    else HAddSegPoint(point);
////   })
////  google.maps.Event.addListener(HOverlayList[num], "mouseover", function() {}) // gives pointer cursor
  HPrev = num;
  HsegNum = num;
 }

 function HMakeEncodedSegJ(num,pathpoints,levels,color,opacity,width,info) {
  width = width || 5;
  opacity = opacity || 1;
  color = '#' + color;
  HOverlayList[num] = new google.maps.Polyline.fromEncoded({
   color: color,
   weight: width,
   opacity: opacity,
   points: pathpoints,
   levels: levels,
   zoomFactor: 32,
   numLevels: 4
        });
  google.maps.Event.addListener(HOverlayList[num], "click", function(point) {HTrailClick(point,num,info)})
  google.maps.Event.addListener(HOverlayList[num], "mouseover", function() {}) // gives pointer cursor
  HPrev = num;
  HsegNum = num;
 }

 ////////////////////////////// Internal Functions JS //////////////////

 function HWindowSize(what) {
  // mod from: http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight - 22;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  if (what == 'width') return myWidth;
  else return myHeight;
 }

 function nHWindowSize(where,what) {
  var b = document.getElementsByTagName('body');
  b = b[0];
  b.style.height = '100%';
  var e = document.getElementById(where);
  var p = e.parentNode;
  var myWidth = b.clientWidth;
  var myHeight = b.clientHeight;
//alert('172 ' + myWidth);
  if (what == 'width') return myWidth;
  else return myHeight;
 }

function add_link() {
   var link_div = document.createElement('div');
   link_div.id = 'mytopo_cr';
   link_div.style.fontFamily = 'Arial,sans-serif';
   link_div.style.fontSize = '0.6em';
   link_div.style.marginRight = '1em';
   link_div.style.marginBottom = '2px';
   link_div.innerHTML = '<a href="http://www.mytopo.com/index.cfm">Topo maps provided by MyTopo.com</a>';
  return link_div;
}

 function HLoadMap() {
  var mapdiv = document.getElementById(HmapId);
  if (typeof(HMapWidth) != 'undefined' && HMapWidth != '') mapdiv.style.width = HMapWidth;
  if (HMapHeight.substr(HMapHeight.length -1) == '%') HMapHeight = HWindowSize() * .01 * HMapHeight.substring(0,HMapHeight.length -1) + 'px';
  if (typeof(HMapHeight) != 'undefined' && HMapHeight != '') mapdiv.style.height = HMapHeight;

  var HMTypeIniL = HMTypeIni.toLowerCase();
  if (HMTypeIniL == 'map') HMTypeIni = google.maps.MapTypeId.ROADMAP;
  if (HMTypeIniL == 'terrain') HMTypeIni = google.maps.MapTypeId.TERRAIN;
  if (HMTypeIniL == 'hybrid') HMTypeIni = google.maps.MapTypeId.HYBRID;
  if (HMTypeIniL == 'topo') HMTypeIni = WMS_TOPO_MAP;
  if (HMTypeIniL == 'topo - ms') HMTypeIni = WMS_TOPO_MAP;
  if (HMTypeIniL == 'topo-ms') HMTypeIni = WMS_TOPO_MAP;
  if (HMTypeIniL == 'satellite') HMTypeIni = google.maps.MapTypeId.SATELLITE;


////////////
//
// Thanks to Joseph Elfelt for Google Maps v3 API code: http://www.mappingsupport.com/
//
// MyTopo information:  http://www.mytopo.com/google/index.cfm/

    var mytopo_var = new google.maps.ImageMapType({
      getTileUrl: function(ll, z) {
        return "http://maps.mytopo.com/mytopoz63g9R/tilecache.py/1.0.0/topoG/" + z + "/" + ll.x + "/" + ll.y + ".jpg";
      },
     tileSize: new google.maps.Size(256, 256),
     isPng: true,
     maxZoom: 16,
     minZoom: 7,
     name: "MyTopo",
     alt: "Detailed topographic maps"
    });

    var mstopo_var = new google.maps.ImageMapType({
      getTileUrl: function(ll, z) {
        return WMSGetTileUrl(ll, z);
      },
     tileSize: new google.maps.Size(256, 256),
     isPng: false,
     maxZoom: 20,
     minZoom: 5,
     name: "MSTopo",
     alt: "Detailed MS topographic maps"
    });

    var blank_var = new google.maps.ImageMapType({
      getTileUrl: function(ll, z) {
        return "icons/blank256256.jpg";
      },
     tileSize: new google.maps.Size(256, 256),
     isPng: false,
     maxZoom: 20,
     minZoom: 5,
     name: "Blank",
     alt: "Blank map"
    });
//alert('273: ' + HZoomIni);
    var izoom = (HZoomIni != '') ? parseInt(HZoomIni) : 9;
    var options = {
     center: new google.maps.LatLng(HMCLatIni, HMCLonIni),
     zoom: izoom,
     scaleControl: true,
      mapTypeControlOptions: {
        mapTypeIds: [
          google.maps.MapTypeId.ROADMAP,
          google.maps.MapTypeId.SATELLITE,
          google.maps.MapTypeId.HYBRID,
          google.maps.MapTypeId.TERRAIN,
          'mytopo_id',
          'mstopo_id',
          'blank_id'
        ],
        style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
        position: google.maps.ControlPosition.RIGHT_TOP
      },
      panControl: true,
      panControlOptions: {
          position: google.maps.ControlPosition.LEFT_TOP
      },
      zoomControl: true,
      zoomControlOptions: {
          style: google.maps.ZoomControlStyle.LARGE,
          position: google.maps.ControlPosition.LEFT_TOP
      },
      title: ''
    }

    map = new google.maps.Map(document.getElementById("HmapDiv"), options);

    map.mapTypes.set('mytopo_id', mytopo_var);
    map.mapTypes.set('mstopo_id', mstopo_var);
    if (allow_blank) map.mapTypes.set('blank_id', blank_var);

    switch (HMTypeIni.toLowerCase()) {
      case 'hybrid': map.setMapTypeId(google.maps.MapTypeId.HYBRID); break;
      case 'map': map.setMapTypeId(google.maps.MapTypeId.ROADMAP); break;
      case 'satellite': map.setMapTypeId(google.maps.MapTypeId.SATELLITE); break;
      case 'terrain': map.setMapTypeId(google.maps.MapTypeId.TERRAIN); break;
      case 'topo': map.setMapTypeId('mytopo_id'); break;
      case 'mstopo': map.setMapTypeId('mstopo_id'); break;
      case 'blank': map.setMapTypeId('blank_id'); break;
      default: map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
    }



    // Create a div to hold the ToC control.

    HToCcontrolDiv = document.createElement('IMG');
    HToCcontrolDiv.id='SizeT';
    HToCcontrolDiv.index = -10;
    HToCcontrolDiv.className = 'HopenP';
    if (HNoShowToc) {
     HToCcontrolDiv.src='icons/triangle_right.gif';
     HToCcontrolDiv.title='Show the Table of Contents';
    }
    else {
     HToCcontrolDiv.src='icons/triangle_left.gif';
     HToCcontrolDiv.title='Hide the Table of Contents';
    }

    google.maps.event.addDomListener(HToCcontrolDiv, 'click', function() {
      szTog();
    });
    map.controls[google.maps.ControlPosition.LEFT_TOP].push(HToCcontrolDiv);

        // Create a div to hold the Pedometer control.

    HPedControlDiv = document.createElement('IMG');
    HPedControlDiv.id='SizeP';
    HPedControlDiv.src='icons/triangle_left.gif';
    HPedControlDiv.title='Show Pedometer';
    HPedControlDiv.index = -10;
    HPedControlDiv.className = 'HopenP';

    var toAddress='MapMaster@VictorHikingTrails.Org';
    google.maps.event.addDomListener(HPedControlDiv, 'click', function() {
      HonLoadPed(toAddress);
      HPedTog();
    });
    map.controls[google.maps.ControlPosition.RIGHT_TOP].push(HPedControlDiv);

 function WMSGetTileUrl( tile, zoom ) {
  var MapProjection = map.getProjection();
  var zfactor = 256 / Math.pow(2,zoom);

  var southWestPixel = new google.maps.Point( tile.x * zfactor, ( tile.y + 1 ) * zfactor);
  var northEastPixel = new google.maps.Point( ( tile.x + 1 ) * zfactor, tile.y * zfactor);
//  var northEastPixel = new google.maps.Point( ( tile.x ) * zfactor, tile.y * zfactor);
  var southWestCoords = MapProjection.fromPointToLatLng( southWestPixel );
//  top=proj.fromPointToLatLng(new google.maps.Point(coord.x*256/zfactor,coord.y*256/zfactor));

  var northEastCoords = MapProjection.fromPointToLatLng( northEastPixel );
  var bbox = southWestCoords.lng() + ',' + southWestCoords.lat() + ',' + northEastCoords.lng() + ',' + northEastCoords.lat();
  var u = 'http://msrmaps.com/ogcmap.ashx' + '?VERSION=1.1.1&REQUEST=GetMap&LAYERS=DRG&STYLES=&SRS=EPSG:4326&BBOX=' + bbox + '&WIDTH=256&HEIGHT=256&FORMAT=image/jpeg&BGCOLOR=0xCCCCCC&EXCEPTIONS=INIMAGE';
//  alert(u);
  return u;
 }

///////////////

   google.maps.event.addListener(map, "maptypeid_changed", function() {HmapTypeChanged()});

//   HAddControls();
   HFixCheckBox();
 }

 function HmapTypeChanged() {
   if (map.getMapTypeId() == 'mytopo_id')
       // Now add the MyTopo notice to the map
     map.controls[google.maps.ControlPosition.BOTTOM_RIGHT].push(add_link())
   else {
     var tn = document.getElementById('mytopo_cr');
     if (tn) {
       var pn = tn.parentNode;
       pn.removeChild(tn);
     }
   }
 }

 function HRemove(e) {   //v4

 var idno = 0;
 var ancestors = new Array();
 ancestors[0] = 'HmapDiv';
 var n = document.getElementById('HmapDiv');  // starting div
// var sm = document.getElementById('HsuperMain');
// HsuperMainHeight = sm.style.height;
// sm.style.height = n.style.height;
 while (n.tagName.toUpperCase() != 'HTML') {
  var p = n.parentNode;
  if (p.id == '') {
   for(;;idno++) {
    if (document.getElementById('HpId' + idno) == null) break;
   }
   p.id = 'HpId' + idno;
  }
  ancestors.push(p.id);
  n = p;
 }

 for (var i = 1; i < ancestors.length; i++) {
  p = document.getElementById(ancestors[i]);
  for (var j = 0; j < p.childNodes.length; j++) {
   n = p.childNodes[j];
   if (n.nodeType != 1) continue;
   if (n.id == ancestors[i-1]) continue;
   if (n.id == 'HmapDivCaption') continue;
   if (n.id == 'HProfileDiv') continue;
   if (n.tagName == 'SCRIPT') continue;
   if (n.tagName == 'NOSCRIPT') continue;
   if (n.tagName == 'ID') continue;
   if (!Hjscss('check',n,'HHide')) {
    Hjscss('add',n,'HHide');
    if (n.id == '') {
     for(;;idno++) {
      if (document.getElementById('HpId' + idno) == null) break;
     }
     n.id = 'HpId' + idno;
    }
   }

   HPrintHidIds.push(n.id);
  }
 }
   HMapConLeft = document.getElementById('HMapCon').style.left;
   document.getElementById('HMapCon').style.left = '0';
   e = window.document.body;
   var nel = document.createElement('button');
   nel.setAttribute('id','HprintRestore');
   nel.setAttribute('onclick','HRestore()');
   nel.setAttribute('class','noprint');
   nel.setAttribute('style','position:absolute;top:0;left:' + (document.getElementById('HMapCon').clientWidth + 25) + 'px');
   var t = document.createTextNode('Restore');
   nel.appendChild(t);
   e.appendChild (nel);
 }

 function HRestore() {
  for (var i = 0; i < HPrintHidIds.length; i++) {
   var id = HPrintHidIds[i];
   Hjscss('remove',document.getElementById(id),'HHide');
  }
  var p = window.document.body;
  var e = document.getElementById('HprintRestore');
  p.removeChild(e);
  e = null;
  document.getElementById('HMapCon').style.left = HMapConLeft;
  HsetMapWidth();
 }

 function HPortrait() {
  var cent = map.getCenter();
  if (HPrintMapSize['h'] == '') HPrintMapSize = {h: map.getDiv().style.height, w: map.getDiv().style.width};
  map.getDiv().style.height = '8.74in';
  map.getDiv().style.width = '7in';
  HAdjustHeightForCaption();
  google.maps.event.trigger(map, 'resize');
  map.setCenter(cent);
 }

 function HLandscape() {
  var cent = map.getCenter();
  if (HPrintMapSize['h'] == '') HPrintMapSize = {h: map.getDiv().style.height, w: map.getDiv().style.width};
  map.getDiv().style.height = '6.25in';
  map.getDiv().style.width = '9.5in';
  HAdjustHeightForCaption();
  google.maps.event.trigger(map, 'resize');
  map.setCenter(cent);
 }

 function HDetailSpec() {
  var cent = map.getCenter();
  if (HPrintMapSize['h'] == '') HPrintMapSize = {h: map.getDiv().style.height, w: map.getDiv().style.width};
  map.getDiv().style.height = '500px';
  map.getDiv().style.width = '700px';
  HAdjustHeightForCaption();
  google.maps.event.trigger(map, 'resize');
  map.setCenter(cent);
 }

 function HAdjustHeightForCaption() {
  var cap = document.getElementById('HmapDivCaption');
  if (cap.clientHeight > 0) {
    map.getDiv().style.height = (map.getDiv().clientHeight - cap.clientHeight) + 'px';
    document.getElementById('HMapCon').style.width = map.getDiv().style.width;
  }
 }

 function HNewCaption(t) {
  document.getElementById('HMapCon').style.width = map.getDiv().style.width;
  document.getElementById('HMapCon').style.marginLeft = '0px';
  var tx = t.value;
  var cap = document.getElementById('HmapDivCaption');
  var starth = cap.clientHeight;
  cap.innerHTML = tx;
  var newh = (cap.clientHeight == 0) ? starth : - cap.clientHeight;
  map.getDiv().style.height = (map.getDiv().clientHeight + newh) + 'px';
 }
 var o = ''

 function HshowProfile(page, name) {
  if (!name) name = '';
  openPopup(page, name, 920, 600);
 }

 function HMarkerClick(np,num,msg,but,point) {
  if (HeditTr) HMove(num);
  else if (HClickProc) np.openInfoWindowHtml('<div style="white-space: nowrap;">' +  msg + but + '<\/div>');
    else HAddSegPoint(point);
 }

 function HTrailClick(point,num,info) {
   if (num == 0) {
    HPLine.enableEditing();
    return;
   }
   if (HeditTr) HEdit(num)
   else if (info != '')
    if (HClickProc) map.openInfoWindowHtml(point,'<div style="white-space: nowrap;">' +  info + '<\/div>');
    else HAddSegPoint(point);
 }

function Hsh(sym) {  // Show / Hide group
// var sym = document.getElementById('HE' + n);
 var n = sym.id.substr(2);
 var d = document.getElementById('Hdd' + n).style;
 if (sym.alt == '-') { // showing
  sym.src = 'icons/box+.gif';
  sym.alt = '+';
  d.display = 'none';
 }
 else { // hidden
  sym.src = 'icons/box-.gif';
  sym.alt = '-';
  d.display = 'block';
 }
}

/////////////
// from:  http://www.captain.at/howto-ajax-form-post-request.php

   var Hhttp_request = false;

   function HmakePOSTRequest(url, parameters) {
      Hhttp_request = false;
      if (window.XMLHttpRequest) { // Mozilla, Safari,...
         Hhttp_request = new XMLHttpRequest();
         if (Hhttp_request.overrideMimeType) {
                // set type accordingly to anticipated content type
            //Hhttp_request.overrideMimeType('text/xml');
            Hhttp_request.overrideMimeType('text/html');
         }
      } else if (window.ActiveXObject) { // IE
         try {
            Hhttp_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               Hhttp_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
      }
      if (!Hhttp_request) {
         alert('Cannot create XMLHTTP instance');
         return false;
      }

      Hhttp_request.onreadystatechange = HalertContents;
      Hhttp_request.open('POST', url, true);
      Hhttp_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      Hhttp_request.setRequestHeader("Content-length", parameters.length);
      Hhttp_request.setRequestHeader("Connection", "close");
      Hhttp_request.send(parameters);
   }

   function HalertContents() {
      if (Hhttp_request.readyState == 4) {
         if (Hhttp_request.status == 200) {
//alert('572 : ' + Hhttp_request.responseText);
            result = Hhttp_request.responseText;
            document.getElementById('HEmailResp').style.display = 'block';
            document.getElementById('HMailResponse').innerHTML = result
             + "<br><button onclick=\"document.getElementById('HEmailResp').style.display = 'none';"
             + "document.getElementById('HMailResponse').innerHTML ='';\">OK</button>";
         } else {
            alert('576 : There was a problem with the request.');
         }
      }
   }

   function HAjaxPost(urla,ids) {
      var url = arguments[0];
      var poststr = '';
      for (var i = 1;i < arguments.length; i++) {
        poststr += arguments[i] + '=' + encodeURIComponent(document.getElementById(arguments[i]).value ) + "&";
      }
      poststr += "checkfield=OK";
      HmakePOSTRequest(url, poststr);
   }

// function HAddControls() {
//  map.addControl(HMapControl);
//  map.addControl(HTypeControl);
//  scale = new GScaleControl();
//  scale.printable=function(){return true};
//  map.addControl(scale);

//  if (typeof(HShowSizeControl) != undefined && typeof(HSizeControl) == 'function') {
//   HSizeControlV = new HSizeControl(null, 'icons');
//   map.addControl(HSizeControlV);
//  }
// }

 function HOnLoadList() {
  for (var i=0; i < HonLoadListB.length; i++) {
   HonLoadListB[i]();
  }
  for (var i=0; i < HonLoadListA.length; i++) {
   HonLoadListA[i]();
  }
  if (HNoShowToc) szTog(1);
 }

 window.onload = HOnLoadList;
 window.onunload = HonUnloadList;

 function HFixCheckBox(){ // I don't know why, but Firefox 2 seems to need these when page reloaded after displaying a graph.  Also it moves the check from one trail to the next????
  var b = document.getElementById('HDet');
  if (b) b.checked = 0;
  var b = document.getElementById('HMiles');
  if (b) b.checked = 1;
 }
//hmar = createMarker({"latitude":43.0067, "longitude":-77.4747, "abbr":"Hello!"}); //??????testing
//map.addOverlay(hmar);                                                             //??????

 function createMarker(pointData) {
  var latlng = new google.maps.LatLng(pointData.latitude, pointData.longitude);
//  var icon = new google.maps.Icon();
//  icon.iconAnchor = new google.maps.Point(16, 16);
//  icon.infoWindowAnchor = new google.maps.Point(25, 7);

//  opts = {
//   "icon": icon,
//   "labelText": pointData.abbr,
//   "labelOffset": new google.maps.Size(-16, -16)
//  };
//  var marker = new LabeledMarker(latlng, opts);
  var marker = new google.maps.Marker({
      position: latlng,
      title:pointData.abbr,
      labelText: pointData.abbr,
      labelOffset: new google.maps.Size(-16, -16)
  });


  return marker;
 }

 function Hjscss(action,object,class1,class2) {
  if (object == null) return;
  switch (action){
   case 'swap':
    object.className=!Hjscss('check',object,class1)?object.className.replace(class2,class1): object.className.replace(class1,class2);
   break;
   case 'add':
    if(!Hjscss('check',object,class1)){object.className+=object.className?' '+class1:class1;}
   break;
   case 'remove':
    var rep=object.className.match(' '+class1)?' '+class1:class1;
     object.className=object.className.replace(rep,'');
   break;
   case 'check':
     return new RegExp('\\b'+class1+'\\b').test(object.className)
   break;
  }
 }

////// Trails ////////

var HNNum = 0;
var HOverlayList = [];
var HTrails = [];
var HMarkerMsg = [];
var HOverlayDisplay = [];
var HPoiList = [];
var HTrailInfo = '';
var HLastClickPoint= '';

function HPts(a1,a2) {  // from (string of lat, lon,[waypoint,] ...) or arguments, returns arrays of Gpoints, waypoints, waypoint number to point number
 var r = new Array;
 var p = new Array;
 var wp = new Array;
 var n = new Array;
 var np = 0;
 var nwp = 0;
 if (!a2) {
  a = a1.split(",");
  for(i=0;i<a.length;i++){
   if(isNaN(a[i])) {
    wp[nwp]=np;
    n[nwp] = a[i];
    nwp++;
    continue;
   }
   p[np] = new google.maps.LatLng(parseFloat(a[i]), parseFloat(a[++i]));
   np++;
  }
 }
 else for(i=0;i<arguments.length;i++){
  if(isNaN(arguments[i])) continue;
  p[np] = new google.maps.LatLng(parseFloat(arguments[i]), parseFloat(arguments[++i]));
  np++;
 }
 r[0] = p;
 r[1] = wp;
 r[2] = n;
 return r;
}

function HAddSeg(path,seg,lhtml) {
 lhtml = lhtml || 1;
 var t = '';
 var told = '';
 HFlag = "!";
 for (var i=0;i<path.length;i++) {
  told = t;
  t += '["' + path[i] + '"]';
  f = 'HTrailLists' + t;
  try {
   eval (f  + " += ['" + HFlag + "']")
  }
  catch(e) {
   eval ('HTrailLists' + told + "= []")
   eval (f  + " += ['" + HFlag + "']")
  }
 }
 f[f.length] = seg;
 HTrails[seg] = path[path.length-1];
}

function HAddOverlays(off) {
 if (typeof(off) == 'undefined') off = 1;

 for(var i in HOverlayList){
  HOverlayDisplay[i]=0;
  if(!off) map.addOverlay(HOverlayList[i]);
  if(HMarkerMsg[i])HAddMsg(i);
 }
}

function HShowAll(start) {
 for (var trail in HOverlayList) {
  if (!HOverlayDisplay[trail]) map.addOverlay(HOverlayList[trail]);
  HOverlayDisplay[trail] = 1;
 }

 var c = document.getElementsByName('showt');
 for (var i=0;i<c.length;i++) {
  c.item(i).checked = 1;
 }
 for (var p in HPoiList) {
  if (!HOverlayDisplay[p]) map.addOverlay(HPoiList[p]);
  HOverlayDisplay[p] = 1;
 }
 if (start == 1) {
  for (var i=0;i<c.length;i++) {
   if (c.item(i).className == 'cb_POI') c.item(i).click();
  }
 }
}

////// Markers /////

var HInfoMarker = new google.maps.Marker({
 image : "./icons/marker_i.png",
 shadow : "./icons/shadow50.png",
 transparent : "./icons/marker_transparent.png",
// imageMap : [1,8, 4,4, 1,8, 1,14, 18,4, 20,8, 20,13, 12,24, 8,24, 1,13],
 shape : {
  type: 'poly',
  coord: [1,8, 4,4, 1,8, 1,14, 18,4, 20,8, 20,13, 12,24, 8,24, 1,13]
 },
 iconSize : new google.maps.Size(20, 34),
 shadowSize : new google.maps.Size(37, 34),
 iconAnchor : new google.maps.Point(10, 34),
 infoWindowAnchor : new google.maps.Point(10, 10)
});

var HParkingMarker = new google.maps.Marker({
 image : "./icons/p_green.png",
 shadow : "./icons/p_shadow.png",
 transparent : "./icons/marker_transparent.png",
// imageMap : [1,8, 4,4, 1,8, 1,14, 18,4, 20,8, 20,13, 12,24, 8,24, 1,13],
 shape : {
  type: 'poly',
  coord: [1,8, 4,4, 1,8, 1,14, 18,4, 20,8, 20,13, 12,24, 8,24, 1,13]
 },
 iconSize : new google.maps.Size(20, 20),
 shadowSize : new google.maps.Size(30, 20),
 iconAnchor : new google.maps.Point(10, 20),
 infoWindowAnchor : new google.maps.Point(10, 10)
});

var HNoParkingMarker = new google.maps.Marker({
 image : "./icons/p_green-no.png",
 shadow : "./icons/p_shadow.png",
 transparent : "./icons/marker_transparent.png",
// imageMap : [1,8, 4,4, 1,8, 1,14, 18,4, 20,8, 20,13, 12,24, 8,24, 1,13],
 shape : {
  type: 'poly',
  coord: [1,8, 4,4, 1,8, 1,14, 18,4, 20,8, 20,13, 12,24, 8,24, 1,13]
 },
 iconSize : new google.maps.Size(20, 20),
 shadowSize : new google.maps.Size(30, 20),
 iconAnchor : new google.maps.Point(10, 20),
 infoWindowAnchor : new google.maps.Point(10, 10)
});

var HxMarker = new google.maps.Marker({
 image : "./icons/marker_x_yellow.png",
 iconSize : new google.maps.Size(20, 20),
 iconAnchor : new google.maps.Point(10, 10),
 infoWindowAnchor : new google.maps.Point(10, 10)
});

var HSqMarker = new google.maps.Marker({
 image : "./icons/rmarker_blank.png",
 shadow : "./icons/rmarker_shadow.png",
 transparent : "./icons/rmarker_transparent.png",
// imageMap : [3,1, 27,1, 27,20, 3,20],
 shape : {
  type:'poly',
  coord: [3,1, 27,1, 27,20, 3,20]
 },
 iconSize : new google.maps.Size(28, 28),
 shadowSize : new google.maps.Size(40, 28),
// iconAnchor : new google.maps.Point(10, 34),
 iconAnchor : new google.maps.Point(10, 28),
 infoWindowAnchor : new google.maps.Point(10, 10)
});
/*
function HCreateMarker(name,image,base) {
 if(base == null || base == '') base = "HInfoMarker";
 eval(name + " = new google.maps.Marker({image: './icons/" + image + "', base :" + base + "});");
}
*/
HCreateMarkerJ("HTrailMarker","marker_t.png");
HCreateMarkerJ("HOtherMarker","marker_o.png");
HCreateMarkerJ("HParkMarker","marker_p.png");
HCreateMarkerJ("HSponsorMarker","marker_s.png");
HCreateMarkerJ("HHikeMarker","marker_h.png");
HCreateMarkerJ("HViewMarker","marker_v.png");

HCreateMarkerJ("HBridgeMarker","marker_b.png");
HCreateMarkerJ("HBoardWalkMarker","marker_b_lower.png");
HCreateMarkerJ("HFordMarker","marker_f_lower.png");

HCreateMarkerJ("HParkingMarker","p_green.png",'HParkingMarker');
HCreateMarkerJ("HNoParkingMarker","p_green-no.png",'HNoParkingMarker');

HCreateMarkerJ("HRedXMarker","flat_x_red.png",'HxMarker');
HCreateMarkerJ("HYellowXMarker","flat_x_yellow.png",'HxMarker');

HCreateMarkerJ("HEMarker","iconE.png");
HCreateMarkerJ("HWPMarker","marker_w.png");
HCreateMarkerJ("HQmMarker","marker_qm.png");

HCreateMarkerJ("HStopMarker","marker_stop.png");
HCreateMarkerJ("HCautionMarker","marker_caution.png");

HCreateMarkerJ("HGreenMarker","marker_green.png");

HCreateMarkerJ("HWaterTrailMarker","marker_t_light_blue.png");
HCreateMarkerJ("HLaunchMarker","marker_l_light_blue.png");

HCreateMarkerJ("HCrossMarker","marker_intersection.png");
HCreateMarkerJ("HRightMarker","marker_right.png");
HCreateMarkerJ("HLeftMarker","marker_left.png");
HCreateMarkerJ("HTeeMarker","marker_tee.png");
HCreateMarkerJ("HStraightMarker","marker_straight.png");

////// Numeric Markers /////

// Create a base icon for all of our markers that specifies the
// shadow, icon dimensions, etc.
var baseIcon = new google.maps.Marker({
 shadow : "./icons/shadow50.png",
 transparent : "./icons/marker_transparent.png",
// imageMap : [1,8, 4,4, 1,8, 1,14, 18,4, 20,8, 20,13, 12,24, 8,24, 1,13],
 shape : {
  type:'poly',
  coord: [1,8, 4,4, 1,8, 1,14, 18,4, 20,8, 20,13, 12,24, 8,24, 1,13]
 },
 iconSize : new google.maps.Size(20, 34),
 shadowSize : new google.maps.Size(37, 34),
 iconAnchor : new google.maps.Point(9, 34),
 infoWindowAnchor : new google.maps.Point(9, 2),
 infoShadowAnchor : new google.maps.Point(18, 25)
});

var HLastIndex = -1;

function HCreateNumMarker(point, index, preload) {
  // Create a numbered icon for this point using our icon class
  if (index==='') index = HLastIndex++;
  if (index > 99) {
   if (index % 100 == 0) index = '00'
   else index = index % 100
  }
  if (index > 10) {
   var u = index % 10
   if (u != 0) index = u
  }
  var image = "./icons/icon" + index + ".png";
  var marker;
  if (!preload) {



  var marker = new google.maps.Marker({
      position: point,
      title: "'" + index + "'",
      labelText: index,
      labelOffset: new google.maps.Size(-16, -16),
      icon: image
  });
   HLastIndex = index;
   HNumM[index] = marker;

  }
  else {
   document.getElementById('HPreLoad').src = image
   marker = '';
  }
  return marker;
}

 ///////// PRINT BUTTON ////////
function HPrintShow(){
 Hjscss('remove',document.getElementById("HRemoveMe"),'HHide');
 Hjscss('remove',document.getElementById("HmapDivCaption"),'HHide');
 Hjscss('add',document.getElementById("HPrintB"),'HHide');
// HLandscape();
 HPortrait();
 Hjscss('add',document.getElementById("HPrintIt"),'HSolidBorder');

}
function HPrintHide(){
 var cent = map.getCenter();
 Hjscss('add',document.getElementById("HRemoveMe"),'HHide');
 Hjscss('add',document.getElementById("HmapDivCaption"),'HHide');
 Hjscss('remove',document.getElementById("HPrintB"),'HHide');
 Hjscss('remove',document.getElementById("HPrintIt"),'HSolidBorder');
 map.getDiv().style.height = HPrintMapSize['h'];
 map.getDiv().style.width = HPrintMapSize['w'];
 map.setCenter(cent);
}

