// ---> globale Variablen
var map = null;
var geocoder = null;
var marker = new Array();
// Adressen für Google-Suche (teilweise angepasst)
var markerAddress = new Array();
// formatierte Infotexte
var markerText = new Array();
//Adresse des Nutzers
var from = '';
// Zieladresse
var to = '';
var dirList = new Array(); // Array: 'Entfernung in Metern' => 'Ziel-ID'
var sortList = new Array(); // Array: 'Entfernung in Metern'
// <--- globale Variablen

//---> Hilfsfunktionen
function Numsort (a, b) {
  return a - b;
}
function checkRequired($input) {
	var value = $input.val();
	value = value.replace (/^\s+/, '').replace (/\s+$/, '');
	if(!value || value == "") {
		$input.addClass("error");
		return false;
	}
	else {
		$input.removeClass("error");
		return true;
	}
}
function checkNumber($input) {
	var value = $input.val();
	value = value.replace (/^\s+/, '').replace (/\s+$/, '');
	if(value.match(/^\d{1,4}[a-z]{0,2}$/)) {
		$input.removeClass("error");
		jQuery("#formErrorNumber").hide();
		return true;
	}
	else {
		$input.addClass("error");
		jQuery("#formErrorNumber").show();
		return false;
	}
}
function checkZip($input) {
	var value = $input.val();
	value = value.replace (/^\s+/, '').replace (/\s+$/, '');
	if(value.match(/^\d{5}$/)) {
		$input.removeClass("error");
		jQuery("#formErrorZip").hide();
		return true;
	}
	else {
		$input.addClass("error");
		jQuery("#formErrorZip").show();
		return false;
	}dirList[sortList[0]]
}
// <--- Hilfsfunktionen

// Wird als Callback von getDistance aufgerufen;
// sammelt Entfernungen zu allen Zieladressen;
// sortiert anschließend;
// lädt dann Route mit kürzester Entfernung 
function getShortest(dist, toId) {
	dirList[dist] = toId;
	sortList.push(dist);
	if (sortList.length == markerAddress.length) {
		sortList.sort(Numsort);
		to = markerAddress[dirList[sortList[0]]];
		getRoute();
		$("#shortest").html('<h2>ServiceCenter in Ihrer N&auml;he</h2>'+markerText[dirList[sortList[0]]]);
	}
}
// holt Entfernung von globalem Startpunkt zu übergebenem Ziel von Google
function getDistance(i) {
	var to = markerAddress[i];
	var dir = new GDirections();
	dir.load("from: "+ from +" to: "+ to);
	GEvent.addListener(dir, "load", function() {
		getShortest(dir.getDistance().meters, i);
	});
	GEvent.addListener(dir, "error", function() {
		$("#shortest").html('<p class="error">Die angegebene Adresse wurde von Google leider nicht gefunden.</p>');
	});

}
//Routenplanung - ermittelt automatisch die Strecke von 'from' zum nächstgelegenen Zielpunkt
function doShortestRoute() {
	var street = jQuery("input[name=street]");
	var nr = jQuery("input[name=nr]");
	var zip = jQuery("input[name=zip]");
	var city = jQuery("input[name=city]");

	var streetOK = checkRequired(street);
	var nrOK = checkRequired(nr) && checkNumber(nr);
	var zipOK = checkRequired(zip) && checkZip(zip);
	var cityOK = checkRequired(city);
	
	if(!streetOK || !nrOK || !zipOK || !cityOK) {
		$("#shortest").html('<p class="error">Die angegebene Adresse wurde von Google leider nicht gefunden.<br/>Bitte f&uuml;llen Sie alle Felder aus!</p>');
		return;
	} else {
		var address = street.val() + " " + nr.val() + ", " + zip.val() + " " + city.val() + ", GERMANY";
		from = address;
		for(i=0;i<markerAddress.length;i++) {
			getDistance(i);
		}
		map.setMapType(G_NORMAL_MAP);
	}
}
//Routenplanung - ermittelt die Strecke vom 'from' nach 'to'
function doRoute() {
	var street = jQuery("input[name=street]");
	var nr = jQuery("input[name=nr]");
	var zip = jQuery("input[name=zip]");
	var city = jQuery("input[name=city]");

	var streetOK = checkRequired(street);
	var nrOK = checkRequired(nr) && checkNumber(nr);
	var zipOK = checkRequired(zip) && checkZip(zip);
	var cityOK = checkRequired(city);
	
	if(!streetOK || !nrOK || !zipOK || !cityOK) {
		$("#shortest").html('<p class="error">Die angegebene Adresse wurde von Google leider nicht gefunden.<br/>Bitte f&uuml;llen Sie alle Felder aus!</p>');
		return;
	} else {
		var address = street.val() + " " + nr.val() + ", " + zip.val() + " " + city.val() + ", GERMANY";
		from = address;
		getRoute();
		map.setMapType(G_NORMAL_MAP);
	}
}

// holt Anfahrtsplan von Google
function getRoute() {
	
	$("#route_grid").text('');
	
	directions = new GDirections(map, document.getElementById("route_grid"));
	directions.load("from: "+ from +" to: "+ to);
	GEvent.addListener(directions, "load", function() {
		$("#route_grid").prepend("<h3>Route von "+ from +" nach/zu: "+ to +"</h3><p>"+ directions.getSummaryHtml() +"</p>");
		
	});
	GEvent.addListener(directions, "error", function() {
		$("#shortest").html('<p class="error">Die angegebene Adresse wurde von Google leider nicht gefunden.</p>');
	});

	return false;
}
//Marker anzeigen bei Klick auf Listeneintrag
function loadMarker(i) {
	marker[i].openInfoWindowHtml(markerText[i]);
	to = markerAddress[i];
}
// Routenplanung aus Marker-Link öffnen
function showRouting(i) {
	to = markerAddress[i];
	$("dl.flyout").accordion('activate', 1);
}

// Karte laden, wenn Container vorhanden ist
$("#map_grid").ready(function(){
	loadMap();
	to = markerAddress[0];
});


