function load (lat, lng, getClientGeolocation)
{
	centerPoint = new google.maps.LatLng(lat, lng);
	var mapOptions = {
		zoom: zoomLevel,
		disableDefaultUI: true,
		center: centerPoint,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		mapTypeControl: false,
		scaleControlOptions: {
			position: [google.maps.ControlPosition.TOP_LEFT]
		},
		scaleControl: true,
		navigationControl: false,
		scrollwheel: false,
		disableDoubleClickZoom: true
	}
	xmap = new google.maps.Map(document.getElementById('map'), mapOptions);

	var mgrOptions = { borderPadding: 50, maxZoom: 15, trackMarkers: true };
	mgr = new MarkerManager(xmap, mgrOptions);

	geocoder = new google.maps.Geocoder();
	setLocationTitle();

	google.maps.event.addListener(xmap, 'idle', mapChanged);

	if (dateTs == dateNowTs) setDisabled('link_day_back');
	if (getClientGeolocation) initClientGeolocation();
	setZoomIcons();
} // function load

function updateMap ()
{
	markers = new Array();
	markerInfos = new Array();
	for (var i = 0; i < markerData.length; i++) {
		var thisMarkerOptions = allMarkerOptions[markerData[i].markerOptions];
		thisMarkerOptions.map = xmap;
		thisMarkerOptions.position = new google.maps.LatLng(markerData[i].lat, markerData[i].lng);

		var marker = new google.maps.Marker(thisMarkerOptions);
		marker.catererId = markerData[i].catererId;
		marker.index = i;
		marker.firm = markerData[i].firm;
		marker.infoWindowContents = markerData[i].infoWindowContents;
		google.maps.event.addListener(marker, 'mouseover', function (event) { catererMarkerOn(this.index); Tip(this.infoWindowContents); });
		google.maps.event.addListener(marker, 'mouseout', function (event) { catererMarkerOff(this.index); UnTip(); });
		google.maps.event.addListener(marker, 'click', function (event) { showCaterer(this.catererId, this.firm); });
		markers.push(marker);
	}

	try {
		mgr.clearMarkers();
		mgr.addMarkers(markers, 5);
		mgr.addMarker(meMarker, 1);
	} catch(error) {}
} // function updateMap

function mapChanged ()
{
	var mapCenter = xmap.getCenter();

	updateCatererList(mapCenter);
	setLocationTitle();
	updateSessionMapData(mapCenter);
	updateMapAd(mapCenter.lat(), mapCenter.lng());
} // function mapChanged

function showAddress (address)
{
	if (address != "" && address != strCityOrAddress) {
		point = null;
		address = address.toLowerCase();
		if (predefinedPlaces[address]) {
			zoomLevel = 12;
			point = new google.maps.LatLng(predefinedPlaces[address][0], predefinedPlaces[address][1]);
			xmap.setCenter(point, 12);
			setZoomIcons();
		}

		if (!point && geocoder) {
			geocoder.geocode(
				{'address': address},
				function(results, status) {
					if (status == google.maps.GeocoderStatus.OK) {
						point = results[0].geometry.location;
						if (geoBounds.contains(point)) {
							if (results[0].geometry.location_type == 'ROOFTOP' || results[0].geometry.location_type == 'GEOMETRIC_CENTER') zoomLevel = 15; else zoomLevel = 12;
							xmap.setCenter(point);
							xmap.setZoom(zoomLevel);
							setZoomIcons();
						}
						else alert(msgAddressOutOfBounds);
					} else {
						alert(msgAddressNotFound);
					}
				}
			);
		}
	}
} // function showAddress

function updateSessionMapData (mapCenter)
{
	jQuery.get(baseUrl + "/home/update_session_map_data/" + mapCenter.lat() + "/" + mapCenter.lng() + '/' + zoomLevel);
} // function updateSessionMapData

function updateCatererList (mapCenter)
{
	var mapBounds = xmap.getBounds();
	jQuery("#list").load(baseUrl + "/home/caterer_list/" + mapCenter.lat() + "/" + mapCenter.lng() + "/" + zoomLevel + "/" + dateTs + "?mapBounds=" + mapBounds.toUrlValue());
	var date = new Date(dateTs * 1000);
	var dateOutput = padZeros(date.getDate(), 2) + "." + padZeros((date.getMonth() + 1), 2) + "." + date.getFullYear();
	if (dateOutput == dateToday) {
		dateOutput = strToday;
	} else {
		day = date.getDay(); if (day == 0) day = 7;
		dateOutput = strDays[day - 1] + ', ' + dateOutput;
	}

	jQuery("#date").html(dateOutput);
} // function updateCatererList

function setLocationTitle () {
	var mapCenter = xmap.getCenter();
	var zoomLevel = xmap.getZoom();

	if (zoomLevel >= 11) {
		geocoder.geocode({'latLng': mapCenter}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				var locationName = '';
				for (i = 0; i < results.length; i++) {
					for (j = 0; j < results[i].types.length; j++) {
						if (results[i].types[j] == 'locality') {
							// Ortsname gefunden (-> Schleife abbrechen)
							locationName = results[i].address_components[0].long_name;
							break;
						}
						if (locationName.length == 0 && results[i].types[j] == 'administrative_area_level_3') {
							// übergeordnete Verwaltungsbezeichnung (Ebene 3, z. B. "Trier-Saarburg") gefunden (merken)
							locationName = results[i].address_components[0].long_name;
						}
						if (locationName.length == 0 && results[i].types[j] == 'administrative_area_level_2') {
							// übergeordnete Verwaltungsbezeichnung (Ebene 2) gefunden (merken)
							locationName = results[i].address_components[0].long_name;
						}
					}
					if (locationName.length > 0) break;
				}
				jQuery("h1#header-claim").html(headerClaimPart1 + " " + defaultTitleHeader + " " + strAround + " " + locationName + ".");
				Cufon.replace('h1#header-claim');
			}
		});
	} else {
		jQuery("h1#header-claim").html(headerClaimPart1 + " " + headerClaimPart2);
		Cufon.replace('h1#header-claim');
	}
}

function zoomIn ()
{
	if (zoomLevel < maxZoomLevel) {
		zoomLevel++;
		xmap.setZoom(zoomLevel);
		setZoomIcons();
	}
} // function zoomIn

function zoomOut ()
{
	if (zoomLevel > minZoomLevel) {
		zoomLevel--;
		xmap.setZoom(zoomLevel);
		setZoomIcons();
	}
} // function zoomOut

function setZoomIcons ()
{
	if (zoomLevel < maxZoomLevel) {
		turnOn('icon_map_zoom_in');
	} else {
		turnOff('icon_map_zoom_in');
	}

	if (zoomLevel > minZoomLevel) {
		turnOn('icon_map_zoom_out');
	} else {
		turnOff('icon_map_zoom_out');
	}
} // function setZoomIcons

function dayBack ()
{
	var mapCenter = xmap.getCenter();

	var dateTsTemp = dateTs - 24 * 60 * 60;
	if (dateTsTemp >= dateNowTs) {
		dateTs = dateTsTemp;
		updateCatererList(mapCenter);
		if (dateTs == dateNowTs) setDisabled('link_day_back');
		setEnabled('link_day_forward');
	}
} // function dayBack

function dayForward ()
{
	var mapCenter = xmap.getCenter();
	var maxTs = dateNowTs + 7 * 24 * 60 * 60;

	var dateTsTemp = dateTs + 24 * 60 * 60;
	if (dateTsTemp <= maxTs) {
		dateTs = dateTsTemp;
		updateCatererList(mapCenter);
		if (dateTs == maxTs) setDisabled('link_day_forward');
		setEnabled('link_day_back');
	}
} // function dayBack

function catererMarkerOn (i)
{
	iconOff = markers[i].getIcon();
	zIndexOff = markers[i].getZIndex();
	markers[i].setZIndex(200);
	markers[i].setIcon(mIconOn);
} // function catererMarkerOn

function catererMarkerOff (i)
{
	markers[i].setIcon(iconOff);
	markers[i].setZIndex(zIndexOff);
} // function catererMarkerOff

function showCaterer (catererId, firm)
{
	jQuery("#caterer-info").load(baseUrl + "/caterers/view/" + catererId + "/1");
	jQuery("#caterer-info").dialog("option", "title", firm);
	jQuery('#caterer-info').dialog("open");
} // function showCaterer

function handleClientGeolocationResult(lat, lng) {
	var center = new google.maps.LatLng(lat, lng);
	xmap.setCenter(center);
} // function handleClientGeolocationResult

function updateMapAd (lat, lng)
{
	if (document.getElementById('map-ad')) {
		jQuery("#map-ad").load('ads/ad_code/startpage_map/' + lat + '/' + lng + '/');
	}
} // updateMapAd

function padZeros (n, totalDigits)
{
	n = n.toString();
	var pd = '';
	if (totalDigits > n.length)	{
		for (i=0; i < (totalDigits-n.length); i++) pd += '0';
	}

	return pd + n.toString();
} // function padZeros
