  var infowindow;
  var map;

  function initialize() {
  
	// expect url of form: ...map.php?lat=-35.500000&long=174.000000&zoom=10
	var fullurl = (window.location).toString(); // get browser window url (maybe containing user variables) and convert to a string for slicing up
	var docurl = fullurl.substring(0,(fullurl.indexOf("php")+3)); // extract url of this document only (ie less the variables if present)
	var userlat = parseFloat(fullurl.substring((fullurl.indexOf("lat=")+4),(fullurl.indexOf("long")-1))); // get lat from url and convert to number
	var userlng = parseFloat(fullurl.substring((fullurl.indexOf("long=")+5),(fullurl.indexOf("zoom")-1))); // get long from url and convert to number
	var userzm = parseInt(fullurl.substring((fullurl.indexOf("zoom=")+5))); // get zoom from url and convert to integer
	if ( !(userlat >= -85 && userlat <= 85) ) { var userlat = -41.030000; } // if lat out of map bounds (or NaN) set a default for NZ, same for long and zoom
	if ( !(userlng >= -180 && userlng <= 180) ) { var userlng = 172.390000; }
	if ( !(userzm >= 0 && userzm <= 19) ) { var userzm = 5; }
	
	function updatebookmark(userlat,userlng,userzm) {
		var customlink = docurl + "?lat=" + userlat + "&long=" + userlng + "&zoom=" + userzm ;
		document.getElementById('maplink').innerHTML = "<a href=\"" + customlink + "\" title=\"Bookmark or share this map\">Bookmark or share</a>" ;
	}
	
	updatebookmark(userlat,userlng,userzm);
	
    var myLatlng = new google.maps.LatLng(userlat, userlng);
    var myOptions = {
      zoom: userzm,
      center: myLatlng,
	  scaleControl: true,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	
    google.maps.event.addListener(map, 'click', function(event) { /* 'click' fires on left mouse button on map - not on marker or infowindow */
        var clicklat = event.latLng.lat(); // returns 14 dec places
        var clicklng = event.latLng.lng(); // returns 14 dec places
        document.getElementById('clickpos').innerHTML = roundme(clicklat,6)+", "+roundme(clicklng,6); //round to 6 dec places
    });
	
	google.maps.event.addListener(map, 'idle', function() { /* 'idle' fires after a pan/zoom */
		var userlat = roundme(((map.getCenter()).lat()),6);
		var userlng = roundme(((map.getCenter()).lng()),6);
		var userzm = map.getZoom();
		updatebookmark(userlat,userlng,userzm);
	});

    downloadUrl("map/markers_20100817-1.xml", function(data) {
      var markers = data.documentElement.getElementsByTagName("marker");
      for (var i = 0; i < markers.length; i++) {
        var latlng = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")),
                                    parseFloat(markers[i].getAttribute("lng")));
        var marker = createMarker(markers[i].getAttribute("name"), latlng, markers[i].getAttribute("img"), markers[i].getAttribute("txt"));
       }
    });
	
  }

  function createMarker(name, latlng, img, txt) {
    var marker = new google.maps.Marker({position: latlng, map: map, title: name, icon: img, shadow: 'map/marker_shadow_wide.png'});
    google.maps.event.addListener(marker, "click", function() {
      if (infowindow) infowindow.close();
	  var contentstring = '<h1>'+name+'</h1>'+txt;
      infowindow = new google.maps.InfoWindow({content: contentstring});
      infowindow.open(map, marker);
    });
    return marker;
  }
  
  function newview(dropdownvalue) {
	if (dropdownvalue == "") { return; }
	var dropdownsubvalue = new Array();
	var dropdownsubvalue = dropdownvalue.split(',');
	var lt = parseFloat(dropdownsubvalue[0]);
	var lg = parseFloat(dropdownsubvalue[1]);
	var zm = parseFloat(dropdownsubvalue[2]);
	map.setCenter(new google.maps.LatLng(lt,lg));
	map.setZoom(zm);
  }

  function roundme(num,places) {
    numrnd = Math.round(num*Math.pow(10,places))/Math.pow(10,places);
    return numrnd;
  }