var googlemaps = 
{
	// opties, zijn aan te passen
	defaultOpties		: {
		key					: 'ABCDEF',	// google api key
		zoom				: false,	// mixed, nummer of false voor automatisch aan de hand van de punt(en)
		route				: false,	// boolean, routeplanner functie gebruiken. heeft wel meerdere punten nodig!
		mapControls			: true,		// boolean, links, inzoomen en positie
		typeControls		: false,		// boolean, keuze van de weergave (verkeer, satteliet enzo)
		weergave			: 'map'		// map, satellite, hybrid	
	},
	
	onComplete			: null,
	
	markers				: [],
	
	punten				: [],
	puntenToegevoegd	: 0,
	/*
		opbouw is zoals hieronder;
		[
			{ 
				query	: "Doetinchem", 			// lokatie opzoeken
				// of 
				latlng	: "5.12312312,8.3452345"	// op latlng. het is of op punt of op query. wanneer beiden opgegeven wordt de latlng gepakt.
				html	: "A&amp;M ImpacT", 		// html erin
				icon	: { 						// custom icoontje
							src		: "plaatje.gif",
							height	: 12,
							width	: 12
						  },
				route	: true,						// route te plannen vanaf deze marker
				openen	: true						// marker openen bij inladen
			},
			.....
		]
					
	*/	
	
	map 				: null,
	bounds 				: null,
	geocoder			: null,
	
	directions 			: null,
	directionsQuery		: null,
	
	initElement			: null,
	initCallback		: null,
	
	apiGeladen			: false,


	// init
	init : function( element, callback )
	{	
		// opties instellen
		googlemaps.opties = $.extend(googlemaps.defaultOpties, googlemaps.opties);
		
		// vast zetten
		googlemaps.initElement = element;
		googlemaps.initCallback = callback;
		
		if(!googlemaps.apiGeladen)
		{
			$(element).css({ background: "#E5E3DF", overflow: "hidden" }).html("Bezig met laden van Google Maps...");

			// script laden
			var script = document.createElement("script");
			script.setAttribute("src", "http://maps.google.com/maps?file=api&v=2.x&key="+ googlemaps.opties.key +"&c&async=2&callback=googlemaps.initMap");
			script.setAttribute("type", "text/javascript");
			document.body.appendChild(script);
		}
		else
		{
			try { googlemaps.initMap(); } catch(e) { }
		}
	},
	
	
	// map inladen
	initMap : function()
	{			
		if(GBrowserIsCompatible()) 
		{		
			if(!googlemaps.apiGeladen)
			{
				// google maps rommel opruimen
				$("body").unload(GUnload);
				
				// googlemap opzetten
				googlemaps.map = new GMap2( googlemaps.initElement );
				googlemaps.map.setCenter(new GLatLng(52.0325885, 5.6352225), googlemaps.opties.zoom);	
			}
			
			//googlemaps.map.addMapType(G_SATELLITE_3D_MAP);
			
			switch(googlemaps.opties.weergave)
			{
				case 'map':
					googlemaps.map.setMapType(G_NORMAL_MAP);
					break;
					
				case 'satellite':
					googlemaps.map.setMapType(G_SATELLITE_MAP);
					break;
					
				case 'hybrid':
					googlemaps.map.setMapType(G_HYBRID_MAP);
					break;
			}
			
			// contols
			if(googlemaps.opties.mapControls)	googlemaps.map.addControl(new GSmallMapControl());
			if(googlemaps.opties.typeControls)	googlemaps.map.addControl(new GMapTypeControl());
			
			googlemaps.puntenToegevoegd = 0;
									
			// als de api al geladen is oude dingen opruimen
			if(googlemaps.apiGeladen)
			{
				googlemaps.map.clearOverlays();
				googlemaps.map.closeInfoWindow();

				if(googlemaps.directions)
				{
					googlemaps.directionsQuery = null;
					googlemaps.directions.clear();
				}
			}
						
			// bij route gdirections gebruiken
			if(googlemaps.opties.route)	googlemaps.directions = new GDirections( googlemaps.map );		
			else						googlemaps.bounds = new GLatLngBounds();
			
			googlemaps.geocoder = new GClientGeocoder();
			
			// api geladen, hoeft dus niet nog een keer
			googlemaps.apiGeladen = true;

			googlemaps.initCallback();
		}
		else
		{
			alert("Helaas, je browser heeft geen ondersteuning voor Google Maps");	
		}
	},
	
	
	// punten zetten. 
	// deze functie zorgt ervoor dat ze een voor een worden toegevoegd
	zetPunten : function()
	{
		// alles toegevoegd, afronden
		if(googlemaps.puntenToegevoegd >= googlemaps.punten.length)
		{
			googlemaps.afronden();	
		}
		// punt toevoegen
		else
		{
			punt = googlemaps.punten[ googlemaps.puntenToegevoegd ];
			punt.index = googlemaps.puntenToegevoegd;
			
			googlemaps.zetPunt( punt );
		}
	},
	
	
	// punt zetten. 
	// alleen query is verplicht
	zetPunt : function( punt )
	{
		// wanneer niet de route moet worden weergegeven het punt ophalen enzo
		if(googlemaps.opties.route)	
		{
			// directions query genereren
			if(!googlemaps.directionsQuery)	googlemaps.directionsQuery = "from: "+ punt.query;	
			else							googlemaps.directionsQuery += " to: "+ punt.query; 	
		
			googlemaps.puntenToegevoegd++;	
			
			// callback
			googlemaps.zetPunten();	
		}
		else
		{	
			// op punt
			if(punt.latlng)
			{
				p = punt.latlng.split(",");
								
				googlemaps.zetMarker(new GLatLng( p[0], p[1] ), punt);
				googlemaps.puntenToegevoegd++;	
				googlemaps.zetPunten();	
			}
			// op query (adres) latlng ophalen
			else
			{				
				googlemaps.geocoder.getLatLng(punt.query, function( latlng )
				{
					if(latlng)
					{
						googlemaps.zetMarker(latlng, punt);
					}
					
					googlemaps.puntenToegevoegd++;	
					googlemaps.zetPunten();	
				});
			}
		}
	},
	
	
	// marker plaatsen
	zetMarker : function( latlng, punt )
	{	
		// icoon nodig?
		markerOptions = {};
		
		if(punt.icon)
		{			
			var icon = new GIcon(G_DEFAULT_ICON);
      		icon.image = punt.icon.src;
			icon.iconSize = new GSize(punt.icon.width, punt.icon.height);
			iconAnchor = new GPoint(punt.icon.width, punt.icon.height);
			icon.shadow = false;
			icon.transparent = "http://www.google.com/intl/en_ALL/mapfiles/markerTransparent.png";
			markerOptions.icon = icon;
		}
	
		// marker toevoegen
		var marker = new GMarker(latlng, markerOptions);	
				
		if(punt.html || punt.route || punt.openen)
		{			
			// inline routeplanner
			if(punt.route)	{
				route_html = '<form onsubmit="return googlemaps.planRoute(this);"><input type="text" name="vanaf" size="15" /> <input type="submit" class="button" value="Route ophalen" title="Route weergeven" /></form>';
			}
			else	{
				route_html = '';	
			}
		
			GEvent.addListener(marker, "click", function() 	
			{
				if(route_html)
				{
					marker.openInfoWindowTabsHtml([ new GInfoWindowTab('Info', punt.html), new GInfoWindowTab('Route', route_html) ]); 
				}
				else
				{
					marker.openInfoWindowHtml(punt.html); 
				}
			});
		}
		else if(punt.href) 
		{
			GEvent.addListener(marker, "click", function() { window.location = punt.href; });
		}
			
					
		// marker object in markers array zetten, voor latere aanroep van de marker van buiten af
		googlemaps.markers[punt.index] = marker;	
		
		
		googlemaps.map.addOverlay(marker);	

		// bounds uitbreiden
		googlemaps.bounds.extend(latlng);
	},
	
	
	afronden : function( callback )
	{
		// route planner?
		if(googlemaps.opties.route)	
		{			
			googlemaps.directions.load( googlemaps.directionsQuery );
			
			// als directions geladen zijn deze terug geven aan de callback
			GEvent.addListener(googlemaps.directions, "load", function()
			{												
				 googlemaps.map.openInfoWindowHtml(googlemaps.directions.getBounds().getCenter(),
                 	'<a href="http://maps.google.com/maps?f=q&hl=nl&q='+ googlemaps.directionsQuery +'" title="Bekijk de route in Google Maps" target="_blank">Open de route in Google Maps voor een uitgebreidere routebeschrijving.</a>',
					{ maxWidth: 200 });

						
				
				// callback
				if(googlemaps.onComplete)	{
					googlemaps.onComplete({
						samenvatting: 	googlemaps.directions.getSummaryHtml(),
						afstand: 		googlemaps.directions.getDistance(),
						tijd: 			googlemaps.directions.getDuration()		
					});
				}
			});
		}

		else
		{							
			// bij 1 punt en zoom als optie zoom leven gebruiken
			if(googlemaps.opties.zoom && googlemaps.punten.length == 1) 	
				zoom = googlemaps.opties.zoom;
				
			// map centreren zodat alle items passen
			else												
				zoom = googlemaps.map.getBoundsZoomLevel( googlemaps.bounds);
			
			googlemaps.map.setCenter(googlemaps.bounds.getCenter(), zoom);
			
			// callback
			if(googlemaps.onComplete) googlemaps.onComplete();
		}
	},
	
	
	// route plannen
	planRoute : function( form )
	{		
		googlemaps.punten.push({ query: $("input:text", form).val() });
		googlemaps.opties.route = true;

		googlemaps.rebuild();
		
		return false;
	},
	
	
	// rebuild, googlemaps opnieuw maken
	rebuild : function()
	{	
		googlemaps.map.clearOverlays();
		
		googlemaps.init( googlemaps.initElement, function()
		{		
			// punten toevoegen
			googlemaps.zetPunten();
		});
	},
	
	
	// build, alleen nodig voor route en passend maken
	build : function( element )
	{		
		googlemaps.init( element, function()
		{		
			// punten toevoegen
			googlemaps.zetPunten();
		});
	}
	
};