var map;
var xml;
var i;
var markers;
var baseIcon;
var maxZoom = 12;
var pagecontent;
var geocoder = new GClientGeocoder();
geocoder.setBaseCountryCode("de");

var the_bounds = null;
var bounds = function() {
    if (the_bounds == null) the_bounds = new GLatLngBounds();
    return the_bounds;
}
var centerAndZoom = function() {
    var center = bounds().getCenter();
    map.setCenter(center);

    var zoom = Math.min(map.getBoundsZoomLevel(bounds()), maxZoom);
	if (pagecontent==3)
		zoom = zoom -1
    map.setZoom(zoom);
}

function callGeocoder(address, j, dref)
{
	geocoder.getLocations( address, function(response){
		if (!response || response.Status.code != 200) {
			//alert(address + " not found " + response.Status.code);
		} else {
			place = response.Placemark[0];
			point = new GLatLng(place.Point.coordinates[1],
				place.Point.coordinates[0]);

			var marker = new GMarker(point,markerOptions);
			bounds().extend(point);
			var html = "";
			var mobj = markers[j];
			if (typeof mobj.textContent != 'undefined') {
				html += mobj.textContent;
			}
			else if (typeof mobj.innerText != 'undefined') {
				html += mobj.innerText;
			}
			else if (typeof mobj.text != 'undefined') {
				html += mobj.text;
			}
			//alert(html);
			var tooltip = new Tooltip(marker,html,4);
			marker.tooltip = tooltip;
			map.addOverlay(marker);
			map.addOverlay(tooltip);
			
			GEvent.addListener(marker,'mouseover',function(){ 
				this.tooltip.show(); 
			}); 
			GEvent.addListener(marker,'mouseout',function(){ 
				this.tooltip.hide();
			}); 							
			// bei vorhandenem link --> clickevent dazu
			if ( dref != null ) {
				GEvent.addListener(marker,'click',function(){ 
					parent.top.location.href = dref;
				});
			}
			
			centerAndZoom();
		}

	} );
}

// mit custom Tooltip und XML Datenfile
function loadCallback(data)
{
	// Create our custom marker
    var custIcon = new GIcon(G_DEFAULT_ICON);
    custIcon.image = "/files/sysimages/gmaps_marker_gunblue.png";
    //custIcon.image = "/files/sysimages/gmaps_marker_blue.png";
    //custIcon.image = "/files/sysimages/gmaps_marker_olive.png";
	custIcon.shadow = "/files/sysimages/gmaps_marker_shadow.png";
    custIcon.iconSize = new GSize(30, 41);
    custIcon.shadowSize = new GSize(45, 44);
    custIcon.iconAnchor = new GPoint(13, 41);

	// Set up our GMarkerOptions object
	markerOptions = { icon:custIcon };

	xml = GXml.parse(data);
	markers = xml.documentElement.getElementsByTagName("marker");
	
	for (i = 0; i < markers.length; i++) 
	{
		
		
		var wrapperFunc = function(i){
			var j = i;
			var timeshift = 300 * j;
			var dlat = markers[j].getAttribute("lat");
			var dlng = markers[j].getAttribute("lng");
			var dref = markers[j].getAttribute("href");
			if(dlat!=null && dlat!="") {
				// mit Koordinaten
				point = new GLatLng(dlat, dlng);
				var marker = new GMarker(point,markerOptions);
				bounds().extend(point);
				var html = "";
				var mobj = markers[j];
				if (typeof mobj.textContent != 'undefined') {
					html += mobj.textContent;
				}
				else if (typeof mobj.innerText != 'undefined') {
					html += mobj.innerText;
				}
				else if (typeof mobj.text != 'undefined') {
					html += mobj.text;
				}
				//alert(html);
				var tooltip = new Tooltip(marker,html,4);
				marker.tooltip = tooltip;
				map.addOverlay(marker);
				map.addOverlay(tooltip);
				
				GEvent.addListener(marker,'mouseover',function(){ 
					this.tooltip.show(); 
				}); 
				GEvent.addListener(marker,'mouseout',function(){ 
					this.tooltip.hide();
				}); 
				// bei vorhandenem link --> clickevent dazu
				if ( dref != null ) {
					GEvent.addListener(marker,'click',function(){ 
						parent.top.location.href = dref;
					});
				}
				
				centerAndZoom();
				dlat = "";
				dlng = "";
			}
			else { 
				// mit geocoder
				var address = markers[j].getAttribute("addr");
				// ohne zeitl. Versatz gibt google einen G_GEO_TOO_MANY_QUERIES = Code 620 Fehler
				setTimeout("callGeocoder('" + address + "', " + j + ", '" + dref + "')", timeshift);
			}
				
			

			
		};
		wrapperFunc(i);
	}//end: for
}

// mit Standard Info-Window
// wird gerade nicht verwendet, da der Tour-Artikel alles mit einem kml-file bekommt
function loadCallback2(data)
{
	baseIcon = new GIcon();
	baseIcon.image = "/files/sysimages/gmaps_marker.png";
	//baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
	baseIcon.iconSize = new GSize(20, 34);
	baseIcon.iconAnchor = new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	
	xml = GXml.parse(data);
	markers = xml.documentElement.getElementsByTagName("marker");
	for (i = 0; i < markers.length; i++) 
	{
		
		
		var wrapperFunc = function(i){
			var j = i;
			var dlat = markers[j].getAttribute("lat");
			var dlng = markers[j].getAttribute("lng");
			if(dlat!=null && dlat!="") {
				// mit Koordinaten
				point = new GLatLng(dlat, dlng);
				var marker = new GMarker(point);
				bounds().extend(point);
				var html = "";
				var mobj = markers[j];
				if (typeof mobj.textContent != 'undefined') {
					html += mobj.textContent;
				}
				else if (typeof mobj.innerText != 'undefined') {
					html += mobj.innerText;
				}
				else if (typeof mobj.text != 'undefined') {
					html += mobj.text;
				}
				//alert(html);
				map.addOverlay(createMarker(point,html));
				
				centerAndZoom();
				dlat = "";
				dlng = "";
			}
			else { 
				// mit geocoder
				var address = markers[j].getAttribute("addr");
				geocoder.getLatLng( address, function(point){
						if (!point) {
							//alert(address + " not found");
						} else {
							bounds().extend(point);
							var html = "";
							var mobj = markers[j];
							if (typeof mobj.textContent != 'undefined') {
								html += mobj.textContent;
							}
							else if (typeof mobj.innerText != 'undefined') {
								html += mobj.innerText;
							}
							else if (typeof mobj.text != 'undefined') {
								html += mobj.text;
							}
							//alert(html);
	

							map.addOverlay(createMarker(point,html));
							
							centerAndZoom();
						}
				
				} );			
			}
				
			

			
		};
		wrapperFunc(i);
	}
}

// Creates a marker whose info window displays the letter corresponding
// to the given index.
function createMarker(point,html) {
  var icon = new GIcon(baseIcon);
  // Set up our GMarkerOptions object
  var marker = new GMarker(point,icon);

  GEvent.addListener(marker, "click", function() {
	marker.openInfoWindowHtml(html);
  });
  return marker;
}


function calculateMarkerPosition(map, markerLatLngPoint) {
  // krob: handle map movements
	gmapTopLeftLatLng = map.fromContainerPixelToLatLng(new GPoint(0,0));
	gmapTopLeftPixel  = map.fromLatLngToDivPixel(gmapTopLeftLatLng);
	myMarkerDivPixel  = map.fromLatLngToDivPixel(markerLatLngPoint);

	markerTop  = getAbsoluteTop(map.getContainer())  - gmapTopLeftPixel.y + myMarkerDivPixel.y;
	markerLeft = getAbsoluteLeft(map.getContainer()) - gmapTopLeftPixel.x + myMarkerDivPixel.x;
	return {top:markerTop, left:markerLeft};
}

function getAbsoluteLeft(o) {
	var oLeft = o.offsetLeft;       // Get left position from the parent object
	var oParent;
	var o;
	while(o.offsetParent!=null) {   // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent      // Get parent object reference
		oLeft += oParent.offsetLeft   // Add parent left position
		o = oParent
	}
	return oLeft
}

function getAbsoluteTop(o) {
	var oTop = o.offsetTop;         // Get top position from the parent object
	var oParent;
	var o;
	while(o.offsetParent!=null) {   // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent      // Get parent object reference
		oTop += oParent.offsetTop     // Add parent top position
		o = oParent
	}
	return oTop
}
