function GoogleMaps()
{
	var  that = this;
	var  config = {latitude:53.230361, longitude:6.536061, zoom:15, enableScale:false, mapControl:'small', enableControl:true, enableMinimap:true, enableScrollWheelZoom:false, enableGoogleBar:false};

	var map_canvas_obj;
	
	var googlemap;
	var markerlist = [];

	var bounds;
	
	var doExtraMove = false;
	var myMoveEndEvent;
	var myMoveStartEvent;

	map_canvas_obj = document.getElementById(arguments[0]);

	if (arguments.length == 2)
	{
		//update config
		for(key in arguments[1])
		{
			config[key] = arguments[1][key];
		}
	}


	function init()
	{
		// init googlemaps
		var options = {
//			onMarkersSetCallback : function() { alert('test');},
//			onGenerateMarkerHtmlCallback: function() { alert('test');},
		};
		if (GBrowserIsCompatible())
		{
			googlemap = new GMap2(map_canvas_obj, {googleBarOptions: options});
			googlemap.setCenter(new GLatLng(config['latitude'], config['longitude']), config['zoom']);

			if (config['enableScale'])
				googlemap.addControl(new GScaleControl());			//links onder balk voor schaal
			if (config['mapControl'] == 'small')
			{
				googlemap.addControl(new GSmallMapControl());
			}
			if (config['mapControl'] == 'large')
			{
				googlemap.addControl(new GLargeMapControl());		//zoom balk met navigatie
			}
			if (config['enableControl'])
				googlemap.addControl(new GMapTypeControl());		//controls voor kaart, satelliet, beide
			if (config['enableMinimap'])
			{
				var OMap = new GOverviewMapControl();
				googlemap.addControl(OMap);
				OMap.hide(true);
			}
			if (config['enableScrollWheelZoom'])
				googlemap.enableScrollWheelZoom();					//enable mouse zoom
			if (config['enableGoogleBar'])
				googlemap.enableGoogleBar();

			GEvent.addListener(googlemap,'infowindowprepareopen',function(iwtabs)
			{
				//wijzig alle _blank naar _self
				var html = iwtabs[0].contentElem.innerHTML;
				var newhtml = html.replace("_blank", '_self');
				iwtabs[0].contentElem.innerHTML = newhtml;
			});

			GEvent.addListener(googlemap, 'infowindowopen',function()
			{
//googlemap.panBy(new GSize(0,20));
//http://www.seroundtable.com/archives/015411.html
//http://econym.org.uk/gmap/index.htm
//http://www.appelsiini.net/2008/5/google-maps-without-javascript
//http://code.google.com/intl/nl/apis/maps/documentation/controls.html

				doExtraMove = true;

				myMoveEndEvent = GEvent.addListener(googlemap, 'moveend', function ()
				{
					if (doExtraMove)
					{
						// scroll een stukje naar beneden.
						var gbounds = googlemap.getBounds();
						var southWest = gbounds.getSouthWest();
						var northEast = gbounds.getNorthEast();
						var latSpan = northEast.lat() - southWest.lat();

						var extraOffset = latSpan / googlemap.getSize().height * 40;

						var moveto = new GLatLng((googlemap.getCenter().lat() + extraOffset), googlemap.getCenter().lng());
						googlemap.panTo(moveto);
					}
				});

				myMoveStartEvent = GEvent.addListener(googlemap, 'movestart', function ()
				{
					doExtraMove = false;
					GEvent.removeListener(myMoveEndEvent);
					GEvent.removeListener(myMoveStartEvent);
				});


			});

			bounds = new GLatLngBounds();

		}
		else
			alert("Er is een fout opgetreden bij initialiseren van GoogleMaps");

	};

	function parseKML(data)
	{
		var xml = GXml.parse(data);
		var doc = xml.documentElement.getElementsByTagName("Document")[0];
		var markers = doc.getElementsByTagName("Placemark");

		for (var i = 0; i < markers.length; i++)
		{
			var name = (markers[i].getElementsByTagName("name")[0].firstChild)?markers[i].getElementsByTagName("name")[0].firstChild.nodeValue:'';
			var title = (markers[i].getElementsByTagName("title")[0])?markers[i].getElementsByTagName("title")[0].firstChild.nodeValue:name;

			var desc = (markers[i].getElementsByTagName("description")[0].firstChild?markers[i].getElementsByTagName("description")[0].firstChild.nodeValue:'');
			var nicon = markers[i].getElementsByTagName("styleUrl")[0].firstChild.nodeValue.substr(1);
			var micon = new GIcon(G_DEFAULT_ICON);
			switch(nicon)
			{
				case 'red':
					micon.image = 'https://www.gemeentenoordenveld.nl/cms/style/images/googlemap/20x34/rood.png';
					break;
				case 'green':
					micon.image = 'https://www.gemeentenoordenveld.nl/cms/style/images/googlemap/20x34/groen.png';
					break;
				case 'yellow':
					micon.image = 'https://www.gemeentenoordenveld.nl/cms/style/images/googlemap/20x34/geel.png';
					break;
				case 'blue':
					micon.image = 'https://www.gemeentenoordenveld.nl/cms/style/images/googlemap/20x34/blauw.png';
					break;
				case 'white':
					micon.image = 'https://www.gemeentenoordenveld.nl/cms/style/images/googlemap/20x34/wit.png';
					break;
				case 'purple':
					micon.image = 'https://www.gemeentenoordenveld.nl/cms/style/images/googlemap/20x34/paars.png';
					break;
			}
			
			var points = markers[i].getElementsByTagName("Point");
			var coordinates = points[0].getElementsByTagName("coordinates");
			var coord = coordinates[0].firstChild.nodeValue.split(",");
			// coord[0] = longitude,  coord[1] = latitude, coord[3] = unbounded

			var latlng = new GLatLng(parseFloat(coord[1]), parseFloat(coord[0]));
			var marker = new GMarker(latlng, {icon:micon, title: title});

			GEvent.addListener(marker, "click", function()
			{
				if (name == title)
					marker.openInfoWindow('<h2>'+name+'</h2><p>'+desc.replace(/\n/g, "<br/>")+'</p>', {});
				else
					marker.openInfoWindow('<h2>'+title+'</h2><strong>'+name+'</strong><p>'+desc.replace(/\n/g, "<br/>")+'</p>', {});
			});

			markerlist.push(marker);
			googlemap.addOverlay(marker);


			bounds.extend(latlng);
			googlemap.setZoom(googlemap.getBoundsZoomLevel(bounds)-1);
			googlemap.setCenter(bounds.getCenter());
		}

	};


	this.loadFrom = function(url)
	{
		GDownloadUrl(url, function(data, responseCode)
		{
			if(responseCode == 200)
			{
				parseKML(data);
			}
			else if(responseCode == -1)
			{
				alert("Data request timed out. Please try later.");
			}
			else
			{
				alert("Request resulted in error. Check XML file is retrievable.");
			}
		});
	};

	
	this.LoadKML = function(url)
	{
		geoXml = new GGeoXml(url);
		googlemap.addOverlay(geoXml);

		GEvent.addListener(geoXml, "load", function()
		{
			var zoomLevel = googlemap.getZoom();
			googlemap.setZoom(zoomLevel - 1); 
		}); 

		geoXml.gotoDefaultViewport(googlemap);

	};
	
	//nadat alles geladen is:
	init();
}



