/*******************************************************************************************
 * mapDirections
 * Written by Craig Francis
 * Allow the
 *******************************************************************************************/

	var mapDirections = new function() {

		//--------------------------------------------------
		// Old browsers

			if (!document.getElementById || !document.getElementsByTagName || !GBrowserIsCompatible()) {
				return;
			}

		//--------------------------------------------------
		// Initialisation

			this.init = function() {

				//--------------------------------------------------
				// Debug

					console.log('mapDirections.js: Initialisation');

				//--------------------------------------------------
				// Get references

					mapDirections.fldLatitude = document.getElementById('fldLatitude');
					mapDirections.fldLongitude = document.getElementById('fldLongitude');
					mapDirections.fldAddress = document.getElementById('fldAddress');
					mapDirections.fldDirections = document.getElementById('fldDirections');
					mapDirections.gMapRef = document.getElementById('gMap');
					mapDirections.gDirectionsRef = document.getElementById('gDirections');

					if (!mapDirections.fldLatitude || !mapDirections.fldLongitude || !mapDirections.fldAddress || !mapDirections.fldDirections || !mapDirections.gMapRef || !mapDirections.gDirectionsRef) {

						if (!mapDirections.fldLatitude)    console.log('mapDirections.js: Missing latitude field');
						if (!mapDirections.fldLongitude)   console.log('mapDirections.js: Missing longitude field');
						if (!mapDirections.fldAddress)     console.log('mapDirections.js: Missing address field');
						if (!mapDirections.fldDirections)  console.log('mapDirections.js: Missing directions field');
						if (!mapDirections.gMapRef)        console.log('mapDirections.js: Missing map holder');
						if (!mapDirections.gDirectionsRef) console.log('mapDirections.js: Missing directions holder');

						return;

					}

				//--------------------------------------------------
				// Setup map

					mapDirections.gMap = new GMap2(mapDirections.gMapRef);
					mapDirections.gDirections = new GDirections(mapDirections.gMap, mapDirections.gDirectionsRef);

					mapDirections.gMap.addControl(new GSmallMapControl());

				//--------------------------------------------------
				// Starting point

					var gIcon = new GIcon(G_DEFAULT_ICON);
					gIcon.image = '/a/img/map/marker.png';
					gIcon.iconSize = new GSize(22, 34);
					gIcon.iconAnchor = new GPoint(22, 34);
					gIcon.infoWindowAnchor = new GPoint(5, 1);

					mapDirections.pPoint = new GLatLng(mapDirections.fldLatitude.value, mapDirections.fldLongitude.value);
					mapDirections.gMarker = new GMarker(mapDirections.pPoint, gIcon);

					mapDirections.gMap.setCenter(mapDirections.pPoint, 14);
					mapDirections.gMap.addOverlay(mapDirections.gMarker);

					mapDirections.localSearch = new GlocalSearch();

				//--------------------------------------------------
				// No backup yet

					mapDirections.backup = '';

				//--------------------------------------------------
				// Error handler

					GEvent.addListener(mapDirections.gDirections, 'error', mapDirections.directionsError);

				//--------------------------------------------------
				// Handler for the directions form

					var form = getParent(mapDirections.fldDirections, 'form');
					if (form) {
						form.onsubmit = function() {
							mapDirections.getGeocode();
							return false;
						}
					}

				//--------------------------------------------------
				// Initial load value

					mapDirections.getGeocode();

			}

		//--------------------------------------------------
		// Get geocode

			this.getGeocode = function() {

				//--------------------------------------------------
				// Value

					var searchFor = mapDirections.fldDirections.value;

					if (searchFor == '') {
						console.log('mapDirections.js: No search value');
						return true;
					}

				//--------------------------------------------------
				// Build request

					mapDirections.localSearch.setSearchCompleteCallback(null,
						function() {

							//--------------------------------------------------
							// Got a response

								if (mapDirections.localSearch.results[0]) {

									//--------------------------------------------------
									// Update currentSearch

										var resultLat = mapDirections.localSearch.results[0].lat;
										var resultLng = mapDirections.localSearch.results[0].lng;

										mapDirections.currentSearch = resultLat + ', ' + resultLng;

									//--------------------------------------------------
									// Debug

										console.log('mapDirections.js: Response for lat/long convert "' + mapDirections.currentSearch + '"');

									//--------------------------------------------------
									// Get directions

										mapDirections.getDirections(null);

								} else {

									//--------------------------------------------------
									// Debug

										console.log('mapDirections.js: The lat/long convert failed');

									//--------------------------------------------------
									// Fallback

										mapDirections.getDirections(null);

								}

						});

				//--------------------------------------------------
				// Send request

					console.log('mapDirections.js: Convert "' + searchFor + '" to lat/long');

					mapDirections.currentSearch = searchFor;

					mapDirections.localSearch.execute(searchFor);

			}

		//--------------------------------------------------
		// Get directions

			this.getDirections = function(destination) {

				//--------------------------------------------------
				// Clear previous

					mapDirections.gDirections.clear();

				//--------------------------------------------------
				// Backup directions

					mapDirections.backup = mapDirections.fldLatitude.value + ', ' + mapDirections.fldLongitude.value;

				//--------------------------------------------------
				// Directions

					if (destination == null) {
						destination = mapDirections.fldAddress.value;
						//destination = [ mapDirections.fldLatitude.value, mapDirections.fldLongitude.value ];
					}

					var directions = [mapDirections.currentSearch, destination];

				//--------------------------------------------------
				// Debug

					console.log('mapDirections.js: Directions "' + mapDirections.currentSearch + '" to "' + destination + '"');

				//--------------------------------------------------
				// Show directions panel

					cssjs('add', mapDirections.gDirectionsRef, 'active');

				//--------------------------------------------------
				// Remove gMarker

					if (mapDirections.gMarker) {
						mapDirections.gMap.removeOverlay(mapDirections.gMarker);
					}

				//--------------------------------------------------
				// Get directions

					mapDirections.gDirections.loadFromWaypoints(directions, { 'locale' : 'en_UK' });

			}

		//--------------------------------------------------
		// Directions error

			this.directionsError = function() {

				//--------------------------------------------------
				// Debug

					console.log('mapDirections.js: Directions error');

				//--------------------------------------------------
				// Try backup?

					if (mapDirections.backup != '') {

						console.log('mapDirections.js: Trying the backup "' + mapDirections.backup + '"');

						mapDirections.getDirections(mapDirections.backup);

						mapDirections.backup = '';

						return;

					}

				//--------------------------------------------------
				// Re-show the main point

					mapDirections.gMap.setCenter(mapDirections.pPoint, 14);
					mapDirections.gMap.addOverlay(mapDirections.gMarker);

				//--------------------------------------------------
				// Show the error message

					mapDirections.gDirectionsRef.innerHTML = '<p class="error">Sorry, we cannot find your postcode, please try again.</p>';

			}

		//--------------------------------------------------
		// On page load

			addLoadEvent(function() {
				mapDirections.init();
			});

	}
