
	// Lokale Variablen definieren
	var map;
	var geocoder;
	var divbox;
	var submit_button;
	var submit_address;
	var dbData;
	var gps_data_lat;
	var gps_data_lng;
	var gps_start_point;
	var markersArray = [];
	var infoWindowsArray = [];
	var countryArray = ['Switzerland','Germany','Austria'];
	
	$(document).ready(function(){

	// Geocoder Instanzieren
	geocoder = geocoder = new google.maps.Geocoder();

	// Elemente holen
	divbox = document.getElementById("map_canvas");
	submit_button = document.getElementById("submit");

	// erstmal eine Karte erstellen
	map = new google.maps.Map(divbox,{
		zoom:5,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	});
	
	// Karte auf Deutschland zentrieren
	geocoder.geocode({'address':'Germany'}, 
		function(results) 
		{
			map.setCenter(results[0].geometry.location);
		}
	);

	// Alle Marker holen
	getDataAll();

	// Events definieren
	init();

	// success callback, gets passed position object
	// Wenn der Browser GPS unterstützt, dann aktuelle Position nutzen
	// und nächsten Händler abfragen.
	function do_gps_ting(position)
	{
		gps_data_lat = position.coords.latitude;
		gps_data_lng = position.coords.longitude;

		gps_start_point = new google.maps.LatLng(
			gps_data_lat,
			gps_data_lng
		);

		// Da der Browser GPS unterstützt, die aktuelle Adresse als String
		// holen
		getMyAddress(gps_start_point);

		// nächstbesten Händler anhand der Datenbank suchen
		getNearestDistributor(gps_start_point);
	}

	/*
		Hier werden alle Event Listener definiert
	*/
	function init()
	{
		google.maps.event.addDomListener(
			document.getElementById('ssMapPresets'),
			'change',
			function(event)
			{
				// Alle Marker zerstören
				deleteOverlays();
				deleteWindows();

				if(event.target.value == 'INIT')
				{
					// Karte auf in der Selectbox gewählten Ort zentrieren
					getDataAll();
					geocoder.geocode({'address':'Germany'}, 
						function(results) 
						{
							map.setZoom(5);
							map.setCenter(results[0].geometry.location);
						}
					);
				}
				else 
				{
					// Karte auf in der Selectbox gewählten Ort zentrieren
					geocoder.geocode({'address':countryArray[event.target.value]}, 
						function(results) 
						{
							getDataAll(countryArray[event.target.value]);
							map.setZoom(6);
							map.setCenter(results[0].geometry.location);
						}
					);
				}
			}
		);

		// Wenn Locate geklickt wird, soll die aktuelle Position lokalisiert werden
		google.maps.event.addDomListener(
			document.getElementById("ssMapLocate"),
			'click',
			function()
			{
				// Adress eingabe leeren
				$('#addressInput').val('');

				// Versuchen per Browser GPS Api die aktuelle Position
				// zu definieren
				navigator
					.geolocation
					.getCurrentPosition(
						do_gps_ting,
						function() { alert('Ihr Browser unterstützt keine Lokalisierung!') }
					)
			}
		);

		// jetzt noch ein paar Events definieren, dass auf die Usereingaben
		// entsprechend reagiert werden kann.
		google.maps.event.addDomListener(
			submit_button, 
			'click', 
			function() 
			{
				getNearestDistributor();
			}
		);
	}

	/*
		Holt sich die aktuelle eingegebene Adresse, geocodet die Adresse und
		sucht per Ajax den nächstbesten händler und zentriert die karte dort!
	*/
	function getNearestDistributor(gps_start_point) 
	{
		// Eingebene Adresse holen
		submit_address = document.getElementById('addressInput').value;

		//submit_address = submit_address+' '+document.getElementById('country').value;
		if(gps_data_lat && gps_data_lng && !submit_address)
		{
			getData(gps_data_lat,gps_data_lng);
		}
		else
		{
			if(submit_address)
			{
				// Dann Geocoder bemühen und adresse geocodieren
				geocoder.geocode({'address':submit_address}, function(results) {
					lat = results[0].geometry.location.lat();
					lng = results[0].geometry.location.lng();
					getData(lat,lng);
				});
			}
			else
			{
				alert('Bitte geben Sie eine PLZ oder einen Ort ein!');
			}
		}
	}

	/*
		Benötigt GPS daten und gibt eine Adresse als String zurück
	*/
	function getMyAddress(latlng)
	{
		if (geocoder) {
			geocoder.geocode({'latLng': latlng}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK) {
					if (results[1]) {
						jQuery('#ssMapLocateArea')
							.html('<p>Dein erkannter Standpunkt: <b>'+results[1].formatted_address+'</b></p>');
						init();
					}
				} 
				else 
				{
					alert("Geocoder failed due to: " + status);
				}
			})
		}
	}

	/* 
		Holt anhand der lat lng den nahsten Händler aus der Datenbank
	*/
	function getData(lat,lng) {
		// Url zusammenbauen an die wir einen ajax Call absetzen
		var searchUrl = 'search.php?lat='+lat+'&lng='+lng+'&radius='+12;

		// Ajax Call an meine PHP mit jQuery um Längen und Breitengrad zu
		// übermitteln und um den nächstbesten Händler heraus zufinden
		jQuery.get(searchUrl, function(data) {

			markers = jQuery(data).find("marker");
			jQuery('div#nextOne').html('');
			if(markers.length != 0) 
			{
				$.each(markers,function(i,xml) {
					xml = $(xml);

					html = '\
					<address class="hCard">\
						<span class="organization-name">'+xml.attr("name")+'</span>\
						<br><span class="street-address">'+xml.attr("street")+'</span>\
						<br><span class="region">'+xml.attr("plz")+' '+xml.attr("city")+'</span>';

					if(xml.attr("tel").length != 0)
					{
						html = html + '<br>Tel: <span class="tel">'+xml.attr("tel")+'</span>';
					}

					if(xml.attr("url").length != 0)
					{
						html = html + '<br><a href="http://'+xml.attr("url")+'">'+xml.attr("url").substr(0,18)+'...</a>';
					}

					if(xml.attr("openings").length != 0)
					{
						html = html + '<br>\
							<br><u>Öffnungszeiten</u>\
							<br>'+xml.attr("openings");
					}

					html = html+'</address>';

					// Adresse in der Sidebar einblenden!
					jQuery('div#nextOne').append(html);
				})

				xml = jQuery(data).find("marker").first();

				// Objekt vom Typ LatLng erzeugen und in point speichern
				var point = new google.maps.LatLng(
						parseFloat(xml.attr("lat")),
						parseFloat(xml.attr("lng"))
					);

				var content = xml.text();

				// Karte auf diesen Punkt zentrieren
				map.setZoom( 15 );
				map.setCenter(point, 12);

				// Alle Overlays zerstören
				deleteOverlays();
				deleteWindows();

				// Marker instanzieren und positionieren
				var marker = new google.maps.Marker({
					position: point, 
					map: map, 
					title:"Klick mich!"
				});
				markersArray.push(marker);

				newcontent = '<p>nächster Händler:</p>\
				<ul style="height:150px;margin:0px;padding:0px;">\
					<li><b>'+xml.attr("name")+'</b></li>\
					<li>'+xml.attr("street")+'</li>\
					<li>'+xml.attr("plz")+' '+xml.attr("city")+'</li>\
					<li>Entfernung: '+Math.round(xml.attr("distance"))+'km</li>\
				</ul>';

				// Inhalt für die Bubble!
				if(content.length != 0)
				{
					content = newcontent+content;
				}
				else
				{
					content = newcontent;
				}

				// Neues Info Window aufmachen und html reinbauen
				var infoWindow = new google.maps.InfoWindow(
					{content: content}
				);

				infoWindow.open(map,marker);
				infoWindowsArray.push(infoWindow);
			

			}
			else
			{
				alert('Wir haben leider kein Ergebnis finden können!');
			}
		});
	}

	function getDataAll(country)
	{
		if(typeof country != 'undefined')
		{
			url = 'search.php?c='+country;
		}
		else
		{
			url = 'search.php';
		}

		jQuery.get(url, function(data) {

			dbData = jQuery(data).find('marker');

			dbData.each(function(i,val) {

				// Objekt vom Typ LatLng erzeugen und in point speichern
				var point = new google.maps.LatLng(
						parseFloat($(this).attr("lat")),
						parseFloat($(this).attr("lng"))
					);

				// Marker instanzieren und positionieren
				var marker = new google.maps.Marker({
					position: point, 
					map: map, 
					title: "Klick mich!"
				});
				markersArray.push(marker);

				var content = '<ul>\
					<li><b>'+$(this).attr("name")+'</b></li>\
					<li>'+$(this).attr("street")+'</li>\
					<li>'+$(this).attr("plz")+' '+$(this).attr("city")+'</li>\
				</ul>';

				// Neues Info Window aufmachen und html reinbauen
				var infoWindow = new google.maps.InfoWindow(
					{content: content}
				);

				google.maps.event.addListener(marker, 'click', function() {
					infoWindow.open(map,marker);
				});

			})
		})
	}

	// Deletes all markers in the array by removing references to them
	function deleteOverlays() {
		if (markersArray) {
			for (i in markersArray) {
				markersArray[i].setMap(null);
			}
			markersArray.length = 0;
		}
	}

	function deleteWindows() {
		if (infoWindowsArray) {
			for (i in infoWindowsArray) {
				infoWindowsArray[i].close(null);
			}
			infoWindowsArray.length = 0;
		}
	}

	// Formular verhalten bei Focus und Blur
	$('form input, .distr_input input').live('focus',function(){
		$(this).prev().hide();
	});

	$('form input, .distr_input input').live('blur',function(){
		if($(this).val() == '')
		{
			$(this).prev().fadeIn('slow');
		}
	});

	// Wenn die Inputfelder beim reloaden gefüllt bleiben
	$('form input, .distr_input input').each(function(){
		if($(this).val())
		{
			$(this).prev().hide();
		}
	});

	$('form a.submit').live('click',function(){
		$.post('/sitedata/php/form_check.php', $('form#contact').serialize(), function(data){

			if(data.error == undefined)
			{
				// Formular wurde erfolgreich angenommen
				// Fehlermeldungen löschen
				$('div.error').html('');
				
				// Google Analytics sagen das wer erfolgreich ein
				// Kontaktform abgschickt hat!
				_gaq.push(['_trackPageview', '/kontakt/success']);

				// Formular verstecken
				$('form#contact').slideUp('slow', function(){
					$('#contactform').html('<div id="ssFormGrant"><p style="font-weight:bold;">Wir haben Ihr Daten erhalten. Vielen Dank!</p></div>');
				});
			}
			else
			{
				// Forumlar enthält Fehler
				$('div.error').html('');
				$('[name]').css({border:"2px solid #d9d9d9"});

				// Google Analytics sagen das wer fehlerhaftein
				// Kontaktform abgschickt hat!
				_gaq.push(['_trackPageview', '/kontakt/fail']);

				$.each(data.post,function(i,val){
					$('[name="'+i+'"]').css({border:"2px solid green"});
				})
				$.each(data.error,function(i,val){
					$('div.error').append('<p>'+val.desc+'</p>');
					$('[name="'+i+'"]').css({border:"2px solid red"});
				})
			}
		},'json')
	});
})
