    var zoomInLevel = 10;
    var iMinZoom = 5;
    var currentZoom = 1;
    var oldBounds = null;
    var newBounds = null;
    var bZoomOut = false;
    var bZoomIn = false;
    var map;
    var cgArgs = "";
    var geocoder;

    function load() {
      if (GBrowserIsCompatible()) {
        var mapOptions = {
          googleBarOptions : {
            style : "new",
	    adsOptions : {
              client: "partner-pub-9924129530725371:hcpfljv0wh1",
              adsafe: "high",
              language: "en"
            }
          }
        }
        map = new GMap2(document.getElementById("map"), mapOptions);
        map.setCenter(new GLatLng(37.4419, -122.1419), 13);
        map.setUIToDefault();
        map.enableGoogleBar();

        geocoder = new GClientGeocoder();

        // listeners
        GEvent.addListener(map, 'moveend', handleMoveEnd);
        GEvent.addListener(map, 'zoomend', handleZoomEnd);

        // initialize map
        optionsChanged();

        //       _IG_Analytics("UA-3840571-2", "/gadgets/books.xml");
      }
    }

    function updateCgArgs() {
      cgArgs = "";
      if (document.getElementById("cg-ap").checked == true) {
        cgArgs = cgArgs + '&cg-ap=1';
      }
      if (document.getElementById("cg-bl").checked == true) {
        cgArgs = cgArgs + '&cg-bl=1';
      }
      if (document.getElementById("cg-church").checked == true) {
        cgArgs = cgArgs + '&cg-church=1';
      }
      if (document.getElementById("cg-geo-land").checked == true) {
        cgArgs = cgArgs + '&cg-geo-land=1';
      }
      if (document.getElementById("cg-geo-man").checked == true) {
        cgArgs = cgArgs + '&cg-geo-man=1';
      }
      if (document.getElementById("cg-geo-water").checked == true) {
        cgArgs = cgArgs + '&cg-geo-water=1';
      }
      if (document.getElementById("cg-pp").checked == true) {
        cgArgs = cgArgs + '&cg-pp=1';
      }
    }

    function optionsChanged() {
      updateCgArgs();
      GetTidesByLLBounds();
      if (cgArgs != "") {
        GetBooksByLLBounds();
      }
    }

    function GetTidesByLLBounds() {
      var bounds = map.getBounds();
      var bSW = bounds.getSouthWest();
      var bNE = bounds.getNorthEast();
      var dOffset = .00;

      var kmlUrl = 'http://books.connectedvacation.com/kml/tides/mapplet.kml?minlongitude=' + (bSW.lng() - dOffset) + '&maxlongitude=' + (bNE.lng() + dOffset) + '&minlatitude=' + (bSW.lat() + dOffset) + '&maxlatitude=' + (bNE.lat() + dOffset);
      var geoXml = new GGeoXml(kmlUrl);
      map.addOverlay(geoXml);

	//        _IG_Analytics("UA-3840571-2", "/kml/books/mapplet.kml");
    }

    function GetBooksByLLBounds() {
      var bounds = map.getBounds();
      var bSW = bounds.getSouthWest();
      var bNE = bounds.getNorthEast();
      var dOffset = .00;

      var kmlUrl = 'http://books.connectedvacation.com/kml/books/mapplet.kml?minlongitude=' + (bSW.lng() - dOffset) + '&maxlongitude=' + (bNE.lng() + dOffset) + '&minlatitude=' + (bSW.lat() + dOffset) + '&maxlatitude=' + (bNE.lat() + dOffset);
      var geoXml = new GGeoXml(kmlUrl + cgArgs);
      map.addOverlay(geoXml);

	//        _IG_Analytics("UA-3840571-2", "/kml/books/mapplet.kml");
    }

    function handleMoveEnd() {
      var bounds = map.getBounds();
      var pctLng = 0;
      var pctLat = 0;

      newBounds = bounds; 

      if (oldBounds != null && newBounds != null) {
        var bSWOld = oldBounds.getSouthWest();
        var bNEOld = oldBounds.getNorthEast();
        var bSWNew = newBounds.getSouthWest();
        var bNENew = newBounds.getNorthEast();

        bSWOld.lng() > bSWNew.lng() ? pctLng = (bSWOld.lng() - bSWNew.lng()) / (bNEOld.lng() - bSWOld.lng()) : pctLng = (bSWNew.lng() - bSWOld.lng()) / (bNENew.lng() - bSWNew.lng());
        bSWOld.lat() > bSWNew.lat() ? pctLat = (bSWOld.lat() - bSWNew.lat()) / (bNEOld.lat() - bSWOld.lat()) : pctLat = (bSWNew.lat() - bSWOld.lat()) / (bNENew.lat() - bSWNew.lat());
        pctLng *= 100;
        pctLat *= 100;
      }

      if (bZoomIn || bZoomOut || oldBounds == null || pctLng > 20 || pctLat > 20) {
        oldBounds = newBounds;
	if (bZoomIn || bZoomOut) {
          cleanup();
        }
	checkZoom();
        bZoomIn = false;
        bZoomOut = false;
      }
    }

    function handleZoomEnd(oldZoomLevel, newZoomLevel) {
      oldZoomLevel > newZoomLevel ? bZoomOut = true : bZoomIn = true;
      currentZoom = newZoomLevel;
    }

    function cleanup() {
      map.clearOverlays();
    }

    function checkZoom() {
      var zoom = map.getZoom();
      if (zoom >= iMinZoom) {
	currentZoom = zoom;
        GetTidesByLLBounds();
        if (cgArgs != "") {
          GetBooksByLLBounds();
        }
      }
    }

   function updateAddress(address) {
     if (geocoder != null) {
       geocoder.getLocations(address, updateMap);
     }
     document.getElementById("maperror").style.visibility = 'hidden';
   }

   function updateMap(response) {
     if (response.Status.code == G_GEO_SUCCESS) {
       place = response.Placemark[0];

       lat = place.Point.coordinates[1];
       lon = place.Point.coordinates[0];

       point = new GLatLng( lat, lon );
       map.setCenter( point, zoomInLevel );

       cleanup();
       checkZoom();

       document.getElementById("maperror").style.visibility = 'hidden';
     }
     else {
       document.getElementById("maperror").style.visibility = 'visible';
     }
   }
