var map;
var gdir;
var geocoder;
var addressMarker;
var autocompleter = false;

/*Add the Gmaps Marker to the map*/
function isoMap() {
	var markerItems = $$('#locationsHtml li');
	$('locationFrom').setAttribute('autocomplete','off');
	$('swapNode').show();
	$('swapItem1').addClassName('active');
	
	if (GBrowserIsCompatible()){
		map = new GMap2($('map_canvas'));
        map.setCenter(new GLatLng(50.5, 13.13), 5);
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
		gdir = new GDirections(map, document.getElementById("directions"));
		geoCoder = new GClientGeocoder();
		GEvent.addListener(gdir, "error", handleErrors);
		for (var i = 0; i < markerItems.length; i++) {
			map.addOverlay(createMarker(markerItems[i],i+1));
		}
	}
}

/*Create the Gmaps Marker*/
function createMarker(places, index) {
	var latlon = places.className.split(" ");
	var baseIcon = new GIcon(G_DEFAULT_ICON);
	var marker = new GMarker(new GLatLng(latlon[0],latlon[1]));
	
	//add listener to swapList Item
	if($('swapItem'+index)){
		GEvent.addDomListener($('swapItem'+index), "click", function() {
			marker.openInfoWindowHtml(places.innerHTML);
		});
	}
	//add listener to the marker
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(places.innerHTML);
	});
	return marker;
}

function setSuggestionValue(el){
	$('locationFrom').setValue(el.innerHTML);
	setDirections($('locationTo'),$('locationFrom'));
}

function removeSuggestionMarker(el){
	Element.removeClassName(el,'selected');
}

function setSuggestionMarker(el){
	Element.addClassName(el,'selected');
}
function getSuggestions(el){
	geoCoder.getLocations(el.value, function(response){
		if(response.Status.code == 200){
			var output = '<ul>';
			for(i=0;i<response.Placemark.length;i++){
				output += '<li onclick="setSuggestionValue(this)" onmouseover="setSuggestionMarker(this)" onmouseout="removeSuggestionMarker(this)">'+response.Placemark[i].address+'</li>';
			}
			output +='</ul>';
			$('mapSuggestion').show();
			$('mapSuggestion').update(output);
		}
	});
}

function setDirections(to, from) {
	geoCoder.getLocations(from.value, function(response){
		if(response.Status.code == 200){
			$('locationFrom').setValue(response.Placemark[0].address);
			$('mapError').hide();
			gdir.load("from: " + response.Placemark[0].address + " to: " + to.value);
		} else {
			handleErrors(response.Status.code);
		}
		$('mapSuggestion').hide();
	});
	return false;
}

function handleErrors(status){
	if(isNaN(status)){
		status = gdir.getStatus().code
	}

	switch(status){
		case G_GEO_MISSING_ADDRESS:
			// do nothing;
		break;
		case G_GEO_UNKNOWN_ADDRESS:
			// previously: this._mUrlLanguageParameter
            if(_mHL == 'de'){$('mapError').update('Die angebene Adresse konnte nicht gefunden werden')}else{$('mapError').update('The address entered cannot be identified')};
		break;
		case G_GEO_UNAVAILABLE_ADDRESS:
			if(_mHL == 'de'){$('mapError').update("Für diese Adresse gibt es keine GEO-Informationen")}else{$('mapError').update("There is no geocoding information for this address")};
		break;
		case 604:
			if(_mHL == 'de'){$('mapError').update("Es konnte keine Route ermittelt werden")}else{$('mapError').update("The route for the given directions query cannot be returned due to legal or contractual reasons.");}
		break;
		case G_GEO_BAD_KEY:
			$('mapError').update("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + gdir.getStatus().code);
		break;
		case G_GEO_SERVER_ERROR:
			if(_mHL == 'de'){$('mapError').update("Der Geocode Service ist momentan nicht erreichbar. Versuchen Sie es später nocheinmal.")}else{$('mapError').update("Internal Geocode Service Error, Try later.")};
		break;
		default:
			 if(_mHL == 'de'){$('mapError').update("Unbekannter Fehler aufgetreten.")}else{$('mapError').update("An unknown error occurred.")}
	}
	$('mapError').show();   
}