function gm_control_select(input, address) {

	var hasClass = /gm-control-selected/;

	if (gm_result) {
		gm_result.style.display = 'none';
	}

	input.value = address;
	if ( ! hasClass.exec(input.className)) {
		$(input).removeClass('gm-control-toselect');
		$(input).addClass('gm-control-selected');
	}

	var finishStep = false;
	
	if (
		hasClass.exec(gm_input_from.className) && 
		hasClass.exec(gm_input_to.className)
	) {

		gm_direction.loadFromWaypoints(
			[gm_input_from.value, gm_input_to.value],
			{getPolyline:true, getSteps:true}
		);

		finishStep = true;
	}
	
	setTimeout(
		'gm_waypoint_show('+(finishStep ? 'true' : 'false')+')',
		500
	);
}
function gm_control_autocomplete_timer_process(input, refresh) {
	
	if (refresh == true) {
		if (gm_control_autocomplete_interval) {
			clearInterval(gm_control_autocomplete_interval);
		}
		gm_control_autocomplete_timer = 1000;
	}
	else {
		gm_control_autocomplete_timer -= 100;
	}
	
	if (gm_control_autocomplete_timer <= 0) {
		gm_control_autocomplete(input);
		clearInterval(gm_control_autocomplete_interval);
	}
	
	if (refresh == true) {
		gm_control_autocomplete_interval = setInterval(
			function () {
				gm_control_autocomplete_timer_process(input, false);
			},
			100
		);
	}
}
function gm_control_autocomplete(input) {
		
	gm_geocoder.getLocations(
		input.value,
		function (response) {

			if ( ! response || ! response.Placemark || ! response.Placemark[0] ) {
				return false;
			}
			
			var fields = [];
			for (var i=0; i<response.Placemark.length; i++) {
				fields[fields.length] = response.Placemark[i].address;
			}
			
			$(input).autocomplete('option', 'source', fields);

      place = response.Placemark[0];
      point = new GLatLng(
      	place.Point.coordinates[1],
        place.Point.coordinates[0]
			);
			
			if (fields.length == 1) {
				input.value = fields[0];
				gm_control_select(input, input.value);
			}
			else {
				$(input).autocomplete('search', input.value);
			}
		}
	);
}
function gm_contextmenu(mode, point, position) {

	if (gm_mode != 'add' && gm_mode != 'addrequest' && gm_mode != 'edit') {
		return false;
	}

	if (point) {
		gm_point = point;
	}
	
	if (mode == 1) {
		
		if (gm_menu && gm_menu.style.display == 'block') {
			return false;
		}
		
		var html = '';

		html += '<div class="gm-contextmenu-item"><a href="#" onclick="gm_waypoint_add(this)">Neuer Wegpunkt hier</a></div>';
		html += '<div class="gm-contextmenu-item"><a href="#" onclick="gm_waypoint_delete(this)">Alle Wegpunkte löschen</a></div>';

		gm_menu.style.display = 'block';
		gm_menu.style.left = (parseInt(position.left)-15)+'px';
		gm_menu.style.top = (parseInt(position.top)-15)+'px';
		gm_menu.innerHTML = html;
	}
	else {
		
		gm_menu.style.display = 'none';
	}
}
function gm_waypoint_error() {

	$('.gm-error').removeClass('gm-error');		
	$('.gm-error-message').remove();

	var errors = [];
	var params = [];
	var errorMessages = [];
	
	errorMessages['start_date'] = 'Das Startdatum muss korrekt eingegeben werden<br/>(Bsp: 16.04.1986)';
	errorMessages['start_time'] = 'Die Startzeit muss korrekt eingegeben werden<br/>(Bsp: 13:00)';
		
	$(':input').each(
		function (i) {
			
			var id = $(this).attr('id');
			var name = $(this).attr('name');
			var value = $(this).attr('value');
			
			if (
				( name == 'start_date' && ! /\d\d\.\d\d\.\d\d\d\d/.exec(value) ) || 
				( name == 'start_time' && ! /\d\d\:\d\d/.exec(value) ) 
			) {
				errors[errors.length] = [name, id, errorMessages[name]];
			}
			
			if (name == 'frequency') {
				if ( ! $(this).attr('checked') ) {
					value = null;
				}
			} 
			else if (name == 'start_date') {
				var regRes = /^(\d{1,2})\.(\d{1,2})\.(\d{4})$/.exec(value);
				if (regRes) {
					value = regRes[3]+'-'+regRes[2]+'-'+regRes[1];
				}
			}
			else if (name != '') {
				if ($(this).attr('type') == 'checkbox') {
					value = ($(this).attr('checked') ? 1 : 0);
				}
			}
			if (value != null && name != '') {
				if (/\[\d+\]/.exec(name)) {
					name = name.replace('[', '][');
					name = name.replace(/\]+$/, '');
				} 
				params[params.length] = ['route['+name+']', value];
			}
		}
	);
	
	if (errors.length > 0) {
		
		var errorField = null;
		for (var i=0; i<errors.length; i++) {
			errorField = $('#'+errors[i][1]);
			errorMessage = errors[i][2];
			$('label').each(
				function (i) {

					if ($(this).attr('for') == errorField.attr('id')) {
						$(this).addClass('gm-error');
						$('<div class="gm-control-info-others-error gm-error gm-error-message">'+errorMessage+'</div>').insertAfter(errorField);
					}
				}
			);
		}
		return false;
	}
	else {

		params[params.length] = ['action', 'saveRoute'];

		if (gm_interface && gm_interface.route && gm_interface.route.id)
			params[params.length] = ['id', gm_interface.route.id];
		
		params[params.length] = ['route[type]', (gm_mode == 'addrequest' ? 'request' : 'offer')];
		
		params[params.length] = ['route[start_name]', gm_steps[0][0][0]];
		params[params.length] = ['route[start_lat]', gm_steps[0][0][1]];
		params[params.length] = ['route[start_lng]', gm_steps[0][0][2]];
		params[params.length] = ['route[start_city]', gm_steps[0][0][3]];
		params[params.length] = ['route[start_zip]', gm_steps[0][0][4]];
		params[params.length] = ['route[start_street]', gm_steps[0][0][5]];
		
		params[params.length] = ['route[end_name]', gm_steps[0][1][0]];
		params[params.length] = ['route[end_lat]', gm_steps[0][1][1]];
		params[params.length] = ['route[end_lng]', gm_steps[0][1][2]];
		params[params.length] = ['route[end_city]', gm_steps[0][1][3]];
		params[params.length] = ['route[end_zip]', gm_steps[0][1][4]];
		params[params.length] = ['route[end_street]', gm_steps[0][1][5]];

		for (var i=0; i<gm_steps[1].length; i++) {
			var latlng = /^\(([\d\.]+)\,\s?([\d\.]+)\)$/.exec(gm_steps[1][i][1]);
			params[params.length] = ['waypoints['+i+'][name]', gm_steps[1][i][0]];
			params[params.length] = ['waypoints['+i+'][lat]', latlng[1]];
			params[params.length] = ['waypoints['+i+'][lng]', latlng[2]];
			params[params.length] = ['waypoints['+i+'][city]', gm_steps[1][i][3]];
			params[params.length] = ['waypoints['+i+'][zip]', gm_steps[1][i][4]];
			params[params.length] = ['waypoints['+i+'][street]', gm_steps[1][i][5]];
			if (gm_steps[1][i][2]) {
				params[params.length] = ['waypoints['+i+'][comment]', gm_steps[1][i][2]];
			}
		}

		var paramString = '';
		for (var i=0; i<params.length; i++) {
			if (params[i][0] == '' || /^\d+$/.exec(params[i][0])) {
				continue;
			}
			paramString += params[i][0]+'='+params[i][1]+'&';
		}
		paramString = paramString.replace(/\&$/, '');

		$.post(
			window.location.href,
			paramString,
			function (data, textStatus, XMLHttpRequest) {
				if (parseInt(data) == 1) {
					gm_waypoint_show(true);
				}
			}
		);
	}

	return true;
}
function gm_waypoint_comment(id, input) {
	
	gm_waypoints[id][2] = input.value;
}
function gm_waypoint_show(finishStep) {
	
	if (finishStep == true) {
		
		if (gm_steps.length == 0) {
			
			gm_steps[0] = [];
			
			gm_geocoder.getLocations(
				gm_input_from.value,
				function (response) {
	
					if ( ! response || ! response.Placemark || ! response.Placemark[0] ) {
						return false;
					}
		      place = response.Placemark[0];
	      	city = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
					zip = '';//place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode ? place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber : null;
					street = ''; //place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare ? place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName : null;
		      gm_steps[0][0] = [place.address, place.Point.coordinates[1], place.Point.coordinates[0], city, zip, street];
				}
			);
			gm_geocoder.getLocations(
				gm_input_to.value,
				function (response) {
	
					if ( ! response || ! response.Placemark || ! response.Placemark[0] ) {
						return false;
					}
		      place = response.Placemark[0];
					city = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
					zip = '';//place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode ? place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber : null;
					street = '';//place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare ? place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName : null;
		      gm_steps[0][1] = [place.address, place.Point.coordinates[1], place.Point.coordinates[0], city, zip, street];
				}
			);
			
			$('#gm-control').hide();
			
			setTimeout(
				function () {
					gm_waypoint_show(false);	
				},
				500
			);
		}
		else if (gm_steps.length == 1) {
			gm_steps[gm_steps.length] = gm_waypoints;
		}
		else if (gm_steps.length == 2) {
			if ( ! gm_waypoint_error()) {
				return false;
			} else {
				gm_steps[gm_steps.length] = [];
			}
		}
	}
	
	var hasClass = /gm-control-selected/;

	setTimeout(
		function() {
		
			var html = '';
			
			var steps = ['Start und Ende', 'Wegpunkte', 'Fahrtinfos', 'Route gespeichert'];
			if (steps[gm_steps.length]) {
				html += '<div class="gm-waypoint-headline">';
				if (gm_mode != 'show') {
					html += (gm_steps.length+1)+'. ';
				}
				html += steps[gm_steps.length]+'</div>';
				html += '<br/>';
			}
			
			// Step 1
			if (gm_steps.length == 0) {
				
				var i = 1;
				if ( ! hasClass.exec(gm_input_from.className)) {
					html += '<div>'+i+'. Bitte wählen Sie den Startpunkt aus</div>';
					i++;
				}
				if ( ! hasClass.exec(gm_input_to.className)) {
					html += '<div>'+i+'. Bitte wählen Sie den Endpunkt aus</div>';
					i++;
				}
			}
			// Step 2
			else if (gm_steps.length == 1) {
		
				var distance = gm_direction.getDistance();
				
				var waypoints = [];
		
				waypoints[waypoints.length] = gm_steps[0][0][0];
				for (var i=0; i<gm_waypoints.length; i++) {
					waypoints[waypoints.length] = gm_waypoints[i][0];
				}
				waypoints[waypoints.length] = gm_steps[0][1][0];
		
				html += '<b>Strecke: </b>'+gm_direction.getSummaryHtml();
				html += '<h1 />';
				
				var addComment = false;
				for (i=0; i<waypoints.length; i++) {

					addComment = false;
					if (i == 0) {
						html += '<div class="gm-waypoint-item gm-waypoint-item-start"><b>Start: </b>';
					}
					else if (	(i+1) == waypoints.length) {
						if (waypoints.length == 2) {
							html += '<div class="gm-waypoint-item gm-waypoint-item-middle">Keine Zwischenstationen gewählt</div>';	
						}
						html += '<div class="gm-waypoint-item gm-waypoint-item-end"><b>Ziel: </b>';
					}
					else {
						html += '<div class="gm-waypoint-item gm-waypoint-item-middle">'+i+'. ';
						addComment = true;
					}
					html += waypoints[i];
					if (addComment == true && gm_mode != 'show') {
						html += '<br/><input type="text" onblur="gm_waypoint_comment('+(i-1)+', this)" onclick="this.value=\'\'" value="Kommentar" />';
					}
					else if (gm_mode == 'show' && gm_waypoints[(i-1)]) {
						html += '<div class="gm-waypoint-item-comment">'+gm_waypoints[(i-1)][2]+'</div>';
					}
					
					if (gm_mode == 'edit' && i != 0 && (i+1) != waypoints.length) {
						html += '<div><button onclick="gm_waypoint_delete('+(i-1)+')">Löschen</button></div>';
					}
					
					html += '</div>';
				}
			}
			// Step 3
			else if (gm_steps.length == 2) {
				
				var weekdays = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];
				
				html += '<div id="gm-control-info">';
		
				// Frequency
				html += '<div id="gm-control-info-frequency">';
				
				html += '<div style="float: left;"><label for="gm-control-info-input-frequency-single">einmalig</label><input id="gm-control-info-input-frequency-single" class="gm-control-info-frequency" type="radio" name="frequency" value="single" onchange="gm_control_info_switchFrequency(this)"></div>';
				html += '<div style="float: left;"><label for="gm-control-info-input-frequency-regular">regelmäßig</label><input id="gm-control-info-input-frequency-regular" class="gm-control-info-frequency" type="radio" name="frequency" value="regular" onchange="gm_control_info_switchFrequency(this)"></div>';
				html += '<br style="clear: both;" />';
				
				html += '<div id="gm-control-info-frequency-single"></div>';
				
				html += '<div id="gm-control-info-frequency-regular">';
				html += '<br/>';
				html += '<table align="center"><tr>';
				for (var i=0; i<weekdays.length; i++) {
					html += '<td><input type="checkbox" class="gm-input-weekday" name="weekdays['+i+']" value="1" /></td>'; 
				}
				html += '</tr><tr>';
				for (var i=0; i<weekdays.length; i++) {
					html += '<td>'+weekdays[i]+'</td>'; 
				}
				html += '</tr></table>';
				html += '</div>';
				
				html += '</div>';
				html += '<br/>';
				
				// Others
				html += '<div id="gm-control-info-others">';
				html += '<div><label for="gm-control-info-input-start-date">Startdatum</label></div><div><input id="gm-control-info-input-start-date" name="start_date" type="text" size="10" /></div>';
				html += '<div><label for="gm-control-info-input-start-time">Startzeit</label></div><div><input id="gm-control-info-input-start-time" name="start_time" type="text" size="4" value="08:00" /> Uhr</div>';
				html += '<div><label for="gm-control-info-input-type">Fahrttyp</label></div><div><select id="gm-control-info-input-drive-type" name="drive_type"><option>Bahn-Mitfahrt</option><option>Gruppenreise</option><option>Tiertransport privat</option><option>Pendler</option></select></div>';
				html += '<div><label for="gm-control-info-input-price">Preis</label></div><div><input type="text" id="gm-control-info-input-price" name="price" size="4" /></div>';
				html += '<div><label for="gm-control-info-input-comment">Kommentar</label></div><div><textarea id="gm-control-info-input-comment" name="comment" cols="15" rows="4"></textarea></div>';
				html += '</div>';
				
				html += '</div>';
			}
			// Step 4
			else if (gm_steps.length == 3) {
				
				html += '<div id="gm-control-info">';
				html += 'Vielen Dank, die Route wurde erfolgreich gespeichert';
				html += '</div>';
				
			}
			
			if (gm_steps.length >= 1 && gm_mode != 'show') {
				html += '<br/>';
				
				if (gm_steps.length <= 2) {
					html += '<div><input type="button" value="'+((gm_steps.length == 1) ? 'Weiter' : 'Speichern')+'" onclick="gm_waypoint_show(true)" /></div>';
				}
				else {
					html += '<div><input type="button" value="Zur Übersicht" onclick="document.location.href=\'?content=kunden-anzeigen\';" /></div>';
				}
			}
			
			$('#gm-waypoints').html(html);
						
			if (gm_steps.length == 2) {
				$('#gm-control-info-input-start-date').datepicker({ 
					dateFormat: 'dd.mm.yy',
					monthNames: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'July', 'August', 'September', 'Oktober', 'November', 'Dezember'],
					dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
					minDate: new Date()
				});

				if (gm_interface && gm_interface.route !== undefined) {
					$('#gm-control-info-input-start-date')
						.val(gm_interface.route.start_date);
					$('#gm-control-info-input-start-time')
						.val(gm_interface.route.start_time);
					$('#gm-control-info-input-price')
						.val(gm_interface.route.price);
					$('#gm-control-info-input-comment')
						.val(gm_interface.route.comment);
					$('#gm-control-info-input-frequency-'+gm_interface.route.frequency)
						.attr('checked', true);
					$('#gm-control-info-input-drive-type')
						.val(gm_interface.route.drive_type);
						
					if (gm_interface.route.frequency == 'regular') {
						$('#gm-control-info-frequency-regular').show();
						$('.gm-input-weekday').each(function(i,node) {
							if (gm_interface.route.weekdays.charAt(i) == '1')
								node.checked = true;
						});
					}
				}
			}
		},
		500
	);
}
function gm_waypoint_calculate() {

	var waypoints = [];
	
	if (gm_steps[0] && gm_steps[0][0]) {
		//waypoints[waypoints.length] = gm_steps[0][0][0];
		waypoints[waypoints.length] = new GLatLng(gm_steps[0][0][1], gm_steps[0][0][2]);
	}
	else {
		waypoints[waypoints.length] = gm_input_from.value;
	}
	
	for (var i=0; i<gm_waypoints.length; i++) {
		waypoints[waypoints.length] = gm_waypoints[i][1];
	}
	
	if (gm_steps[0] && gm_steps[0][1]) {
		//waypoints[waypoints.length] = gm_steps[0][1][0];
		waypoints[waypoints.length] = new GLatLng(gm_steps[0][1][1], gm_steps[0][1][2]);
	}
	else {
		waypoints[waypoints.length] = gm_input_from.value;
	}


	gm_direction.loadFromWaypoints(
		waypoints,
		{getPolyline:true, getSteps:true}
	);
}
function gm_waypoint_add(link) {

	gm_geocoder.getLocations(
		gm_point, 
		function (response) {
			
      place = response.Placemark[0];

			city = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
			zip = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode ? place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber : null;
			street = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare ? place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName : null;


			var marker = new GMarker(gm_point);
			gm_map.addOverlay(marker);

			gm_waypoints[gm_waypoints.length] = [
				place.address,
				gm_point,
				city,
				zip,
				street,
				marker
			];
			
			gm_waypoint_calculate();
	
			gm_menu.style.display = 'none';
			
			setTimeout(
				'gm_waypoint_show()',
				500
			);
		}
	);
}
function gm_waypoint_delete(key) {
	
	var waypoints = new Array();
	for (var i=0; i<gm_waypoints.length; i++)
		if (i != key)
			waypoints.push(gm_waypoints[i]);
		else
			if (gm_waypoints[i][5])
				gm_waypoints[i][5].remove();
		
	gm_waypoints = waypoints;
	gm_waypoint_calculate();
	
	gm_waypoint_show();
}

function gm_control_info_switchFrequency(input) {
	
	var opposite = ( (input.value == 'single') ? 'regular' : 'single' );
	
	$('#gm-control-info-frequency-'+input.value).show();
	$('#gm-control-info-frequency-'+opposite).hide();
}

if (GBrowserIsCompatible()) {

	if ( ! gm_interface) {
		var gm_interface = null;
	}

	var gm_map = new GMap2(document.getElementById('gm-map'));
	var gm_geocoder = new GClientGeocoder();
	var gm_point = null;
	var gm_direction = new GDirections(gm_map, document.getElementById('gm-directions'));
	var gm_control_autocomplete_timer = null;
	var gm_control_autocomplete_interval = null;
	var gm_result = document.getElementById('gm-result');				
	var gm_waypoints = [];
	var gm_waypoint_data = [];
	var gm_menu = document.getElementById('gm-contextmenu');
	var gm_input_from = document.getElementById('gm-input-from');
	var gm_input_to = document.getElementById('gm-input-to');
	var gm_steps = []; // (Start-Ziel), (Wegpunkte), (Fahrtdauer)
	var gm_mode = /gm-mode-([A-Za-z]+)/.exec( $('#gm-map').attr('class') )[1];
	var gm_routes =  [];
	var gm_directions = [];

	if (gm_mode == 'edit') {
		gm_input_from.value = gm_interface.start[0];
		gm_input_to.value = gm_interface.end[0];
	}

	if (gm_mode == 'show' || gm_mode == 'edit') {
	
		gm_steps[0] = [gm_interface.start, gm_interface.end];
		
		if (gm_interface.waypoints && gm_interface.waypoints.length > 0) {
			for (var i=0; i<gm_interface.waypoints.length; i++) {
				gm_waypoints[gm_waypoints.length] = [gm_interface.waypoints[i][0], new GPoint(gm_interface.waypoints[i][1], gm_interface.waypoints[i][2]), gm_interface.waypoints[i][3]];
			}
		}
		
		if (gm_mode == 'edit')
			$('.gm-input-submit').hide();
			
		$('#gm-input-from, #gm-input-to').attr('readonly', true);
		
		gm_waypoint_calculate();
		setTimeout(
			function () {
				gm_waypoint_show();
			},
			1000
		);
	}
	else if (gm_mode == 'multiple') {
		
		var colors = ['#f00', '#0f0', '#00f', '#ff0', '#0ff', '#fff', '#000', '#900', '#090', '#009', '#990', '#099', '#999'];
		
		if (gm_interface && gm_interface.routes && gm_interface.routes.length > 0) {
			
			var html = '<div class="gm-waypoint-headline">Routen</div>';
			for (var i=0; i<gm_interface.routes.length; i++) {
				
				var direction = new GDirections(gm_map);
				direction.loadFromWaypoints(
	  			gm_interface.routes[i], 
	  			{getPolyline:true, preserveViewport:true}
	  		);
	  		
	  		gm_routes[i] = gm_interface.routes[i];
	  		gm_directions[i] = direction;
	  		
	  		html += '<div class="gm-route" style="background: '+colors[i]+'">'+(i+1)+'.Route: '+gm_interface.routes[i][0]+'</div>';
			}
			
			setTimeout(
				function () {
					
					for (var i=0; i<gm_directions.length; i++) {
					
						var direction = gm_directions[i].getPolyline();
						direction.counter = i;
						direction.link = gm_interface.routeLinks[i];
					
						if (direction) {
							GEvent.addDomListener(
								direction, 
								'mouseover', function(e) {
									
								}
							);
							GEvent.addDomListener(
								direction, 
								'click', function(e) {
									document.location.href = this.link;
								}
							);
						}
					}
				},
				3000
			);
			
			setTimeout(
  			function () {
  			
  				$('#gm-waypoints').html(html);
  				
  				for (var i=0; i<gm_directions.length; i++) {
  					var p = gm_directions[i].getPolyline();
  					if (p) {
  						p.color = colors[i];
  						p.redraw(true);
        		}
  				}
  			},
				3000
	  	);
		}
	}
	else if (gm_mode == 'add' || gm_mode == 'edit' || gm_mode == 'addrequest') {
		
		/*
		gm_input_from.onkeypress = function () { gm_control_autocomplete_timer_process(this, true); };
		gm_input_to.onkeypress = function () { gm_control_autocomplete_timer_process(this, true); };
		*/
		
		$('.gm-input-submit').bind(
			'click',
			function () {
				gm_control_autocomplete(gm_input_from);	
				gm_control_autocomplete(gm_input_to);
			}
		);
		$('.gm-input').addClass('gm-control-toselect');
		$('.gm-input').autocomplete(
			{
				'source': [ ],
				'select': function (event, ui) {
					gm_control_select(this, ui.item.value);
				}
			}
		);
		
		gm_waypoint_show();
	}

	// Context Menu
	$(gm_menu).bind(
		'mouseleave',
		function () {
			gm_contextmenu(0);
		}
	);

	// Set Map Center
	gm_geocoder.getLatLng(
		'Deutschland',
		function(point) {
			gm_map.setCenter(point, 6);
		}
	);

	// Adding Markers and Listeners
	var gm_map_points = [];
	var gm_map_markers = [];

	gm_map.addControl(new GSmallMapControl());
  gm_map.addControl(new GMapTypeControl());

  // Defining Map Listeners
  var gm_nearest_street_direction = new GDirections();
  GEvent.addListener(
  	gm_map,
  	'click',
  	function (overlay, point) {

  		if ( ! point) {
  			return false;
  		}

  		gm_nearest_street_direction.loadFromWaypoints(
  			[point.toUrlValue(6),point.toUrlValue(6)], 
  			{getPolyline:true}
  		);

      GEvent.addListener(
      	gm_nearest_street_direction,
      	'load', 
      	function () {
	     
	        var point = gm_nearest_street_direction.getPolyline().getVertex(0);
	        gm_contextmenu(1, point, gm_map.mousePosition);
				}
			);
  	}
  );
}

document.onclick = function (event) {

	if( ! event) event = window.event;

	var body = (window.document.compatMode && window.document.compatMode == "CSS1Compat") ? window.document.documentElement : window.document.body;

	gm_map.mousePosition = {
		top: event.pageY ? event.pageY : event.clientY + body.scrollTop - body.clientTop,
		left: event.pageX ? event.pageX : event.clientX + body.scrollLeft  - body.clientLeft
	};
}
