PageSourceSearch

https://maps.rwth-aachen.de/navigator/libraries/rwth/js/rwth.js

js rwth-aachen.de collected 2026-10-01 08:11:17 UTC 87,445 bytes, 2,198 lines download raw bytes

1$(function() {
2	var strLang        = $('html').attr('lang');
3	
4	var arrDictionary = { 'Aktuelle Position': 'Current location',
5						  'Suche': 'Search',
6						  'Es konnten leider keine Objekte in der N&auml;he (<': 'Unfortunately, no objects could be found nearby (<',
7						  'm) gefunden werden.': 'm).',
8						  ' Zoomen Sie einmal heraus um einen Gr&ouml;&szlig;eren Bereich zu durchsuchen.': ' Zoom out to conduct a search across a larger area.',
9						  'Keine Suchtreffer': 'No hits',
10						  'Dies ist eine von Google ermittelte Position. Diese basiert auf der Adresse': 'This location was determined by Google based on the address',
11						  'Dies ist die von Ihrem Ger\u00e4t gesendete Position, an der Sie sich aktuell aufhalten. Falls dies nicht korrekt ist, k\u00f6nnen Sie den Marker durch Drag and Drop auch an eine andere Position verschieben.': 'This is the position where you are located according to your device. If it is not correct, you can move the marker to another location using the drag & drop function.',
12						  'Dies ist eine benutzerdefinierte Position. Sie k\u00f6nnen den Marker durch Drag and Drop an eine andere Position verschieben.': 'This is a user-defined location. You can move the marker to another position using the drag & drop function.',
13						  'Geomarker verschoben': 'Geomarker moved',
14						  'Einrichtungen': 'Organisation units',
15						  'Geb&auml;ude': 'Buildings',
16						  'Fahrplan': 'Schedule',
17						  'Informationen': 'Information',
18						  ' Treffer gefunden': ' hits',
19						  'Routenplaner': 'Directions',
20						  'Benutzerdefinierte Position': 'User-defined location',
21						  'Es konnten leider keine Suchtreffer zu Ihrer Anfrage gefunden werden.': 'Unfortunately no search results could be found for your query.',
22						  'Fehler: Koordinaten': 'Error: Coordinates',
23						  'Zur Berechnung einer Route m&uuml;ssen genau zwei Marker auf der Karte existieren. Einer f&uuml;r Ihren Startpunkt und einer f&uuml;r Ihren Zielpunkt.': 'To calculate a route, there have to be exactly two markers on the map.',
24						  'Fehler: Berechnung der Route': 'Error: Route calculation',
25						  'Es gab leider Probleme bei der Berechnung Ihrer Route. Bitte versuchen Sie es sp&auml;ter erneut.': 'Unfortunately, there were problems calculating your route. Please try again at a later time.',
26						  'Route berechnen': 'Calculate route',
27						  'Route entfernen': 'Clear route',
28						  'Zielpunkt': 'Destination',
29						  'In RWTH Maps suchen': 'Search RWTH Maps',
30						  'Fehler: Geolocation': 'Error: Geolocation',
31						  'Ihr Ger\u00e4t verbietet der Anwendung ihre aktuelle Geolocation zu ermitteln.': 'Your device does not allow the application to detect your current geolocation.',
32						  'Ihre aktuelle Geolocation konnte nicht ermittelt werden.': 'It was not possible to detect your geolocation.',
33						  'Es hat zu lange gedauert ihre Geolocation zu ermitteln, sodass der Versuch abgebrochen wurde.': 'It took too long to determine your geolocation, so the attempt was aborted.',
34						  'Ein unbekannter Fehler ist beim Ermitteln der Geolocation aufgetreten.': 'An unknown error occurred when determining your geolocation.',
35						  'Men\u00fc ausblenden': 'Collapse side panel',
36						  'Men\u00fc einblenden': 'Expand side panel',
37						  'Suche leeren': 'Clear search',
38						  'Keine Relation': 'No relation',
39						  'Als Startpunkt setzen': 'Set as starting point',
40						  'Als Zielpunkt setzen': 'Set as destination',
41						  'Es konnten leider keine Objekte gefunden werden, die in Relation zu diesem Objekt stehen.': 'Unfortunately no relations could be found for your query.',
42						  'RWTH Parkplatz': 'RWTH parking',
43						  '&Ouml;ffentlicher Parkplatz': 'Public parking',
44						  'Parkzonen einblenden': 'Show parking zones',
45						  'Lade Parkzonen...': 'Loading parking zones...',
46						  'Parkzonen ausblenden': 'Hide parking zones',
47						  'Umweltzone einblenden': 'Show environmental zone',
48						  'Lade Umweltzone...': 'Loading environmental zone...',
49						  'Umweltzone ausblenden': 'Hide environmental zone' };
50	
51	var ajaxURL = '//maps.rwth-aachen.de/navigator/libraries/rwth/ajax/getBuildings.asp?lang=' + strLang;
52	
53	var allowChangeURL = 1;
53 // 0 = false, 1 = pushState, 2 = replaceState
54	var mobileVersion  = $('body').hasClass('mobile');
55	
56	var markerBuilding = [];
57	var polygonParkingZones = [];	
58	var polygonEnvironmentalZone = [];	
59	
60	var posMenu = google.maps.ControlPosition.RIGHT_TOP;
61	if (mobileVersion) posMenu = google.maps.ControlPosition.LEFT_BOTTOM;
62	
63	mapTypeId = google.maps.MapTypeId.ROADMAP;
64	if      ($('#startingParameters').attr('data-maptype') == 'satellite') mapTypeId = google.maps.MapTypeId.SATELLITE;
65	else if ($('#startingParameters').attr('data-maptype') ==    'hybrid') mapTypeId = google.maps.MapTypeId.HYBRID;
66	else if ($('#startingParameters').attr('data-maptype') ==   'terrain') mapTypeId = google.maps.MapTypeId.TERRAIN;
67	
68	var defaultZoom = 15;
69	if ($('#startingParameters').attr('data-start-z')  != '' && parseInt($('#startingParameters').attr('data-start-z')) > 0) defaultZoom = Math.max( 1, Math.min( parseInt($('#startingParameters').attr('data-start-z')), 18 ) );
70	var defaultLat  = 50.77767;
71	if ($('#startingParameters').attr('data-start-x')  != '' && parseFloat($('#startingParameters').attr('data-start-x')) > 0.0) defaultLat = parseFloat($('#startingParameters').attr('data-start-x'));
72	var defaultLng  = 6.077912;
73	if ($('#startingParameters').attr('data-start-y')  != '' && parseFloat($('#startingParameters').attr('data-start-y')) > 0.0) defaultLng = parseFloat($('#startingParameters').attr('data-start-y'));
74	
75	var modifyZoom = 0;
76	if ($('#startingParameters').attr('data-modify-z') != '') {
77		let newModifyZoom = Number($('#startingParameters').attr('data-modify-z'));
78		if (Number.isInteger(newModifyZoom)) modifyZoom = newModifyZoom;
79	}
80	
81	$('html').addClass('accepted');
82	$('#main-menu').css({
83		'height': 'auto',
84	});
85	
86	var staticmode = $('#startingParameters').attr('data-static') != '';
87	if (staticmode) $('body').addClass('static');
88	else			$('body').removeClass('static');
89	
90	// Default-Parameter, wenn man ohne URL-Parameter in die Anwendung kommt
91	var options = {
92		zoom: defaultZoom,
93		center: { 
94			lat: defaultLat, 
95			lng: defaultLng 
96		},
97		zoomControl: false,
98		keyboardShortcuts: !staticmode,
99		scaleControl: true,
100		rotateControl: false,
101		cameraControl: !staticmode,
102		tilt: 0,
103		mapMarker: true,
104		disableDoubleClickZoom: !mobileVersion,
105		draggableCursor: (staticmode ? 'default' : 'pointer'),
106		gestureHandling: (staticmode ? 'none' : (window != top ? 'cooperative' : 'greedy')),
107		mapTypeControl: !staticmode,
108		mapTypeControlOptions: {
109			position: posMenu
110		},
111		streetViewControl: false,
112		mapTypeId: mapTypeId,
113		styles: [ {
114			featureType: 'poi',
115			elementType: 'labels',
116			stylers: [ {
117				visibility: 'off'
118			} ]
119		}, {
120			featureType: 'transit.station',
121			stylers: [ {
122				visibility: 'off'
123			} ]
124		} ]
125	};
126
127	map			= new google.maps.Map( document.getElementById("mappart"), options );
128	
129	const trafficLayer = new google.maps.TrafficLayer();
130	trafficLayer.setMap(map);
131	
132	geocoder	= new google.maps.Geocoder();
133	dirService	= new google.maps.DirectionsService();
134	dirDisplay	= new google.maps.DirectionsRenderer({
135		draggable: false,
136		suppressMarkers: true,
137		polylineOptions: {
138			strokeColor: '#00B3FD',
139			strokeOpacity: 1.0,
140			strokeWeight: 5
141		}
142	});
143	
144	google.maps.event.addListenerOnce(map, 'idle', function() {
145		allowChangeURL = 2;
146		restoreURLValues();
147	});
148
149	google.maps.event.addListener(map, 'zoom_changed', function() {
150		var oldStatus = $('body').hasClass('wideview');
151		if ( map.getZoom() < 17 ) $('body').addClass('wideview');
152		else					  $('body').removeClass('wideview');
153		var newStatus = $('body').hasClass('wideview');
154		
155		if ( oldStatus != newStatus ) {
156			for ( key in markerBuilding ) {
157				if ( markerBuilding[key].polygon != null ) {
158					markerBuilding[key].polygon.setMap( newStatus ? null : map );
159				}
160			}
161		}
162	});
163	
164	google.maps.event.addListener(map, 'maptypeid_changed', function() {
165		for ( key in markerBuilding ) {
166			if ( markerBuilding[key].polygon != null ) {
167				highlightPolygon ( markerBuilding[key].polygon, 0 )
168			}
169		}
170
171		$('#map').removeClass().addClass(map.getMapTypeId());
172		
173		changeURL( 'changed Map Type' );
174	});
175	
176	google.maps.event.addListener(map, 'click', function(e) {
177		if (staticmode) return;
178		
179		var param = e.latLng.lat() + ';' + e.latLng.lng() + ';false;anything;0.11';
180
181		$('#selectableInfoWrapper').hide('fade', {}, 250, function() {
182			$('#selectableInfoWrapper .selectableInfo').remove();
183			
184			$.ajax({
185				url: ajaxURL + "&mode=distance&q=" + param,
186				dataType: 'json',
187				success: function( items ) {
188					if (items.length >= 1) {
189						var minItem = items[0]
190						var didSth  = false;
191						
192						for (var i = 0; i < items.length; i++ ) {
193							if (minItem.dst > items[i].dst) minItem = items[i];
194							
195							if (typeof items[i].pol !== 'undefined' && items[i].pol != '') {
196								var p = new google.maps.Polygon({
197									paths: getArrayFromCoordString(items[i].pol),
198									map: null
199								});
200								
201								if (google.maps.geometry.poly.containsLocation(e.latLng, p)) {
202									var strInfo = '<p class="headline">' + items[i].bez + '</p>';
203									if (items[i].adr != '') strInfo += '<p>' + items[i].adr.replace(/, /g, ',<br />') + '</p>';
204									strInfo += '<p class="coordinates">' + (Math.round(items[i].lat * 100000) / 100000) + ', ' + (Math.round(items[i].lng * 100000) / 100000) + '</p>'
205									
206									$('#selectableInfoWrapper').append('<div class="selectableInfo' + (didSth ? '' : ' first-child') + '">' + 
207																			'<div class="infodiv ' + items[i].typ + '">' + strInfo + '</div>' + 
208																			'<div class="navigateFrom tooltipright" title="' + translate('Als Startpunkt setzen') + '"></div>' + 
209																			'<div class="navigateTo tooltipright" title="' + translate('Als Zielpunkt setzen') + '"></div>' + 
210																	   '</div>');
211									jQuery.data( $('#selectableInfoWrapper .selectableInfo:last-child')[0], "item", items[i] );
212									
213									didSth = true;
214								}
215							}
216						}
217						
218						if (!didSth) {
219							var strInfo = '<p class="headline">' + minItem.bez + '</p>';
220							if (minItem.adr != '') strInfo += '<p>' + minItem.adr.replace(/, /g, ',<br />') + '</p>';
221							strInfo += '<p class="coordinates">' + (Math.round(minItem.lat * 100000) / 100000) + ', ' + (Math.round(minItem.lng * 100000) / 100000) + '</p>'
222
223							$('#selectableInfoWrapper').append('<div class="selectableInfo first-child">' + 
224																	'<div class="infodiv ' + minItem.typ + '">' + strInfo + '</div>' + 
225																	'<div class="navigateFrom tooltipright" title="' + translate('Als Startpunkt setzen') + '"></div>' + 
226																	'<div class="navigateTo tooltipright" title="' + translate('Als Zielpunkt setzen') + '"></div>' + 
227															   '</div>');
228							jQuery.data( $('#selectableInfoWrapper .selectableInfo:last-child')[0], "item", minItem );
229						}
230					} else {
231						var lat = Math.round(e.latLng.lat() * 100000) / 100000,
232							lng = Math.round(e.latLng.lng() * 100000) / 100000;
233						
234						var item = { 'gno': 'curpos', 'bez': translate('Benutzerdefinierte Position'), 'adr': '', 'img': 0, 'rel': 0, 'info': '', 'typ': 'geo', 'lat': lat, 'lng': lng }
235						
236						var strInfo = '<p class="headline">' + item.bez + '</p>';
237						strInfo += '<p class="coordinates">' + lat + ', ' + lng + '</p>'
238
239						$('#selectableInfoWrapper').append('<div class="selectableInfo first-child">' + 
240																'<div class="infodiv ' + item.typ + '">' + strInfo + '</div>' + 
241																'<div class="navigateFrom tooltipright" title="' + translate('Als Startpunkt setzen') + '"></div>' + 
242																'<div class="navigateTo tooltipright" title="' + translate('Als Zielpunkt setzen') + '"></div>' + 
243														   '</div>');
244						jQuery.data( $('#selectableInfoWrapper .selectableInfo:last-child')[0], "item", item );
245					}
246					
247					$('#selectableInfoWrapper .tooltipright').tooltip({
248						position: {
249							my: "left center",
250							at: "right center",
251							collision: "none"
252						},
253						classes: { "ui-tooltip": "ui-corner-all ui-widget-shadow arrowleft" }
254					});
255
256					$('#selectableInfoWrapper').show( 'fade', {}, 250 );
257				},
258				error: function() {}
259			});
260		});
261	});
262	
263	google.maps.event.addListener(map, 'rightclick', function(e) {
264		if (staticmode) return;
265		
266		$('#selectableInfoWrapper').hide('fade', {}, 250, function() {
267			$('#selectableInfoWrapper .selectableInfo').remove();
268			
269			var lat = Math.round(e.latLng.lat() * 100000) / 100000,
270				lng = Math.round(e.latLng.lng() * 100000) / 100000;
271			
272			var item = { 'gno': 'curpos', 'bez': translate('Benutzerdefinierte Position'), 'adr': '', 'img': 0, 'rel': 0, 'info': '', 'typ': 'geo', 'lat': lat, 'lng': lng }
273			
274			var strInfo = '<p class="headline">' + item.bez + '</p>';
275			strInfo += '<p class="coordinates">' + lat + ', ' + lng + '</p>'
276
277			$('#selectableInfoWrapper').append('<div class="selectableInfo first-child">' + 
278													'<div class="infodiv ' + item.typ + '">' + strInfo + '</div>' + 
279													'<div class="navigateFrom tooltipright" title="' + translate('Als Startpunkt setzen') + '"></div>' + 
280													'<div class="navigateTo tooltipright" title="' + translate('Als Zielpunkt setzen') + '"></div>' + 
281											   '</div>');
282			jQuery.data( $('#selectableInfoWrapper .selectableInfo:last-child')[0], "item", item );
283			
284			$('#selectableInfoWrapper .tooltipright').tooltip({
285				position: {
286					my: "left center",
287					at: "right center",
288					collision: "none"
289				},
290				classes: { "ui-tooltip": "ui-corner-all ui-widget-shadow arrowleft" }
291			});
292
293			$('#selectableInfoWrapper').show( 'fade', {}, 250 );
294		});
295	});
296
297	setTimeout(function() { $('#overlayInfo').css('--imgcontainer-height', $('#overlayInfo .imgcontainer').outerHeight() + 'px'); }, 500);
298	window.addEventListener('resize', (evt) => {
299		$('#overlayInfo').css('--imgcontainer-height', $('#overlayInfo .imgcontainer').outerHeight() + 'px');
300		
301		let $addInfoTarget = $('#overlayInfo .additionalInfos');
302		if ($addInfoTarget.length > 0) {
303			let calcHeightOfHeader = $('#overlayInfo .headline-bg').outerHeight() + $('#overlayInfo .imgcontainer').outerHeight() + 67;
304			$addInfoTarget.css('top', calcHeightOfHeader + 'px');
305		}
306	});
307	
308	$('.building-attribute').on('mouseenter', function() {
309		$(this).next().show();
310	});
311	$('.building-attribute').on('mouseleave blur', function() {
312		$(this).removeClass('opened');
313		$(this).next().hide();
314	});
315	$('.building-attribute').on('click', function() {
316		if (mobileVersion && !$(this).hasClass('mobile-link') && !$(this).hasClass('opened')) {
317			$(this).addClass('opened');
318			$(this).next().show();
319		} else if (typeof $(this).attr('data-link') != 'undefined' && $(this).attr('data-link') != '') {
320			window.open($(this).attr('data-link'), '_blank');
321		}
322	});
323	
324	$('#map').on('resize', function() {
325		google.maps.event.trigger(map, 'resize');
326	});
327	
328	let $hoverItemExpand      = $('#hover-item-expand'),
329		$additionalInfos      = $('#overlayInfo .additionalInfos')[0],
330		lastHoveredItem       = null,
331		scrollTimerToReappear = null;
332	$('#overlayInfo .additionalInfos').on('mouseenter', '.additionalElement', function() {
333		lastHoveredItem = this;
334		$hoverItemExpand
335			.html('')
336			.append($($(this).html()).removeAttr('id').removeAttr('data-search'))
337			.css({
338				'min-width': $additionalInfos.clientWidth + 'px', 
339				'top': (this.getBoundingClientRect().top - 1) + 'px'
340			});
341	}).on('mouseleave click', '.additionalElement', function() {
342		$hoverItemExpand.css('top', '-1000px');
343		lastHoveredItem = null;
344	}).on('scroll', function() {
345		$hoverItemExpand.css('top', '-1000px');
346		
347		if (scrollTimerToReappear !== null) clearTimeout(scrollTimerToReappear);
348		scrollTimerToReappear = setTimeout(function() {
349			if (lastHoveredItem !== null) $hoverItemExpand.css('top', (lastHoveredItem.getBoundingClientRect().top - 1) + 'px');
350			scrollTimerToReappear = null;
351		}, 150);
352	});
353	
354	$('#main-menu-wrapper .search-input').on('input', function() {
355		if ($('body').hasClass('routeplaner')) {
356			var doneSomething = false;
357			for ( key in markerBuilding ) {
358				if (markerBuilding[key].navStartEnd == $(this).next('span.searchplace').attr('data-marker')) {
359					if (markerBuilding[key].map != null) markerBuilding[key].setMap(null);
360					if (markerBuilding[key].polygon != null) markerBuilding[key].polygon.setMap(null);
361					delete markerBuilding[key];
362					
363					doneSomething = true;
364				}
365			}
366			
367			if ( doneSomething ) {
368				clearRoute();
369				changeURL( translate('Suche') );
370			}
371		}
372		
373		updateSearchItem('#' + $(this).attr('id'));
374	});
375	
376	function updateSearchItem( that ) {
377		var strLength = $(that).val().length;
378
379		if ( strLength > 0 ) {
380			$(that).next('span.searchplace').addClass('active').attr('title', translate('Suche')).html(translate('Suche'));
381		} else {
382			$(that).next('span.searchplace').removeClass('active');
383			if ($('body').hasClass('geolocation')) $(that).next('span.searchplace').attr('title', translate('Aktuelle Position')).html(translate('Aktuelle Position'));
384		}
385	}
386
387	$('#search').autocomplete({
388		source: function( request, response ) {
389			var strRoute = '';
390			if ($('body').hasClass('routeplaner')) strRoute = '&route=1';
391			
392			$.ajax({
393				url: ajaxURL + "&q=" + escape(request.term).replace( new RegExp( '\\+', 'g' ), '%2B' ) + strRoute,
394				dataType: 'json',
395				success: function( data ) {
396					if (data.length == 0) $('.ui-autocomplete li').remove();
397					response( data );
398				}
399			});
400		},
401		select: function( event, ui ) {
402			$('#search').val(ui.item.bez).blur();
403			
404			successfulSearch( [ ui.item ], 0, 'end' );
405			changeURL( translate('Suche') );
406			
407			$('.ui-autocomplete li').remove();
408			return false;
409		},
410		minLength: 3
411	}).autocomplete('instance')._renderItem = function( ul, item ) {
412		var str1 = item.bez;
413		var str2 = item.info;
414		
415		var re = new RegExp('(' + escapeRegExp($('#search').val()) + ')', 'gi');
416		str1 = str1.replace(re, '<span class="highlight">$1</span>');
417		str2 = str2.replace(re, '<span class="highlight">$1</span>');
418		
419		return $('<li>').append('<div class="wrapperWrapper"><div class="wrapWrapper ' + item.typ + '">' + str1 + '<br /><span class="address">' + str2 + '</span></div></div>').appendTo(ul);
420    };
421	
422	$('#startNav').autocomplete({
423		source: function( request, response ) {
424			var strRoute = '';
425			if ($('body').hasClass('routeplaner')) strRoute = '&route=1';
426			
427			$.ajax({
428				url: ajaxURL + "&q=" + escape(request.term) + strRoute,
429				dataType: 'json',
430				success: function( data ) {
431					if (data.length == 0) $('.ui-autocomplete li').remove();
432					response( data );
433				}
434			});
435		},
436		select: function( event, ui ) {
437			$('#startNav').val(ui.item.bez).blur();
438			
439			successfulSearch( [ ui.item ], 0, 'start' );
440			changeURL( translate('Suche') );
441			
442			$('.ui-autocomplete li').remove();
443			return false;
444		},
445		minLength: 3
446	}).autocomplete('instance')._renderItem = function( ul, item ) {
447		var str1 = item.bez;
448		var str2 = item.info;
449		
450		var re = new RegExp('(' + escapeRegExp($('#startNav').val()) + ')', 'gi');
451		str1 = str1.replace(re, '<span class="highlight">$1</span>');
452		str2 = str2.replace(re, '<span class="highlight">$1</span>');
453		
454		return $('<li>').append('<div class="wrapperWrapper"><div class="wrapWrapper ' + item.typ + '">' + str1 + '<br /><span class="address">' + str2 + '</span></div></div>').appendTo(ul);
455    };
456
457	let $hoverSearchExpand     = $('#hover-search-expand'),
458		$autocompleteContainer = $('#ui-id-2')[0],
459		lastHoveredSearch      = null,
460		scrollTimerToReappear2 = null;
461	$('#ui-id-2, #ui-id-3').on('mouseenter', '.wrapperWrapper', function() {
462		lastHoveredSearch = this;
463		$hoverSearchExpand
464			.html('')
465			.append($(this).html())
466			.css({
467				'min-width': $(this).closest('.ui-autocomplete')[0].clientWidth + 'px', 
468				'top': (this.getBoundingClientRect().top - 1) + 'px'
469			});
470	}).on('mouseleave click', '.wrapperWrapper', function() {
471		$hoverSearchExpand.css('top', '-1000px');
472		lastHoveredSearch = null;
473	}).on('scroll', function() {
474		$hoverSearchExpand.css('top', '-1000px');
475		
476		if (scrollTimerToReappear2 !== null) clearTimeout(scrollTimerToReappear2);
477		scrollTimerToReappear2 = setTimeout(function() {
478			if (lastHoveredSearch !== null) $hoverSearchExpand.css('top', (lastHoveredSearch.getBoundingClientRect().top - 1) + 'px');
479			scrollTimerToReappear2 = null;
480		}, 150);
481	});
482	
483	function escapeRegExp( str ) {
484		return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
485	}
486	
487	function successfulSearch( items, addInfos, type ) {
488		$hoverSearchExpand.css('top', '-1000px');
489		lastHoveredSearch = null;
490
491		if ($('body').hasClass('routeplaner') && items.length > 0) {
492			$('.ui-autocomplete li').remove();
493			items = [ items[0] ];
494		}
495		
496		if (addInfos == 0) {
497			$('#main-menu .calcroute').addClass('delete').attr('title', translate('Suche leeren')).html(translate('Suche leeren'));
498		}
499		$('#overlayInfo .additionalInfos').html('').attr('data-nearobjects', '').attr('data-informations', '');
500		
501		var lengthItems = items.length;
502		
503		for ( key in markerBuilding ) {
504			if (addInfos == 0 || !(markerBuilding[key].exportMarker)) {
505				if (markerBuilding[key].navStartEnd == type) {
506					if (markerBuilding[key].map != null) markerBuilding[key].setMap(null);
507					if (markerBuilding[key].polygon != null) markerBuilding[key].polygon.setMap(null);
508					delete markerBuilding[key];
509				}
510			}
511		}
512
513		var errorMsg = translate('Es konnten leider keine Suchtreffer zu Ihrer Anfrage gefunden werden.');
514		
515		if ( lengthItems == 0 ) {
516			if (addInfos == 1) {
517				var distance = getDistanceFromZoom() * 1000;
518				errorMsg = translate('Es konnten leider keine Objekte in der N&auml;he (<') + distance + translate('m) gefunden werden.');
519				if (map.getZoom() >= 17) errorMsg += translate(' Zoomen Sie einmal heraus um einen Gr&ouml;&szlig;eren Bereich zu durchsuchen.');
520
521				openMessageDialog( translate('Keine Suchtreffer'), errorMsg );
522			} else if (addInfos == 2) {
523				openMessageDialog( translate('Keine Relation'), translate('Es konnten leider keine Objekte gefunden werden, die in Relation zu diesem Objekt stehen.') );
524			}
525			
526			return false;
527		}
528		
529		for (var i = 0; i < lengthItems; i++ ) {
530			createMarker( items[i], addInfos == 0, type );
531			
532			if ( lengthItems > 1 || addInfos > 0 ) {
533				var str1 = '';
534				if (items[i].info != '') str1 = '<p class="address">' + items[i].info + '</p>';
535				
536				$('#overlayInfo .additionalInfos').append('<div class="additionalElement"><div id="object_' + items[i].gno + '" class="' + items[i].typ + '" data-search="' + (items[i].typ == 'geo' ? items[i].lat 
536+ ',' + items[i].lng : items[i].gno) + '"><p class="name">' + items[i].bez + '</p>' + str1 + '</div></div>');
537				if (items[i].typ == 'geo') {
538					$('#object_' + items[i].gno).on('click', function() { convertLatLngParamToMap('end', $(this).attr('data-search')); });
539				} else {
540					$('#object_' + items[i].gno).on('click', function() { getObjectsWithID($(this).attr('data-search'), 'end'); });
541				}
542				
543				$('#object_' + items[i].gno).on('mouseover', function() {
544					var tempMarker = markerBuilding[$(this).attr('data-search')];
545					if ( typeof tempMarker !== 'undefined' ) {
546						if ( tempMarker.polygon != null ) highlightPolygon( tempMarker.polygon, 1 );
547						if ( tempMarker.markerTyp === 'full' ) tempMarker.setTitle('Marker: ' + tempMarker.label.text);
548					}
549				}).on('mouseout', function() {
550					var tempMarker = markerBuilding[$(this).attr('data-search')];
551					if ( typeof tempMarker !== 'undefined' ) {
552						if ( tempMarker.polygon != null ) highlightPolygon( tempMarker.polygon, -1 );
553						if ( tempMarker.markerTyp === 'full' ) tempMarker.setTitle('');
554					}
555				});
556			}
557			
558			if (markerBuilding[items[i].gno].markerTyp != 'reduced') {
559				google.maps.event.addListener(markerBuilding[items[i].gno], 'mouseover', function() {
560					if ($('#object_' + this.gebnr).length > 0) $('#object_' + this.gebnr).css('background-color', '#FCC');
561					if (this.polygon != null) highlightPolygon( this.polygon, 1 );
562					if (this.markerTyp === 'full') this.setTitle('Marker: ' + this.label.text);
563				});
564				
565				google.maps.event.addListener(markerBuilding[items[i].gno], 'mouseout', function() {
566					if ($('#object_' + this.gebnr).length > 0) $('#object_' + this.gebnr).css('background-color', '');
567					if (this.polygon != null) highlightPolygon( this.polygon, -1 );
568					if (this.markerTyp === 'full') this.setTitle('');
569				});
570				
571				if (markerBuilding[items[i].gno].polygon != null) {
572					google.maps.event.addListener(markerBuilding[items[i].gno].polygon, 'mouseover', function() {
573						if ($('#object_' + this.gebnr).length > 0) $('#object_' + this.gebnr).css('background-color', '#FCC');
574						highlightPolygon( this, 1 );
575						if (markerBuilding[this.gebnr].markerTyp === 'full') markerBuilding[this.gebnr].setTitle('Marker: ' + markerBuilding[this.gebnr].label.text);
576					});
577					
578					google.maps.event.addListener(markerBuilding[items[i].gno].polygon, 'mouseout', function() {
579						if ($('#object_' + this.gebnr).length > 0) $('#object_' + this.gebnr).css('background-color', '');
580						highlightPolygon( this, -1 );
581						if (markerBuilding[this.gebnr].markerTyp === 'full') markerBuilding[this.gebnr].setTitle('');
582					});
583				}
584
585				if (markerBuilding[items[i].gno].objType != 'geo') {
586					google.maps.event.addListener(markerBuilding[items[i].gno], 'click', function() {
587						if (staticmode) return;
588						if (!($('body').hasClass('routeplaner'))) getObjectsWithID(this.gebnr, 'end');
589					});
590
591					if (markerBuilding[items[i].gno].polygon != null) {
592						google.maps.event.addListener(markerBuilding[items[i].gno].polygon, 'click', function() {
593							if (staticmode) return;
594							if (!($('body').hasClass('routeplaner'))) getObjectsWithID(this.gebnr, 'end');
595						});
596					}
597				} else {
598					google.maps.event.addListener(markerBuilding[items[i].gno], 'click', function() {
599						var msg = translate('Dies ist eine von Google ermittelte Position. Diese basiert auf der Adresse') + ' "' + this.label.text + '".';
600						if      (this.label.text ==           translate('Aktuelle Position')) msg = translate('Dies ist die von Ihrem Ger\u00e4t gesendete Position, an der Sie sich aktuell aufhalten. Falls dies nicht korrekt ist, k\u00f6nnen Sie den Marker durch Drag and Drop auch an eine andere Position verschieben.');
601						else if (this.label.text == translate('Benutzerdefinierte Position')) msg = translate('Dies ist eine benutzerdefinierte Position. Sie k\u00f6nnen den Marker durch Drag and Drop an eine andere Position verschieben.');
602
603						openMessageDialog( this.label.text, msg );
604					});
605
606					google.maps.event.addListener(markerBuilding[items[i].gno], 'dragend', function() {
607						var lat = Math.round(this.getPosition().lat()  * 100000) / 100000,
608							lng = Math.round(this.getPosition().lng()  * 100000) / 100000;
609						
610						if (this.navStartEnd == 'end') {
611							$('#search').val( lat + ',' + lng );
612							updateSearchItem('#search');
613						} else {
614							$('#startNav').val( lat + ',' + lng );
615							updateSearchItem('#startNav');
616						}
617
618						clearRoute();
619						changeURL( translate('Geomarker verschoben') );
620					});
621				}
622			}
623		}
624
625		if (addInfos == 0 && type == 'end') {
626			$('#overlayInfo .imgcontainer').css('background-image', '');
627			$('#overlayInfo .imgcontainer .copyright').html('RWTH Aachen University');
628			$('#overlayInfo .sub-menu .couldbeinactive').attr('data-key', '').attr('href', '').removeClass('active');
629			$('#overlayInfo .sub-menu .organisation').removeClass('building').removeClass('schedule').removeClass('externalinfos');
630			$('#overlayInfo .sub-menu .organisation span').html(translate('Einrichtungen'));
631			
632			$('.building-attribute').hide();
633			
634			if ( lengthItems == 1 ) {
635				if ( typeof items[0].wickelraum !== 'undefined') {
636					$('#wickelraum-tooltip').html(items[0].wickelraum.info);
637					$('#wickelraum-flag').attr('data-link', items[0].wickelraum.link).show();
638				}
639				if ( typeof items[0].elternkindraum !== 'undefined') {
640					$('#elternkind-tooltip').html(items[0].elternkindraum.info);
641					$('#elternkind-flag').attr('data-link', items[0].elternkindraum.link).show();
642				}
643				if ( typeof items[0].defibrillator !== 'undefined') {
644					$('#defibrillator-tooltip').html(items[0].defibrillator.info);
645					$('#defibrillator-flag').attr('data-link', items[0].defibrillator.link).show();
646				}
647				if ( typeof items[0].bwc !== 'undefined') {
648					$('#bwc-tooltip').html(items[0].bwc.info);
649					$('#bwc-flag').attr('data-link', items[0].bwc.link).show();
650				}
651				if ( typeof items[0].agwc !== 'undefined') {
652					$('#agwc-tooltip').html(items[0].agwc.info);
653					$('#agwc-flag').attr('data-link', items[0].agwc.link).show();
654				}
655				if ( typeof items[0].hhwc !== 'undefined') {
656					$('#hhwc-tooltip').html(items[0].hhwc.info);
657					$('#hhwc-flag').attr('data-link', items[0].hhwc.link).show();
658				}
659				if ( typeof items[0].lernraum !== 'undefined') {
660					$('#lernraum-tooltip').html(items[0].lernraum.info);
661					$('#lernraum-flag').attr('data-link', items[0].lernraum.link).show();
662				}
663				if ( typeof items[0].energy !== 'undefined') {
664					$('#energie-tooltip').html(items[0].energy.info);
665					// Einkommentieren, wenn korrektes Piktogramm zur Verfügung steht
666					// $('#energie-flag').show();
667				}
668				
669				$('#overlayInfo').css('--imgcontainer-height', $('#overlayInfo .imgcontainer').outerHeight() + 'px');
670				
671				if ( items[0].img == 1 && !mobileVersion ) {
672					$('#overlayInfo .imgcontainer').css('background-image', 'url("images/' + items[0].typ + '/' + items[0].gno + '.jpg")');
673					$('#overlayInfo .imgcontainer .copyright').html('RWTH Aachen University');
674				}
675				$('#overlayInfo .headline-bg').html('<p class="name">' + items[0].bez + '</p><p class="address">' + items[0].info + '</p>');
676				
677				if (items[0].typ != 'geo') {
678					$('#search').val(items[0].bez);
679					$('#search').next('span.searchplace').addClass('active').attr('title', translate('Suche')).html(translate('Suche'));;
680				}
681				
682				if (markerBuilding[items[0].gno].markerTyp != 'reduced') $('#overlayInfo .routewrapper').show();
683				else													 $('#overlayInfo .routewrapper').hide();
684				
685				if ( markerBuilding[items[0].gno].markerTyp != 'reduced' ) $('#overlayInfo .sub-menu .nearobjects').attr('data-key', items[0].gno).addClass('active');
686				
687				if      ( (items[0].typ ==  'b' || items[0].typ ==  'e') && items[0].rel == 1 ) $('#overlayInfo .sub-menu .organisation').attr('data-key', items[0].gno).addClass('active');
688				else if ( items[0].typ !=  'geo' && items[0].lnk != '' ) $('#overlayInfo .sub-menu .organisation').attr('data-key', items[0].lnk).addClass('active');
689				
690				if (items[0].typ == 'b') {
691					// Do nothing.
692				} else if ( items[0].typ == 'e' ) {
693					$('#overlayInfo .sub-menu .organisation').addClass('building');
694					$('#overlayInfo .sub-menu .organisation span').html(translate('Geb&auml;ude'));
695				} else if ( items[0].typ == 'h1' || items[0].typ == 'h2' ) {
696					$('#overlayInfo .sub-menu .organisation').addClass('schedule');
697					$('#overlayInfo .sub-menu .organisation span').html(translate('Fahrplan'));
698				} else {
699					$('#overlayInfo .sub-menu .organisation').addClass('externalinfos');
700					$('#overlayInfo .sub-menu .organisation span').html(translate('Informationen'));
701				}
702			} else {
703				$('#overlayInfo .headline-bg').html('<p class="name">' + lengthItems + translate(' Treffer gefunden') + '</p>');
704				$('#overlayInfo .routewrapper').hide();
705			}
706			
707			if ( $('#overlayInfo:hidden').length > 0 ) {
708				if ($('#overlayInfo').hasClass('slided-out')) {
709					$('#overlayInfo').show();
710				} else {
711					if (!mobileVersion) $('#map').css('left', 'min(90dvw, 332px)').resize();
712					$('#overlayInfo').show( 'slide', {}, 250 );
713				}
714			}
715			
716			var calcHeight = $('#overlayInfo .headline-bg').outerHeight() + $('#overlayInfo .imgcontainer').outerHeight() + 67;
717			$('#overlayInfo .additionalInfos').css('top', calcHeight + 'px');
718		} else if (addInfos == 0 && type == 'start') {
719			if (lengthItems == 1 && items[0].typ != 'geo') {
720				$('#startNav').val(items[0].bez);
721				$('#startNav').next('span.searchplace').addClass('active').attr('title', translate('Suche')).html(translate('Suche'));;
722			}
723		}
724
725		centerAndZoomMap();
726		
727		return true;
728	}
729	
730	function highlightPolygon ( polygon, value ) {
731		polygon.cHighlight = Math.max( polygon.cHighlight + value, 0 );
732		
733		if ( polygon.cHighlight > 0 ) {
734			polygon.setOptions({
735				strokeColor: '#FF0000',
736				strokeOpacity: 1.0,
737				strokeWeight: 2,
738				fillColor: '#FFCCCC',
739				fillOpacity: getHighlightFillOpacity(),
740				zIndex: 2
741			});
742		} else {
743			polygon.setOptions({
744				strokeColor: getStrokeColorByType(polygon.objType),
745				strokeOpacity: getStrokeOpacityByType(polygon.objType),
746				strokeWeight: 1,
747				fillColor: getFillColorByType(polygon.objType),
748				fillOpacity: getFillOpacityByType(polygon.objType),
749				zIndex: getZIndexByType(polygon.objType)
750			});
751		}
752	}
753	
754	function getFillColorByType( type ) {
755		if ( type == 'zC' ) return '#FFBF81';
756		if ( type == 'zU' ) return '#00FCFF';
757		if ( type == 'zS' ) return '#FD81BD';
758		if ( type == 'zT' ) return '#D60403';
759		if ( type ==  'u' ) return '#0FA20F';
760		if ( type ==  'p' ) return '#8888FF';
761		if ( type == 'pr' ) return '#8888FF';
762		
763		return '#F4F3EC';
764	}
765	
766	function getStrokeColorByType( type ) {
767		if ( type == 'zC' ) return '#FFBF81';
768		if ( type == 'zU' ) return '#00FCFF';
769		if ( type == 'zS' ) return '#FD81BD';
770		if ( type == 'zT' ) return '#D60403';
771		if ( type ==  'u' ) return '#0FA20F';
772		if ( type ==  'p' ) return '#0000FF';
773		if ( type == 'pr' ) return '#0000FF';
774		
775		return '#ECECEC';
776	}
777	
778	function getHighlightFillOpacity() {
779		tmpMapType = map.getMapTypeId();
780		
781		if ( tmpMapType == 'hybrid' || tmpMapType == 'satellite' ) return 0.4;
782		return 1.0;
783	}
784	
785	function getFillOpacityByType( type ) {
786		tmpMapType = map.getMapTypeId();
787		
788		if ( type.indexOf('z') == 0 ) return 0.0;
789		if ( type ==  'u' ) return 0.1;
790		if ( type ==  'p' ) return 0.2;
791		if ( type == 'pr' ) return 0.2;
792		
793		if ( tmpMapType == 'hybrid' || tmpMapType == 'satellite' ) return 0.6;
794		
795		return 1.0;
796	}
797	
798	function getStrokeOpacityByType( type ) {
799		if ( type.indexOf('z') == 0 ) return 0.6;
800		if ( type ==  'u' ) return 0.9;
801		if ( type ==  'p' ) return 0.6;
802		if ( type == 'pr' ) return 0.6;
803		
804		return 1.0;
805	}
806	
807	function getZIndexByType( type ) {
808		if ( type ==  'p' ) return 3;
809		if ( type == 'pr' ) return 3;
810		if ( type == 'u' ) return 0;
811		
812		return 1;
813	}
814	
815	function createMarker( item, exportMarker, type ) {
816		if (typeof markerBuilding[item.gno] !== 'undefined') {
817			if (markerBuilding[item.gno].map != null) markerBuilding[item.gno].setMap(null);
818			if (markerBuilding[item.gno].polygon != null) markerBuilding[item.gno].polygon.setMap(null);
819			delete markerBuilding[item.gno];
820		}
821		
822		if (typeof item.lat !== 'undefined' && typeof item.lng !== 'undefined') {
823			var tempPolygon = null;
824			if ((item.typ == 'pr' || item.typ == 'p' || item.typ == 'b') && item.pol.length > 0) {
825				tempPolygon = new google.maps.Polygon({
826					paths: getArrayFromCoordString(item.pol),
827					strokeColor: getStrokeColorByType( item.typ ),
828					strokeOpacity: getStrokeOpacityByType( item.typ ),
829					strokeWeight: 1,
830					fillColor: getFillColorByType( item.typ ),
831					fillOpacity: getFillOpacityByType( item.typ ),
832					map: $('body').hasClass('wideview') ? null : map,
833					gebnr: item.gno,
834					objType: item.typ,
835					cHighlight: 0,
836					zIndex: getZIndexByType( item.typ )
837				});
838			}
839			
840			var iconMarker = 'libraries/rwth/img/rwth2.png';
841			var labelMarker = 'markerlabel';
842			var strContent = item.bez;
843			var hiddenContent = '';
844			
845			if (item.typ ==  'p') {
846				iconMarker    = 'libraries/rwth/img/parkplatz.png';
847				labelMarker   = 'markerlabel simple';
848				hiddenContent = item.bez;
849				if      (item.pzn == 'O')					strContent  = translate('&Ouml;ffentlicher Parkplatz');
850				else if (item.pzn != '' && item.pzn != '-') strContent  = translate('RWTH Parkplatz') + ': Zone ' + item.pzn;
851				else										strContent  = translate('RWTH Parkplatz');
852			} else if (item.typ == 'c') {
853				iconMarker  = 'libraries/rwth/img/cambio.png';
854				labelMarker = 'markerlabel simple';
855			} else if (item.typ == 'v') {
856				iconMarker  = 'libraries/rwth/img/velocity.png';
857				labelMarker = 'markerlabel simple';
858			} else if (item.typ == 'ls') {
859				iconMarker  = 'libraries/rwth/img/ladestation.png';
860				labelMarker = 'markerlabel simple';
861			} else if (item.typ == 'h1') {
862				iconMarker  = 'libraries/rwth/img/haltestelle_bus.png';
863				labelMarker = 'markerlabel simple';
864			} else if (item.typ == 'h2') {
865				iconMarker  = 'libraries/rwth/img/haltestelle_bahn.png';
866				labelMarker = 'markerlabel simple bahn';
867			} else if (item.typ == 'pr') {
868				iconMarker  = 'libraries/rwth/img/park_ride.png';
869				labelMarker = 'markerlabel simple parkride';
870			} else if (item.typ == 'd1') {
871				iconMarker  = 'libraries/rwth/img/defi.png';
872				labelMarker = 'markerlabel simple';
873			} else if (item.typ == 'd2') {
874				iconMarker  = 'libraries/rwth/img/defi2.png';
875				labelMarker = 'markerlabel simple';
876			} else if (item.typ == 't') {
877				iconMarker  = 'libraries/rwth/img/bwc.png';
878				labelMarker = 'markerlabel simple';
879			} else if (item.typ == 'tt') {
880				iconMarker  = 'libraries/rwth/img/agwc.png';
881				labelMarker = 'markerlabel simple';
882			} else if (item.typ == 'tthh') {
883				iconMarker  = 'libraries/rwth/img/hhwc.png';
884				labelMarker = 'markerlabel simple';
885			} else if (item.typ == 'ba') {
886				iconMarker  = 'libraries/rwth/img/fahrstuhl.png';
887				labelMarker = 'markerlabel simple';
888			} else if (item.typ == 'be') {
889				iconMarker  = 'libraries/rwth/img/eingang.png';
890				labelMarker = 'markerlabel simple';
891			} else if (item.typ == 'w') {
892				iconMarker  = 'libraries/rwth/img/wickel.png';
893				labelMarker = 'markerlabel simple';
894			} else if (item.typ == 'f') {
895				iconMarker  = 'libraries/rwth/img/eltern.png';
896				labelMarker = 'markerlabel simple';
897			} else if (item.typ == 'fk') {
898				iconMarker  = 'libraries/rwth/img/fristenkasten.png';
899				labelMarker = 'markerlabel simple';
900			}
901			
902			markerBuilding[item.gno] = new google.maps.Marker({
903				position: {
904					lat: item.lat, 
905					lng: item.lng
906				},
907				map: map,
908				draggable: (item.bez == translate('Benutzerdefinierte Position') || item.bez == translate('Aktuelle Position')),
909				polygon: tempPolygon,
910				gebnr: item.gno,
911				objType: item.typ,
912				label: {
913					text: strContent,
914					className: labelMarker,
915					color: (labelMarker !== 'markerlabel' ? 'black' : '#820101')
916				},
917				hiddenContent: hiddenContent,
918				icon: {
919					url: iconMarker,
920					labelOrigin: new google.maps.Point((labelMarker !== 'markerlabel' ? 12 : 0), (labelMarker !== 'markerlabel' ? 15 : 38))
921				},
922				exportMarker: exportMarker,
923				markerTyp: 'full',
924				address: item.adr,
925				navStartEnd: type
926			});
927		} else {
928			markerBuilding[item.gno] = {
929				gebnr: item.gno,
930				objType: item.typ,
931				label: { text: item.bez },
932				exportMarker: exportMarker,
933				markerTyp: 'reduced',
934				address: item.adr,
935				navStartEnd: type
936			};
937		}
938	}
939	
940	function clearSearch( onlyNavigation, changeButton ) {
941		onlyNavigation = typeof onlyNavigation !== 'undefined' ? onlyNavigation : false;
942		changeButton   = typeof changeButton   !== 'undefined' ? changeButton   : true;
943		
944		$('.ui-autocomplete li').remove();
945		
946		if ( !onlyNavigation ) {
947			$('#map').css('left', '0').resize();
948			$('#overlayInfo').hide( 'slide', {}, 250 );
949			// Setze die Karte auf den Default
950			map.setZoom(15);
951			map.setCenter( { lat: 50.77767, lng: 6.077912 } );
952		}
953		
954		for ( key in markerBuilding ) {
955			if (!onlyNavigation || markerBuilding[key].navStartEnd != 'end') {
956				if (markerBuilding[key].map != null) markerBuilding[key].setMap(null);
957				if (markerBuilding[key].polygon != null) markerBuilding[key].polygon.setMap(null);
958				delete markerBuilding[key];
959			}
960		}
961		
962		if ( changeButton ) {
963			$('#main-menu .delete').removeClass('delete').attr('title', translate('Routenplaner')).html(translate('Routenplaner'));
964		}
965	}
966	
967	function centerAndZoomMap() {
968		var minLat = 1000.0, minLng = 1000.0, maxLat = -1000.0, maxLng = -1000.0;
969		
970		for ( key in markerBuilding ) {
971			if (markerBuilding[key].markerTyp != 'reduced') {
972				if ( markerBuilding[key].getPosition().lat() < minLat ) minLat = markerBuilding[key].getPosition().lat();
973				if ( markerBuilding[key].getPosition().lat() > maxLat ) maxLat = markerBuilding[key].getPosition().lat();
974				if ( markerBuilding[key].getPosition().lng() < minLng ) minLng = markerBuilding[key].getPosition().lng();
975				if ( markerBuilding[key].getPosition().lng() > maxLng ) maxLng = markerBuilding[key].getPosition().lng();
976			}
977		}
978		
979		if (!$('#toggleparkingzones').hasClass('show')) {
980			for ( key in polygonParkingZones ) {
981				if ( polygonParkingZones[key].getPosition().lat() < minLat ) minLat = polygonParkingZones[key].getPosition().lat();
982				if ( polygonParkingZones[key].getPosition().lat() > maxLat ) maxLat = polygonParkingZones[key].getPosition().lat();
983				if ( polygonParkingZones[key].getPosition().lng() < minLng ) minLng = polygonParkingZones[key].getPosition().lng();
984				if ( polygonParkingZones[key].getPosition().lng() > maxLng ) maxLng = polygonParkingZones[key].getPosition().lng();
985			}
986		}
987		
988		if (minLat < 1000.0 && minLng < 1000.0 && maxLat > -1000.0 && maxLng > -1000.0) {
989			var bounds = new google.maps.LatLngBounds( { lat: minLat, lng: minLng }, { lat: maxLat, lng: maxLng } );
990			map.setZoom(Math.max(0, Math.min(getZoomByBounds( bounds ) + modifyZoom, 18)));
991			map.setCenter( bounds.getCenter() );
992			modifyZoom = 0;
993		}
994	}
995	
996	function getZoomByBounds( bounds ){
997		if (typeof map.getProjection() === 'undefined') return;
998		
999		var MAX_ZOOM = 18 ;
1000		var MIN_ZOOM = 0 ;
1001
1002		var ne = map.getProjection().fromLatLngToPoint( bounds.getNorthEast() );
1003		var sw = map.getProjection().fromLatLngToPoint( bounds.getSouthWest
1003() ); 
1004
1005		var worldCoordWidth  = Math.abs( ne.x - sw.x );
1006		var worldCoordHeight = Math.abs( ne.y - sw.y );
1007
1008		var FIT_PAD = 40;
1009
1010		for ( var zoom = MAX_ZOOM; zoom >= MIN_ZOOM; --zoom ) {
1011			if ( worldCoordWidth * (1 << zoom) + 2 * FIT_PAD < $(map.getDiv()).width() && worldCoordHeight * (1 << zoom) + 2 * FIT_PAD < $(map.getDiv()).height() ) return zoom;
1012		}
1013		
1014		return 0;
1015	}
1016	
1017	function selectSelectableInfo( item, toNavigate, field ) {
1018		if (typeof item === 'undefined') return;
1019		
1020		$(field == 'end' ? '#search' : '#startNav').val(item.bez);
1021		successfulSearch( [ item ], 0, field );
1022		setNavigationVisibility(toNavigate);
1023		expandSidepanel( true );
1024		
1025		$('#selectableInfoWrapper').hide('fade', {}, 250);
1026	}
1027	
1028	$('#selectableInfoWrapper').on('click', '.selectableInfo .infodiv', function() {
1029		selectSelectableInfo( jQuery.data( $(this).parent()[0], "item" ), false, 'end' );
1030	});
1031	
1032	$('#selectableInfoWrapper').on('click', '.selectableInfo .navigateFrom', function() {
1033		selectSelectableInfo( jQuery.data( $(this).parent()[0], "item" ), true, 'start' );
1034	});
1035	
1036	$('#selectableInfoWrapper').on('click', '.selectableInfo .navigateTo', function() {
1037		selectSelectableInfo( jQuery.data( $(this).parent()[0], "item" ), true, 'end' );
1038	});
1039
1040	$('#selectableInfoWrapper .closewindow').on('click', function() {
1041		$('#selectableInfoWrapper').hide('fade', {}, 250);
1042	});
1043	
1044	$('#search').on('focus', function() {
1045		$('.ui-autocomplete:has(li)').css('display', 'block');
1046	});
1047	
1048	$('.search-input').on('keypress', function( e ) {
1049		if ( e.which == 13 && $(this).next('span.searchplace').hasClass('active') ) {
1050			$(this).next('span.searchplace').click();
1051			$(this).blur();
1052		}
1053	});
1054	
1055	$('#main-menu .calcroute').on('click', function() {
1056		if ( $(this).hasClass('delete') ) {
1057			$('#search').val('');
1058			$('#main-menu .searchplace').removeClass('active')
1059			if ($('body').hasClass('geolocation')) $('#main-menu .searchplace').attr('title', translate('Aktuelle Position')).html(translate('Aktuelle Position'));
1060			clearSearch();
1061			changeURL( translate('Suche') );
1062		} else {
1063			setNavigationVisibility(true);
1064		}
1065	});
1066	
1067	$('#overlayInfo .routewrapper').on('click', function() {
1068		for ( key in markerBuilding ) {
1069			if (markerBuilding[key].exportMarker) {
1070				if (markerBuilding[key].objType != 'geo') {
1071					$('#search').val(markerBuilding[key].hiddenContent != '' ? markerBuilding[key].hiddenContent : markerBuilding[key].label.text);
1072				} else {
1073					$('#search').val((Math.round(markerBuilding[key].getPosition().lat()  * 100000) / 100000) + ',' + (Math.round(markerBuilding[key].getPosition().lng()  * 100000) / 100000));
1074				}
1075			}
1076		}
1077
1078		setNavigationVisibility(true);
1079	});
1080	
1081	$('#main-menu-wrapper .searchplace').on('click', function() {
1082		$('#startingParameters').attr('data-last-used', $(this).attr('data-marker'));
1083
1084		if ( $(this).hasClass('active') ) {
1085			var re = /\d+\.\d+, *\d+\.\d+/gi;
1086			// var re = /\d+\.\d+,\d+\.\d+|\d+\.\d+, +\d+\.\d+/gi;
1087			
1088			if ( $(this).prev('.search-input').val().match(re) ) {
1089				var coords = $(this).prev('.search-input').val().split(',');
1090				
1091				var lat = Math.round(parseFloat(coords[0]) * 100000) / 100000,
1092					lng = Math.round(parseFloat(coords[1]) * 100000) / 100000;
1093				
1094				$(this).prev('.search-input').val(lat + ',' + lng);
1095				
1096				var item = { 'gno': 'curpos', 'bez': translate('Benutzerdefinierte Position'), 'adr': '', 'img': 0, 'rel': 0, 'info': '', 'typ': 'geo', 'lat': lat, 'lng': lng }
1097				successfulSearch( [ item ], 0, $(this).attr('data-marker') );
1098				
1099				changeURL( translate('Suche') );
1100			} else {
1101				var strRoute = '';
1102				if ($('body').hasClass('routeplaner')) strRoute = '&route=1';
1103
1104				$.ajax({
1105					url: ajaxURL + "&q=" + escape($(this).prev('.search-input').val()).replace( new RegExp( '\\+', 'g' ), '%2B' ) + strRoute,
1106					dataType: 'json',
1107					success: function( data ) {
1108						if ( !successfulSearch( data, 0, $('#startingParameters').attr('data-last-used') ) ) {
1109							var strSuche = '#search';
1110							if ($('#startingParameters').attr('data-last-used') == 'start') strSuche = '#startNav';
1111							
1112							geocoder.geocode({
1113								address: $(strSuche).val(),
1114								bounds: new google.maps.LatLngBounds(
1115									{
1116										lat: 49.77767, 
1117										lng: 5.077912 
1118									},
1119									{
1120										lat: 51.77767, 
1121										lng: 7.077912 
1122									}
1123								)
1124							}, function( results, status ) {
1125								if ( status == google.maps.GeocoderStatus.OK ) {
1126									var item = { 'gno': 'curpos_' + $('#startingParameters').attr('data-last-used'), 'bez': $(strSuche).val(), 'adr': $(strSuche).val(), 'img': 0, 'rel': 0, 'info': '', 'typ': 'geo', 'lat': results[0].geometry.location.lat(), 'lng': results[0].geometry.location.lng() }
1127									successfulSearch( [ item ], 0, $('#startingParameters').attr('data-last-used') );
1128								} else {
1129									openMessageDialog( translate('Keine Suchtreffer'), translate('Es konnten leider keine Suchtreffer zu Ihrer Anfrage gefunden werden.') );
1130									if (!$('body').hasClass('routeplaner')) clearSearch();
1131								}
1132								
1133								changeURL( translate('Suche') );
1134							});
1135						} else {
1136							changeURL( translate('Suche') );
1137						}
1138					}
1139				});
1140			}
1141		} else {
1142			navigator.geolocation.getCurrentPosition( handle_geolocation_query, handle_geolocation_errors );
1143		}
1144	});
1145	
1146	$('.settingspanel .search-group[data-type]').on('click', function() {
1147		setNavigationVisibility(false);
1148		
1149		$('.settingspaneloverlay').hide('fade', {}, 250);
1150		$('.settingspanel').hide('slide', {}, 250);	
1151		
1152		$('#search').val('');
1153		$('#main-menu .searchplace').removeClass('active')
1154		if ($('body').hasClass('geolocation')) $('#main-menu .searchplace').attr('title', translate('Aktuelle Position')).html(translate('Aktuelle Position'));
1155
1156		var strType = $(this).data('type');
1157		
1158		if (strType !== '') {
1159			$('#startingParameters').attr('data-last-used', 'end');
1160
1161			$.ajax({
1162				url: ajaxURL + "&mode=type&q=" + strType,
1163				dataType: 'json',
1164				success: function( data ) {
1165					successfulSearch( data, 0, $('#startingParameters').attr('data-last-used') );
1166					changeURL( translate('Suche') );
1167				}
1168			});
1169		}
1170	});
1171	
1172	$('#main-menu-wrapper .buttonNav').on('click', function() {
1173		if (!($(this).hasClass('active'))) {
1174			$('#main-menu-wrapper .buttonNav').removeClass('active');
1175			$(this).addClass('active');
1176			
1177			clearRoute();
1178			
1179			allowChangeURL = 2;
1180			changeURL( 'change Navigation Type' );
1181			allowChangeURL = 1;
1182		}
1183	});
1184	
1185	$('#main-menu-wrapper .switchNav').on('click', function() {
1186		var tempStr = $('#startNav').val();
1187		$('#startNav').val($('#search').val());
1188		$('#search').val(tempStr);
1189		
1190		clearRoute();
1191		
1192		$('.ui-autocomplete li').remove();
1193		updateSearchItem('#startNav');
1194		updateSearchItem('#search');
1195		
1196		for ( key in markerBuilding ) {
1197			var tmp = markerBuilding[key].navStartEnd;
1198			markerBuilding[key].setOptions( { navStartEnd: (tmp == 'end' ? 'start' : 'end') } );
1199		}
1200		
1201		changeURL ( 'switch Navigation' );
1202	});
1203	
1204	$('#main-menu-wrapper .closeNav').on('click', function() {
1205		setNavigationVisibility( false );
1206	});
1207
1208	$('#calcRouteButton').on('click', function() {
1209		if ($(this).hasClass('deactivated')) return;
1210		
1211		var removeRoute = $(this).hasClass('removeRoute');
1212		
1213		if ( removeRoute ) {
1214			clearRoute();
1215		} else {
1216			var coords = { 'start': '', 'end': '' }, arrCounter = 0;
1217			
1218			for ( key in markerBuilding ) {
1219				if (markerBuilding[key].address != '' && markerBuilding[key].objType != 'geo')
1220					coords[markerBuilding[key].navStartEnd] = markerBuilding[key].address;
1221				else
1222					coords[markerBuilding[key].navStartEnd] = markerBuilding[key].getPosition().lat() + ',' + markerBuilding[key].getPosition().lng();
1223				
1224				arrCounter++;
1225			}
1226			
1227			if (arrCounter != 2 || coords['start'] == '' || coords['end'] == '') {
1228				openMessageDialog( translate('Fehler: Koordinaten'), translate('Zur Berechnung einer Route m&uuml;ssen genau zwei Marker auf der Karte existieren. Einer f&uuml;r Ihren Startpunkt und einer f&uuml;r Ihren Zielpunkt.') );
1229				return;
1230			}
1231			
1232			$('#calcRouteButton').addClass('deactivated');
1233			
1234			var mode = google.maps.TravelMode.DRIVING;
1235			if      ($('#main-menu-wrapper .buttonNav.transit').hasClass('active'))   mode = google.maps.TravelMode.TRANSIT;
1236			else if ($('#main-menu-wrapper .buttonNav.walking').hasClass('active'))   mode = google.maps.TravelMode.WALKING;
1237			else if ($('#main-menu-wrapper .buttonNav.bicycling').hasClass('active')) mode = google.maps.TravelMode.BICYCLING;
1238
1239			dirService.route({
1240				origin: coords['start'], 
1241				destination: coords['end'], 
1242				travelMode: mode,
1243				provideRouteAlternatives: true
1244			}, function( result, status ) {
1245				if ( status == google.maps.DirectionsStatus.OK ) {
1246					dirDisplay.setPanel( document.getElementById('routePanel') );
1247					dirDisplay.setDirections( result );
1248					dirDisplay.setMap( map );
1249					
1250					$('#calcRouteButton').html(translate('Route entfernen')).addClass('removeRoute');
1251					$('#overlayInfo .navigationWrapper .topBackground').animate( { height: 140 }, 250, null );
1252					$('#overlayInfo .navigationWrapper .bottomBackground').animate( { top: 140 }, 250, null );
1253				} else {
1254					openMessageDialog( translate('Fehler: Berechnung der Route'), translate('Es gab leider Probleme bei der Berechnung Ihrer Route. Bitte versuchen Sie es sp&auml;ter erneut.') );
1255				}
1256				
1257				$('#calcRouteButton').removeClass('deactivated');
1258			});
1259		}
1260	});
1261	
1262	function clearRoute() {
1263		dirDisplay.setPanel( null );
1264		dirDisplay.setMap( null );
1265		
1266		$('#calcRouteButton').html(translate('Route berechnen')).removeClass('removeRoute');
1267		$('#overlayInfo .navigationWrapper .topBackground').animate( { height: 180 }, 250, null );
1268		$('#overlayInfo .navigationWrapper .bottomBackground').animate( { top: 180 }, 250, null );
1269	}
1270	
1271	function setNavigationVisibility( activate ) {
1272		if ( activate ) {
1273			$('body').addClass('routeplaner');
1274			
1275			for ( key in markerBuilding ) {
1276				if (!(markerBuilding[key].exportMarker)) {
1277					if (markerBuilding[key].map != null) markerBuilding[key].setMap(null);
1278					if (markerBuilding[key].polygon != null) markerBuilding[key].polygon.setMap(null);
1279					delete markerBuilding[key];
1280				}
1281			}
1282			
1283			$('#overlayInfo .additionalInfos').html('').attr('data-nearobjects', '').attr('data-informations', '');
1284			
1285			$('#main-menu').css('box-shadow', '0 0');
1286			$('#main-menu .search-input').attr('placeholder', translate('Zielpunkt'));
1287			
1288			if (!($('#overlayInfo').is(':visible'))) {
1289				$('#overlayInfo .navigationWrapper').show();
1290				if (!mobileVersion) $('#map').css('left', 'min(90dvw, 332px)').resize();
1291				$('#overlayInfo').show( 'slide', {}, 250 );
1292				offsetCenter( -166, 0 );
1293			} else {
1294				$('#overlayInfo .navigationWrapper').show( 'fade', {}, 250 );
1295			}
1296			
1297			$('#search').removeClass('extrapadding');
1298			$('#main-menu-wrapper').animate({
1299				top: '0'
1300			}, 250, function() {});
1301			$('.settings').animate({
1302				top: '11px',
1303				left: '5px'
1304			}, 250, function() {});
1305			$('#main-menu-wrapper').addClass('doing-routes');
1306			setTimeout(function() { $('#main-menu-wrapper .switchNav').css( 'display', 'inline-block' ); }, 250);
1307		} else {
1308			$('body').removeClass('routeplaner');
1309			
1310			clearRoute();
1311			
1312			$('#main-menu').css('box-shadow', '');
1313			$('#main-menu .search-input').attr('placeholder', translate('In RWTH Maps suchen'));
1314			
1315			var relevantMarkers = false;
1316			for ( key in markerBuilding ) {
1317				if (markerBuilding[key].navStartEnd == 'end') {
1318					relevantMarkers = true;
1319					break;
1320				}
1321			}
1322			
1323			if ( !relevantMarkers ) {
1324				$('#map').css('left', '0').resize();
1325				$('#overlayInfo').hide( 'slide', {}, 250, function() {
1326					$('#overlayInfo .navigationWrapper').hide();
1327				} );
1328				offsetCenter( 166, 0 );
1329			} else {
1330				$('#overlayInfo .navigationWrapper').hide( 'fade', {}, 250 );
1331			}
1332			
1333			$('#startNav').val('');
1334			$('#startNav').next('.searchplace').removeClass('active');
1335			if ($('body').hasClass('geolocation')) $('#main-menu-wrapper .searchplace').attr('title', translate('Aktuelle Position')).html(translate('Aktuelle Position'));
1336			clearSearch( true, !relevantMarkers );
1337			
1338			$('#search').addClass('extrapadding');
1339			$('#main-menu-wrapper .switchNav').css( 'display', 'none' );
1340			$('#main-menu-wrapper').animate({
1341				top: '-87px'
1342			}, 250, function() {});
1343			$('.settings').animate({
1344				top: '102px',
1345				left: '13px'
1346			}, 250, function() {});
1347			$('#main-menu-wrapper').removeClass('doing-routes');
1348		}
1349		
1350		changeURL( 'Change NAV-Mode' );
1351	}
1352	
1353	function handle_geolocation_query( position ) {
1354		var lat = Math.round(position.coords.latitude  * 100000) / 100000,
1355			lng = Math.round(position.coords.longitude * 100000) / 100000;
1356		
1357		if ($('#startingParameters').attr('data-last-used') == 'end') {
1358			$('#search').val(lat + ',' + lng);
1359			$('#search').next('span.searchplace').addClass('active');
1360		} else {
1361			$('#startNav').val(lat + ',' + lng);
1362			$('#startNav').next('span.searchplace').addClass('active');
1363		}
1364		var item = { 'gno': 'curpos', 'bez': translate('Aktuelle Position'), 'adr': '', 'img': 0, 'rel': 0, 'info': '', 'typ': 'geo', 'lat': lat, 'lng': lng }
1365		successfulSearch( [ item ], 0, $('#startingParameters').attr('data-last-used') );
1366		changeURL( translate('Suche') );
1367	}
1368
1369	function handle_geolocation_errors( error ) {
1370		switch ( error.code ) {
1371			case error.PERMISSION_DENIED:
1372				openMessageDialog( translate('Fehler: Geolocation'), translate('Ihr Ger\u00e4t verbietet der Anwendung ihre aktuelle Geolocation zu ermitteln. Dies kann gegebenenfalls daran liegen, dass sie unverschl\u00fcsselt auf dieser Webseite surfen.') );
1373				break;
1374			case error.POSITION_UNAVAILABLE:
1375				openMessageDialog( translate('Fehler: Geolocation'), translate('Ihre aktuelle Geolocation konnte nicht ermittelt werden.') );
1376				break;
1377			case error.TIMEOUT:
1378				openMessageDialog( translate('Fehler: Geolocation'), translate('Es hat zu lange gedauert ihre Geolocation zu ermitteln, sodass der Versuch abgebrochen wurde.') );
1379				break;
1380			default:
1381				openMessageDialog( translate('Fehler: Geolocation'), translate('Ein unbekannter Fehler ist beim Ermitteln der Geolocation aufgetreten.') );
1382				break;
1383		}
1384	} 
1385
1386	function openMessageDialog( title, message ) {
1387		$('#overlayDialog').html(message);
1388		$('#overlayDialog').dialog({
1389			closeOnEscape: true,
1390			draggable: !mobileVersion,
1391			resizable: false,
1392			modal: true,
1393			width: mobileVersion ? '97%' : 385,
1394			title: title,
1395			position: { my: "center", at: "center", of: window },
1396			show: { effect: 'fade', duration: 200 },
1397			hide: { effect: 'fade', duration: 200 }
1398		});
1399	}
1400	
1401	$('#overlayInfo .sub-menu .nearobjects').on('click', function() {
1402		if ( $(this).hasClass('active') ) {
1403			$('#overlayNearObjects').show( 'fade', {}, 200 );
1404		}
1405	});
1406	
1407	$('#overlayNearObjects').on('mouseleave', function() {
1408		$('#overlayNearObjects').hide( 'fade', {}, 200 );
1409	});
1410	
1411	$('#overlayNearObjects span').on('click', function() {
1412		$('#overlayNearObjects').hide( 'fade', {}, 200 );
1413		
1414		var dataType = $(this).attr('data-type');
1415		var tempMarker = markerBuilding[$('#overlayInfo .sub-menu .nearobjects').attr('data-key')];
1416		
1417		getObjectsNearX( tempMarker, dataType, getDistanceFromZoom() );
1418	});
1419	
1420	$('#overlayInfo .sub-menu .organisation').on('click', function() {
1421		if ( $(this).hasClass('active') ) {
1422			if ( $(this).hasClass('schedule') || $(this).hasClass('externalinfos') ) {
1423				window.open( $(this).attr('data-key'), '_blank' );
1424			} else {
1425				getObjectsWithRelation( $(this).attr('data-key') );
1426			}
1427		}
1428	});
1429	
1430	$('#overlayInfo .sub-menu .share').on('click', function() {
1431		$('#overlayShare input').val( 'https://maps.rwth-aachen.de' + buildURL() );
1432		
1433		$('#overlayShare').dialog({
1434			closeOnEscape: true,
1435			draggable: !mobileVersion,
1436			resizable: false,
1437			modal: true,
1438			width: mobileVersion ? '97%' : 500,
1439			height: 132,
1440			position: { my: "center", at: "center", of: window },
1441			show: { effect: 'fade', duration: 200 },
1442			hide: { effect: 'fade', duration: 200 }
1443		});
1444
1445		$('#overlayShare input').select();
1446	});
1447	
1448	$('.toggleVisibility').on('click', function() {
1449		if ( $(this).hasClass('show') ) {
1450			expandSidepanel( true );
1451		} else {
1452			collideSidepanel( true );
1453		}
1454	});
1455	
1456	function expandSidepanel( updateURL ) {
1457		if (!$('.toggleVisibility').hasClass('show')) return;
1458		
1459		$('.toggleVisibilityTarget').removeClass('slided-out');
1460		if (updateURL) {
1461			setTimeout(function() {
1462				if ($('.toggleVisibility').hasClass('show')) {
1463					$('.toggleVisibility').removeClass('show');
1464					changeURL( 'expand sidepanel' );
1465				}
1466			}, 250);
1467		} else {
1468			$('.toggleVisibility').removeClass('show');
1469		}
1470		
1471		$('#overlayInfo .toggleVisibility[title]').attr('title', translate('Men\u00fc ausblenden'));
1472		
1473		if (!mobileVersion) {
1474			$('#map').css('left', 'min(90dvw, 332px)').resize();
1475			offsetCenter( -166, 0 );
1476		}
1477		
1478		$('#overlayInfo').css('--imgcontainer-height', $('#overlayInfo .imgcontainer').outerHeight() + 'px');
1479	}
1480	
1481	function collideSidepanel( updateURL ) {
1482		if ($('.toggleVisibility').hasClass('show')) return;
1483
1484		$('.toggleVisibilityTarget').addClass('slided-out');
1485		if (updateURL) {
1486			setTimeout(function() {
1487				if (!$('.toggleVisibility').hasClass('show')) {
1488					$('.toggleVisibility').addClass('show');
1489					changeURL( 'collide sidepanel' );
1490				}
1491			}, 250);
1492		} else {
1493			$('.toggleVisibility').addClass('show');
1494		}
1495		
1496		$('#overlayInfo .toggleVisibility[title]').attr('title', translate('Men\u00fc einblenden'));
1497		
1498		if (!mobileVersion) {
1499			offsetCenter( 166, 0 );
1500			$('#map').css('left', '0').resize();
1501		}
1502	}
1503	
1504	$('.show-on-js').show();
1505	
1506	$('#toggleenvironmentzone').on('click', function() {
1507		if ($(this).hasClass('ready')) {
1508			if ($('#toggleenvironmentzone').hasClass('show')) {
1509				showUmweltzone();
1510			} else {
1511				hideUmweltzone();
1512			}
1513		}
1514	});
1515	
1516	function showUmweltzone() {
1517		$('#toggleenvironmentzone').removeClass('show');
1518		
1519		if (polygonEnvironmentalZone.length > 0) {
1520			$('#toggleenvironmentzone').html(translate('Umweltzone ausblenden'));
1521			
1522			for (var i = 0; i < polygonEnvironmentalZone.length; i++) {
1523				polygonEnvironmentalZone[i].setMap( map );
1524			}
1525			
1526			changeURL( 'toggle environmental zone' );
1527			$('.closesettings').click();
1528		} else {
1529			$('#toggleenvironmentzone').removeClass('ready').html(translate('Lade Umweltzone...'));
1530			
1531			$.ajax({
1532				url: ajaxURL + "&mode=environmentalzone",
1533				dataType: 'json',
1534				success: function( data ) {
1535					for (var i = 0; i < data.length; i++) {
1536						polygonEnvironmentalZone[i] = new google.maps.Polygon({
1537							paths: getArrayFromCoordString(data[i].pol),
1538							strokeColor: getStrokeColorByType( data[i].typ ),
1539							strokeOpacity: getStrokeOpacityByType( data[i].typ ),
1540							strokeWeight: 3,
1541							fillColor: getFillColorByType( data[i].typ ),
1542							fillOpacity: getFillOpacityByType( data[i].typ ),
1543							map: map,
1544							zIndex: getZIndexByType( data[i].typ )
1545						});
1546					}
1547					
1548					$('#toggleenvironmentzone').addClass('ready').html(translate('Umweltzone ausblenden'));
1549					changeURL( 'toggle environmental zone' );
1550					$('.closesettings').click();
1551				},
1552				error: function() { 
1553					$('#toggleenvironmentzone').addClass('show').addClass('ready').html(translate('Umweltzone einblenden'));
1554					// TODO: Alert in Dialog umwandeln
1555					alert( 'Die Polygondaten fuer die Umweltzone konnten nicht geladen werden! Bitte versuchen Sie es spaeter erneut.' );
1556				}
1557			});
1558		}
1559	}
1560	
1561	function hideUmweltzone() {
1562		$('#toggleenvironmentzone').addClass('show').html(translate('Umweltzone einblenden'));
1563		
1564		for (var i = 0; i < polygonEnvironmentalZone.length; i++) {
1565			polygonEnvironmentalZone[i].setMap( null );
1566		}
1567		
1568		changeURL( 'toggle environmental zone' );
1569		$('.closesettings').click();
1570	}
1571	
1572	$('#toggleparkingzones').on('click', function() {
1573		if ($(this).hasClass('ready')) {
1574			if ($('#toggleparkingzones').hasClass('show')) {
1575				showParkzonen();
1576			} else {
1577				hideParkzonen();
1578			}
1579		}
1580	});
1581	
1582	function showParkzonen() {
1583		$('#toggleparkingzones').removeClass('show');
1584		
1585		if (polygonParkingZones.length > 0) {
1586			$('#toggleparkingzones').html(translate('Parkzonen ausblenden'));
1587			
1588			for (var i = 0; i < polygonParkingZones.length; i++) {
1589				polygonParkingZones[i].setMap( map );
1590				polygonParkingZones[i].polygon.setMap( map );
1591			}
1592			
1593			centerAndZoomMap();
1594			changeURL( 'toggle parking zones' );
1595			$('.closesettings').click();
1596		} else {
1597			$('#toggleparkingzones').removeClass('ready').html(translate('Lade Parkzonen...'));
1598			
1599			$.ajax({
1600				url: ajaxURL + "&mode=parkingzones",
1601				dataType: 'json',
1602				success: function( data ) {
1603					for (var i = 0; i < data.length; i++) {
1604						typePZ = data[i].typ + data[i].bez.replace('Parkzonen ', '').replace('Parkzone ', '');
1605						
1606						var tempPolygon = new google.maps.Polygon({
1607							paths: getArrayFromCoordString(data[i].pol),
1608							strokeColor: getStrokeColorByType( typePZ ),
1609							strokeOpacity: getStrokeOpacityByType( typePZ ),
1610							strokeWeight: 5,
1611							fillColor: getFillColorByType( typePZ ),
1612							fillOpacity: getFillOpacityByType( typePZ ),
1613							map: map,
1614							zIndex: getZIndexByType( data[i].typ )
1615						});
1616						
1617						polygonParkingZones[i] = new google.maps.Marker({
1618							position: {
1619								lat: data[i].lat, 
1620								lng: data[i].lng
1621							},
1622							map: map,
1623							draggable: false,
1624							polygon: tempPolygon,
1625							label: {
1626								text: data[i].bez.replace('Parkzonen ', '').replace('Parkzone ', ''),
1627								className: 'parkingzonelabel'
1628							},
1629							icon: {
1630								url: 'libraries/rwth/img/parkzone.png',
1631								labelOrigin: new google.maps.Point(16, 48)
1632							}
1633						});
1634					}
1635					
1636					$('#toggleparkingzones').addClass('ready').html(translate('Parkzonen ausblenden'));
1637					centerAndZoomMap();
1638					changeURL( 'toggle parking zones' );
1639					$('.closesettings').click();
1640				},
1641				error: function() { 
1642					$('#toggleparkingzones').addClass('show').addClass('ready').html(translate('Parkzonen einblenden'));
1643					// TODO: Alert in Dialog umwandeln
1644					alert( 'Die Polygondaten fuer die Parkzonen konnten nicht geladen werden! Bitte versuchen Sie es spaeter erneut.' );
1645				}
1646			});
1647		}
1648	}
1649
1650	function hideParkzonen() {
1651		$('#toggleparkingzones').addClass('show').html(translate('Parkzonen einblenden'));
1652		
1653		for (var i = 0; i < polygonParkingZones.length; i++) {
1654			polygonParkingZones[i].setMap( null );
1655			polygonParkingZones[i].polygon.setMap( null );
1656		}
1657		
1658		centerAndZoomMap();
1659		changeURL( 'toggle parking zones' );
1660		$('.closesettings').click();
1661	}
1662	
1663	if (!mobileVersion) {
1664		$('.tooltip').tooltip({
1665			position: {
1666				my: "center top",
1667				at: "center bottom",
1668				collision: "none"
1669			},
1670			classes: { "ui-tooltip": "ui-corner-all ui-widget-shadow arrowup" }
1671		});
1672		
1673		$('.tooltipright').tooltip({
1674			position: {
1675				my: "left center",
1676				at: "right center",
1677				collision: "none"
1678			},
1679			classes: { "ui-tooltip": "ui-corner-all ui-widget-shadow arrowleft" }
1680		});
1681		
1682		$('.tooltipleft').tooltip({
1683			position: {
1684				my: "right center",
1685				at: "left center",
1686				collision: "none"
1687			},
1688			classes: { "ui-tooltip": "ui-corner-all ui-widget-shadow arrowright" }
1689		});
1690	}
1691	
1692	$('#map').on('mousedown', function() {
1693		$('#search').blur();
1694	});
1695	
1696	function getDistanceFromZoom() {
1697		if      (map.getZoom() >= 18) return 0.15;
1698		else if (map.getZoom() == 17) return 0.375;
1699		else if (map.getZoom() <= 16) return 0.75;
1700		
1701		return 0.15;
1702	}
1703	
1704	function offsetCenter( offsetx, offsety ) {
1705		if (typeof map === 'undefined' || typeof map.getBounds() === 'undefined') return;
1706		
1707		var scale = Math.pow(2, map.getZoom());
1708		var nw = new google.maps.LatLng(
1709			map.getBounds().getNorthEast().lat(),
1710			map.getBounds().getSouthWest().lng()
1711		);
1712
1713		var worldCoordinateCenter = map.getProjection().fromLatLngToPoint(map.getCenter());
1714		
1715		var pixelOffset = new google.maps.Point( (offsetx/scale) || 0, (offsety/scale) || 0 );
1716
1717		var worldCoordinateNewCenter = new google.maps.Point(
1718			worldCoordinateCenter.x - pixelOffset.x,
1719			worldCoordinateCenter.y + pixelOffset.y
1720		);
1721
1722		var newCenter = map.getProjection().fromPointToLatLng(worldCoordinateNewCenter);
1723
1724		map.setCenter(newCenter);
1725	}
1726
1727	function getArrayFromCoordString( coords ) {
1728		var arrCoords = coords.split(';');
1729		var arrLatLng = [];
1730
1731		for (var i = 0; i < arrCoords.length; ++i) {
1732			var curCoord = arrCoords[i].split(',');
1733			
1734			if ((!isNaN(parseFloat(curCoord[0]))) && (!isNaN(parseFloat(curCoord[1])))) {
1735				arrLatLng.push( { lat: parseFloat(curCoord[1]), lng: parseFloat(curCoord[0]) } );
1736			}
1737		}
1738		
1739		return arrLatLng;
1740	}
1741	
1742	function changeURL( title ) {
1743		if ( allowChangeURL == 1 ) {
1744			// alert('Push State: ' + JSON.stringify(buildStateObject()));
1745			window.history.pushState( buildStateObject(), title, buildURL() );
1746		} else if ( allowChangeURL == 2 ) {
1747			// alert('Replace State: ' + JSON.stringify(buildStateObject()));
1748			window.history.replaceState( buildStateObject(), title, buildURL() );
1749		}
1750	}
1751	
1752	function buildStateObject() {
1753		var strGNO = '', strGNOSource = '', coords = '', scoords = '', dlabel = '', slabel= '';
1754		for ( key in markerBuilding ) {
1755			if (markerBuilding[key].exportMarker) {
1756				if (markerBuilding[key].objType != 'geo') {
1757					if (markerBuilding[key].navStartEnd == 'end') {
1758						strGNO += key + ',';
1759					} else {
1760						if (strGNOSource == '') strGNOSource  = key;
1761						else					strGNOSource += ',' + key;
1762					}
1763				} else {
1764					if (markerBuilding[key].navStartEnd == 'end') {
1765						coords  = (Math.round(markerBuilding[key].getPosition().lat()  * 100000) / 100000) + ',' + (Math.round(markerBuilding[key].getPosition().lng()  * 100000) / 100000);
1766						if (markerBuilding[key].label.text != translate('Benutzerdefinierte Position') && markerBuilding[key].label.text != translate('Aktuelle Position')) dlabel = markerBuilding[key].label.text;
1767					} else {
1768						scoords = (Math.round(markerBuilding[key].getPosition().lat()  * 100000) / 100000) + ',' + (Math.round(markerBuilding[key].getPosition().lng()  * 100000) / 100000);
1769						if (markerBuilding[key].label.text != translate('Benutzerdefinierte Position') && markerBuilding[key].label.text != translate('Aktuelle Position')) slabel = markerBuilding[key].label.text;
1770					}
1771				}
1772			}
1773		}
1774
1775		var param;
1776		if ($('#overlayInfo .additionalInfos').attr('data-nearobjects')  != '') {
1777			param = {
1778				sur: $('#overlayInfo .additionalInfos').attr('data-nearobjects'),
1779				dist: $('#overlayInfo .additionalInfos').attr('data-nearobjects-distance'),
1780				info: ''
1781			};
1782		} else if ($('#overlayInfo .additionalInfos').attr('data-informations') != '') {
1783			param = { sur: '', dist: '', info: '1' };
1784		} else {
1785			param = { sur: '', dist: '', info: '' };
1786		}
1787		
1788		var boolRoute = $('body').hasClass('routeplaner');
1789		var strRoute = '';
1790		if (boolRoute) {
1791			if      ($('#main-menu-wrapper .buttonNav.transit').hasClass('active'))   strRoute = 'transit';
1792			else if ($('#main-menu-wrapper .buttonNav.walking').hasClass('active'))   strRoute = 'walking';
1793			else if ($('#main-menu-wrapper .buttonNav.bicycling').hasClass('active')) strRoute = 'bicycling';
1794			else																	  strRoute = 'driving';
1795		}
1796
1797		strOverlays = '';
1798		if (!$('#toggleparkingzones').hasClass('show'))    strOverlays += ',pz';
1799		if (!$('#toggleenvironmentzone').hasClass('show')) strOverlays += ',uz';
1800		if (strOverlays != '') strOverlays = strOverlays.substring(1);
1801
1802		var returnValue = {
1803				coords: '',
1804				dlabel: '',
1805				scoords: '',
1806				slabel: '',
1807				obj: '',
1808				sobj: '',
1809				route: strRoute,
1810				param: param,
1811				lang: strLang,
1812				map: map.getMapTypeId(),
1813				overlays: strOverlays,
1814				staticmode: staticmode,
1815				expandmenu: $('.toggleVisibility').hasClass('show') ? '0' : ''
1816			}
1817		
1818		if (coords != '') {
1819			returnValue = {
1820				coords: coords,
1821				dlabel: dlabel,
1822				scoords: scoords,
1823				slabel: slabel,
1824				obj: (strGNO != '' ? strGNO.substr(0, strGNO.length - 1) : ''),
1825				sobj: strGNOSource,
1826				route: strRoute,
1827				param: param,
1828				lang: strLang,
1829				map: map.getMapTypeId(),
1830				overlays: strOverlays,
1831				staticmode: staticmode,
1832				expandmenu: $('.toggleVisibility').hasClass('show') ? '0' : ''
1833			}
1834		} else if (strGNO != '') {
1835			returnValue = {
1836				coords: '',
1837				dlabel: '',
1838				scoords: scoords,
1839				slabel: slabel,
1840				obj: strGNO.substr(0, strGNO.length - 1),
1841				sobj: strGNOSource,
1842				route: strRoute,
1843				param: param,
1844				lang: strLang,
1845				map: map.getMapTypeId(),
1846				overlays: strOverlays,
1847				staticmode: staticmode,
1848				expandmenu: $('.toggleVisibility').hasClass('show') ? '0' : ''
1849			}
1850		} else if (scoords != '') {
1851			returnValue = {
1852				coords: '',
1853				dlabel: '',
1854				scoords: scoords,
1855				slabel: slabel,
1856				obj: '',
1857				sobj: '',
1858				route: strRoute,
1859				param: param,
1860				lang: strLang,
1861				map: map.getMapTypeId(),
1862				overlays: strOverlays,
1863				staticmode: staticmode,
1864				expandmenu: $('.toggleVisibility').hasClass('show') ? '0' : ''
1865			}
1866		} else if (strGNOSource != '') {
1867			returnValue = {
1868				coords: '',
1869				dlabel: '',
1870				scoords: '',
1871				slabel: '',
1872				obj: '',
1873				sobj: strGNOSource,
1874				route: strRoute,
1875				param: param,
1876				lang: strLang,
1877				map: map.getMapTypeId(),
1878				overlays: strOverlays,
1879				staticmode: staticmode,
1880				expandmenu: $('.toggleVisibility').hasClass('show') ? '0' : ''
1881			}
1882		}
1883		
1884		return returnValue;
1885	}
1886	
1887	function buildURL() {
1888		var strGNO = '', strGNOSource = '', coords = '', scoords = '';
1889		
1890		for ( key in markerBuilding ) {
1891			if (markerBuilding[key].exportMarker) {
1892				if (markerBuilding[key].objType != 'geo') {
1893					if (markerBuilding[key].navStartEnd == 'end') {
1894						strGNO += key + ',';
1895					} else {
1896						if (strGNOSource == '') strGNOSource  = key;
1897						else					strGNOSource += ',' + key;
1898					}
1899				} else {
1900					if (markerBuilding[key].navStartEnd == 'end') {
1901						coords  = (Math.round(markerBuilding[key].getPosition().lat()  * 100000) / 100000) + ',' + (Math.round(markerBuilding[key].getPosition().lng()  * 100000) / 100000);
1902						if (markerBuilding[key].label.text != translate('Benutzerdefinierte Position') && markerBuilding[key].label.text != translate('Aktuelle Position')) coords  += '&d-label=' + escape(markerBuilding[key].label.text);
1903					} else {
1904						scoords = (Math.round(markerBuilding[key].getPosition().lat()  * 100000) / 100000) + ',' + (Math.round(markerBuilding[key].getPosition().lng()  * 100000) / 100000);
1905						if (markerBuilding[key].label.text != translate('Benutzerdefinierte Position') && markerBuilding[key].label.text != translate('Aktuelle Position')) scoords += '&s-label=' + escape(markerBuilding[key].label.text);
1906					}
1907				}
1908			}
1909		}
1910
1911		var param = '';
1912		if      ($('#overlayInfo .additionalInfos').attr('data-nearobjects')  != '') param = '&sur=' + $('#overlayInfo .additionalInfos').attr('data-nearobjects') + '&dist=' + $('#overlayInfo .additionalInfos').attr('data-nearobjects-distance');
1913		else if ($('#overlayInfo .additionalInfos').attr('data-informations') != '') param = '&info=1';
1914		
1915		var boolRoute = $('body').hasClass('routeplaner');
1916		var strRoute = '';
1917		if (boolRoute) {
1918			if      ($('#main-menu-wrapper .buttonNav.transit').hasClass('active'))   strRoute = 'route=transit';
1919			else if ($('#main-menu-wrapper .buttonNav.walking').hasClass('active'))   strRoute = 'route=walking';
1920			else if ($('#main-menu-wrapper .buttonNav.bicycling').hasClass('active')) strRoute = 'route=bicycling';
1921			else																	  strRoute = 'route=driving';
1922		}
1923		
1924		var returnValue = boolRoute ? '&' + strRoute : '';
1925		
1926		if      (coords		  != '') returnValue = '&coords=' + coords + (strGNO != '' ? '&obj=' + strGNO.substr(0, strGNO.length - 1) : '') + (strGNOSource != '' ? '&s-obj=' : '') + strGNOSource + (scoords != '' ? '&s-coords=' : '') + scoords + param + (boolRoute ? '&' + strRoute : '');
1927		else if (strGNO		  != '') returnValue = '&obj=' + strGNO.substr(0, strGNO.length - 1) + (strGNOSource != '' ? '&s-obj=' : '') + strGNOSource + (scoords != '' ? '&s-coords=' : '') + scoords + param + (boolRoute ? '&' + strRoute : '');
1928		else if (scoords	  != '') returnValue = '&s-coords=' + scoords + (boolRoute ? '&' + strRoute : '');
1929		else if (strGNOSource != '') returnValue = '&s-obj=' + strGNOSource + (boolRoute ? '&' + strRoute : '');
1930		
1931		strOverlays = '';
1932		if (!$('#toggleparkingzones').hasClass('show'))    strOverlays += ',pz';
1933		if (!$('#toggleenvironmentzone').hasClass('show')) strOverlays += ',uz';
1934			
1935		if (staticmode) returnValue = '&static=1' + returnValue;
1936			
1937		if (strOverlays != '') returnValue = '&overlays=' + strOverlays.substring(1) + returnValue;
1938		
1939		if ($('.toggleVisibility').hasClass('show')) {
1940			returnValue = '&expandmenu=0' + returnValue;
1941		}
1942		
1943		returnValue = '&type=' + map.getMapTypeId() + returnValue;
1944		
1945		$('.switchlanguage').attr('href', '/navigator/?lang=' + (strLang == 'en' ? 'de' : 'en') + returnValue);
1946		
1947		return '/navigator/?lang=' + strLang + returnValue;
1948	}
1949	
1950	window.onpopstate = function( event ) {
1951		// alert('--- On Pop State ---\nhistory.state: ' + JSON.stringify(history.state) + '\nevent.state: ' + JSON.stringify(event.state));
1952		
1953		if ( event.state != null ) {
1954			allowChangeURL = 0;
1955			
1956			$('#startingParameters')
1957				.html( event.state.obj )
1958				.attr( 'data-current-position', event.state.coords )
1959				.attr( 'data-source-coords', event.state.scoords )
1960				.attr( 'data-source-obj', event.state.sobj )
1961				.attr( 'data-nearobjects', event.state.param.sur )
1962				.attr( 'data-nearobjects-distance', event.state.param.dist )
1963				.attr( 'data-informations', event.state.param.info )
1964				.attr( 'data-destination-label', event.state.dlabel )
1965				.attr( 'data-source-label', event.state.slabel )
1966				.attr( 'data-overlays', ',' + event.state.overlays + ',' )
1967				.attr( 'data-expandmenu', event.state.expandmenu )
1968				.attr( 'data-route', event.state.route );
1969
1970			staticmode = event.state.staticmode;
1971			if (staticmode) $('body').addClass('static');
1972			else			$('body').removeClass('static');
1973				
1974			mapTypeId = google.maps.MapTypeId.ROADMAP;
1975			if      (event.state.map == 'satellite') mapTypeId = google.maps.MapTypeId.SATELLITE;
1976			else if (event.state.map ==    'hybrid') mapTypeId = google.maps.MapTypeId.HYBRID;
1977			else if (event.state.map ==   'terrain') mapTypeId = google.maps.MapTypeId.TERRAIN;
1978
1979			map.setMapTypeId( mapTypeId );
1980			
1981			restoreURLValues();
1982		} else {
1983			$('#startingParameters')
1984				.html( '' )
1985				.attr( 'data-current-position', '' )
1986				.attr( 'data-source-coords', '' )
1987				.attr( 'data-source-obj', '' )
1988				.attr( 'data-nearobjects', '' )
1989				.attr( 'data-nearobjects-distance', '' )
1990				.attr( 'data-informations', '' )
1991				.attr( 'data-destination-label', '' )
1992				.attr( 'data-source-label', '' )
1993				.attr( 'data-overlays', ',,' )
1994				.attr( 'data-expandmenu', '' )
1995				.attr( 'data-route', '' );
1996				
1997			map.setMapTypeId( google.maps.MapTypeId.ROADMAP );
1998				
1999			$('#search').val('');
2000			$('#startNav').val('');
2001			$('#main-menu-wrapper .searchplace').removeClass('active')
2002			clearSearch();
2003		}
2004	};
2005
2006	function restoreURLValues() {
2007		if ($('#startingParameters').attr('data-overlays').indexOf(',pz,') > -1) showParkzonen();
2008		else																	 hideParkzonen();
2009
2010		if ($('#startingParameters').attr('data-overlays').indexOf(',uz,') > -1) showUmweltzone();
2011		else																	 hideUmweltzone();
2012
2013		if ($('#startingParameters').attr('data-expandmenu') == '0') {
2014			collideSidepanel( false );
2015		} else {
2016			expandSidepanel( false );
2017		}
2018
2019		for ( key in markerBuilding ) {
2020			if (markerBuilding[key].map != null) markerBuilding[key].setMap(null);
2021			if (markerBuilding[key].polygon != null) markerBuilding[key].polygon.setMap(null);
2022			delete markerBuilding[key];
2023		}
2024
2025		if      ($('#startingParameters').attr('data-route') != '' && !($('body').hasClass('routeplaner'))) setNavigationVisibility( true );
2026		else if ($('#startingParameters').attr('data-route') == '' &&   $('body').hasClass('routeplaner'))  setNavigationVisibility( false );
2027
2028		if ($('#startingParameters').attr('data-route') != '') {
2029			$('#main-menu-wrapper .buttonNav.' + $('#startingParameters').attr('data-route')).trigger('click');
2030		}
2031
2032		if ($('#startingParameters').attr('data-search') != '') {
2033			$('#search').val($('#startingParameters').attr('data-search'));
2034			$('#startNav').val('');
2035			$('#startNav').next('span').removeClass('active');
2036			$('#search').next('span').addClass('active').trigger('click');
2037		} else {
2038			$('#search').val('');
2039			$('#startNav').val('');
2040			$('#main-menu-wrapper .searchplace').removeClass('active')
2041
2042			if ($('#startingParameters').attr('data-source-obj') != '') {
2043				getObjectsWithID($('#startingParameters').attr('data-source-obj'), 'start');
2044			} else if ($('#startingParameters').attr('data-source-coords') != '') {
2045				convertLatLngParamToMap('start');
2046			} else if ($('#startingParameters').html() != '') {
2047				getObjectsWithID($('#startingParameters').html(), 'end');
2048			} else if ($('#startingParameters').attr('data-current-position') != '') {
2049				convertLatLngParamToMap('end');
2050			} else {
2051				changeURL ( 'Initialize RWTH Maps' );
2052				allowChangeURL = 1;
2053			}
2054		}
2055	}
2056	
2057	function convertLatLngParamToMap( type, latlng ) {
2058		if (typeof latlng === 'undefined') {
2059			if (type == 'end') latlng = $('#startingParameters').attr('data-current-position').split(',');
2060			else			   latlng = $('#startingParameters').attr('data-source-coords').split(',');
2061		} else {
2062			latlng = latlng.split(',');
2063		}
2064		
2065		if ( latlng.length == 2 ) {
2066			var strBez = translate('Benutzerdefinierte Position');
2067			if      (type == 'end'   && $('#startingParameters').attr('data-destination-label') != '') strBez = $('#startingParameters').attr('data-destination-label');
2068			else if (type == 'start' && $('#startingParameters').attr('data-source-label')      != '') strBez = $('#startingParameters').attr('data-source-label');
2069			
2070			var address = (strBez == translate('Benutzerdefinierte Position') ? '' : strBez);
2071			
2072			var item = { 'gno': 'curpos_' + type, 'bez': strBez, 'adr': address, 'img': 0, 'rel': 0, 'info': '', 'typ': 'geo', 'lat': parseFloat(latlng[0]), 'lng': parseFloat(latlng[1]) }
2073			successfulSearch( [ item ], 0, type );
2074			
2075			var lat = parseFloat(latlng[0]), lng = parseFloat(latlng[1]);
2076			
2077			$(type == 'end' ? '#search' : '#startNav').val(strBez == translate('Benutzerdefinierte Position') ? lat + ',' + lng : strBez);
2078			$(type == 'end' ? '#search' : '#startNav').next('span.searchplace').addClass('active');
2079			
2080			if (type == 'start') {
2081				if ($('#startingParameters').html() != '') getObjectsWithID($('#startingParameters').html(), 'end');
2082				else if ($('#startingParameters').attr('data-current-position') != '') convertLatLngParamToMap('end');
2083				else {
2084					changeURL( translate('Suche') );
2085					allowChangeURL = 1;
2086				}
2087			} else {
2088				if ($('#startingParameters').attr('data-nearobjects') != '' && markerBuilding['curpos'] != null) {
2089					getObjectsNearX( markerBuilding['curpos'], $('#startingParameters').attr('data-nearobjects'), $('#startingParameters').attr('data-nearobjects-distance') );
2090					$('#startingParameters').attr('data-nearobjects', '');
2091				} else {
2092					if ($('#startingParameters').attr('data-calcroute') == '1') $('#calcRouteButton').click();
2093						
2094					changeURL( translate('Suche') );
2095					allowChangeURL = 1;
2096				}
2097			}
2098		}
2099		
2100		$('#startingParameters').attr('data-current-position', '');
2101	}
2102	
2103	function getObjectsNearX( obj, type, distance ) {
2104		var param = obj.getPosition().lat() + ';' + obj.getPosition().lng() + ';' + obj.gebnr + ';' + type + ';' + distance;
2105
2106		$.ajax({
2107			url: ajaxURL + "&mode=distance&q=" + param,
2108			dataType: 'json',
2109			success: function( items ) {
2110				if (successfulSearch(items, 1, 'end')) $('#overlayInfo .additionalInfos').attr('data-nearobjects', type).attr('data-nearobjects-distance', distance);
2111				changeURL( 'Suche' );
2112				allowChangeURL = 1;
2113			},
2114			error: function( error ) { 
2115				allowChangeURL = 1; 
2116			}
2117		});
2118	}
2119	
2120	function getObjectsWithID( idlist, type ) {
2121		$.ajax({
2122			url: ajaxURL + "&mode=gno&q=" + escape(idlist),
2123			dataType: 'json',
2124			success: function( data ) {
2125				if ($('#startingParameters').attr('data-current-position') != '') {
2126					var latlng = $('#startingParameters').attr('data-current-position').split(',');
2127					
2128					if ( latlng.length == 2 ) {
2129						var strBez = translate('Benutzerdefinierte Position');
2130						if ($('#startingParameters').attr('data-destination-label') != '') strBez = $('#startingParameters').attr('data-destination-label');
2131						
2132						var address = (strBez == translate('Benutzerdefinierte Position') ? '' : strBez);
2133						
2134						var item = { 'gno': 'curpos_' + type, 'bez': strBez, 'adr': address, 'img': 0, 'rel': 0, 'info': '', 'typ': 'geo', 'lat': parseFloat(latlng[0]), 'lng': parseFloat(latlng[1]) }
2135
2136						data.push(item);
2137					}
2138					
2139					$('#startingParameters').attr('data-current-position', '');
2140				}
2141				
2142				successfulSearch( data, 0, type );
2143				
2144				if ( type == 'start' ) {
2145					if ($('#startingParameters').html() != '') getObjectsWithID($('#startingParameters').html(), 'end');
2146					else if ($('#startingParameters').attr('data-current-position') != '') convertLatLngParamToMap('end');
2147					else {
2148						changeURL( translate('Suche') );
2149						allowChangeURL = 1;
2150					}
2151				} else {
2152					if ($('#startingParameters').attr('data-nearobjects') != '' && markerBuilding[$('#startingParameters').html()] != null) {
2153						getObjectsNearX( markerBuilding[$('#startingParameters').html()], $('#startingParameters').attr('data-nearobjects'), $('#startingParameters').attr('data-nearobjects-distance') );
2154					} else if ($('#startingParameters').attr('data-informations') != '' && markerBuilding[$('#startingParameters').html()] != null) {
2155						getObjectsWithRelation( $('#startingParameters').html() );
2156					} else {
2157						if ($('#startingParameters').attr('data-calcroute') == '1') $('#calcRouteButton').click();
2158						
2159						changeURL( translate('Suche') );
2160						allowChangeURL = 1;
2161					}
2162					
2163					$('#startingParameters').attr('data-nearobjects', '').attr('data-informations', '');
2164				}
2165			},
2166			error: function() { allowChangeURL = 1; }
2167		});
2168	}
2169	
2170	function getObjectsWithRelation( relationid ) {
2171		$.ajax({
2172			url: ajaxURL + "&mode=relation&q=" + escape(relationid),
2173			dataType: 'json',
2174			success: function( data ) {
2175				if (successfulSearch(data, 2, 'end')) $('#overlayInfo .additionalInfos').attr('data-informations', relationid);
2176				changeURL( 'Suche' );
2177				allowChangeURL = 1;
2178			},
2179			error: function() { allowChangeURL = 1; }
2180		});
2181	}
2182	
2183	$('#map').removeClass().addClass(map.getMapTypeId());
2184	
2185	if ( navigator.geolocation ) {
2186		$('body').addClass('geolocation');
2187		$('#main-menu-wrapper .searchplace').attr('title', translate('Aktuelle Position')).html(translate('Aktuelle Position'));
2188	}	
2189	
2190	function translate( german ) {
2191		if (strLang == 'en' && typeof arrDictionary[german] !== 'undefined') {
2192			return arrDictionary[german];
2193		} else if (strLang == 'en') {
2194			return '***' + german + '***';
2195		}
2196		return german;
2197	}
2198});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.