var googlemaps = 
{
	// opties, zijn aan te passen
	defaultOpties		: {
		key					:  GOOGLEMAPS_API_KEY,	// google api key
		zoom				: true,	// mixed, nummer of false voor automatisch aan de hand van de punt(en)
		route				: false,	// boolean, routeplanner functie gebruiken. heeft wel meerdere punten nodig!
		mapControl			: true,	
		mapControls			: true,	// boolean, links, inzoomen en positie
		zoomControl			: true,
		typeControls		: false,		// boolean, keuze van de weergave (verkeer, satteliet enzo)
		weergave			: 'physical'		// 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;
					
				case 'physical':
					googlemaps.map.setMapType(G_PHYSICAL_MAP);
					break;					
			}
			
			// controls
			if(googlemaps.opties.typeControls)	googlemaps.map.addControl(new GMapTypeControl());
			if(googlemaps.opties.mapControls)
			{
				if(googlemaps.opties.zoomControl == 'groot') googlemaps.map.addControl(new GLargeMapControl3D());
				if(googlemaps.opties.zoomControl == 'klein') googlemaps.map.addControl(new GSmallZoomControl3D());
			}
			
			
			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);
						//alert(latlng);
					}
					
					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;
		}
		//nf[' ' + punt.id] = latlng;
	
		// 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>';
                punt.route_html =  "<form method=\"get\" action=\"http://maps.google.nl\" ";
				punt.route_html += "onsubmit=\"document.getElementById('routeplanner_adres').value = document.getElementById('routeplanner_straat').value;\" ";
				punt.route_html += "id=\"routeplanner_form\" target=\"_blank\">";

				punt.route_html += "<a href=\"#\" style=\"font-weight:bold;\" onclick=\"gm_toggleRouteplanner('naar', this); return false;\" title=\"Heenreis\">Heenreis</a> ";
				punt.route_html += "<a href=\"#\" style=\"font-weight:none;\" onclick=\"gm_toggleRouteplanner('van', this); return false;\" title=\"Terugreis\">Terugreis</a>";

				punt.route_html += "<input id=\"routeplanner_adres\" type=\"hidden\" name=\"saddr\" size=\"20\" value=\"\" />";
				punt.route_html += "<input id=\"routeplanner_locatie\" type=\"hidden\" name=\"daddr\" value=\""+latlng+" ("+ punt.adres +")\" />";

				punt.route_html += "<br /><label for=\"routeplanner_straat\"></label><input id=\"routeplanner_straat\" type=\"text\" name=\"straat\" size=\"30\" style=\"width:140px\"  onfocus=\"if(this.value == 'Adres, woonplaats'){ this.value=''; }\" onblur=\"if(this.value == ''){ this.value='Adres, woonplaats'; }\" value=\"Adres, woonplaats\" />";
			/*	punt.route_html += "<label for=\"routeplanner_plaats\">Plaats:</label><input id=\"routeplanner_plaats\" type=\"text\" name=\"plaats\" size=\"30\" value=\"\" />";*/
				punt.route_html += "<input class=\"button\" id=\"routeplanner_submit\" type=\"submit\" style=\"padding:2px 0;margin-top:5px;width:64px\" value=\"Plan route\" title=\"Plan route\" />";
				punt.route_html += "</form>";

			}
			else	{
				punt.route_html = '';	
			}
		
			GEvent.addListener(marker, "click", function() 	
			{
				if(punt.route_html)
				{
					marker.openInfoWindowTabsHtml([ new GInfoWindowTab('Info', punt.html), new GInfoWindowTab('Route', punt.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();
		});
	}
	
};

function gm_toggleRouteplanner( actie, sender )
{
	switch(actie)
	{
		case 'naar':
			document.getElementById('routeplanner_adres').name = 'saddr';
			document.getElementById('routeplanner_locatie').name = 'daddr';

			as = document.getElementById('routeplanner_form').getElementsByTagName("a");
			for(i=0; i<as.length; i++)	{
				as[i].style.fontWeight = 'normal';
			}

			sender.style.fontWeight = 'bold';
			break;

		case 'van':
			document.getElementById('routeplanner_adres').name = 'daddr';
			document.getElementById('routeplanner_locatie').name = 'saddr';

			as = document.getElementById('routeplanner_form').getElementsByTagName("a");
			for(i=0; i<as.length; i++)	{
				as[i].style.fontWeight = 'normal';
			}

			sender.style.fontWeight = 'bold';
			break;
	}
}

