// Copyright 2007-9 NetTempo, Inc.
// http://www.nettempo.com
// All rights reserved.
//
// Portions of this code is based on code provided by the
// Blackpool Community Church Javascript Team
// http://www.commchurch.freeserve.co.uk/   
// http://www.econym.demon.co.uk/googlemaps/
// 
// Portions of this code is based on code from other public domain sources.
//
// $Id: alc-gmap.js,v 1.11 2009/03/04 18:08:57 irvin Exp $
//

var map;
var mgr;
var initlat;
var initlng;
var initzoom;
var inittype;
var request;
var curmgroup;
var initopen;
var lastmgrp;
var gmarkers = [];
var imagesurl;
// Read the data from the following file
var filename;
var icons = new Array();
var notmgrmarkers = new Array();
var noboxclass;
var dirDisclaimer;
var GRusemgr;
var GRtransroute;
var GRbikeroute;
var GRbikemap;
var img;
var gmtypes = new Array();
var bubble = new Array();

function load(filename) {
   if (GBrowserIsCompatible()) {
      imagesurl = "images/";
      preload_images();
      curmgroup = 0;
      if (msieversion() > 0) { noboxclass = "noboxitie"; }
      else                   { noboxclass = "noboxit"; }

      icons[""] = new GIcon(); 
      icons[""].image = "http://www.google.com/mapfiles/marker.png"; 
      icons[""].shadow="http://www.google.com/mapfiles/shadow50.png"; 
      icons[""].iconSize=new GSize(20, 34); 
      icons[""].shadowSize=new GSize(37, 34); 
      icons[""].iconAnchor=new GPoint(9,34); 
      icons[""].infoWindowAnchor=new GPoint(9,2); 
      icons[""].infoShadowAnchor=new GPoint(18,25); 
      icons[""].printImage="http://www.google.com/mapfiles/markerie.gif"; 
      icons[""].mozPrintImage="http://www.google.com/mapfiles/markerff.gif"; 
      icons[""].printShadow="http://www.google.com/mapfiles/dithshadow.gif"; 
      icons[""].transparent="http://www.google.com/mapfiles/markerTransparent.png";
      icons[""].imageMap=[9,0,6,1,4,2,2,4,0,8,0,12,1,14,2,16,5,19,7,23,8,26,9,30,9,34,11,34,11,30,12,26,13,24,14,21,16,18,18,16,20,12,20,8,18,4,16,2,15,1,13,0]; 

      gmtypes["m"] = G_NORMAL_MAP;
      gmtypes["s"] = G_SATELLITE_MAP;
      gmtypes["h"] = G_HYBRID_MAP;
      gmtypes["p"] = G_PHYSICAL_MAP;

      dirDisclaimer = '<div class="dirdisclaim">The services above are provided by external sites. The availability of, and the information provided by, those sites is not in the control of AIDS/LifeCycle&#8482;.</div>';
      initlat = 40.00000;
      initlng = -95.00000;
      initzoom = 4;
      inittype = "m";

      resizeMapDiv();
      map = new GMap2(document.getElementById("map"));
      map.enableDoubleClickZoom();
      map.addMapType(G_PHYSICAL_MAP);
      map.addControl(new GLargeMapControl());
      map.addControl(new GHierarchicalMapTypeControl());
      map.addControl(new GScaleControl());
      map.addControl(new GOverviewMapControl());

      request = GXmlHttp.create();
      request.open("GET", filename+'?noCache='+new Date().getTime(), true);
      request.onreadystatechange = processTabbedXML;
      request.send(null);

      resizeMapDiv();
      map.checkResize();
   }
   else {
      alert("Sorry, the Google Maps API is not compatible with this browser");
   }
}

function get_icon(iconStr, iconheight, iconwidth, 
                  shadowStr, shadowheight, shadowwidth) {
   if ((typeof iconStr == "string") && (iconStr.length > 1) && 
       (!icons[iconStr])) {
      if (iconheight && iconwidth) {
         icons[iconStr] = new GIcon();
         icons[iconStr].iconSize=new GSize(iconheight, iconwidth); 
         icons[iconStr].iconAnchor=new GPoint(Math.round(iconwidth/2), 
                                              Math.round(iconheight/2)); 
         icons[iconStr].imageMap=[0, 0, 0, iconheight, iconwidth, 
                                           iconheight, iconwidth, 0];
      }
      else {
         icons[iconStr] = new GIcon(icons[""]);
      }
      icons[iconStr].image = imagesurl + iconStr + ".png";
      preload_it(icons[iconStr].image, icons[iconStr].iconSize.width, icons[iconStr].iconSize.height);
   }
   else if ((typeof(iconStr)=="undefined") || (iconStr==null) || 
            (iconStr < "A") || (iconStr > "Z")) { 
      iconStr = ""; 
   } 
   else if (!icons[iconStr]) {
      icons[iconStr] = new GIcon(icons[""]);
      icons[iconStr].image = "http://www.google.com/mapfiles/marker"+ iconStr +
                             ".png";
   } 
   if (shadowStr) {
      icons[iconStr].shadow = imagesurl + shadowStr + ".png";
      icons[iconStr].shadowSize = new GSize(shadowheight, shadowwidth);
   }
   return icons[iconStr];
}

// Functions that open directions forms on tabbed info windows
function tohere(i) {
   var tabLabel = 'Directions';
   var numTabs = gmarkers[i].tabs.length;
   var divWidth = numTabs * 88;
   if (divWidth < 300) divWidth = 300;
   var tabHtml = '<div style="width:'+divWidth+'px">'+
                 'Driving Directions: <b>To here</b> - ' + drivefrom(i) +
                 '<form style="display: inline; margin: 0;" action="http://maps.google.com/maps" method="get"" target="_blank">' +
                 '<br />' +
                 '<table border="0">' +
                 '<tr><td>' +
                 '<input type="text" size="40" maxlength="40" name="saddr" id="saddr" value="Start address" class="cleardefault" />' +
                 '</td></tr>' +
                 '<tr><td>' +
                 '<input value="Get Directions" type="submit"/>' +
                 '</td></tr></table>' +
                 '<input type="hidden" name="daddr" value="' + 
                 gmarkers[i].getPoint().lat() + ',' + 
                 gmarkers[i].getPoint().lng() + '(' + 
                 gmarkers[i].name + ', ' + gmarkers[i].addr + ', ' + 
                 gmarkers[i].city + ', ' + gmarkers[i].state + ' ' + 
                 gmarkers[i].zip + ')"/>';
   tabHtml += addtrans(i);
   tabHtml += addbike(i);
   tabHtml += searchnear(i);
   tabHtml += dirDisclaimer + '</div>';

   gmarkers[i].tabs[numTabs-1]= new GInfoWindowTab(tabLabel,tabHtml);
   gmarkers[i].openInfoWindowTabsHtml(gmarkers[i].tabs,{selectedTab:numTabs-1});
   init();
}

function fromhere(i) {
   var tabLabel = 'Directions';
   var numTabs = gmarkers[i].tabs.length;
   var divWidth = numTabs * 88;
   if (divWidth < 300) divWidth = 300;
   var tabHtml = '<div style="width:'+divWidth+'px">' +
                 'Driving Directions: ' + driveto(i) + ' - <b>From here</b>' +
                 '<form style="display: inline; margin: 0;" action="http://maps.google.com/maps" method="get"" target="_blank">' +
                 '<br />' +
                 '<table border="0">' +
                 '<tr><td>' +
                 '<input type="text" size="40" maxlength="40" name="daddr" id="daddr" value="End address" class="cleardefault" /><br />' +
                 '</td></tr>' +
                 '<tr><td>' +
                 '<input value="Get Directions" type="submit"/>' +
                 '</td></tr></table>' +
                 '<input type="hidden" name="saddr" value="' + 
                 gmarkers[i].getPoint().lat() + ',' + 
                 gmarkers[i].getPoint().lng() + "(" + 
                 gmarkers[i].name + ", " + gmarkers[i].addr + ", " + 
                 gmarkers[i].city + ", " + gmarkers[i].state + " " + 
                 gmarkers[i].zip + ")" + 
                 '"/>';
   tabHtml += addtrans(i);
   tabHtml += addbike(i);
   tabHtml += searchnear(i);
   tabHtml += dirDisclaimer + '</div>';

   gmarkers[i].tabs[numTabs-1]= new GInfoWindowTab(tabLabel,tabHtml);
   gmarkers[i].openInfoWindowTabsHtml(gmarkers[i].tabs,{selectedTab:numTabs-1});
   init();
}

function searchnearby(i) {
   var tabLabel = 'Directions';
   var numTabs = gmarkers[i].tabs.length;
   var divWidth = numTabs * 88;
   if (divWidth < 300) divWidth = 300;
   var tabHtml = '<div style="width:'+divWidth+'px">';
   tabHtml += adddrive(i);
   tabHtml += addtrans(i);
   tabHtml += addbike(i);
   tabHtml += '<br /><b>Search Nearby: </b>' +
              '<br />' +
              '<form style="display: inline; margin: 0;" action="http://maps.google.com/maps" method="get"" target="_blank">' +
              '<input type="text" size="25" maxlength="40" name="q" id="q" value="e.g.: &quot;pizza&quot;" class="cleardefault" />' +
              '<input value="Search" type="submit"/>' +
              '<input type="hidden" name="near" value="' + 
                 gmarkers[i].getPoint().lat() + ',' + 
                 gmarkers[i].getPoint().lng() + "(" + 
                 gmarkers[i].name + ", " + gmarkers[i].addr + ", " + 
                 gmarkers[i].city + ", " + gmarkers[i].state + " " + 
                 gmarkers[i].zip + ")" + '"/>' +
              '<input type="hidden" name="z" value="15" />' +
              dirDisclaimer + '</div>';

   gmarkers[i].tabs[numTabs-1]= new GInfoWindowTab(tabLabel,tabHtml);
   gmarkers[i].openInfoWindowTabsHtml(gmarkers[i].tabs,{selectedTab:numTabs-1});
   init();
}

function toheretransit(i) {
   var tabLabel = 'Directions';
   var numTabs = gmarkers[i].tabs.length;
   var divWidth = numTabs * 88;
   if (divWidth < 300) divWidth = 300;
   var tabHtml = '<div style="width:'+divWidth+'px">';
   tabHtml += adddrive(i);
   if (gmarkers[i].transroute == "sf") {
      tabHtml += '<br />Transit Planner: <b>To here</b> - '+transfrom(i) +
                 '<form style="display: inline; margin: 0;" action="http://maps.google.com/maps" method="get"" target="_blank">' +
                 '<br />' +
                 '<table border="0">' +
                 '<tr><td>' +
                 '<input type="text" size="40" maxlength="40" name="saddr" id="saddr" value="Start address" class="cleardefault" />' +
                 '</td></tr>' +
                 '<tr><td>' +
                 '<table border="0" style="display: inline; margin: 0;">' +
                 '<tr><td colspan="2"><font size="-2">' +
                 '&nbsp;When:&nbsp;</font></td>' +
                 '<tr><td style="padding: 0" valign=BOTTOM>' +
                 '&nbsp;<input type="radio" name="ttype" value="dep" CHECKED>' +
                 '</td>' +
                 '<td style="padding: 0" VALIGN=MIDDLE><font size="-2">' +
                 'Leave at&nbsp;</font></td>' + 
                 '<td style="padding: 0" valign=MIDDLE rowspan="2">' +
                 '<input type="text" size="10" maxlength="10" name="date" value="'+getCurDate()+'" />' +
                 '<font size="-2"> at </font>' +
                 '<input type="text" size="7" maxlength="7" name="time" value="'+getCurTime()+'" />' +
                 '</td>' +
                 '<td style="padding: 0" valign=MIDDLE>' +
                 '<tr><td style="padding: 0" valign=MIDDLE>&nbsp;' +
                 '<input type="radio" name="ttype" value="arr"></td>' +
                 '<td style="padding: 0" valign=MIDDLE>' +
                 '<font size="-2">Arrive by&nbsp;</font></td>' +
                 '</table>' +
                 '<tr><td>' +
                 '<input value="Get Itinerary" type="submit"/>' +
                 '</td></tr></table>' +
                 '<input type="hidden" name="dirflg" value="r">' +
                 '<input type="hidden" name="daddr" value="' + 
                 gmarkers[i].getPoint().lat() + ',' + 
                 gmarkers[i].getPoint().lng() + '(' + 
                 gmarkers[i].name + ', ' + gmarkers[i].addr + ', ' + 
                 gmarkers[i].city + ', ' + gmarkers[i].state + ' ' + 
                 gmarkers[i].zip + ')"/>';
   }
   else if (gmarkers[i].transroute == "la") {
      tabHtml += '<br />Transit Planner: <b>To here</b> - '+transfrom(i) +
              '<form style="display: inline; margin: 0;" action="http://socaltransport.org/tm_pub_start.php" method="get" target="_blank">' +
              '<table border="0">' +
              '<tr><td>' +
              '<input type="text" size="40" maxlength="40" name="place0" id="place0" value="Start address" class="cleardefault" />' +
              '<br /><font size="-2" color="#C0C0C0">' +
              'e.g.: 101 Main St, 1st/Spring, or Union Station<br />' +
              '(Separate streets in intersection with "/")</font></td>'+
              '</tr></table>' +
              '<table border="0" style="display: inline; margin: 0;">' +
              '<tr><td colspan="2"><font size="-2">' +
              '&nbsp;When:&nbsp;</font></td>' +
              '<td style="padding: 0" valign=MIDDLE rowspan="2">' +
              '<font size="-2">' +
              '<select name="day0" size="-2" STYLE="font-size : 7pt">' +
                 '<option value="Today" selected>Today</option>' +
                 '<option value="SUN">Sunday</option>' +
                 '<option value="MON">Monday</option>' +
                 '<option value="TUE">Tuesday</option>' +
                 '<option value="WED">Wednesday</option>' +
                 '<option value="THU">Thursday</option>' +
                 '<option value="FRI">Friday</option>' +
                 '<option value="SAT">Saturday</option>' +
                 '<option value="SUN">Holiday</option>' +
              '</select></font></td></tr>' +
              '<tr><td style="padding: 0" colspan="2">' +
              '<font size="-2" color="#C0C0C0">' +
              '&nbsp;(optional)</font></td></tr>' +
              '<tr><td style="padding: 0" valign=BOTTOM>' +
              '&nbsp;<input type="radio" name="timecrit0" value="LV">' +
              '</td>' +
              '<td style="padding: 0" VALIGN=MIDDLE><font size="-2">' +
              'Leave at&nbsp;</font></td>' + 
              '<td style="padding: 0" valign=MIDDLE rowspan="2">' +
              '<input type="text" size="2" maxlength="2" name="hour0" value="hh" class="cleardefault" />:' +
              '<input type="text" size="2" maxlength="2" name="min0" value="mm" class="cleardefault" />' +
              '</td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<input type="radio" name="ampm0" value="A"></td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<font size="-2">AM </font></td></tr>' +
              '<tr><td style="padding: 0" valign=MIDDLE>&nbsp;' +
              '<input type="radio" name="timecrit0" value="AR"></td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<font size="-2">Arrive by&nbsp;</font></td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<input type="radio" name="ampm0" value="P"></td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<font size="-2">PM</font></td></tr>' +
              '</table>' +
              '</font><br />' +
              '<input value="Get Itinerary" name="evaluateButton" id="evaluateButton" type="submit"/>' +
              '<input type="hidden" name="place1" value="' + 
                 (gmarkers[i].addr).replace(/&/,"/") + 
                 ', ' + gmarkers[i].city + ',' + gmarkers[i].zip +
              '"/>' + 
              '<input type="hidden" name="name" value="trip">' +
              '<input type="hidden" name="format" value="TABLETEXT">' +
              '<input type="hidden" name="fare" value="RG">' +
              '</form><br />';
   }
   tabHtml += addbike(i);
   tabHtml += searchnear(i);
   tabHtml += dirDisclaimer + '</div>';

   gmarkers[i].tabs[numTabs-1]= new GInfoWindowTab(tabLabel,tabHtml);
   gmarkers[i].openInfoWindowTabsHtml(gmarkers[i].tabs,{selectedTab:numTabs-1});
   init();
}

function fromheretransit(i) {
   var tabLabel = 'Directions';
   var numTabs = gmarkers[i].tabs.length;
   var divWidth = numTabs * 88;
   if (divWidth < 300) divWidth = 300;
   var tabHtml = '<div style="width:'+divWidth+'px">';
   tabHtml += adddrive(i);
   if (gmarkers[i].transroute == "sf") {
      tabHtml += '<br />Transit Planner: '+transto(i)+' - <b>From here</b>' +
                 '<form style="display: inline; margin: 0;" action="http://maps.google.com/maps" method="get"" target="_blank">' +
                 '<br />' +
                 '<table border="0">' +
                 '<tr><td>' +
                 '<input type="text" size="40" maxlength="40" name="daddr" id="daddr" value="End address" class="cleardefault" />' +
                 '</td></tr>' +
                 '<tr><td>' +
                 '<table border="0" style="display: inline; margin: 0;">' +
                 '<tr><td colspan="2"><font size="-2">' +
                 '&nbsp;When:&nbsp;</font></td>' +
                 '<tr><td style="padding: 0" valign=BOTTOM>' +
                 '&nbsp;<input type="radio" name="ttype" value="dep" CHECKED>' +
                 '</td>' +
                 '<td style="padding: 0" VALIGN=MIDDLE><font size="-2">' +
                 'Leave at&nbsp;</font></td>' + 
                 '<td style="padding: 0" valign=MIDDLE rowspan="2">' +
                 '<input type="text" size="10" maxlength="10" name="date" value="'+getCurDate()+'" />' +
                 '<font size="-2"> at </font>' +
                 '<input type="text" size="7" maxlength="7" name="time" value="'+getCurTime()+'" />' +
                 '</td>' +
                 '<td style="padding: 0" valign=MIDDLE>' +
                 '<tr><td style="padding: 0" valign=MIDDLE>&nbsp;' +
                 '<input type="radio" name="ttype" value="arr"></td>' +
                 '<td style="padding: 0" valign=MIDDLE>' +
                 '<font size="-2">Arrive by&nbsp;</font></td>' +
                 '</table>' +
                 '<tr><td>' +
                 '<input value="Get Itinerary" type="submit"/>' +
                 '</td></tr></table>' +
                 '<input type="hidden" name="dirflg" value="r">' +
                 '<input type="hidden" name="saddr" value="' + 
                 gmarkers[i].getPoint().lat() + ',' + 
                 gmarkers[i].getPoint().lng() + '(' + 
                 gmarkers[i].name + ', ' + gmarkers[i].addr + ', ' + 
                 gmarkers[i].city + ', ' + gmarkers[i].state + ' ' + 
                 gmarkers[i].zip + ')"/>';
   }
   else if (gmarkers[i].transroute == "la") {
      tabHtml += '<br />Transit Planner: ' + transto(i) + 
              ' - <b>From here</b>' +
              '<form style="display: inline; margin: 0;" action="http://socaltransport.org/tm_pub_start.php" method="get" target="_blank">' +
              '<table border="0">' +
              '<tr><td>' +
              '<input type="text" size="40" maxlength="40" name="place1" id="place1" value="End address" class="cleardefault" />' +
              '<br /><font size="-2" color="#C0C0C0">' +
              'e.g.: 101 Main St, 1st/Spring, or Union Station<br />' +
              '(Separate streets in intersection with "/")</font></td>' +
              '</tr></table>' +
              '<table border="0" style="display: inline; margin: 0;"tr>' +
              '<td colspan="2"><font size="-2">' +
              '&nbsp;When:&nbsp;</font></td>' +
              '<td style="padding: 0" valign=MIDDLE rowspan="2">' +
              '<font size="-2">' +
              '<select name="day0" size="-2" STYLE="font-size : 7pt">' +
                 '<option value="Today" selected>Today</option>' +
                 '<option value="SUN">Sunday</option>' +
                 '<option value="MON">Monday</option>' +
                 '<option value="TUE">Tuesday</option>' +
                 '<option value="WED">Wednesday</option>' +
                 '<option value="THU">Thursday</option>' +
                 '<option value="FRI">Friday</option>' +
                 '<option value="SAT">Saturday</option>' +
                 '<option value="SUN">Holiday</option>' +
              '</select></font></td></tr>' +
              '<tr><td style="padding: 0" colspan="2">' +
              '<font size="-2" color="#C0C0C0">&nbsp;(optional)</font>' +
              '</td></tr>' +
              '<tr><td style="padding: 0" valign=BOTTOM>&nbsp;' +
              '<input type="radio" name="timecrit0" value="LV"></td>' +
              '<td style="padding: 0" VALIGN=MIDDLE>' +
              '<font size="-2">Leave at&nbsp;</font></td>' + 
              '<td style="padding: 0" valign=MIDDLE rowspan="2">' +
              '<input type="text" size="2" maxlength="2" name="hour0" value="hh" class="cleardefault" />:' +
              '<input type="text" size="2" maxlength="2" name="min0" value="mm" class="cleardefault" /></td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<input type="radio" name="ampm0" value="A"></td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<font size="-2">AM </font></td></tr>' +
              '<tr><td style="padding: 0" valign=MIDDLE>&nbsp;' +
              '<input type="radio" name="timecrit0" value="AR"></td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<font size="-2">Arrive by&nbsp;</font></td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<input type="radio" name="ampm0" value="P"></td>' +
              '<td style="padding: 0" valign=MIDDLE>' +
              '<font size="-2">PM</font></td></tr></table><br />' +
              '<input value="Get Itinerary" name="evaluateButton" id="evaluateButton" type="submit"/>' +
              '<input type="hidden" name="place0" value="' + 
                 (gmarkers[i].addr).replace(/&/,"/") + 
                 ', ' + gmarkers[i].city + ',' + gmarkers[i].zip +
              '"/>' + 
              '<input type="hidden" name="name" value="trip">' +
              '<input type="hidden" name="format" value="TABLETEXT">' +
              '<input type="hidden" name="fare" value="RG">' +
              '</form><br />';
   }
   tabHtml += addbike(i);
   tabHtml += searchnear(i);
   tabHtml += dirDisclaimer + '</div>';

   gmarkers[i].tabs[numTabs-1]= new GInfoWindowTab(tabLabel,tabHtml);
   gmarkers[i].openInfoWindowTabsHtml(gmarkers[i].tabs,{selectedTab:numTabs-1});
   init();
}

function toherebike(i) {
   var tabLabel = 'Directions';
   var numTabs = gmarkers[i].tabs.length;
   var divWidth = numTabs * 88;
   if (divWidth < 300) divWidth = 300;
   var tabHtml = '<div style="width:'+divWidth+'px">';
   tabHtml += adddrive(i);
   tabHtml += addtrans(i);
   if (gmarkers[i].bikeroute == "sf") {
      tabHtml += '<br />Bike Route: <b>To here</b> - ' + 
           bikefrom(i);
      if (gmarkers[i].bikemap) {
         tabHtml += ' - ' + gmarkers[i].bikemap;
      }
      tabHtml += '<br />' +
           '<form style="display: inline; margin: 0;" id="LocationForm" action="http://bikemapper.mtc.ca.gov/BikeMapper/BikeRouteMap" method="post" target="_blank">' +
           '<input type="hidden" name="cmd" value="geocode">' +
           '<input type="hidden" name="mw" value="1200">' +
           '<input type="hidden" name="mh" value="840">' +
           '<table border="0">' +
           '<tr><td>' +
           '<INPUT type="text" size="20" maxlength="40" id="staddr" name="fs" value="Start address" class="cleardefault" />' +
           '</td><td>' +
           '<INPUT type="text" size="15" maxlength="40" id="stcity" name="fc" value="City" class="cleardefault" />' +
           '</td></tr>';
      if (isnull(gmarkers[i].bms)) {
         tabHtml += 
           '<INPUT type="hidden" id="deaddr" name="ts" value="' + gmarkers[i].addr + '">';
      }
      else {
         tabHtml += 
           '<INPUT type="hidden" id="deaddr" name="ts" value="' + gmarkers[i].bms + '">';
      }
         tabHtml += 
           '<INPUT type="hidden" id="decity" name="tc" value="' + gmarkers[i].city + '">' +
           '<tr><td colspan="2">' +
           '<input type="submit" value="Get Bike Route" ID="GoButton" NAME="GoButton">' +
           '</td></tr></table>' +
           '</form>';
        }
   else if (gmarkers[i].bikeroute == "la") {
     tabHtml += '<br />Bike Route: <b>To here</b> - ' + 
           bikefrom(i);
     if (gmarkers[i].bikemap) {
       tabHtml += ' - ' + gmarkers[i].bikemap;
     }
     tabHtml += '<br />' +
           '<form style="display: inline; margin: 0;" name="thisForm" action="http://www.bikemetro.com/route/getroute.asp" method="post" target="_blank">' +
           '<table border="0">' +
           '<tr><td>' +
           '<INPUT type="text" size="40" maxlength="40" id="txtFromAddress" name="txtFromAddress" value="Start address" class="cleardefault" />' +
           '</td></tr></table>' +
           '<table border="0">' +
           '<tr><td>' +
           '<INPUT type="text" size="20" maxlength="40" id="txtFromCity" name="txtFromCity" value="City" class="cleardefault" />' +
           '</td>' +
           '<INPUT type="hidden" id="txtFromState" name="txtFromState" value="CA">' +
           '<td>' +
           '<INPUT type="text" size="5" maxlength="5" id="txtFromZip" name="txtFromZip" value="Zip" class="cleardefault" />' +
           '</td></tr>' +
           '<INPUT type="hidden" id="txtToAddress" name="txtToAddress" value="' + gmarkers[i].addr + '">' +
           '<INPUT type="hidden" id="txtToCity" name="txtToCity" value="' + gmarkers[i].city + '">' +
           '<INPUT type="hidden" id="txtToState" name="txtToState" value="CA">' +
           '<INPUT type="hidden" id="txtToZip" name="txtToZip" value="' + gmarkers[i].zip + '">' +
           '<input type="hidden" name="hidPick" value="">' +
           '<input type="hidden" name="radHillTolerance" value="4">' +
           '<input type="hidden" name="radExperienceLevel" value="3">' +
           '<input type="hidden" name="radPublicTrans" value="0">' +
           '<tr><td>' +
           '<input type="submit" value="Get Bike Route" ID="GoButton" NAME="GoButton">' +
           '</td><td style="vertical-align: super; font-size: 7pt; color: #C0C0C0;">(Optional)</td></tr></table>' +
           '</form>';
   }
   tabHtml += searchnear(i);
   tabHtml += dirDisclaimer + '</div>';

   gmarkers[i].tabs[numTabs-1]= new GInfoWindowTab(tabLabel,tabHtml);
   gmarkers[i].openInfoWindowTabsHtml(gmarkers[i].tabs,{selectedTab:numTabs-1});
   init();
}

function fromherebike(i) {
   var tabLabel = 'Directions';
   var numTabs = gmarkers[i].tabs.length;
   var divWidth = numTabs * 88;
   if (divWidth < 300) divWidth = 300;
   var tabHtml = '<div style="width:'+divWidth+'px">';
   tabHtml += adddrive(i);
   tabHtml += addtrans(i);
   if (gmarkers[i].bikeroute == "sf") {
      tabHtml += '<br />Bike Route: ' + biketo(i) + 
            ' - <b>From here</b>';
      if (gmarkers[i].bikemap) {
         tabHtml += ' - ' + gmarkers[i].bikemap;
      }
      tabHtml +=  '<br />' +
            '<form style="display: inline; margin: 0;" id="LocationForm" action="http://bikemapper.mtc.ca.gov/BikeMapper/BikeRouteMap" method="post" target="_blank">' +
           '<input type="hidden" name="cmd" value="geocode">' +
           '<input type="hidden" name="mw" value="1200">' +
           '<input type="hidden" name="mh" value="840">' +
           '<table border="0">' +
           '<tr><td>' +
           '<INPUT type="text" size="20" maxlength="40" id="deaddr" name="ts" value="End address: (optional)" class="cleardefault" />' +
           '</td>' +
           '<td>' +
           '<INPUT type="text" size="15" maxlength="40" id="decity" name="tc" value="City: (optional)" class="cleardefault" />' +
           '</td></tr>';
      if (isnull(gmarkers[i].bms)) {
         tabHtml +=  
           '<INPUT type="hidden" id="staddr" name="fs" value="' + gmarkers[i].addr + '">';
      }
      else {
         tabHtml +=  
           '<INPUT type="hidden" id="staddr" name="fs" value="' + gmarkers[i].bms + '">';
      }
      tabHtml +=  
           '<INPUT type="hidden" id="stcity" name="fc" value="' + gmarkers[i].city + '">' +
           '<tr><td colspan="2">' +
           '<input type="submit" value="Get Bike Route" ID="GoButton" NAME="GoButton"></form>' +
           '</td></tr>' +
           '</table>';
   }
   else if (gmarkers[i].bikeroute == "la") {
      tabHtml += '<br />Bike Route: ' + biketo(i) + 
           ' - <b>From here</b>';
      if (gmarkers[i].bikemap) {
         tabHtml += ' - ' + gmarkers[i].bikemap;
      }
      tabHtml += '<br />' +
           '<form style="display: inline; margin: 0;" name="thisForm" action="http://www.bikemetro.com/route/getroute.asp" method="post" target="_blank">' +
           '<table border="0">' +
           '<tr><td>' +
           '<INPUT type="text" size="40" maxlength="40" id="txtToAddress" name="txtToAddress" value="End address" class="cleardefault" />' +
           '</td></tr></table>' +
           '<table border="0">' +
           '<tr><td>' +
           '<INPUT type="text" size="20" maxlength="40" id="txtToCity" name="txtToCity" value="City" class="cleardefault" />' +
           '</td>' +
           '<INPUT type="hidden" id="txtToState" name="txtToState" value="CA">' +
           '<td>' +
           '<INPUT type="text" size="5" maxlength="5" id="txtToZip" name="txtToZip" value="Zip" class="cleardefault" />' +
           '</td></tr>' +
           '<INPUT type="hidden" id="txtFromAddress" name="txtFromAddress" value="' + gmarkers[i].addr + '">' +
           '<INPUT type="hidden" id="txtFromCity" name="txtFromCity" value="' + gmarkers[i].city + '">' +
           '<INPUT type="hidden" id="txtFromState" name="txtFromState" value="CA">' +
           '<INPUT type="hidden" id="txtFromZip" name="txtFromZip" value="' + gmarkers[i].zip + '">' +
           '<input type="hidden" name="hidPick" value="">' +
           '<input type="hidden" name="radHillTolerance" value="4">' +
           '<input type="hidden" name="radExperienceLevel" value="3">' +
           '<input type="hidden" name="radPublicTrans" value="0">' +
           '<tr><td>' +
           '<input type="submit" value="Get Bike Route" ID="GoButton" NAME="GoButton">' +
           '</td><td style="vertical-align: super; font-size: 7pt; color: #C0C0C0;">(Optional)</td></tr></table>' +
           '</form>';
   }
   tabHtml += searchnear(i);
   tabHtml += dirDisclaimer + '</div>';

   gmarkers[i].tabs[numTabs-1]= new GInfoWindowTab(tabLabel,tabHtml);
   gmarkers[i].openInfoWindowTabsHtml(gmarkers[i].tabs,{selectedTab:numTabs-1});
   init();
}

// ==================================================
// A function to create a tabbed marker and set up the event window
// This version accepts a variable number of tabs, passed in the 
// arrays htmls[] and labels[]
function createTabbedMarker(point,label,sublabel,tabs,icon,iconheight,iconwidth,shadow,shadowheight,shadowwidth,name,addr,city,state,zip,mgrp_num,header,zoomonclick,zoompoint,zoomtype,usemgr,transroute,bikeroute,bikemap,tpx,tpy,tps,bms) {
   var marker;
   if (icon) {
      marker = new GMarker(point,{icon:get_icon(icon,iconheight,iconwidth,shadow,shadowheight,shadowwidth), title:label});
   } else {
      marker = new GMarker(point, {title:label});
   }
   var marker_num = gmarkers.length;
   marker.marker_num = marker_num;
   marker.tabs = tabs;
   marker.name = name;
   marker.icon = icon;
   marker.label = label;
   marker.sublabel = sublabel;
   marker.addr = addr;
   marker.city = city;
   marker.state = state;
   marker.zip = zip;
   marker.mgrp_num = mgrp_num;
   marker.header = header;
   marker.zoomonclick = zoomonclick;
   marker.zoomtype = zoomtype;
   marker.usemgr = usemgr;
   marker.transroute = transroute;
   marker.bikeroute = bikeroute;
   marker.bikemap = bikemap;
   marker.tpx = tpx;
   marker.tpy = tpy;
   marker.tps = tps;
   marker.bms = bms;
   gmarkers[marker_num] = marker;
     
   if (marker.header) {
      GEvent.addListener(gmarkers[marker_num], "click", function() {
         curmgroup = gmarkers[marker_num].mgrp_num;
         nomgrshowhide(gmarkers[marker_num].mgrp_num);
         document.getElementById("sidebar").innerHTML = 
            mksidebar_html(marker_num);
         resizeMapDiv();
         map.setCenter(zoompoint , gmarkers[marker_num].zoomonclick, gmtypes[zoomtype]);
      });
   }
   else {
      GEvent.addListener(gmarkers[marker_num], "click", function() {
         if (!gmarkers[marker_num].usemgr) {
            map.setCenter(zoompoint, gmarkers[marker_num].zoomonclick, gmtypes[gmarkers[marker_num].zoomtype]);
            openMgrInfoWindow(gmarkers[marker_num]);
         }
         else {
            marker.openInfoWindowTabsHtml(gmarkers[marker_num].tabs);
         }
         document.getElementById("sidebar").innerHTML = 
            mksidebar_html(marker_num);
         init();
      });
      GEvent.addListener(gmarkers[marker_num], "dblclick", function() {
         if (gmarkers[marker_num].mgrp_num == 0) {
            map.setCenter(zoompoint , gmarkers[marker_num].zoomonclick, gmtypes[zoomtype]);
         }
         else {
            map.setCenter(zoompoint);
            map.setMapType(gmtypes[zoomtype]);
            map.zoomIn();
         }
      });
   }
   return marker;
}
      
function iseq(i,j,k,l) {
   if (i == j) { return(k); }
   else { return(l); }
}

// This function picks up the click and opens the corresponding info window
function myclick(i) {
   if (isNaN(i)) {
      map.closeInfoWindow();
      map.setCenter(new GLatLng(initlat, initlng), initzoom, gmtypes[inittype]);
      curmgroup = 0;
   }
   else {
      var bounds = map.getBounds();
      var point = gmarkers[i].getPoint();
      if (gmarkers[i].mgrp_num != curmgroup) {
         map.closeInfoWindow();
      }
      curmgroup = gmarkers[i].mgrp_num;
      if (bounds.contains(point) != true) {
         var handle = GEvent.addListener(map, "moveend", function() {
            GEvent.removeListener(handle);
            GEvent.trigger(gmarkers[i], "click");
         });
         map.setCenter(point);
         map.setMapType(gmtypes[gmarkers[i].zoomtype]);
      }
      else {
         GEvent.trigger(gmarkers[i], "click");
      }
   }
   nomgrshowhide(curmgroup);
   document.getElementById("sidebar").innerHTML = mksidebar_html(i);
   resizeMapDiv();
}


function getWindowHeight() {
   if (window.self&&self.innerHeight) {
      return self.innerHeight;
   }
   if (document.documentElement&&document.documentElement.clientHeight) {
      return document.documentElement.clientHeight;
   }
   return 0;
}

function resizeMapDiv() {
   var d=document.getElementById("map");
   var offsetTop=0;
   var minheight=750;
   for (var elem=d; elem!=null; elem=elem.offsetParent) {
      offsetTop+=elem.offsetTop + 30;
   }
   var height=getWindowHeight()-offsetTop;
   if (height < minheight) { height = minheight; }
   if (height>=0) {
      d.style.height=height+"px";
   }
}

function processTabbedXML() {
   if (request.readyState == 4) {
      if ((request.status != 200) && (request.status != 304)) {
         alert("XML file not found: "+filename);
         return;
      }
      var xmlDoc = GXml.parse(request.responseText);
      // obtain initilize info
      bubble[0] = GXml.value(xmlDoc.documentElement.getElementsByTagName("bubble")[0]);
      var dirxml = xmlDoc.documentElement.getElementsByTagName("directions")[0];
      if (dirxml) {
         var disc = GXml.value(dirxml.getElementsByTagName("disclaimer")[0]);
         if (disc) {
            dirDisclaimer = '<div class="dirdisclaim">' + disc + '</div>';
         }
      }
      var initview = xmlDoc.documentElement.getElementsByTagName("initview")[0];
      if (initview) {
         var ivlat = parseFloat(initview.getAttribute("lat"));
         if (!isNaN(ivlat)) { initlat = ivlat; }
         var ivlng = parseFloat(initview.getAttribute("lng"));
         if (!isNaN(ivlng)) { initlng = ivlng; }
         var ivzoom = parseInt(initview.getAttribute("zoom"));
         if (!isNaN(ivzoom)) { initzoom = ivzoom; }
         var ivtype = initview.getAttribute("type");
         if (ivtype) { inittype = ivtype; }
      }

      map.setCenter(new GLatLng(initlat, initlng), initzoom, gmtypes[inittype]);
      map.setMapType(gmtypes[inittype]);
      resizeMapDiv();
      map.checkResize();
      mgr = new GMarkerManager(map);
   
      var pline = xmlDoc.documentElement.getElementsByTagName("pline");
      for (var j = 0; j < pline.length; j++) {
         map.addOverlay(new GPolyline.fromEncoded({
            color: pline[j].getAttribute("color"),
            weight: parseInt(pline[j].getAttribute("weight")),
            opacity: parseFloat(pline[j].getAttribute("opacity")),
            points: GXml.value(pline[j].getElementsByTagName("points")[0]),
            levels: GXml.value(pline[j].getElementsByTagName("levels")[0]),
            zoomFactor: parseInt(pline[j].getAttribute("zoomfactor")),
            numLevels:  parseInt(pline[j].getAttribute("numlevels"))
         }));
      }
      // obtain the array of markers and loop through it
      var mgroup = xmlDoc.documentElement.getElementsByTagName("mgroup");
      for (var i=0; i<gmarkers.length; i++) {
         map.removeOverlay(gmarkers[i]);
      }
      
      gmarkers = new Array();
      for (var j = 0; j < mgroup.length; j++) {
         GRusemgr = parseInt(mgroup[j].getAttribute("usemgr"));
         if (isNaN(GRusemgr)) { GRusemgr = 1; }
         GRtransroute = mgroup[j].getAttribute("transroute");
         if (isnull(GRtransroute) || GRtransroute.toLowerCase() == "no") {
            GRtransroute = "";
         }
         GRbikeroute = mgroup[j].getAttribute("bikeroute");
         if (isnull(GRbikeroute) || GRbikeroute.toLowerCase() == "no") {
            GRbikeroute = "";
         }
         GRbikemap = GXml.value(mgroup[j].getElementsByTagName("bikemap")[0]);
         if (isnull(GRbikemap) || GRbikemap.toLowerCase() == "no") {
            GRbikemap = "";
         }
         mgrp_num = j + 1;
         if (parseInt(mgroup[j].getAttribute("initopen")) == 1) {
            curmgroup = mgrp_num;
            var initopen = gmarkers.length;
         }
         bubble[mgrp_num] = GXml.value(mgroup[j].getElementsByTagName("bubble")[0]);
         parseXMLMarker(mgroup[j], 1);
         var markers = mgroup[j].getElementsByTagName("marker");
         for (var i = 0; i < markers.length; i++) {
            parseXMLMarker(markers[i], 0);
         }
      }
// Bike Route was removed from here
      // put the assembled sidebar_html contents into the sidebar div
      document.getElementById("sidebar").innerHTML = mksidebar_html();
      if (curmgroup != 0) { myclick(initopen); }
      resizeMapDiv();
   }
}

function parseXMLMarker(element, header) {
   var marker_num = gmarkers.length;
   var lat = parseFloat(element.getAttribute("lat"));
   var lng = parseFloat(element.getAttribute("lng"));
   var label = element.getAttribute("label");
   var sublabel = element.getAttribute("sublabel");
   var name = element.getAttribute("name");
   var addr = element.getAttribute("addr");
   var city = element.getAttribute("city");
   var state = element.getAttribute("state");
   var zip = element.getAttribute("zip");
   var tpx = element.getAttribute("tpx");
   var tpy = element.getAttribute("tpy");
   var tps = element.getAttribute("tps");
   var bms = element.getAttribute("bms");
   var icon = element.getAttribute("icon");
   var iconheight = parseInt(element.getAttribute("iconheight"));
   var iconwidth = parseInt(element.getAttribute("iconwidth"));
   var shadow = element.getAttribute("shadow");
   var shadowheight = parseInt(element.getAttribute("shadowheight"));
   var shadowwidth = parseInt(element.getAttribute("shadowwidth"));
   var zoomonclick = parseInt(element.getAttribute("zoomonclick"));
   var minzoom = parseInt(element.getAttribute("minzoom"));
   var maxzoom = parseInt(element.getAttribute("maxzoom"));
   var zoomlat = parseFloat(element.getAttribute("zoomlat"));
   var zoomlng = parseFloat(element.getAttribute("zoomlng"));
   var zoomtype = element.getAttribute("zoomtype");
   var usemgr = parseInt(element.getAttribute("usemgr"));
   var transroute = element.getAttribute("transroute");
   var bikeroute = element.getAttribute("bikeroute");
   var bikemap = GXml.value(element.getElementsByTagName("bikemap")[0]);
   
   if (isNaN(lat) || isNaN(lng)) {
      alert("bad point "+marker_num);
      return("");
   }
   if (isNaN(zoomlat) || isNaN(zoomlng)) {
      zoomlat = lat;
      zoomlng = lng;
   }
   if (! zoomonclick) { zoomonclick = 15; }
   if (isNaN(minzoom)) { minzoom = 10; }
   if (isNaN(maxzoom)) { maxzoom = 17; }
   if (isNaN(usemgr)) { usemgr = GRusemgr; }
   if (isnull(transroute)) {
      transroute = GRtransroute;
   }
   if (transroute.toLowerCase() == "no") { 
      transroute = "";
   }
   if (isnull(bikeroute)) {
      bikeroute = GRbikeroute;
   }
   if (isnull(zoomtype)) {
      zoomtype = "m";
   }
   if (bikeroute.toLowerCase() == "no") {
      bikeroute = "";
   }
   if (!bikemap) {
      bikemap = GRbikemap;
   }
   if (bikemap.toLowerCase() == "no") {
      bikemap = "";
   }
   var point = new GLatLng(lat,lng);
   var zoompoint = new GLatLng(zoomlat,zoomlng);
   // get the tab info
   tabInfo = element.getElementsByTagName("tab");
   tabs = new Array();
   if (tabInfo.length > 0) {
      for (var j = 0; j < tabInfo.length; j++) {
         var tabLabel = GXml.value(tabInfo[j].getElementsByTagName("label")[0]);
         var tabHtml = GXml.value(tabInfo[j].getElementsByTagName("contents")[0]);
         if ((j==0) && (tabInfo.length > 2)) {
            tabHtml = '<div style="width:' + tabInfo.length*88 +
                      'px">' + tabHtml + '</div>';
         }
         tabs.push(new GInfoWindowTab(tabLabel,tabHtml));
      }
   } else { 
      var tabLabel = "Nothing";
      var tabHtml = element.getAttribute("html");
      tabs.push(new GInfoWindowTab(tabLabel,tabHtml));
   }      
   if (!element.getAttribute("nodirections") || 
       (element.getAttribute("nodirections").toLowerCase() == "no")) {
      // add directions tab
      var tabLabel = "Directions";
      var divWidth = (tabs.length+1)*88;
      if (divWidth < 300) divWidth = 300;
      var tabHtml = '<div style="width:'+divWidth+'px">';
      tabHtml += adddrive(marker_num);
      tabHtml += addtrans(marker_num, transroute);
      tabHtml += addbike(marker_num, bikeroute, bikemap);
      tabHtml += searchnear(marker_num);
      tabHtml += dirDisclaimer + '</div>';
      tabs.push(new GInfoWindowTab(tabLabel,tabHtml));
   }
   // create the marker
   var marker = createTabbedMarker(point,label,sublabel,tabs,icon,iconheight,iconwidth,shadow,shadowheight,shadowwidth,name,addr,city, state,zip,mgrp_num,header,zoomonclick,zoompoint,zoomtype,usemgr,transroute,bikeroute,bikemap,tpx,tpy,tps,bms);
   if (usemgr) {
      mgr.addMarker(marker, minzoom, maxzoom);
   }
   else {
      notmgrmarkers.push(marker);
   }
   lastmgrp = mgrp_num;
   return(marker);
}
   

function getXMLfile() {
   request = GXmlHttp.create();
   filename = document.MyForm.filename.value
   if (filename.length == 0) { 
      alert("Please enter a filename!");
      return false;
   }

   request.open("GET", filename, true);
   request.onreadystatechange = processTabbedXML;
   request.send(null);
   return false;
}

function driveto(i) {
   return('<a href="javascript:tohere(' + i + ')">To here</a>');
}
function drivefrom(i) {
   return('<a href="javascript:fromhere(' + i + ')">From here</a>');
}
function transto(i) {
   return('<a href="javascript:toheretransit(' + i + ')">To here</a>');
}
function transfrom(i) {
   return('<a href="javascript:fromheretransit(' + i + ')">From here</a>');
}
function biketo(i) {
   return('<a href="javascript:toherebike(' + i + ')">To here</a>');
}
function bikefrom(i) {
   return('<a href="javascript:fromherebike(' + i + ')">From here</a>');
}
function searchnear(i) {
   return('<br /><a href="javascript:searchnearby(' + i + ')">Search Nearby</a>');
}
function adddrive(i) {
   return('Driving Directions: ' + driveto(i) + ' - ' + drivefrom(i) + '<br />');
}
function addtrans(i, j) {
   var tr = "";
   if (gmarkers[i]) { tr = gmarkers[i].transroute; }
   else { tr = j; }
   if (tr) {
      return('<br />Transit Planner: ' + transto(i) + ' - ' + transfrom(i) + '<br />');
   }
   else {
      return('');
   }
}
function addbike(i, j, k) {
   var retval = "";
   var br = "";
   var bm = "";
   if (gmarkers[i]) { br = gmarkers[i].bikeroute; bm = gmarkers[i].bikemap; }
   else { br = j; bm = k; }
   if (br || bm) {
      retval = '<br />Bike Route: ';
      if (br) {
         retval +=  biketo(i) + ' - ' + bikefrom(i);
      }
      if (br && bm) {
         retval += ' - ';
      }
      if (bm) {
         retval += bm;
      }
      retval += '<br />';
   }
   return(retval);
}

function nomgrshowhide(mgrp_num) {
   var nummarkers = notmgrmarkers.length;
   for (var i = 0; i < nummarkers; i++) {
      map.removeOverlay(notmgrmarkers[i]);
      if (notmgrmarkers[i].mgrp_num == mgrp_num) {
         map.addOverlay(notmgrmarkers[i]);
      }
   }
}

function msieversion()
{
   var ua = window.navigator.userAgent
   var msie = ua.indexOf ( "MSIE " )

   if ( msie > 0 )      // If Internet Explorer, return version number
      return parseInt (ua.substring (msie+5, ua.indexOf (".", msie )))
   else                 // If another browser, return 0
      return 0

}

function isnull(val){return(val==null);}

function mksidebar_html(act_marker) {
   var sidebar_html;
   var lastmgrp;
   var intable = 0;

   if (bubble[curmgroup]) {
      sidebar_html = '<TABLE BORDER="0"><TR><TD COLSPAN="2">' +
         '<div class="bubble">' + bubble[curmgroup] + '</div></TD></TR>';
   }
   for (var i = 0; i < gmarkers.length; i++) {
      if (lastmgrp && lastmgrp != gmarkers[i].mgrp_num && intable) {
         sidebar_html += '</table>';
         intable = 0;
      }
      lastmgrp = gmarkers[i].mgrp_num;
      if (!gmarkers[i].header) {
         if (gmarkers[i].mgrp_num == curmgroup) {
            if (act_marker == i) {
               sidebar_html += '<TR class="boxit_active">';
            }
            else {
               sidebar_html += '<TR class="boxit_inactive">';
            }
            sidebar_html += '<TD class="sblabel">';
            if (gmarkers[i].icon) {
               sidebar_html += '<a href="javascript:myclick(' + i + ')">' +
                  '<IMG SRC="' + icons[gmarkers[i].icon].image + 
                  '" BORDER="0" /></a>';
            }
            sidebar_html += '</TD><TD><a href="javascript:myclick(' + i + ')" '+
               'class="sb_label">' + gmarkers[i].label + '</a>';
            if (gmarkers[i].sublabel) {
               sidebar_html += '<a href="javascript:myclick(' + i +
                  ')" class="sb_sublabel">' + '<br />' + 
                  gmarkers[i].sublabel + '</a>';
            }
            sidebar_html += '</TD></TR>';
         }
      }
      else {
         if (curmgroup == 0) {
            sidebar_html += '<TR><TD COLSPAN="2">' +
               '<table class="' + noboxclass + '"><tr>' +
               '<td valign=top width="12px">' +
               '<a href="javascript:myclick(' + i + ')" ' +
               ' class="fbox fmaxbox"></a>' +
               '</td>' +
               '<td valign=top>' +
               '<a href="javascript:myclick(' + i + ')" class="mgrouphead">'+
               gmarkers[i].label + '</a>' +
               '</td></tr></table>' +
               '</TD></TR>';
         }
         else {
            if (curmgroup == gmarkers[i].mgrp_num) {
               sidebar_html += '<table class="boxit"><TR class="mgrouphead">' +
                  '<TD COLSPAN="2">' +
                  '<table class="boxit_internal"><tr>' +
                  '<td valign=top>';
               intable = 1;
            }
            else {
               sidebar_html += '<TR><TD COLSPAN="2">' +
                  '<table class="' + noboxclass + '">' +
                  '<tr><td valign=top width="12px">';
            }
            sidebar_html += '<a href="javascript:myclick(' + 
               iseq(curmgroup,gmarkers[i].mgrp_num,"",i) + ')" ' +
               ' class="fbox ' + 
               iseq(curmgroup,gmarkers[i].mgrp_num,"fminbox","fmaxbox") + 
               '"></a>' +
               '</td> ' +
               '<td valign=top>' +
               '<a href="javascript:myclick(' + i + ')" class="mgrouphead">'+
               gmarkers[i].label + '</a>' +
               '</td></tr></table>' +
               '</TD></TR>';
         }
      }
   }
   sidebar_html += '</TABLE>';
   return(sidebar_html);
}

function preload_images() {
   if (document.images) {
      img = new Array();
      preload_it(imagesurl + "max_dark_blue.gif", 12, 12);
      preload_it(imagesurl + "max_dark_blue_highlight.gif", 12, 12);
      preload_it(imagesurl + "min_dark_blue.gif", 12, 12);
      preload_it(imagesurl + "min_dark_blue_highlight.gif", 12, 12);
      preload_it(imagesurl + "shadow-laglc.png", 61, 40);
      preload_it(imagesurl + "shadow-sfaf_trans.png", 67, 45);
      preload_it(imagesurl + "shadow-alc5_logo.png", 166, 202); 
      preload_it("http://www.google.com/mapfiles/shadow50.png", 37, 34); 
   }
}

function preload_it(imgurl, width, height) {
   var img_num = img.length;
   img[img_num] = new Image(width, height);
   img[img_num].src = imgurl;
}

/* 
 * Cross-browser event handling, by Scott Andrew
 */
function addEvent(element, eventType, lamdaFunction, useCapture) {
    if (element.addEventListener) {
        element.addEventListener(eventType, lamdaFunction, useCapture);
        return true;
    } else if (element.attachEvent) {
        var r = element.attachEvent('on' + eventType, lamdaFunction);
        return r;
    } else {
        return false;
    }
}

/* 
 * Kills an event's propagation and default action
 */
function knackerEvent(eventObject) {
    if (eventObject && eventObject.stopPropagation) {
        eventObject.stopPropagation();
    }
    if (window.event && window.event.cancelBubble ) {
        window.event.cancelBubble = true;
    }
    
    if (eventObject && eventObject.preventDefault) {
        eventObject.preventDefault();
    }
    if (window.event) {
        window.event.returnValue = false;
    }
}

/* 
 * Safari doesn't support canceling events in the standard way, so we must
 * hard-code a return of false for it to work.
 */
function cancelEventSafari() {
    return false;        
}

/* 
 * Cross-browser style extraction, from the JavaScript & DHTML Cookbook
 * <http://www.oreillynet.com/pub/a/javascript/excerpt/JSDHTMLCkbk_chap5/index5.html>
 */
function getElementStyle(elementID, CssStyleProperty) {
    var element = document.getElementById(elementID);
    if (element.currentStyle) {
        return element.currentStyle[toCamelCase(CssStyleProperty)];
    } else if (window.getComputedStyle) {
        var compStyle = window.getComputedStyle(element, '');
        return compStyle.getPropertyValue(CssStyleProperty);
    } else {
        return '';
    }
}

/* 
 * CamelCases CSS property names. Useful in conjunction with 'getElementStyle()'
 * From <http://dhtmlkitchen.com/learn/js/setstyle/index4.jsp>
 */
function toCamelCase(CssProperty) {
    var stringArray = CssProperty.toLowerCase().split('-');
    if (stringArray.length == 1) {
        return stringArray[0];
    }
    var ret = (CssProperty.indexOf("-") == 0)
              ? stringArray[0].charAt(0).toUpperCase() + stringArray[0].substring(1)
              : stringArray[0];
    for (var i = 1; i < stringArray.length; i++) {
        var s = stringArray[i];
        ret += s.charAt(0).toUpperCase() + s.substring(1);
    }
    return ret;
}

/*
 * Disables all 'test' links, that point to the href '#', by Ross Shannon
 */
function disableTestLinks() {
  var pageLinks = document.getElementsByTagName('a');
  for (var i=0; i<pageLinks.length; i++) {
    if (pageLinks[i].href.match(/[^#]#$/)) {
      addEvent(pageLinks[i], 'click', knackerEvent, false);
    }
  }
}

/* 
 * Cookie functions
 */
function createCookie(name, value, days) {
    var expires = '';
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        var expires = '; expires=' + date.toGMTString();
    }
    document.cookie = name + '=' + value + expires + '; path=/';
}

function readCookie(name) {
    var cookieCrumbs = document.cookie.split(';');
    var nameToFind = name + '=';
    for (var i = 0; i < cookieCrumbs.length; i++) {
        var crumb = cookieCrumbs[i];
        while (crumb.charAt(0) == ' ') {
            crumb = crumb.substring(1, crumb.length); /* delete spaces */
        }
        if (crumb.indexOf(nameToFind) == 0) {
            return crumb.substring(nameToFind.length, crumb.length);
        }
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, '', -1);
}

/*
 * Clear Default Text: functions for clearing and replacing default text in
 * <input> elements.
 */

//addEvent(window, 'load', init, false);
function init() {
    var formInputs = document.getElementsByTagName('input');
    for (var i = 0; i < formInputs.length; i++) {
        var theInput = formInputs[i];
        
        if (theInput.type == 'text' && theInput.className.match(/\bcleardefault\b/)) {  
            /* Add event handlers */          
            addEvent(theInput, 'focus', clearDefaultText, false);
            addEvent(theInput, 'blur', replaceDefaultText, false);
            
            /* Save the current value */
            if (theInput.value != '') {
                theInput.defaultText = theInput.value;
            }
            if (theInput.style) {
                theInput.origcssText = theInput.style.cssText;
                theInput.style.cssText += ';color: #C0C0C0;';
                theInput.defaultcssText = theInput.style.cssText;
            }
        }
    }
    var Forms = document.getElementsByTagName('form');
    for (var i = 0; i < Forms.length; i++) {
       var theForm = Forms[i];
       addEvent(theForm, 'submit', clearAllDefaultText, false);
    }
}

function clearAllDefaultText(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;

    var formInputs = target.getElementsByTagName('input');
    for (var i = 0; i < formInputs.length; i++) {
        var theInput = formInputs[i];
        
        if (theInput.type == 'text' && theInput.className.match(/\bcleardefault\b/)) {  
           if (theInput.value == theInput.defaultText) {
              if (theInput.style) theInput.style.cssText = theInput.origcssText;
              theInput.value = '';
           }
        }
    }
    setTimeout('replaceAllDefaultText()', 500, target);
    
}

function replaceAllDefaultText() {
    var formInputs = document.getElementsByTagName('input');
    for (var i = 0; i < formInputs.length; i++) {
        var theInput = formInputs[i];
        
        if (theInput.type == 'text' && theInput.className.match(/\bcleardefault\b/)) {  
           if (theInput.value == '' && theInput.defaultText) {
               if (theInput.style) theInput.style.cssText = theInput.defaultcssText;
               theInput.value = theInput.defaultText;
           }
        }
    }
}


function clearDefaultText(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;
    
    if (target.value == target.defaultText) {
        if (target.style) target.style.cssText = target.origcssText;
        target.value = '';
    }
}

function replaceDefaultText(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;
    
    if (target.value == '' && target.defaultText) {
        if (target.style) target.style.cssText = target.defaultcssText;
        target.value = target.defaultText;
    }
}

function getCurTime()
{
   var now    = new Date();
   var hour   = now.getHours();
   var minute = now.getMinutes();
   var ap = "am";
   if (hour   > 11) { ap = "pm";             }
   if (hour   > 12) { hour = hour - 12;      }
   if (hour   == 0) { hour = 12;             }
   if (hour   < 10) { hour   = "0" + hour;   }
   if (minute < 10) { minute = "0" + minute; }
   var timeString = hour +
                    ':' +
                    minute +
                    ap;
   return timeString;
}

function getCurDate()
{
   var now    = new Date();
   var month  = now.getMonth() + 1;
   var day    = now.getDate();
   var year   = now.getFullYear();
   if (month  < 10) { month  = "0" + month;   }
   if (day    < 10) { day    = "0" + day; }
   var dateString = month +
                    '/' +
                    day +
                    '/' +
                    year;
   return dateString;
}

function openMgrInfoWindow(m)
{
   var iwAnchor = m.getIcon().infoWindowAnchor;
   var iconAnchor = m.getIcon().iconAnchor;
   var offset = new GSize(iwAnchor.x-iconAnchor.x,iwAnchor.y-iconAnchor.y);
   var numTabs = m.tabs.length;
   map.openInfoWindowTabsHtml(m.getLatLng(), m.tabs, {pixelOffset:offset});
}
