var map;
var geocoder;
//midden van nederland
var centerLatitude = 52.120800;
var centerLongitude = 5.035950;

var locale = "nl";
//
var startZoom = 7;

	
	// for back-compatibility with /vestiging/breukelen/route
	var locations_root_node;
	if(locations_root_node == '' || !locations_root_node){
		locations_root_node = './';
	}
//	alert("locations_root_node=" + locations_root_node);


// Voor het starten van de pagina
function load() {
	var setLocation = new GLatLng(centerLatitude, centerLongitude);
	if (GBrowserIsCompatible())
	{ 
		geocoder = new GClientGeocoder();
	}
	else
	{
		document.getElementById('map').innerHTML = 'Sorry, you browser dus not fully work, but your javascript is turned on.';
	}
}

function loadmap() {
	var setLocation = new GLatLng(centerLatitude, centerLongitude);
	if (GBrowserIsCompatible())
	{ 
		geocoder = new GClientGeocoder();
		map = new GMap2(document.getElementById('map'));
        
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());

		map.setCenter(setLocation, startZoom);

		map.enableDoubleClickZoom();
		map.enableScrollWheelZoom();
//		map.setMapType(G_HYBRID_MAP);
	}
	else
	{
		document.getElementById('map').innerHTML = 'Sorry, you browser dus not fully work, but your javascript is turned on.';
	}
}

// Get value en controle op leeg waarden
function dresgetter()
{
	var inpute = document.getElementById('adres').value;
	if(inpute == "Poscode of woonplaats" || inpute == "voer postcode in")
	{
		inpute = '';
	}
	if (inpute)
		jQuery('#stores').css("display", "block");
	else
		jQuery('#stores').css("display", "none");

	var store_id = "";
	if (document.getElementById('store_id'))
		store_id = document.getElementById('store_id').value;

	if (!store_id)
	{
		var searchUrl = locations_root_node + '?act=setlocation&address='+inpute;
		GDownloadUrl(searchUrl, function(data) {});

		if(inpute != '')
		{
			searchLocations(inpute);
		}
	}
	else
	{
		viewStoreRoute(inpute, store_id);
	}
	if (jQuery('#back'))
	{
		jQuery('#back').css("display", "none");
		jQuery('#print').css("display", "none");
	//	jQuery('#back').addClass('hidden');
	}
}

// Controleren op eerste click
function verfijner ()
{
	var inpute = document.getElementById('adres').value;
	if(inpute == "Poscode of woonplaats" || inpute == "voer postcode in")
	{
		document.getElementById('adres').value = '';
	}
}

// Controle na een update voor de locatie, connect naar server voor edit van string
function placeset(input)
{

	var searchUrl = locations_root_node + '?act=place&address='+input;
	
	GDownloadUrl(searchUrl, function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName('string');
		
		input = markers[0].getAttribute('text');

		document.getElementById('adres').value = input;
		dresgetter();
	});
}

// Zoek de locatie naar google, lng lin.
function searchLocations(inpute) {
	inpute;
	if (map)
		map.clearOverlays();
	
	geocoder.getLocations(inpute + " NL", function(latlng)
	{
		if (!latlng)
		{
			alert(address + ' not found');
		}
		else
		{		
			if (latlng.Placemark.length > 1)
			{ 
				document.getElementById("stores").innerHTML = "Did you mean:";
				html = "<dl>";
				for (var i=0; i<latlng.Placemark.length; i++) {
					var p = latlng.Placemark[i].Point.coordinates;
					html += "<dd><a href='#' onclick='placeset(\""+latlng.Placemark[i].address+"\");'>"+(i+1)+":"+ latlng.Placemark[i].address +"</a></dd>";
				}
				html += "</dl>";
				document.getElementById("stores").innerHTML += html;
			}
			else
			{ 
				var p = latlng.Placemark[0].Point.coordinates;
				searchLocationsNear(p[1], p[0]);
			}
		}
	}
	);
}
//De home position zetten
function ownLocationPlace(position)
{
	var home = new GIcon(G_DEFAULT_ICON, "/images/home-dot.png");
	home.iconSize = new GSize(32,32);
	var marker = new GMarker(position, home);
	map.addOverlay(marker);
}
//Contact met de server voor moglelijke locaties in de buurt
function searchLocationsNear(lat, lng) {
	var radius = 25;
	var center = new GLatLng(lat,lng);
	if (map)
		var searchUrl = locations_root_node + '?act=near&lat=' + center.lat() + '&lng=' + center.lng();
	else
		var searchUrl = '/vestiging/storeselector/?act=near&lat=' + center.lat() + '&lng=' + center.lng();

	GDownloadUrl(searchUrl, function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName('marker');

		if (map)
			map.clearOverlays();

		var sidebar = document.getElementById('stores');
		sidebar.innerHTML = '';
		if (markers.length == 0) {
			sidebar.innerHTML = 'Geen resultaat gevonden, geen een geldige postcode of plaats';
			if (map)
				map.setCenter(setLocation, startZoom);
			return;
		}

		if (map)
		{
			var bounds = new GLatLngBounds();
			ownLocationPlace(center);
		}
		for (var i = 0; i < markers.length; i++) {
			var name = markers[i].getAttribute('name');
			var address = markers[i].getAttribute('address');
			var distance = parseFloat(markers[i].getAttribute('distance'));
			params = Array();
			params["phone"] = markers[i].getAttribute('phone');
			params["email"] = markers[i].getAttribute('email');
			params["id"]	= markers[i].getAttribute('id');
			params["city"] = markers[i].getAttribute('city');
			params["url"] = markers[i].getAttribute('url');
			params["name"] = name;
			
			var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
			parseFloat(markers[i].getAttribute('lng')));

			var marker = createMarker(point, name, address, i, params);
			parseFloat(markers[i].getAttribute('lng'));
			if (map)
				map.addOverlay(marker);
			
			var sidebarEntry = createSidebarEntry(marker, name, address, distance, i, params);
			var dl = document.createElement('dl');
			dl.appendChild(sidebarEntry);
			sidebar.appendChild(dl);

			if (map)
				bounds.extend(point);
		} 
		if (map)
			map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
	});
}
// Het maken van de punten, de eerste is blauw
function createMarker(point, name, address, i, params)
{
	var gicons = new GIcon(G_DEFAULT_ICON, "/images/BoekenTijd_google_aanwijzer.png");
	gicons.iconSize = new GSize(32,32);

	if(i==0)
	{
		var marker = new GMarker(point, gicons);
	}
	else
	{
		var marker = new GMarker(point, gicons)
	}
	var html = '<b>' + name + '</b> <br/>' + address+'<br/>'+params["phone"]+'<br/><a href="'+params["url"]+'" target="_blank">toon homepages</a>';
	GEvent.addListener(marker, 'click', function() {
		marker.openInfoWindowHtml(html);
	});
	return marker;
}


//Het maken van de aanklikbaren keuzens in het menublakje, de eerste is blauw
//function createSidebarEntry(marker, name, address, distance, i)
function createSidebarEntry(marker, name, address, distance, i, params)
{
	var dd = document.createElement('dd');
	var locatie_van = document.getElementById('adres').value;

	//var html = '<b>' + name + '</b> (' + distance.toFixed(1) + 'Km)<br/>' + address;
	var html = '<b>' + name + '</b><br/>' + address;

	if (!map)
	{
		var a = document.createElement('a');
		a.href = "#";
		a.innerHTML = html;
		dd.appendChild(a);

		a.onclick = function()
		{
			applyStore(params);
			return false;
		}
	}
	else
	{
		var div1 = document.createElement('div');
		div1.className = "button button-green right";
		var div2 = document.createElement('div');
		div2.className = "button-inner";
		var a = document.createElement('a');
		a.href = "#";
		a.innerHTML = "bepaal route";
		a.onclick = function()
		{
			getroute(address ,locatie_van, i, marker);	
			return false;
		}
		
		div2.appendChild(a);
		div1.appendChild(div2);
		dd.appendChild(div1);

		
		var div3 = document.createElement('div');
		div3.className = "button button-green right spacer-right";
		var div4 = document.createElement('div');
		div4.className = "button-inner";

		if (params["url"] != 'http://') //if empty url
		{

			var a2 = document.createElement('a');
			
			a2.href = params["url"];
			a2.setAttribute('target', '_blank');
			a2.innerHTML = "toon homepage";
			div4.appendChild(a2);
		}

		div3.appendChild(div4);
		dd.appendChild(div3);

		var span = document.createElement('span');
		span.innerHTML = html;
		dd.appendChild(span);

	}

	if(i==0)
		dd.className = 'nearest'; 

	return dd;
}

function handleErrors(){
	if (directions.getStatus().code == G_GEO_UNKNOWN_ADDRESS) {
		alert("De locatie van het opgegeven vertrekadres kon niet worden bepaald.n Foutcode: " + directions.getStatus().code);
	}else if (directions.getStatus().code == G_GEO_SERVER_ERROR) {
		alert("Er is iets misgegaan. Maar het is onduidelijk WAT!n Foutcode: " + directions.getStatus().code);
	}else if (directions.getStatus().code == G_GEO_MISSING_QUERY) {
		alert("Een parameter ontbreekt. Misschien was er geen vertrekpunt ingevoerd.n Foutcode: " + directions.getStatus().code);
	}else if (directions.getStatus().code == G_GEO_BAD_KEY) {
		alert("De Google Maps sleutel is ongeldig of de gebruikte sleutel is niet geldig voor dit domein. n Foutcode: " + directions.getStatus().code);
	}else if (directions.getStatus().code == G_GEO_BAD_REQUEST) {
		alert("De aanvraag voor het plannen van een route is mislukt.n Foutcode: " + directions.getStatus().code);
	}else {
		alert("Er is iets misgegaan. Maar het is volstrekt onduidelijk WAT de oorzaak is!");
	}
}

function getroute(address, locatie_van, i, marker)
{
	map.setZoom(startZoom+1);
	if(jQuery('#back') && !document.getElementById('store_id').value)
//		jQuery('#back').removeClass('hidden');
		jQuery('#back').css("display", "block");

	jQuery('#print').css("display", "block");

	directionsPanel = document.getElementById("stores");
	directionsPanel.innerHTML = "";
	directions = new GDirections(map, directionsPanel);
	directions.load("from: "+locatie_van+", NL to: "+address+", NL",{getSteps:true, locale:locale});
	GEvent.addListener(directions, "error", handleErrors);
	GEvent.addListener(directions, "load", function() {
		directions.getMarker(0).getIcon().image = "";
		directions.getMarker(1).getIcon().image = "";
//		G_MAP_MARKER_PANE
	//	var route = directions.getRoute(0);

	//	var afstand = route.getDistance().meters;

		map.addOverlay(marker);
		GEvent.trigger(marker, 'click');
		
//		if (afstand <= (afst*1000)){
//			alert(afstand);
//		}
	});
}

function addLocatie(data, i)
{
	locaties = data.locaties.length;

	if (locaties >= 1){
		directions = new GDirections();

		var locatie_van = postcode;
		var locatie_naar;

		if (data.locaties[i].locatie.straat != ""){
			locatie_naar = data.locaties[i].locatie.straat + ", " + data.locaties[i].locatie.plaats+ ", " + data.locaties[i].locatie.provincie;
		}else{
			locatie_naar = data.locaties[i].locatie.postcode;
		}

		directions.load("from: "+locatie_van+", NL to: "+locatie_naar+", NL",{locale:locale,getSteps:true});

		GEvent.addListener(directions, "error", handleErrors);
		GEvent.addListener(directions, "load", function() {
			var route = directions.getRoute(0);
			var afstand = route.getDistance().meters;

			if (afstand <= (afst*1000)){
				var duur = route.getDuration();
				duur = duur.html;
				addRoute(routes, afstand, data.locaties[i].locatie.naam, data.locaties[i].locatie.postcode, data.locaties[i].locatie.straat, data.locaties[i].locatie.plaats, duur);
				routes.sort(sortAfstand);

				displayVestigingen(routes);
			}

			if ((i+1) != locaties){
				addLocatie(data, (i+1));
			}

		});
	}else{
		//alert("Er zijn geen vestigingen gevonden.");
	}
}

function addRoute(arr, afstand, naam, postcode, straat, plaats, tijd)
{
	arr[arr.length] = [afstand, naam, postcode, straat, plaats, tijd];
}

var route_id;

function tekenRoute(p,i)
{
	route_id = i;

	direction.load("from: "+postcode+", NL to: "+p+", NL",{getSteps:true});

	GEvent.addListener(direction, "error", handleErrors);
	GEvent.addListener(direction, "load", function(){
		var html = '';
		var numRoutes = direction.getNumRoutes();

		for (var r = 0 ; r < numRoutes ; r++ ) {
			var route = direction.getRoute(r);
			var numSteps = route.getNumSteps();

			html += '<table cellspacing="0" cellpadding="0" width="100%" class="text">';
			for (var s = 0 ; s < numSteps ; s++ ) {
				var step = route.getStep(s);
				var stepBeschrijving = step.getDescriptionHtml();
				var stepAfstand = step.getDistance();
				var stepDuur = step.getDuration();

				html += '<tr><td valign="top">&nbsp;' + (s+1) + '.</td><td> ' + stepBeschrijving + '</td><td>' + stepAfstand.html + '</td></tr>';
			}
			html += '</table>';
		}
		for(var i = 0; i < routes.length; i++){
			document.getElementById("route"+ i+"").innerHTML = '';
		}
		document.getElementById("route"+route_id+"").innerHTML = html;
	});
}
function viewStoreRoute(inpute, store_id)
{
	if (map)
		map.clearOverlays();


	if (store_id)
	{
		var searchUrl = locations_root_node + '?act=getstore';

		GDownloadUrl(searchUrl, function(data) {
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName('marker');
	
			map.clearOverlays();
			var sidebar = document.getElementById('stores');
			sidebar.innerHTML = '';
			if (markers.length == 0) {
				sidebar.innerHTML = 'No results found. Please try to add a city name or a postal code';
				map.setCenter(setLocation, startZoom);
				return;
			}
	
	
			var bounds = new GLatLngBounds();
				
			for (var i = 0; i < markers.length; i++) {
				var name = markers[i].getAttribute('name');
				address = markers[i].getAttribute('address');
				var distance = parseFloat(markers[i].getAttribute('distance'));
				params = Array();
				params["phone"] = markers[i].getAttribute('phone');
				params["email"] = markers[i].getAttribute('email');
				params["id"]	= markers[i].getAttribute('id');
				params["city"] = markers[i].getAttribute('city');
				params["url"] = markers[i].getAttribute('url');
				params["name"] = name;
					
				var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')),
				parseFloat(markers[i].getAttribute('lng')));
	
				marker = createMarker(point, name, address, i, params);
				if (!inpute)
				{
					map.addOverlay(marker);
					bounds.extend(point);
					map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
					GEvent.trigger(marker, 'click');
				}
			} 
			
			if (inpute)
			{
				geocoder.getLocations(inpute + " NL", function(latlng)
				{
					if (!latlng)
					{
						alert(address + ' not found');
					}
					else
					{		
						if (latlng.Placemark.length == 1)
						{ 
							var p = latlng.Placemark[0].Point.coordinates;
							lat = p[1];
							lng = p[0];
							var center = new GLatLng(lat,lng);
							getroute(address , inpute, 0, marker);	
							ownLocationPlace(center);
						}
					}
				}
				);
			}

		//	GEvent.trigger(marker, 'click');
		});
	}
	
}

function transport() {
	if (typeof XMLHttpRequest != 'undefined')
		return new XMLHttpRequest();
	else
		return new ActiveXObject("Microsoft.XMLHTTP");
}

function viewShops()
{
	var inpute = document.getElementById('adres').value;
	if(inpute == "Poscode of woonplaats" || inpute == "voer postcode in")
	{
		inpute = '';
	}

	var req = transport();


	req.onreadystatechange = function()
	{
		if (req.readyState!=4)
			return;
		if (req.status!=200)
			return;
	
		xml = req.responseXML;
		var markers = xml.documentElement.getElementsByTagName('marker');

		var sidebar = document.getElementById('stores');
		sidebar.innerHTML = '';
		if (markers.length == 0) {
			sidebar.innerHTML = 'No results found. Please try to add a city name or a postal code';
			return;
		}

		for (var i = 0; i < markers.length; i++) {
			var name = markers[i].getAttribute('name');
			var address = markers[i].getAttribute('address');
			var distance = parseFloat(markers[i].getAttribute('distance'));
			params = Array();
			params["phone"] = markers[i].getAttribute('phone');
			params["email"] = markers[i].getAttribute('email');
			params["id"]	= markers[i].getAttribute('id');
			params["city"] = markers[i].getAttribute('city');
			params["url"] = markers[i].getAttribute('url');
			params["name"] = name;

			var sidebarEntry = createSidebarEntry('', name, address, distance, i, params);
			var dl = document.createElement('dl');
			dl.appendChild(sidebarEntry);
			sidebar.appendChild(dl);
		} 

	}
	
	var searchUrl = '/vestiging/storeselector/?act=near&address='+inpute;	
	req.open("GET", searchUrl);
	req.send("");

}

