function load(vlat, vlng, vzoom, maptype) {
  if (GBrowserIsCompatible()) {
    var mapObj = document.getElementById("map");
    var map = new GMap2(mapObj);
    map.addControl(new GLargeMapControl());
    map.addControl(new GOverviewMapControl());
    map.addControl(new GMapTypeControl());
    map.addControl(new GScaleControl());

    var CustomGetTileUrl=function(a,b){
      return "displaytilenew.py?xy="+a+"&zoom="+b;
    }


    var copyCollection = new GCopyrightCollection('Cave Survey');
    //A function to process an xml list of acknowledgments
    function setAcknowledgments(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      // extract an array of markers
      var markers = xmlDoc.documentElement.getElementsByTagName("acknowledge");         
      for (var i = 0; i < markers.length; i++) {
        
        var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(parseFloat(markers[i].getAttribute("west")), 
                                                                        parseFloat(markers[i].getAttribute("east"))), 
                                          new GLatLng(parseFloat(markers[i].getAttribute("north")),
                                                      parseFloat(markers[i].getAttribute("south")))), 
                                          parseFloat(markers[i].getAttribute("minzoom")),
                                          parseFloat(markers[i].getAttribute("ack")));
        copyCollection.addCopyright(copyright);
      }
    }
    GDownloadUrl("acknowlege.py", setAcknowledgments)

    var cavesurveylayer = new GTileLayer(copyCollection,0,20)
    cavesurveylayer.isPng(true);
    cavesurveylayer.getTileUrl = CustomGetTileUrl;

    var cavesurverlayers = [cavesurveylayer];
    var cavesurverhybridlayers = [G_HYBRID_MAP.getTileLayers()[0], cavesurveylayer];

    var cavesurveymap = new GMapType(cavesurverlayers, G_SATELLITE_MAP.getProjection(), "Survey",{errorMessage:"Whoops there has been an error"});
    var cavesurveyhybirdmap = new GMapType(cavesurverhybridlayers, G_SATELLITE_MAP.getProjection(), "Hybrid",{errorMessage:"No Satellite data available. Select Cave Survey to just view the survey"});
      

    map.addMapType(cavesurveymap);
    map.addMapType(cavesurveyhybirdmap);
    map.removeMapType(map.getMapTypes()[2]);
    map.removeMapType(map.getMapTypes()[1]);
    map.removeMapType(map.getMapTypes()[0]);


    //GKeyboardHandler(map)

   //Set position view and selected layer
    map.setCenter(new GLatLng(vlat, vlng), vzoom);
    mapTypes = map.getMapTypes();
    for (var i = 0; i < mapTypes.length; i++) {
      if (mapTypes[i].getName() == maptype) {
        map.setMapType(mapTypes[i])
      }
    }

    var side_bar_html = "";

    var entIcon = new GIcon()
    entIcon.image = "cave.png";
    entIcon.iconSize = new GSize(10, 12);
      //Icon.shadow = "";
      //Icon.shadowSize = new GSize(1, 1);
    entIcon.iconAnchor = new GPoint(5, 7);
    entIcon.infoWindowAnchor = new GPoint(10, 1);
      //Icon.transparent = "mytran.png";
      //Icon.printImage = "mymarkerie.gif";
      //Icon.mozPrintImage = "mymarkerff.gif";
      //Icon.printShadow = "myshadow.gif";
      //Icon.imageMap=[9,0,6,1,4,2,2,4,0,8,0,12,1,14,2,16,5];

    //A function to process an xml list of markers
    function processMarkers(data, responseCode) {
      var xmlDoc = GXml.parse(data);
      // extract an array of markers
      var markers = xmlDoc.documentElement.getElementsByTagName("marker");

      // reset the side_bar
      var center = map.getCenter();
      side_bar_html = '<a href="http://seagrass.goatchurch.org.uk/~mjg/cgi-bin/map.py?lat='+center.lat()+'&lng='+center.lng()+'&zoom='+map.getZoom()+'&maptype='+map.getCurrentMapType().getName()+'">Permalink</a><br>';
          
      for (var i = 0; i < markers.length; i++) {
        // obtain the attribues of each marker
        var lat = parseFloat(markers[i].getAttribute("lat"));
        var lng = parseFloat(markers[i].getAttribute("lng"));
        var point = new GLatLng(lat,lng);
        var html = markers[i].getAttribute("html");
        var label = markers[i].getAttribute("label");
        // create the marker
        map.addOverlay(createMarker(point,label,html,label));
      }
      // put the assembled side_bar_html contents into the side_bar div
      document.getElementById("side_bar").innerHTML = side_bar_html;
    }

    // A function to read the data
    function readMap() {
      var bounds = map.getBounds();
      var SW = bounds.getSouthWest();
      var NE = bounds.getNorthEast();
      if (bounds.isFullLng()) {
        var url = "listents.py?swlat="+SW.lat()+"&swlng="+SW.lng()+"&nelat="+NE.lat()+"&nelng="+NE.lng()+"&zoom="+map.getZoom();
      } else {
        var url = "listents.py?swlat="+SW.lat()+"&swlng=-180&nelat="+NE.lat()+"&nelng=180&zoom="+map.getZoom();
      }
      GDownloadUrl(url, processMarkers)
    }

    // A function to create the marker and set up the event window
    function createMarker(point,name,html,tooltip) {
      var marker = new GMarker(point,{title:tooltip, icon:entIcon});
      GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(html);
      });
      return marker;
    }
       
   GEvent.addListener(map, "moveend", function() {
     readMap();
   });

   GEvent.addListener(map, "zoomend", function() {
      // hide the info window, otherwise it still stays open where the removed marker used to be
      map.getInfoWindow().hide();

      map.clearOverlays();
   });


   //cavesurveyhybirdmap.getErrorMessage = function() {
   //  map.setMapType(cavesurveymap);
   //  GLog.write("No satellite data available. Changing to display caves only."); 
   //} 

			//BEGIN SCROLL-WHEEL ZOOM CODE

			GMap2.prototype.wheelZoom = function(event) { 
			        if(event.cancelable) { 
			                event.preventDefault(); 
			        } 
			        if((event.detail || -event.wheelDelta) < 0) { 
			                zoom('in'); 
			        } else { 
			                zoom('out'); 
			        } 
			        return false;
			} 

			GEvent.addDomListener(mapObj, "DOMMouseScroll", map.wheelZoom); 
			GEvent.addDomListener(mapObj, "mousewheel", map.wheelZoom); 
			GEvent.addListener(map, "mousemove", 
			        function(point) { 
			                mouselat = point.y.toFixed(6); 
			                mouselng = point.x.toFixed(6); 
			                //you can stick these into a div somewhere to show the current position 
			        } 
			); 

			function zoom(a) { 
			        var m = map.fromLatLngToDivPixel(new GLatLng(mouselat,mouselng)); 
			        var c = map.fromLatLngToDivPixel(map.getCenter()); 
			        if (a == 'in') { 
			                var x = c.x - ((m.x - c.x) * -.5); 
			                var y = c.y - ((m.y - c.y) * -.5); 
			                var n = map.fromDivPixelToLatLng(new GPoint(x,y)); 
			                map.setCenter(n); 
			                map.zoomIn(); 
			        } else { 
			                var x = c.x - (m.x - c.x); 
			                var y = c.y - (m.y - c.y); 
			                var n = map.fromDivPixelToLatLng(new GPoint(x,y)); 
			                map.setCenter(n); 
			                map.zoomOut(); 
			        }
			}

			//END SCROLL-WHEEL ZOOM CODE

   readMap();
   } 
}

