﻿var map = null;
var geocoder = null;
var markers = new Array();
var marker_texts = new Array();
var x, y; // for mouse coords
var maxZoom = 1;
var showMapTypeControl = true;
var bounds = new GLatLngBounds();
var doZoomEvent = true;
var suppressEvents = false;

// track mouseover event for tooltip coordinates 
document.onmousemove = setCoords;

// Create custom icon
var tinyIcon = new GIcon();
tinyIcon.image = "/Images/ski_marker.png";
tinyIcon.shadow = "/Images/ski_marker_schatten.png";
tinyIcon.iconSize = new GSize(47, 40);
tinyIcon.shadowSize = new GSize(47, 40);
tinyIcon.iconAnchor = new GPoint(8, 32);
tinyIcon.infoWindowAnchor = new GPoint(47, 0);

var mricon = new GIcon(G_DEFAULT_ICON);
mricon.image = "/images/icons/gm_house.png";
mricon.shadow = "/images/icons/gm_shadow.png";

mricon.iconSize = new GSize(21, 34);
mricon.shadowSize = new GSize(39, 34);
mricon.iconAnchor = new GPoint(10, 33);

var mrinfo = new GIcon(G_DEFAULT_ICON);
mrinfo.image = "/images/icons/gm_info.png";
mrinfo.shadow = "/images/icons/gm_shadow.png";

mrinfo.iconSize = new GSize(21, 34);
mrinfo.shadowSize = new GSize(39, 34);
mrinfo.iconAnchor = new GPoint(10, 33);

var mrski = new GIcon(G_DEFAULT_ICON);
mrski.image = "/images/icons/gm_ski.png";
mrski.shadow = "/images/icons/gm_shadow.png";

mrski.iconSize = new GSize(21, 34);
mrski.shadowSize = new GSize(39, 34);
mrski.iconAnchor = new GPoint(10, 33);

var marker_ort = { icon: mrinfo };
var marker_lifteinstieg = { icon: mrski };
var markerOptions ={ icon: tinyIcon };


function initMap() {
	map = new GMap2(document.getElementById("map"));
	// add controls
	map.addControl(new GLargeMapControl());
	if (showMapTypeControl) {
		map.addControl(new GMapTypeControl());
	}
	//map.disableDragging();
	map.setMapType(settings.MapType);
}

function load() {
	if (GBrowserIsCompatible()) {
		initMap();
		// München: 48.137135, 11.575008
		map.setCenter(new GLatLng(centerLat, centerLng), zoomIndex);

		// show clicked points
		//GEvent.addListener(map, "click", function(ov, latlng) {
		//	alert(latlng.toString());
		//});


		// add markers
		addMarkers();

		GEvent.addListener(this.map, "zoomend", userZoomEnd);
		GEvent.addListener(this.map, "dragend", userDragEnd);
		debugMap();
	}
}

function removeListeners() {
	GEvent.clearListeners(this.map, "zoomend");
	GEvent.clearListeners(this.map, "dragend");
}


function userDragEnd() {
	debugMap();
	if (suppressEvents == true)
		return;
	var currZoom = map.getZoom();
	if (currZoom < 9)
		return;
	getCurrentMarkers(currZoom);
}


function userZoomEnd(oldz, newz) {
	debugMap();
	if (suppressEvents == true)
		return;

	if (doZoomEvent == false)
		return;
		
	// check zoom in
	if ((oldz < newz) && (
  				(oldz < 8 && newz < 8) ||
  				//(oldz >= 8 && newz < 12) || 
  				(oldz >= 12 && newz > 12))
  			)
	{ return; }

	// check zoom out
	if ((oldz > newz) && (newz < 7))
	{ return; }
	getCurrentMarkers(newz);
}

function getCurrentMarkers(zoom) {

	map.clearOverlays();
	// save/compare lowest zoom
	//if (newz > maxZoom) {
	//	maxZoom = newz;
	//}

	var bounds = map.getBounds();
	var sw = bounds.getSouthWest().toUrlValue();
	var ne = bounds.getNorthEast().toUrlValue();
	var centerpoint = bounds.getCenter();
	var urlOptions = "zoom=" + zoom;
	urlOptions += "&ne=" + ne + "&sw=" + sw;
	//alert("loading markers:" + urlOptions);
	DownloadUrl("/getgmapmarkers.aspx?type=zoom&" + urlOptions);
}

function setCoords(e) {
	if (e) {
		x = e.pageX;
		y = e.pageY;
	}
	else if (window.event) {
		x = window.event.clientX;
		y = window.event.clientY;
	}
}

function addMarker(address, info_text) {
	geocoder.getLatLng(
          address,
          function(point) {
          	if (!point) {
          		alert(address + " nicht gefunden");
          	} else {
          		var marker = new GMarker(point, markerOptions);
          		GEvent.addListener(marker, "click", function() {
          			document.location = "land.aspx";
          		});
          		GEvent.addListener(marker, "mouseover", function() {
          			tooltip("over", info_text, 100)
          		});
          		GEvent.addListener(marker, "mouseout", function() {
          			tooltip("out", "", "");
          		});

          		map.addOverlay(marker);
          		markers[markers.length] = marker;
          		marker_texts[marker_texts.length] = info_text;
          	}
          }
        );
}

function addMarker2(lat, lng, info_text, destination) {
	var marker = new GMarker(new GLatLng(lat, lng), markerOptions);
	GEvent.addListener(marker, "click", function() {
		document.location = destination;
	});
	GEvent.addListener(marker, "mouseover", function() {
		tooltip("over", info_text, 100)
	});
	GEvent.addListener(marker, "mouseout", function() {
		tooltip("out", "", "");
	});

	map.addOverlay(marker);
	markers[markers.length] = marker;
	marker_texts[marker_texts.length] = info_text;
}

function addMarker3(point, info_text, destination, marker_options) {
	var marker = new GMarker(point, marker_options);
	GEvent.addListener(marker, "click", function() {
		document.location = destination;
	});
	GEvent.addListener(marker, "mouseover", function() {
		tooltip("over", info_text, 100)
	});
	GEvent.addListener(marker, "mouseout", function() {
		tooltip("out", "", "");
	});

	map.addOverlay(marker);
	bounds.extend(point);
	markers[markers.length] = marker;
	marker_texts[marker_texts.length] = info_text;
}

function addMarkerDrag(point, info_text, destination) {
	var marker = new GMarker(point, {draggable:true});
	marker.enableDragging();
	GEvent.addListener(marker, "mouseover", function() {
		tooltip("over", info_text, 100)
	});
	GEvent.addListener(marker, "mouseout", function() {
		tooltip("out", "", "");
	});

	map.addOverlay(marker);
	markers[markers.length] = marker;
	marker_texts[marker_texts.length] = info_text;
}

function setMarkerAddress(_marker, address) {
	geocoder.getLatLng(
          address,
          function(point) {
          	if (!point) {
          		alert(address + " nicht gefunden");
          	} else {
          		_marker.setLatLng(point);
          		map.setCenter(point);
          	}
          }
        );
}


function zoomfit()
{
	newzoom = map.getBoundsZoomLevel(bounds);
	newcenter = bounds.getCenter();
	//alert("new zoom: " + newzoom);
	map.setZoom(newzoom);
	map.setCenter(newcenter); //, newzoom);
	//GEvent.addListener(this.map, "zoomend", userZoomEnd);
	//GEvent.addListener(this.map, "dragend", userDragEnd);
}

function DownloadUrl(the_url, enable_dragging) {
    GDownloadUrl(the_url, function(data, responseCode) {
        var xml = GXml.parse(data);
        var markers = xml.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {

            var type = markers[i].getAttribute("type");
            var desc = markers[i].getAttribute("desc");
            var link = markers[i].getAttribute("link");

            var mark_options = "";
            if (type == "ort")
                mark_options = marker_ort;
            else if (type == "lifteinstieg")
                mark_options = marker_lifteinstieg;
            else {
                mark_options = markerOptions;

            }
            var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                            parseFloat(markers[i].getAttribute("lng")));
            if (enable_dragging == true) {
                addMarkerDrag(point, desc, link);
            }
            else {
                addMarker3(point, desc, link, mark_options);
            }
        }
        //zoomfit();

    });
}

function tooltip(modus, inhalt, breite) {
	breite = 0;
	var tooltip = document.getElementById('tooltip');

	if (modus == 'out')
		tooltip.style.display = 'none';
	else {
		//tooltip.style.width = breite + 'px';
		tooltip.innerHTML = inhalt;
		tooltip.style.display = 'block';

		tooltip.style.top = (y + 20) + 'px';

		if (x > document.body.clientWidth - breite - 16)
			tooltip.style.left = (x - breite) + 'px';
		else
			tooltip.style.left = (x + 10) + 'px';
	}
}

function disableEnterKey(e) {
	var key;
	if (window.event)
		key = window.event.keyCode; //IE
	else
		key = e.which; //firefox     

	return (key != 13);
}

function debugMap() {
	if (map != null && settings.DebugMap == true && document.getElementById("zoomDebug") != null) {
		document.getElementById("zoomDebug").innerHTML = map.getZoom();
		document.getElementById("latDebug").innerHTML = map.getCenter().lat();
		document.getElementById("longDebug").innerHTML = map.getCenter().lng();
	}
}


function addMarkers() { }
