var directionDisplay;
var directionsService = new google.maps.DirectionsService();
var map;
var geocoder;

function initialize() {
	geocoder = new google.maps.Geocoder();
	directionsDisplay = new google.maps.DirectionsRenderer();
	var amsterdam = new google.maps.LatLng(52.1400, 5.577068);
	var myOptions = {
		zoom:7,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		center: amsterdam
	}
	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	directionsDisplay.setMap(map);
	directionsDisplay.setPanel(document.getElementById("directions"));
}

function searchLocations() {
	var from_add = document.getElementById("fromAddress").value;
	if (geocoder) {
		geocoder.geocode( { 'address': from_add}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				searchLocationsNear(results[0].geometry.location);
			} else {
				alert(address + ' not found');
			}
		});
	}
}

function downloadUrl(url,callback) {
	var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest;
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			request.onreadystatechange = doNothing;
			callback(request.responseText);
		}
	};
	request.open('GET', url, true);
	request.send(null);
}

function doNothing() {}

function parseXml(str) {
	if (window.ActiveXObject) {
		var doc = new ActiveXObject('Microsoft.XMLDOM');
		doc.loadXML(str);
		return doc;
	} else if (window.DOMParser) {
		return (new DOMParser).parseFromString(str, 'text/xml');
	}
}

function searchLocationsNear(center) {
	var searchUrl = '/xml/showrooms/nearest.php?lat=' + center.lat() + '&lng=' + center.lng();
	downloadUrl(searchUrl, function(data) {
		window.open(searchUrl);
		var xml = parseXml(data);
		var markerNodes = xml.documentElement.getElementsByTagName("marker");
		if (markerNodes.length < 1) {
			displayError(true);
			return false;
		} else {
			displayError(false);
			var name = markerNodes[0].getAttribute("name");
			var address = markerNodes[0].getAttribute("address");
			var distance = parseFloat(markerNodes[0].getAttribute("distance"));
			var latlng = new google.maps.LatLng(
											parseFloat(markerNodes[0].getAttribute("lat")),
											parseFloat(markerNodes[0].getAttribute("lng")));
			calcRoute(address);
		}
	});
}
function displayError(display) {
	if (display) {
		$('#error').css('display', '');
		$('#error p span').fadeOut(100, function() {
			$(this).fadeIn(100, function() {
				$(this).fadeOut(100, function() {
					$(this).fadeIn(100);
				});
			});
		});
	} else {
		$('#error').css('display', 'none');
	}
}
function calcRoute(end) {
	if(!end) {
		var end = document.getElementById("to").value;
	}
	
	if(end != "nearest") {
		var start = document.getElementById("fromAddress").value;
		var pattern = new RegExp('^[1-9]{1}[0-9]{3}$', ''); // Only 4 digits in postcode. Belgian, maybe?
		
		if (start.length == 4 && pattern.test(start)) {
			displayError(true);
			// alert('calcRoute('+end+')');
			return false;
		} else {
			displayError(false);
		}
		
		if(end == "H.J.E. Wenckebachweg 83, 1096AL Amsterdam") {
			$("#ov_amsterdam").show();
			$("#ov_shortcut").show();
		} else {
			$("#ov_amsterdam").hide();
			$("#ov_shortcut").hide();
		}
		
		var request = {
			origin:start,
			destination:end,
			travelMode: google.maps.DirectionsTravelMode.DRIVING
		};
		
		directionsService.route(request, function(response, status) {
			if (status == google.maps.DirectionsStatus.OK) {
				directionsDisplay.setDirections(response);
			}
		});
	} else {
		searchLocations();
	}
}
