﻿// Javascript
var CrLf = "\r\n"; 
var mapsCount = 0;
var map = null;  
var maps = new Array();
var mapDivs = new Array();
var mapCenter = null;
var mapDiv = null;
var mapCenter = null;
var mapHeight = '400px';
var mapWidth = '600px';
var mapHeights = new Array();
var mapWidths = new Array();
var dimensionXOverride = false;
var dimensionYOverride = false;
var mapControlsOverride = false;
var mapMarkerButtonsOverride = false;
var dimensionXOverrides = new Array();
var dimensionYOverrides = new Array();
var mapControlsOverrides = new Array();
var mapMarkerButtonsOverrides = new Array();
var geocoder = null; 
var routeOverlay = null;
var iconName = null;
var iconHeight = null;
var iconWidth = null;
var resObject;
var count;
var createMarkerButton = false;
var createMapControl = false;
var createMarkerButtons = new Array();
var createMapControls = new Array();
var mapName = null;
var mapNames = new Array();
var mapParent = null;
    
function ZoomIn(mapNr) {
	maps[mapNr].zoomIn()
}
function moveTo(btnId) {
	// markerButton.id = 'btnMarker_' + (i + 1) + '_' + lat + '_' + lng;
	var params = btnId.split('_');
	var mapNr = Number(params[2]);						
	var lat = Number(params[3]);						
	var lng = Number(params[4]);						
	var grenzen = maps[mapNr].getBounds();
	if (grenzen.contains(new GLatLng(lat,lng))) {
		maps[mapNr].panTo(new GLatLng(lat,lng));	
	}
	else {
		maps[mapNr].panTo(new GLatLng(lat,lng));	
		// var southWest = grenzen.getSouthWest();
		// var northEast	= grenzen.getNorthEast();
		// var northWest = new GLatLng(northEast.lat(),southWest.lng());
		// var southEast = new GLatLng(southWest.lat(),northEast.lng());
		// if (lng < southWest.lng()) {
		// map.panTo(new GLatLng(lat, southWest.lng()));	
	}	
}

function loadMap(mapElement) {
	if (mapElement.id.substring(0,12) == 'GoogleMapXml') { 
		loadXmlMap(mapElement);
	}
	if (mapElement.id.substring(0,15) == 'GoogleMapNormal') { 
		loadMapNormal(mapElement.id);
	}
}

function loadXmlMap(MapElement) { //,XmlName) { //,Height,Width,overrideDisplayControls,overrideMarkerButtons) { 
  if (GBrowserIsCompatible()) {
		if (mapParent == null) {
			mapParent = MapElement.parentNode; // mapDivs[mapsCount].parentNode;
    }
		var mapTmp = MapElement.id.split('_');
		var MapName = MapElement.id;
		// mapDivs.push(document.getElementById(MapName));
    mapDivs.push(MapElement.id);
		mapNames.push(MapElement.id);
    mapName = mapTmp[0] + '_' + mapTmp[3];	
		var XmlName = mapTmp[1];
		var mapArguments = mapTmp[2].split(',');
		
		if (mapArguments[0] != 'null') {
			mapHeights.push(mapArguments[0]);
			dimensionYOverrides.push(true);
		}
		else {
			dimensionYOverrides.push(false);
			mapHeights.push(300);
		} 
  	if (mapArguments[1] != 'null') {
			mapWidths.push(mapArguments[1]);
			dimensionXOverrides.push(true);
		} 
		else {
			dimensionXOverrides.push(false);
			mapWidths.push(400);
		} 
  	if (mapArguments[2] != 'null') {
			mapControlsOverrides.push(true);		
			createMapControls.push(mapArguments[2] == 'true');
		}
    else {
			mapControlsOverrides.push(false);		
			createMapControls.push(false);
		}
		if (mapArguments[3] != 'null') {
			mapMarkerButtonsOverrides.push(true);		
			createMarkerButtons.push(mapArguments[3] == 'true');
		}
    else {
			mapMarkerButtonsOverrides.push(false);		
			createMarkerButtons.push(false);
		}
		GDownloadUrl('/GoogleMapXml/' + XmlName, loadXml); 
  } 
} 

function loadXml(data, responseCode) {  
  var markerButtons = new Array(); 
  var zoomText = document.getElementById("zoomText");
  var xml = GXml.parse(data);
  var root = xml.documentElement;  
  var centerNode = xml.documentElement.getElementsByTagName('Mapcenter');  
  var heightNode = xml.documentElement.getElementsByTagName('Mapheight');  
  var widthNode = xml.documentElement.getElementsByTagName('Mapwidth');  
  var mapTypeNode = xml.documentElement.getElementsByTagName('Maptype');  
  var zoomLevelNode = xml.documentElement.getElementsByTagName('Zoomlevel');  
  var createMarkerButtonsNode = xml.documentElement.getElementsByTagName('Markerbuttons');  
  var createMapControlsNode = xml.documentElement.getElementsByTagName('Mapcontrols');  
  // --------------
	if (centerNode == null) {
  	zoomText.innerHTML += "<p>Fehler: kein centerNode !</p>";	
  }
  
  if (mapTypeNode == null) {
  	zoomText.innerHTML += "<p>Fehler: kein mapTypeNode !</p>";	
  }
  
  if (zoomLevelNode == null) {
  	zoomText.innerHTML += "<p>Fehler: kein zoomLevelNode !</p>";	
  }
  mapCenter = new GLatLng(
    parseFloat(centerNode[0].getElementsByTagName("Lat")[0].firstChild.data),                            
    parseFloat(centerNode[0].getElementsByTagName("Lng")[0].firstChild.data)
  );
  var Polylines = root.getElementsByTagName("Polylines");
  if (Polylines.length > 0) {
  	var showPolyLines = Polylines[0].firstChild.data;
  }
  if (!mapMarkerButtonsOverrides[mapsCount]) {
		if (createMarkerButtonsNode.length > 0) {
  		createMarkerButton = createMarkerButtonsNode[0].firstChild.data;
		}
		else {
			createMarkerButton = false;
		}
	}
  else {
		createMarkerButton = createMarkerButtons[mapsCount];	
	}
	if (!mapControlsOverrides[mapsCount]) {
		if (createMapControlsNode.length > 0) {
			createMapControl = createMapControlsNode[0].firstChild.data;
		}
		else {
			createMapControl = false;
		}
  }
	else {
		createMapControl = createMapControls[mapsCount];
	}
	if (!dimensionYOverrides[mapsCount]) {
		if (heightNode.length > 0) {
			mapHeight = heightNode[0].firstChild.data;
		}
		else {
			mapHeight = mapHeights[mapsCount];	
		}
	}
	else {
		mapHeight = mapHeights[mapsCount];	
	}

	if (!dimensionXOverrides[mapsCount]) {
		if (widthNode.length > 0) {
			mapWidth = widthNode[0].firstChild.data;
		}
		else {
		mapWidth = mapWidths[mapsCount];	
		}
	}
	else {
		mapWidth = mapWidths[mapsCount];	
	}
	// --
	var clearDiv = document.createElement("div");
	clearDiv.style.clear = "both";
	if (createMarkerButton && createMapControl ) {
    var mapTable = null;
		try {
			mapTable = document.createElement("<table id='tb_" + mapNames[mapsCount] + "'>");
		}
		catch(e) {
			mapTable = document.createElement("tb");
			mapTable.id = 'tb_' + mapNames[mapsCount];
		}
    var mapTableBody = document.createElement("tbody");
    var mapControlRow = document.createElement("tr");
		var mapRow = document.createElement("<tr>");
    var mapControlCell = null;
		var mapCell1 = null;
		var mapCell2 = null;
		var mapNew = null;
		var btnZoomIn = null;
		var btnZoomOut = null;
    var btnMap = null; 
		var btnSat = null;
		var btnHyb = null;
	
		mapControlCell = document.createElement("td");
		mapControlCell.id = 'mapControlCell' + mapNames[mapsCount];
		mapControlCell.colspan = 2;
		mapControlCell.style.verticalAlign = 'top';
		
    mapCell1 = document.createElement("td");
		mapCell1.id = 'mapCell' + mapNames[mapsCount];
		mapCell1.style.verticalAlign = 'top';
		
		mapCell2 = document.createElement("td");
		mapCell2.id = 'buttonCell' + mapNames[mapsCount];
		mapCell2.style.verticalAlign = 'top';
		
		mapNew = document.createElement("div");
		mapNew.id = 'new_' + mapNames[mapsCount];
		mapNew.style.width = mapWidth;
		mapNew.style.height = mapHeight;
		mapNew.style.clear = "both";
		
		mapTable.appendChild(mapTableBody);
		mapTableBody.appendChild(mapControlRow);
    mapTableBody.appendChild(mapRow);
    mapControlRow.appendChild(mapControlCell);
    mapRow.appendChild(mapCell1);
    mapRow.appendChild(mapCell2);
    mapCell1.appendChild(mapNew);
    
		if ( document.getElementById(mapDivs[mapsCount]) != null) {
			if (mapParent != null) {
				mapParent.replaceChild(mapTable,document.getElementById(mapDivs[mapsCount]));
				mapParent.insertBefore(clearDiv,mapTable);			
			}
		}
	  
		maps.push(new GMap2(document.getElementById('new_' + mapNames[mapsCount]))); 
	
		btnZoomIn = document.createElement("input"); //onclick='maps[" + mapsCount + "].zoomIn();'");
		btnZoomIn.type = 'Button';
		btnZoomIn.id = 'btnZI_' + mapsCount;
		btnZoomIn.value = 'Zoom In';
		btnZoomIn.onclick = function(event){maps[Number(this.id.substring(6))].zoomIn();}; // maps[" + mapsCount + "].zoomIn;
		mapControlCell.appendChild(btnZoomIn);
		
		btnZoomOut = document.createElement("input");
		btnZoomOut.type = 'Button';
		btnZoomOut.id = 'btnZO_' + mapsCount;
		btnZoomOut.value = 'Zoom Out';
		btnZoomOut.onclick = function(event){maps[Number(this.id.substring(6))].zoomOut();};
		mapControlCell.appendChild(btnZoomOut);
		
		btnMap = document.createElement("input");
		btnMap.type = 'Button';
		btnMap.id = 'btnMA_' + mapsCount;
		btnMap.value = 'Map';
		btnMap.onclick = function(event){maps[Number(this.id.substring(6))].setMapType(G_NORMAL_MAP);};
		mapControlCell.appendChild(btnMap);
		
		btnSat = document.createElement("input");
		btnSat.type = 'Button';
		btnSat.id = 'btnSA_' + mapsCount;
		btnSat.value = 'Satellite';
		btnSat.onclick = function(event){maps[Number(this.id.substring(6))].setMapType(G_SATELLITE_MAP);};
		mapControlCell.appendChild(btnSat);
		
		btnHyb = document.createElement("input");
		btnHyb.type = 'Button';
		btnHyb.id = 'btnHY_' + mapsCount;
		btnHyb.value = 'Hybrid';
		btnHyb.onclick = function(event){maps[Number(this.id.substring(6))].setMapType(G_HYBRID_MAP);};
		mapControlCell.appendChild(btnHyb);
	}
  else if (!createMarkerButton  && createMapControl) {
    var mapTable = null;
		var mapTableBody = document.createElement("tbody");
    var mapControlRow = document.createElement("tr");
		var mapRow = document.createElement("tr");
    var mapControlCell = null;
		var mapCell1 = null;
		var mapNew = null;
		var btnZoomIn = null;
		var btnZoomOut = null;
    var btnMap = null; 
		var btnSat = null;
		var btnHyb = null;
		
		mapTable = document.createElement("table");
		mapTable.id = 'tb_' + mapNames[mapsCount];
		
    mapControlCell = document.createElement("td");
		mapControlCell.id = 'mapControlCell' + mapNames[mapsCount];
		mapControlCell.colspan = 1;
		mapControlCell.style.verticalAlign = 'top';
		
    mapCell1 = document.createElement("td");
		mapCell1.id = 'mapCell' + mapNames[mapsCount];
		mapCell1.style.verticalAlign = 'top';
		
		mapNew = document.createElement("div");
		mapNew.id = 'new_' + mapNames[mapsCount];
		mapNew.style.width = mapWidth;
		mapNew.style.height = mapHeight;
		mapNew.style.clear = "both";
		mapTable.appendChild(mapTableBody);
		mapTableBody.appendChild(mapControlRow);
    mapTableBody.appendChild(mapRow);
    mapControlRow.appendChild(mapControlCell);
    mapRow.appendChild(mapCell1);
    mapCell1.appendChild(mapNew);
    
		if ( document.getElementById(mapDivs[mapsCount]) != null) {
			if (mapParent != null) {
				mapParent.replaceChild(mapTable,document.getElementById(mapDivs[mapsCount]));
				mapParent.insertBefore(clearDiv,mapTable);			
			}
		}
	  
		maps.push(new GMap2(document.getElementById('new_' + mapNames[mapsCount]))); 
	
		btnZoomIn = document.createElement("input"); //onclick='maps[" + mapsCount + "].zoomIn();'");
		btnZoomIn.type = 'Button';
		btnZoomIn.id = 'btnZI_' + mapsCount;
		btnZoomIn.value = 'Zoom In';
		btnZoomIn.onclick = function(event){maps[Number(this.id.substring(6))].zoomIn();}; // maps[" + mapsCount + "].zoomIn;
		mapControlCell.appendChild(btnZoomIn);
		
		btnZoomOut = document.createElement("input");
		btnZoomOut.type = 'Button';
		btnZoomOut.id = 'btnZO_' + mapsCount;
		btnZoomOut.value = 'Zoom Out';
		btnZoomOut.onclick = function(event){maps[Number(this.id.substring(6))].zoomOut();};
		mapControlCell.appendChild(btnZoomOut);
		
		btnMap = document.createElement("input");
		btnMap.type = 'Button';
		btnMap.id = 'btnMA_' + mapsCount;
		btnMap.value = 'Map';
		btnMap.onclick = function(event){maps[Number(this.id.substring(6))].setMapType(G_NORMAL_MAP);};
		mapControlCell.appendChild(btnMap);
		
		btnSat = document.createElement("input");
		btnSat.type = 'Button';
		btnSat.id = 'btnSA_' + mapsCount;
		btnSat.value = 'Satellite';
		btnSat.onclick = function(event){maps[Number(this.id.substring(6))].setMapType(G_SATELLITE_MAP);};
		mapControlCell.appendChild(btnSat);
		
		btnHyb = document.createElement("input");
		btnHyb.type = 'Button';
		btnHyb.id = 'btnHY_' + mapsCount;
		btnHyb.value = 'Hybrid';
		btnHyb.onclick = function(event){maps[Number(this.id.substring(6))].setMapType(G_HYBRID_MAP);};
		mapControlCell.appendChild(btnHyb);
	}
  else if (createMarkerButton && !createMapControl) {
    var mapTable = null;
		var mapTableBody = document.createElement("tbody");
    var mapRow = document.createElement("<tr>");
    var mapCell1 = null;
		var mapCell2 = null;
		var mapNew = null;
		var btnZoomIn = null;
		var btnZoomOut = null;
    var btnMap = null; 
		var btnSat = null;
		var btnHyb = null;
		
		mapTable = document.createElement("table");
		mapTable.id = 'tb_' + mapNames[mapsCount];
		
    mapCell1 = document.createElement("td");
		mapCell1.id = 'mapCell' + mapNames[mapsCount];
		mapCell1.style.verticalAlign = 'top';
		
		mapCell2 = document.createElement("td");
		mapCell2.id = 'buttonCell' + mapNames[mapsCount];
		mapCell2.style.verticalAlign = 'top';
		
		mapNew = document.createElement("div");
		mapNew.id = 'new_' + mapNames[mapsCount];
		mapNew.style.width = mapWidth;
		mapNew.style.height = mapHeight;
		mapNew.style.clear = "both";
			
		mapTable.appendChild(mapTableBody);
		mapTableBody.appendChild(mapRow);
    mapRow.appendChild(mapCell1);
    mapRow.appendChild(mapCell2);
    mapCell1.appendChild(mapNew);
    
		if ( document.getElementById(mapDivs[mapsCount]) != null) {
			if (mapParent != null) {
				mapParent.replaceChild(mapTable,document.getElementById(mapDivs[mapsCount]));
				mapParent.insertBefore(clearDiv,mapTable);			
			}
		}
		maps.push(new GMap2(document.getElementById('new_' + mapNames[mapsCount]))); 
	}
  else {
    //var mapParent = mapDivs[mapsCount].parentNode;
    mapNew = document.createElement("<div id='new_" + mapNames[mapsCount] + "' style='width:" + mapWidth + "; height:" + mapHeight + "' >");
    mapParent.replaceChild(mapNew,mapDivs[maps.length]);
		mapParent.insertBefore(clearDiv,mapNew);			
    maps.push(new GMap2(document.getElementById('new_' + mapNames[mapsCount]))); 
  }
  
  var zoomLevel = parseInt(zoomLevelNode[0].firstChild.data); 
  if (zoomText != null) {
  	zoomText.innerHTML += '<p>Zoom: ' + zoomLevel + ' zoomLevelNode: ' + zoomLevelNode[0].firstChild.data + '</p>';	
  }
  maps[maps.length - 1].setCenter(mapCenter);
  maps[maps.length - 1].setZoom(zoomLevel);
  switch (mapTypeNode[0].firstChild.data) {
    case 'Karte':
          maps[maps.length - 1].setMapType(G_NORMAL_MAP);
          break;
    case 'Map':
          maps[maps.length - 1].setMapType(G_NORMAL_MAP);
          break;
    case 'Satellite':
          maps[maps.length - 1].setMapType(G_SATELLITE_MAP);
          break;
    case 'Hybrid':
          maps[maps.length - 1].setMapType(G_HYBRID_MAP);
          break;
  }
  
  var lines = new Array();
  var markers = xml.documentElement.getElementsByTagName("Placemark");  
  if (markers != null) {
  	for (var i = 0; i < markers.length; i++) {
  		var markerName = "";
  		if (markers[i].getElementsByTagName("Name")[0].firstChild != null) {
  			markerName = markers[i].getElementsByTagName("Name")[0].firstChild.data;	
  		}
  		var markerDescription = "";
  		if (markers[i].getElementsByTagName("Description")[0].firstChild != null) {
  			markerDescription = markers[i].getElementsByTagName("Description")[0].firstChild.data;
  		}	
  		var markerIcon = markers[i].getElementsByTagName("Icon")[0].firstChild.data;	
  		var markerIconSize = markers[i].getElementsByTagName("IconSize")[0].firstChild.data;	
  		var markerIconAnchor = markers[i].getElementsByTagName("IconAnchor")[0].firstChild.data;	
  		var markerIconInfoAnchor = markers[i].getElementsByTagName("IconInfoAnchor")[0].firstChild.data;	
  		var lat = parseFloat(markers[i].getElementsByTagName("Lat")[0].firstChild.data);
  		var lng = parseFloat(markers[i].getElementsByTagName("Lng")[0].firstChild.data);
  		var point = new GLatLng(lat,lng);
  		var showMarker = markers[i].getElementsByTagName("Showmarker")[0].firstChild.data;
  		if (showMarker == "true") {     
  			if ( markerIcon != null) {
  			  var iSize = markerIconSize.split(',');
  			  var iAnchor = markerIconAnchor.split(',');
  			  var iInfoAnchor = markerIconInfoAnchor.split(',');
  			  var icon = CreateIcon(
  			    markerIcon, 
  			    null, 
  			    new GSize(
  			      iSize[0], 
  			      iSize[1]
  			    ), 
  			    null, 
  			    new GPoint(iAnchor[0],iAnchor[1]),
  			    new GPoint(iInfoAnchor[0],iInfoAnchor[1])
  			  );
  			  var marker = CreateMarkerXml(point,icon,markerName,markerDescription,maps[maps.length -1]);
  			  // var marker = CreateMarkerXml(point,icon,markerName,markerDescription);
  			}
  			else {
  			  var marker = CreateMarkerXml(point,null,markerName,markerDescription,maps[maps.length -1]);
  			  // var marker = CreateMarkerXml(point,icon,markerName,markerDescription);
  			}
  			maps[maps.length -1].addOverlay(marker);
	  		if (createMarkerButton) {
					var markerButton = null;
  		    try {
					markerButton = document.createElement("<input type='Button' id='btnMarker_" 
            + (i + 1) + '_' + mapsCount + '_' + lat + '_' + lng
            + "' style='width:120px' ' value='" + markerName 
            + "' onclick='moveTo(\"btnMarker_" + (i + 1) + "_" + mapsCount + "_" + lat + "_" + lng + "\")'>");
					}
					catch(e) {
						markerButton = document.createElement("input");
						markerButton.id = 'btnMarker_' + (i + 1) + '_' + mapsCount + '_' + lat + '_' + lng;
						markerButton.type = 'Button';	
						markerButton.style.width = 120;
						markerButton.value = markerName;
						//btnHyb.onclick = function(event){maps[Number(this.id.substring(10))].setMapType(G_HYBRID_MAP);};
						markerButton.onclick=function(event){moveTo(this.id)};	
					}
          markerButtons.push(markerButton);
        }
  		}
  		if (showPolyLines == "true") {
  			lines.push(point);
  		}
  	}
    if (showPolyLines == "true") {
   		maps[maps.length - 1].addOverlay(new GPolyline(lines));
   	}  					
    if (markerButtons.length > 0) {
      var buttonCell = document.getElementById('buttonCell' + mapNames[mapsCount] );
      for (var i = 0; i < markerButtons.length;  i++) {
        if (i == 0) {
          buttonCell.appendChild(markerButtons[i]);
        }
        else {
          buttonCell.appendChild(document.createElement("br"));
          buttonCell.appendChild(markerButtons[i]);
        }
      }
    }
  }
	mapsCount++;
}


function createMarker(point,html) {
	var marker = new GMarker(point);
	// Zeige Info Fenster bei Klick
	GEvent.addListener(
		marker, 
		'click', 
		function() {
			// marker.openInfoWindowHtml(html);
			marker.openInfoWindowHtml(html);
		}
	);
	return marker;
}


function CreateMarkerXml(point, icon, markerName, markerDescription, map) {
	var marker = null;
	if (icon == null) {
	  marker = new GMarker(point);  
	}
	else {
	  marker = new GMarker(point,icon);  
	}
  GEvent.addListener(
  		marker, "click", 
   		function() {
  			// marker.openInfoWindowHtml("<b>" + markerName + "</b><br />" + markerDescription);  
  			map.openInfoWindowHtml(point,"<b>" + markerName + "</b><br />" + markerDescription);  
   		}
   	); 
  return marker;							
}

function CreateIcon(imagePath, shadowPath, size,      shadowSize, anchor,     infoAnchor) {
// Parameter:       Urlstring, Urlstring,  GSize(x,y),GSize(x,y), GPoint(x,y),GPoint(x,y))
// Returns:  GIcon() 
  var icon = new GIcon();
  icon.image = '/GoogleMapXml/Icons' + imagePath; // "http://labs.google.com/ridefinder/images/mm_20_red.png";
  icon.iconSize = size; // new GSize(12, 20);
  if (shadowPath != null) {
    icon.shadow = shadowPath; // "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
    icon.shadowSize = shadowSize; // new GSize(22, 20);
  }
  icon.iconAnchor = anchor; // new GPoint(6, 20);
  icon.infoWindowAnchor = infoAnchor; // new GPoint(5, 1);
  return icon;
}
