/**
 * Filiaalkiezer met kaart
 */

var filiaalkiezer =
{
	'top': 68,
	'nietBAS': 'show',  // show, hide, showDisabled
	'anvr': 4615,
	'template': false,
	'filialen': null,
	'filiaal': null,
	'map': null,
	'markers': [ ],
	'markerImages': { },
	'geocoder': null,
	'geocoderTimeout': 0,
	'currentlyGeocoding': '',
	'geocodeNext': '',
	'defaultCenter': [ 52.128393, 5.204844 ],  // centreren op Bilthoven met zoomlevel 7 toont precies heel Nederland
	'zoomlevel': 7,
	'zoomlevelPresets': { 'filiaal': 11, 'home': 10, 'default': 7 },
	'cache': { },
	'eventHandlers': [ ],

	'open': function(nietBAS)
	{
		nietBASChanged = false;
		if (typeof nietBAS !== 'undefined' && (nietBAS == 'show' || nietBAS == 'hide' || nietBAS == 'showDisabled'))
		{
			if (this.nietBAS != nietBAS)
				nietBASChanged = true;
			this.nietBAS = nietBAS;
		}

		var popupDiv = document.getElementById('filiaalKiezerGoogleMaps');
		if (!popupDiv)
			this.init();

		var popupDiv = document.getElementById('filiaalKiezerGoogleMaps');
		if (!popupDiv)
			return false;

		popupDiv.style.top = this.top+'px';
		popupDiv.className = 'on';

		if (typeof toerkoop !== 'undefined' && toerkoop.anvr && this.anvr != toerkoop.anvr)
			this.selectFiliaal(toerkoop.anvr);

		if (nietBASChanged)
		{
			// weergave aanpassen aan nieuwe nietBAS-situatie
			for (var i = 0; i < this.filialen.length; i++)
			{
				if (this.filialen[i].filiaal_bas == '1')
					continue;

				switch (this.nietBAS)
				{
					case 'show':
						this.filialen[i].div.className = this.filialen[i].div.className.replace(/^nietBAS_[a-zD]+ ?/, '');
						if (this.filialen[i].marker)
						{
							this.filialen[i].marker.setVisible(true);
							this.filialen[i].marker.setIcon(this.getMarkerImage(this.anvr == this.filialen[i].filiaal_anvr ? 'selected' : 'filiaal'));
						}
						break;

					case 'showDisabled':
						this.filialen[i].div.className = this.filialen[i].div.className.replace(/^(nietBAS_[a-zD]+)?(.*)$/, 'nietBAS_showDisabled$2');
						if (this.filialen[i].marker)
						{
							this.filialen[i].marker.setVisible(true);
							this.filialen[i].marker.setIcon(this.getMarkerImage(this.anvr == this.filialen[i].filiaal_anvr ? 'selected' : 'disabled'));
						}
						break;

					case 'hide':
						this.filialen[i].div.className = this.filialen[i].div.className.replace(/^(nietBAS_[a-zD]+)?(.*)$/, 'nietBAS_hide$2');
						if (this.filialen[i].marker)
							this.filialen[i].marker.setVisible(false);
						break;
				}
			}

			this.showFiliaalData();

			var zoektermInput = document.getElementById('filiaalkiezer_zoekterm');
			if (zoektermInput.value)
				this.zoekCoordinaten(zoektermInput.value);
		}

		return true;
	},

	'close': function()
	{
		var popupDiv = document.getElementById('filiaalKiezerGoogleMaps');
		if (popupDiv)
			popupDiv.className = 'off';

		return true;
	},

	'init': function()
	{
		if (this.template === false)
		{
			// dan eerst de template ophalen
			this.template = '';
			ajax.send('/ajax/templates.php', 'templates%5B%5D='+encodeURIComponent('/templates/filiaalkiezer_googlemaps.tpl'), function(templateData) { if (templateData) { filiaalkiezer.template = filiaalkiezer.parseTemplate(templateData); filiaalkiezer.open(); } else { filiaalpopup.template = null; } return false; }, 'POST');
			return false;
		}
		else if (this.template === '')
		{
			// dan is-ie al bezig met ophalen van de content voor de popup
			return false;
		}
		else if (!this.template)
		{
			if (typeof toerEngineError !== 'undefined')
				toerEngineError('Filiaalkiezer met kaart niet beschikbaar', window.location.protocol+'\/\/'+window.location.hostname+'\/js\/filaalkiezer_googlemaps.js', 122);
			return false;
		}
		else
		{
			popupDiv = document.createElement('div');
			popupDiv.id = 'filiaalKiezerGoogleMaps';
			popupDiv.innerHTML = this.template;
			document.body.appendChild(popupDiv);
		}

		var mapOptions = {
			'zoom': this.zoomlevelPresets['default'],
			'center': new google.maps.LatLng(this.defaultCenter[0], this.defaultCenter[1]),
			'mapTypeId': google.maps.MapTypeId.ROADMAP,
			'mapTypeControl': false,
			'navigationControlOptions': { 'position': google.maps.ControlPosition.TOP_LEFT }
		};

		this.geocoder = new google.maps.Geocoder();
		this.map = new google.maps.Map(document.getElementById("filiaalKiezerGoogleMapsContent"), mapOptions);

		var vastebox = document.getElementById('filiaalkiezer_vastecontent');
		for (var i = 0; i < this.filialen.length; i++)
		{
			this.filialen[i].div = document.createElement('div');
			this.filialen[i].div.id = 'filiaalkiezer_anvr'+this.filialen[i].filiaal_anvr;
			this.filialen[i].div.innerHTML = this.filialen[i].filiaal_plaats+', '+this.filialen[i].filiaal_naam+(this.filialen[i].filiaal_wijk ? ' ('+this.filialen[i].filiaal_wijk+')' : '');
			if (this.filialen[i].filiaal_bas == '0' && this.nietBAS != 'show')
				this.filialen[i].div.className = 'nietBAS_'+this.nietBAS;
			vastebox.appendChild(this.filialen[i].div);
			eventHandler.add(this.filialen[i].div, 'mouseover', null, function(element) { element.className += ' mouseover'; return true; });
			eventHandler.add(this.filialen[i].div, 'mouseout', null, function(element) { element.className = element.className.replace(/ ?mouseover/g, ''); return true; });
			eventHandler.add(this.filialen[i].div, 'click', null, function(element) { return filiaalkiezer.selectFiliaal(element.id.replace(/^filiaalkiezer_anvr/, '')); });

			if (this.filiaal && this.filialen[i].filiaal_anvr == this.filiaal.filiaal_anvr)
				this.filialen[i].div.className = 'selected';

			if (parseFloat(this.filialen[i].filiaal_latitude) && parseFloat(this.filialen[i].filiaal_longitude))
			{
				this.filialen[i].positie = new google.maps.LatLng(parseFloat(this.filialen[i].filiaal_latitude), parseFloat(this.filialen[i].filiaal_longitude));
				this.filialen[i].marker = new google.maps.Marker({ 'position': this.filialen[i].positie, 'map': this.map, 'title': 'Toerkoop reisburo '+this.filialen[i].filiaal_naam+(this.filialen[i].filiaal_wijk ? ' ('+this.filialen[i].filiaal_wijk+')' : ''), 'icon': this.getMarkerImage(this.filiaal && this.filialen[i].filiaal_anvr == this.filiaal.filiaal_anvr ? 'selected' : (this.filialen[i].filiaal_bas == '1' || this.nietBAS == 'show' ? 'filiaal' : 'disabled')), 'clickable': true, 'visible': this.nietBAS != 'hide' });
				this.setMarkerEvent(this.filialen[i].marker, i);
			}
		}

		google.maps.event.addListener(this.map, 'zoom_changed', function() { return filiaalkiezer.zoom(filiaalkiezer.map.getZoom()); });

		var zoektermInput = document.getElementById('filiaalkiezer_zoekterm');
		eventHandler.add(zoektermInput, 'keydown', null, function(element) { if (!element.className.match(/ on$/)) element.className += ' on'; return true; });
		eventHandler.add(zoektermInput, 'keyup', null, function(element)
		{
			if (filiaalkiezer.geocoderTimeout)
				clearTimeout(filiaalkiezer.geocoderTimeout);

			if (element.value)
				filiaalkiezer.geocoderTimeout = setTimeout(function() { filiaalkiezer.zoekCoordinaten(element.value); return true; }, 1500);

			else
			{
				filiaalkiezer.geocoderTimeout = 0;
				element.className = element.className.replace(/ on/g, '');
			}
			return true;
		});

		eventHandler.add(document.getElementById('filiaalkiezer_knop_kies'), 'click', null, function(element) { return filiaalkiezer.saveSelectedFiliaal(); });
		eventHandler.add(document.getElementById('filiaalkiezer_knop_sluiten'), 'click', null, function(element) { return filiaalkiezer.close(); });
		eventHandler.add(document.getElementById('filiaalKiezerGoogleMapsSluiten'), 'click', null, function(element) { return filiaalkiezer.close(); });

		if (typeof toerkoop !== 'undefined' && toerkoop.klantlocatie)
		{
			zoektermInput.value = toerkoop.klantlocatie;
			zoektermInput.className += ' on';
			this.zoekCoordinaten(toerkoop.klantlocatie);
		}

		return true;
	},

	'zoekCoordinaten': function(zoekterm, attempt)
	{
		if (typeof attempt == 'undefined')
			attempt = 1;
		else if (attempt >= 2)
		{
			// Controleer of de input van de klant inmiddels veranderd is. Zo ja,
			// dan triggert hij zelf wel een nieuwe zoekopdracht en kan deze poging
			// vergeten worden. Zo niet, dan geven de foutmelding alsnog.
			var huidigeZoekterm = document.getElementById('filiaalkiezer_zoekterm').value;
			if (zoekterm != huidigeZoekterm.replace(/^\s|\s$/g, ''))
				return false;

			return this.showMessage('Ongeldige postcode: <b>'+xmlEscape(zoekterm)+'<\/b>', 'error');
		}

		zoekterm = zoekterm.replace(/^\s|\s$/g, '');
		if (!zoekterm)
			return false;

		var zoekType = zoekterm.match(/^[0-9]+/) ? 'postcode' : 'plaats';
		if (zoekType == 'postcode')
			zoekterm = zoekterm.replace(/\s/, '').toUpperCase();

		if (zoekType == 'postcode')
		{
			if (zoekterm.match(/^[0-9]{1,3}([^0-9]|$)/))
			{
				// Als de postcode uit minder dan 4 cijfers bestaat, is de klant
				// waarschijnlijk niet zo handig met typen en heeft nog even tijd
				// nodig. Wij wachten nog 3 seconden, en dan proberen we het nog
				// een keer. Heeft de klant dan nog niks aangepast, dan geven we
				// een foutmelding terug.
				setTimeout(function() { return filiaalkiezer.zoekCoordinaten(zoekterm, 2); }, 3000);
				return false;
			}

			if (!zoekterm.match(/^[0-9]{4} ?([a-z]{2})?$/i))
			{
				// Ongeldige postcode
				return this.showMessage('Ongeldige postcode: <b>'+xmlEscape(zoekterm)+'<\/b>', 'error');
			}
		}

		if (this.cache[zoekterm])
			return this.verwerkZoekresultaten(this.cache[zoekterm][0].geometry.location, zoekterm);

		if (this.currentlyGeocoding)
		{
			this.geocodeNext = zoekterm;
			return true;
		}

		this.currentlyGeocoding = zoekterm;
		var geocodingOptions = {
			'address': zoekterm,
			'region': 'NL'
		};

		this.geocoder.geocode(geocodingOptions, function(results, status) { return filiaalkiezer.saveGeocodingResults(results, status, zoekterm); });
		return true;
	},

	'saveGeocodingResults': function(results, status, zoekterm)
	{
		this.currentlyGeocoding = '';
		this.cache[zoekterm] = results;

		if (this.geocodeNext)
		{
			var next = this.geocodeNext;
			this.geocodeNext = '';
			return this.zoekCoordinaten(next);
		}

		var zoekType = zoekterm.match(/^[0-9]+/) ? 'postcode' : 'plaats';

		for (var i = results.length -1; i >= 0; i--)
		{
			var isPlaats = false;
			var isPostcode = false;
			var inNederland = false;

			// Type controleren. Het moet wel een postcode of een plaats zijn,
			// geen straatnaam of een bedrijf of zo. Dus 'locality' of 'sublocality'
			// voor een plaats, en 'postal_code' voor een postcode.
			for (var t = 0; t < results[i].types.length; t++)
			{
				isPlaats = isPlaats || results[i].types[t].match(/^(sub)?locality$/);
				isPostcode = isPostcode || results[i].types[t].match(/^postal_code$/);
			}
			if ((zoekType == 'plaats' && !isPlaats) || (zoekType == 'postcode' && !isPostcode))
			{
				results.splice(i, 1);
				continue;
			}

			// Controleren of de gevonden locaties wel in Nederland liggen. Als iemand
			// bijvoorbeeld 'New York' intypt of '9999ZZ' vinden we geen resultaten,
			// ook al komt Google wel met antwoorden.
			for (var v = 0; v < results[i].address_components.length; v++)
			{
				if (inNederland || results[i].address_components[v].long_name != 'Nederland')
					continue;
				for (t = 0; t < results[i].address_components[v].types.length; t++)
					inNederland = inNederland || results[i].address_components[v].types[t] == 'country';
			}
			if (!inNederland)
			{
				results.splice(i, 1);
				continue;
			}
		}

		if (results.length == 0 || status != google.maps.GeocoderStatus.OK)
			return this.showMessage('Kan de '+zoekType+' <b>'+xmlEscape(zoekterm)+'<\/b> niet vinden', 'error');

		return this.verwerkZoekresultaten(results[0].geometry.location, zoekterm);
	},

	'verwerkZoekresultaten': function(LatLng, zoekterm)
	{
		if (!this.home)
		{
			this.home = {
				'marker': new google.maps.Marker({ 'position': LatLng, 'map': this.map, 'title': 'Uitgangslocatie: '+xmlEscape(zoekterm), 'icon': this.getMarkerImage('home') }),
				'positie': LatLng
			};
		}
		else
		{
			this.home.marker.setPosition(LatLng);
			this.home.marker.setTitle('Uitgangslocatie: '+xmlEscape(zoekterm));
			this.home.positie = LatLng;
		}

		var zoom = this.zoomlevelPresets.home;
		this.zoomFunc(zoom, zoom, null, function() { return filiaalkiezer.centerFunc(LatLng, LatLng); })

		var latitude = LatLng.lat();
		var longitude = LatLng.lng();

		for (var i = 0; i < this.filialen.length; i++)
			if (this.filialen[i].positie)
				this.filialen[i].afstand = this.berekenAfstand(latitude, longitude, this.filialen[i].positie.lat(), this.filialen[i].positie.lng());

		var filialen = [ ];
		var maxDistance = 40; // km
		while (!filialen.length && maxDistance <= 100)
		{
			for (var i = 0; i < this.filialen.length; i++)
			{
				if (this.filialen[i].filiaal_bas == '0' && this.nietBAS != 'show')
					continue;

				if (this.filialen[i].afstand && this.filialen[i].afstand <= maxDistance)
					filialen.push({ 'filiaal': this.filialen[i], 'afstand': this.filialen[i].afstand });
			}
			maxDistance += 10;
		}

		if (!filialen.length)
			return this.showMessage('Er zijn geen Toerkoop servicekantoren bij u in de buurt', 'info');

		filialen.sort(function(a, b) { return a.afstand - b.afstand; });

		var variatiebox = document.getElementById('filiaalkiezer_variatiecontent');
		if (!variatiebox)
			return false;

		this.removeEventHandlers();
		while (variatiebox.hasChildNodes())
			variatiebox.removeChild(variatiebox.lastChild);

		var infoDiv = document.createElement('div');
		infoDiv.className = 'melding_info';
		variatiebox.appendChild(infoDiv);

		var filiaalDiv = document.createElement('div');
		filiaalDiv.className = 'titel';
		filiaalDiv.innerHTML = 'Kantoren in uw omgeving';
		infoDiv.appendChild(filiaalDiv);

		for (i = 0; i < Math.min(filialen.length, 6); i++)
		{
			filiaalDiv = document.createElement('div');
			filiaalDiv.id = 'filiaalkiezer_afstand'+filialen[i].filiaal.filiaal_anvr;
			filiaalDiv.innerHTML = filialen[i].filiaal.filiaal_plaats+', '+filialen[i].filiaal.filiaal_naam+(filialen[i].filiaal.filiaal_wijk ? ' ('+filialen[i].filiaal.filiaal_wijk+')' : '');
			infoDiv.appendChild(filiaalDiv);
			this.eventHandlers.push(eventHandler.add(filiaalDiv, 'mouseover', null, function(element) { element.className += ' mouseover'; return true; }));
			this.eventHandlers.push(eventHandler.add(filiaalDiv, 'mouseout', null, function(element) { element.className = element.className.replace(/ ?mouseover/g, ''); return true; }));
			this.eventHandlers.push(eventHandler.add(filiaalDiv, 'click', null, function(element) { return filiaalkiezer.selectFiliaal(element.id.replace(/^filiaalkiezer_afstand/, '')); }));

			if (this.filiaal && filialen[i].filiaal.filiaal_anvr == this.filiaal.filiaal_anvr)
				filiaalDiv.className = 'selected';
		}

		var lijstwindow = document.getElementById('lijstwindow');
		if (lijstwindow)
			lijstwindow.scrollTop = 0;

		return true;
	},

	'berekenAfstand': function(degLat1, degLng1, degLat2, degLng2)
	{
		// Coordinaten omrekenen van graden naar radialen
		var radLat1 = degLat1 * Math.PI / 180;
		var radLng1 = degLng1 * Math.PI / 180;
		var radLat2 = degLat2 * Math.PI / 180;
		var radLng2 = degLng2 * Math.PI / 180;
		var earthRadius = 6367;  // km

		return Math.abs(earthRadius * Math.acos(Math.sin(radLat1) * Math.sin(radLat2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.cos(radLng2 - radLng1)));
	},

	'selectFiliaal': function(anvr)
	{
		if (this.filiaal && anvr == this.filiaal.filiaal_anvr)
		{
			// Dan kiest de klant opnieuw het huidige filiaal, dat al gekozen was.
			// Er verandert dan dus niks. We centreren 'm alleen weer op de kaart.
			if (this.filiaal.marker)
			{
				var defaultZoom = this.zoomlevelPresets['default'];
				var filiaalZoom = this.zoomlevelPresets.filiaal;
				var filiaalPositie = this.filiaal.positie;

				this.zoomFunc(defaultZoom, filiaalZoom, filiaalPositie, function() { return filiaalkiezer.centerFunc(filiaalPositie, filiaalPositie); });
			}

			return true;
		}

		// Huidige selectie uitzetten
		if (this.filiaal)
		{
			this.filiaal.div.className = this.filiaal.div.className.replace(/ ?selected/g, '');
			if (this.filiaal.marker)
				this.filiaal.marker.setIcon(this.getMarkerImage(this.filiaal.filiaal_bas == '1' || this.nietBAS != 'showDisabled' ? 'filiaal' : 'disabled'));
		}

		// 'Kantoren in uw omgeving' deselecteren
		var afstandDivs = document.getElementById('filiaalkiezer_variatiecontent').getElementsByTagName('div');
		for (i = 2; i < afstandDivs.length; i++)
			if (afstandDivs[i].id.match(/^filiaalkiezer_afstand[0-9]+$/))
				afstandDivs[i].className = afstandDivs[i].className.replace(/ ?selected/g, '');

		// Nieuwe filiaal opzoeken
		for (var i = 0; i < this.filialen.length; i++)
			if (this.filialen[i].filiaal_anvr == anvr)
				this.filiaal = this.filialen[i];

		this.anvr = this.filiaal.filiaal_anvr;

		// Kantoordiv(s) en marker van nieuwe filiaal selecteren
		this.filiaal.div.className += ' selected';
		var afstandDiv = document.getElementById('filiaalkiezer_afstand'+anvr);
		if (afstandDiv)
			afstandDiv.className += ' selected';

		if (this.filiaal.marker)
		{
			this.filiaal.marker.setIcon(this.getMarkerImage('selected'));

			var defaultZoom = this.zoomlevelPresets['default'];
			var filiaalZoom = this.zoomlevelPresets.filiaal;
			var filiaalPositie = this.filiaal.positie;

			this.zoomFunc(defaultZoom, filiaalZoom, filiaalPositie, function() { return filiaalkiezer.centerFunc(filiaalPositie, filiaalPositie); });
		}

		this.showFiliaalData();

		return true;
	},

	'saveSelectedFiliaal': function()
	{
		if (!this.filiaal)
			return false;

		var zoektermInput = document.getElementById('filiaalkiezer_zoekterm');
		var zoekterm = zoektermInput ? zoektermInput.value : '';

		ajax.send('\/ajax\/filiaal_select.php?action=select_filiaal&anvr='+this.anvr+'&zoekterm='+encodeURIComponent(zoekterm), '', function(filiaalData, passthruData, ajaxStatus) { if (ajaxStatus == 'ok') filiaalkiezer.verwerkSelectedFiliaal(filiaalData); return true; });

		return true;
	},

	'verwerkSelectedFiliaal': function(filiaalData)
	{
		select_filiaal_response(filiaalData);

		return this.close();
	},

	'showMessage': function(mess, messType)
	{
		var variatiebox = document.getElementById('filiaalkiezer_variatiecontent');
		if (!variatiebox)
			return false;

		if (typeof messType == 'undefined' || (messType != 'error' && messType != 'info'))
			messType = 'error';

		this.removeEventHandlers();
		variatiebox.innerHTML = '<div class="melding_'+messType+'">'+mess+'<\/div>';

		var lijstwindow = document.getElementById('lijstwindow');
		if (lijstwindow)
			lijstwindow.scrollTop = 0;

		return true;
	},

	'showFiliaalData': function()
	{
		var filiaalbox = document.getElementById('filiaalkiezer_servicekantoor');
		if (!filiaalbox)
			return false;

		if (!this.filiaal)
			return false;

		var html = [ '<h3>Geselecteerde servicekantoor<\/h3><div class="servicekantoor_locatie">' ];
		html.push(this.filiaal.filiaal_naam+'<br \/>');
		if (this.filiaal.filiaal_wijk)
			html.push(this.filiaal.filiaal_wijk+'<br \/>');
		html.push(this.filiaal.filiaal_straat+' '+this.filiaal.filiaal_nummer+'<br \/>');
		html.push(this.filiaal.filiaal_postcodestraat+' '+this.filiaal.filiaal_plaats);
		html.push('<\/div><div class="servicekantoor_contact">');
		if (this.filiaal.filiaal_telefoon)
			html.push('Telefoon: '+this.filiaal.filiaal_telefoon+'<br \/>');
		if (this.filiaal.filiaal_fax)
			html.push('Fax: '+this.filiaal.filiaal_fax+'<br \/>');
		if (this.filiaal.filiaal_email)
			html.push('E-mail: '+this.filiaal.filiaal_email);
		if (this.filiaal.filiaal_bas == '0' && this.nietBAS != 'show')
			html.push('<br \/><span class="nietBAS">(Geen inlogmogelijkheid)<\/span>');
		html.push('<\/div>');

		filiaalbox.innerHTML = html.join('');
		return true;
	},

	'zoom': function(zoomlevel)
	{
		var oudeMarker = this.getMarkerImage('filiaal');
		this.zoomlevel = zoomlevel;
		var nieuweMarker = this.getMarkerImage('filiaal');
		var nieuweMarkerDisabled = this.getMarkerImage('disabled');

		if (oudeMarker === nieuweMarker)
			return true;

		for (var i = 0; i < this.filialen.length; i++)
			if (this.filialen[i].marker)
				this.filialen[i].marker.setIcon(this.filialen[i].filiaal_bas == '0' && this.nietBAS == 'showDisabled' ? nieuweMarkerDisabled : nieuweMarker);

		if (this.filiaal && this.filiaal.marker)
			this.filiaal.marker.setIcon(this.getMarkerImage('selected'));

		if (this.home)
			this.home.marker.setIcon(this.getMarkerImage('home'));

		return true;
	},

	'getMarkerImage': function(type)
	{
		if (!this.markerImages.filiaal)
		{
			this.markerImages.filiaal = [
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerA_off.gif', new google.maps.Size(5, 5), new google.maps.Point(0, 0), new google.maps.Point(2, 3)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerB_off.gif', new google.maps.Size(12, 12), new google.maps.Point(0, 0), new google.maps.Point(6, 6)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerC_off.gif', new google.maps.Size(20, 20), new google.maps.Point(0, 0), new google.maps.Point(10, 10)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerD_off.gif', new google.maps.Size(43, 43), new google.maps.Point(0, 0), new google.maps.Point(21, 22)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerE_off.gif', new google.maps.Size(72, 72), new google.maps.Point(0, 0), new google.maps.Point(36, 36))
			];
			this.markerImages.disabled = [
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerA_disabled.gif', new google.maps.Size(5, 5), new google.maps.Point(0, 0), new google.maps.Point(2, 3)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerB_disabled.gif', new google.maps.Size(12, 12), new google.maps.Point(0, 0), new google.maps.Point(6, 6)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerC_disabled.gif', new google.maps.Size(20, 20), new google.maps.Point(0, 0), new google.maps.Point(10, 10)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerD_disabled.gif', new google.maps.Size(43, 43), new google.maps.Point(0, 0), new google.maps.Point(21, 22)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerE_disabled.gif', new google.maps.Size(72, 72), new google.maps.Point(0, 0), new google.maps.Point(36, 36))
			];
			this.markerImages.selected = [
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerA_on.gif', new google.maps.Size(5, 5), new google.maps.Point(0, 0), new google.maps.Point(2, 3)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerB_on.gif', new google.maps.Size(12, 12), new google.maps.Point(0, 0), new google.maps.Point(6, 6)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerC_on.gif', new google.maps.Size(20, 20), new google.maps.Point(0, 0), new google.maps.Point(10, 10)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerD_on.gif', new google.maps.Size(43, 43), new google.maps.Point(0, 0), new google.maps.Point(21, 22)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerE_on.gif', new google.maps.Size(72, 72), new google.maps.Point(0, 0), new google.maps.Point(36, 36))
			];
			this.markerImages.home = [
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerC_home.gif', new google.maps.Size(20, 18), new google.maps.Point(0, 0), new google.maps.Point(10, 9)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerC_home.gif', new google.maps.Size(20, 18), new google.maps.Point(0, 0), new google.maps.Point(10, 9)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerC_home.gif', new google.maps.Size(20, 18), new google.maps.Point(0, 0), new google.maps.Point(10, 9)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerD_home.gif', new google.maps.Size(43, 37), new google.maps.Point(0, 0), new google.maps.Point(21, 19)),
				new google.maps.MarkerImage('\/images\/markers\/mapsMarkerE_home.gif', new google.maps.Size(65, 57), new google.maps.Point(0, 0), new google.maps.Point(32, 28))
			];
		}

		if (typeof type == 'undefined' || !type.match(/^(filiaal|disabled|selected|home)$/))
			type = 'filiaal';

		if (this.zoomlevel >= 19)
			return this.markerImages[type][4];
		else if (this.zoomlevel >= 16)
			return this.markerImages[type][3];
		else if (this.zoomlevel >= 12)
			return this.markerImages[type][2];
		else if (this.zoomlevel >= 7)
			return this.markerImages[type][1];
		else
			return this.markerImages[type][0];
	},

	'parseTemplate': function(templateData)
	{
		var templatePart = templateData.replace(/^(?:.*?\r?\n){3}/, '');
		return templatePart.replace(/\{!--(\r|\n|.)*?--\}/g, '').replace(/(^\s+)|(\s+$)/g, '');
	},

	'setMarkerEvent': function(marker, i)
	{
		var anvr = this.filialen[i].filiaal_anvr;
		google.maps.event.addListener(marker, 'click', function() { return filiaalkiezer.selectFiliaal(anvr); });
	},

	'removeEventHandlers': function()
	{
		while (this.eventHandlers.length > 0)
		{
			var handlerId = this.eventHandlers.pop();
			eventHandler.remove(handlerId);
		}

		return true;
	},

	/**
	 * centerFunc en zoomFunc bestaan alleen maar om timing problemen met het
	 * laden van de kaart op te vangen. De functie getZoom en getBounds geven
	 * geen resultaat terug als de kaart nog niet geladen is. Daarom is er een
	 * wacht-constructie nodig.
	 */
	'centerFunc': function(boundsPositie, centerPositie)
	{
		if (!filiaalkiezer.map.getBounds())
			setTimeout(function() { return filiaalkiezer.centerFunc(boundsPositie, centerPositie); }, 100);

		else if (!filiaalkiezer.map.getBounds().contains(boundsPositie))
			filiaalkiezer.map.setCenter(centerPositie);

		return true;
	},

	'zoomFunc': function(minimalZoom, targetZoom, boundsPositie, callNext)
	{
		if (!filiaalkiezer.map.getZoom() || !filiaalkiezer.map.getBounds())
			setTimeout(function() { return filiaalkiezer.zoomFunc(minimalZoom, targetZoom, boundsPositie, callNext); }, 100);

		else if (this.map.getZoom() <= minimalZoom || !boundsPositie || !this.map.getBounds().contains(boundsPositie))
		{
			this.zoom(targetZoom);
			this.map.setZoom(targetZoom);

			if (callNext)
				return callNext();
		}

		return true;
	}

};


