var GoogleMaps = {
	map: undefined,

	init: function () {
		if ($('map-holder'))
			$('map-holder').getFirst('div.handle').addEvent('click', GoogleMaps.checkForMap);

		if ($('route-holder'))
			GoogleMaps.buildRoutePlottingHTML();
	},

	checkForMap: function () {
		if (!$('map'))
			window.setTimeout(GoogleMaps.loadMap, 100);
	},

	loadMap: function () {
		$('map-holder').getFirst('div.content').adopt(new Element('div', {'id': 'map'}));

		GoogleMaps.map = new GMap2($('map'));
		var icon = new GIcon();

		icon.image = '/images/maps-icon-driebit.png';
		icon.shadow = '/images/maps-icon-driebit_shadow.png';
		icon.iconSize = new GSize(27, 26);
		icon.shadowSize = new GSize(35, 26);
		icon.iconAnchor = new GPoint(8, 26);
		icon.infoWindowAnchor = new GPoint(8, 0);

		var officeLocation = new GLatLng(52.369517,4.894556);
		var office = new GMarker(officeLocation, icon);

		GoogleMaps.map.setCenter(officeLocation, 16);
		GoogleMaps.map.addOverlay(office);
		GoogleMaps.map.addControl(new GMapTypeControl());
		GoogleMaps.map.addControl(new GSmallMapControl());
		GoogleMaps.map.addControl(new GOverviewMapControl());

		GEvent.addListener(office, 'click', function () {
			var panoramaHolder = new Element('div', {'style': 'width:600px;height:300px'});
			this.openInfoWindow(panoramaHolder)

			window.setTimeout(function () {
				var streetView = new GStreetviewClient();
				streetView.getNearestPanorama(officeLocation, function (data) {
					var panorama = new GStreetviewPanorama(panoramaHolder, {
						latlng: officeLocation,
						pov: {
							yaw: 101.84,
							pitch: 0,
							zoom: 0
						}
					});
				});
			}, 100);
		});
	},

	buildRoutePlottingHTML: function () {
		var plotterHTML = new Element('p', {'id': 'route-form'}).adopt(
			new Element('label', {'html': 'Voer uw postcode in (bv. 1234AB)', 'for': 'postcode'}),
			new Element('br'),
			new Element('input', {'type': 'text', 'id': 'postcode'}),
			new Element('br'),
			new Element('input', {'type': 'radio', 'id': 'travel-car', 'checked': 'checked', 'name': 'travelmode'}),
			new Element('label', {'for': 'travel-car', 'html': 'Ik reis per auto/motor'}),
			new Element('br'),
			new Element('input', {'type': 'radio', 'id': 'travel-foot', 'name': 'travelmode'}),
			new Element('label', {'for': 'travel-foot', 'html': 'Ik reis te voet'}),
			new Element('br'),
			new Element('input', {'type': 'button', 'value': 'Plan route'}).addEvent('click', GoogleMaps.plotRoute)
		);

		var routeSteps = new Element('div', {'id': 'route-steps'});

		$('route-holder').getElement('div.content').adopt(plotterHTML, routeSteps);
	},

	plotRoute: function () {
		if ($('route-holder').getElement('div.content div.feedback-error'))
			$('route-holder').getElement('div.content div.feedback-error').destroy();

		if (GoogleMaps.map && $('map-holder').hasClass('foldedout')) {
			var routePlanner = new GDirections(GoogleMaps.map);
		} else {
			var routePlanner = new GDirections();
		}

		var routeOptions = {
			locale: 'nl_NL',
			avoidHighways: false,
			preserveViewport: false,
			getSteps: true,
			travelMode: $('travel-foot').checked ? G_TRAVEL_MODE_WALKING : G_TRAVEL_MODE_DRIVING
		}

		var postcodeInput = $('postcode').get('value').replace(/\s/, '');

		if (postcodeInput.test(/^[0-9]{4}[a-z]{2}/i)) {
			GEvent.addListener(routePlanner, 'error', GoogleMaps.directionsError);
			GEvent.addListener(routePlanner, 'load', GoogleMaps.buildStepsHTML);

			routePlanner.load('from: ' + postcodeInput + ' The Netherlands to: 1012ez The Netherlands', routeOptions);

		} else {
			$('route-holder').getElement('div.content').grab(
				new Element('div', {'class': 'feedback-error'}).grab(
					new Element('p', {'html': 'U Heeft een ongeldige postcode ingevoerd.'})
				), 'top'
			);
		}
	},

	buildStepsHTML: function () {
		var stepsTable = new Element('table', {'id': 'route'});
		var route = this.getRoute(0);
		var stepsCount = route.getNumSteps();
		var step, description, distance, duration;

		for (var i=0; i<stepsCount; i++) {
			step = route.getStep(i);

			stepsTable.adopt(
				new Element('tr').adopt(
					new Element('td', {'html': (i+1).toString()}),
					new Element('td', {'html': step.getDescriptionHtml()}),
					new Element('td', {'html': step.getDistance().html, 'class': 'distance'}),
					new Element('td', {'html': step.getDuration().html, 'class': 'duration'})
				)
			);
		}

		$('route-steps').empty();
		$('route-steps').grab(stepsTable);
		
		window.setTimeout(Background.resize, 100);
	},

	directionsError: function () {
		var statusCode = this.getStatus().code;

		switch (statusCode) {
			case G_GEO_UNKNOWN_ADDRESS:
			case G_GEO_UNAVAILABLE_ADDRESS:
			case G_GEO_UNKNOWN_DIRECTIONS:
				errorMessage = 'Er kon helaas voor de ingevoerde postcode geen route bepaald worden.';
			break;

			default:
				errorMessage = 'Er kon geen route bepaald worden. Probeer het later nog eens.';
			break;
		}
		
		$('route-holder').getElement('div.content').grab(
			new Element('div', {'class': 'feedback-error'}).grab(
				new Element('p', {'html': errorMessage})
			), 'top'
		);
	}
}

window.addEvent('domready', GoogleMaps.init);