var LNG = ReturnLNG();
google.load("maps", "2", {"language" : LNG });
var IconSet = [];
var dragmap = new Object();
var dragmark = new Object();


function  createMarker(point, pid, nfo, color, ptitle) { 
	var  marker  =  new GMarker(point, {icon: IconSet[color], title: ptitle});
	marker.value = pid;
	if (nfo[1] == 'big') {
		GEvent.addListener(marker,  "click",  function()  {
			GDownloadUrl("maps.php?x=info&id=" + pid + "&size=" + nfo[1], function(data, responseCode) {
				marker.openInfoWindowHtml(data, {"maxWidth": 350});
			});
		});
	} else {
		if (nfo[4] == 'none') {
		} else {
			GEvent.addListener(marker,  "click",  function()  {
				window.location.href = nfo[4] + pid;
			});
		}
	}
	return  marker;
}

function ShowPoint(map, markers, pBar, pBarMax, pBarPos, nfo){
	if (pBarPos < pBarMax) {
		var point = new GLatLng(parseFloat(markers[pBarPos].getAttribute("lat")), parseFloat(markers[pBarPos].getAttribute("lng")));
		var pid = parseFloat(markers[pBarPos].getAttribute("id"));
		var color = markers[pBarPos].getAttribute("color");
		var ptitle = markers[pBarPos].getAttribute("ptitle");
		map.addOverlay(createMarker(point, pid, nfo, color, ptitle));
		pBarPos++;
		pBar.updateLoader(1);
		setTimeout(function(){
			ShowPoint(map, markers, pBar, pBarMax, pBarPos, nfo);
		}, 1);
	} else {
		pBar.remove();
	}
}


function createSingleMarker(point, pid, nfo, color, ptitle, linkta) {
	var  marker  =  new GMarker(point, {icon: IconSet[color], title: ptitle});
	marker.value = pid;
	if (linkta == '') {
	} else {
		GEvent.addListener(marker,  "click",  function()  {
			window.location.href = linkta;
		});
	}
	
	return marker;
}


function CreateMultiMarkers (map, markers, Max, Pos, nfo){
	var latlngbounds = new GLatLngBounds( );
	var Zoom = 0;
	while (Pos < Max) {
		point = new GLatLng(parseFloat(markers[Pos].getAttribute("lat")), parseFloat(markers[Pos].getAttribute("lng")));
		pid = parseFloat(markers[Pos].getAttribute("id"));
		var color = markers[Pos].getAttribute("color");
		var ptitle = '';
		var linkta = '';
		if (nfo[4] == 'none') {
			ptitle = 'No. ' + (Pos + 1);
		} else if  (nfo[4] == 'title') {
			ptitle = markers[Pos].getAttribute("ptitle");
		} else if  (nfo[4] == 'link_place') {
			ptitle = markers[Pos].getAttribute("ptitle");
			linkta = "places_" + pid;
		} else {
			ptitle = markers[Pos].getAttribute("ptitle");
			linkta = markers[Pos].getAttribute("link");
		}
		marker = createSingleMarker(point, pid, nfo, color, ptitle, linkta);
	
		map.addOverlay(marker);
		latlngbounds.extend( point );
		Pos++;
	};
	Zoom = map.getBoundsZoomLevel( latlngbounds );
	if (Zoom > 1) {
		Zoom--;
	}
	
	if (Max == 1) {
		Zoom--;
	}
	map.setCenter( latlngbounds.getCenter( ),  Zoom);
}

function CreateMultiDrag (map, markers, Max, Pos, nfo){
	var latlngbounds = new GLatLngBounds( );
	var Zoom = 0;
	while (Pos < Max) {
		point = new GLatLng(parseFloat(markers[Pos].getAttribute("lat")), parseFloat(markers[Pos].getAttribute("lng")));
		pid = parseFloat(markers[Pos].getAttribute("id"));
		var color = markers[Pos].getAttribute("color");
		if (Pos == (Max -1)) {
			color = "yellow";
		}
		var ptitle = markers[Pos].getAttribute("ptitle") + ' ' + pid;
		marker = createDragMarkerMulti(point, pid, nfo, color, ptitle, map);
		map.addOverlay(marker);
		latlngbounds.extend( point );
		Pos++;
	};
	Zoom = map.getBoundsZoomLevel( latlngbounds );
	if (Zoom > 1) {
		Zoom--;
	}
	if (Max == 1) {
		Zoom = 1;
	}
	map.setCenter( latlngbounds.getCenter( ),  Zoom);
}

function createDragMarkerMulti(point, pid, nfo, color, ptitle, map) {
	var marker = new GMarker(point, {draggable:true,icon: IconSet[color], title: ptitle});

	GEvent.addListener(marker, "dragstart", function() {
	  map.closeInfoWindow();
	});
	
	GEvent.addListener(marker, "dragend", function() {
		PointToSendMulti(marker, pid);
	});

	GEvent.addListener(marker, "drag", function() {
		PointToSendMulti(marker, pid);
	});
	
	return marker;
}

function PointToSendMulti(marker, ID) {
	var LatLng = marker.getLatLng();
	document.getElementsByName("Lat[" + ID + "]")[0].value = LatLng.lat().toFixed(6);
	document.getElementsByName("Lng[" + ID + "]")[0].value = LatLng.lng().toFixed(6);
}

function PointToSend(marker) {
	var LatLng = marker.getLatLng();
	document.getElementsByName("newLat")[0].value = LatLng.lat().toFixed(6);
	document.getElementsByName("newLng")[0].value = LatLng.lng().toFixed(6);
}

function createDragMarker(point, pid, nfo, color, ptitle, map) {
	var marker = new GMarker(point, {draggable:true,icon: IconSet[color], title: ptitle});

	GEvent.addListener(marker, "dragstart", function() {
	  map.closeInfoWindow();
	});
	
	GEvent.addListener(marker, "dragend", function() {
		PointToSend(marker);
	});

	GEvent.addListener(marker, "drag", function() {
		PointToSend(marker);
	});
	
	return marker;
}

function showAddress(address) {
    if (geocoder) {
      geocoder.getLatLng(
        address,
        function(point) {
          if (!point) {
            alert(address + " not found");
          } else {
            dragmap.setCenter(point, 13);
            dragmark.setPoint(point);
            PointToSend(dragmark);
          }
        }
      );
    }
}

function CreateIcons(){
	var baseIcon = new GIcon(G_DEFAULT_ICON);
	baseIcon.image = "images/red-dot.png";
	baseIcon.shadow = "images/msmarker.shadow.png";
	baseIcon.iconSize = new GSize(32, 32);
	baseIcon.shadowSize = new GSize(59, 32);
	baseIcon.iconAnchor = new GPoint(15, 32);
	baseIcon.infoWindowAnchor = new GPoint(15, 2);
	baseIcon.infoShadowAnchor = new GPoint(18, 25);
	
	IconSet['red'] = new GIcon(baseIcon);
	IconSet['green'] = new GIcon(baseIcon);
	IconSet['green'].image = "images/green-dot.png";
	IconSet['yellow'] = new GIcon(baseIcon);
	IconSet['yellow'].image = "images/yellow-dot.png";
	IconSet['blue'] = new GIcon(baseIcon);
	IconSet['blue'].image = "images/blue-dot.png";
	IconSet['orange'] = new GIcon(baseIcon);
	IconSet['orange'].image = "images/orange-dot.png";
	IconSet['ltblue'] = new GIcon(baseIcon);
	IconSet['ltblue'].image = "images/ltblue-dot.png";
	
}

function DataLoaded(data, map, nfo) {
	var xml = GXml.parse(data);
	var markers = xml.documentElement.getElementsByTagName("marker");
	if (markers.length != 0) {
		if (nfo[3] == 'drag') {
			geocoder = new GClientGeocoder();
			point = new GLatLng(parseFloat(markers[0].getAttribute("lat")), parseFloat(markers[0].getAttribute("lng")));
			pid = parseFloat(markers[0].getAttribute("id"));
			var color = markers[0].getAttribute("color");
			var ptitle = markers[0].getAttribute("ptitle");
			marker = createDragMarker(point, pid, nfo, color, ptitle, map);
			map.addOverlay(marker);
			PointToSend(marker);
			dragmap = map;
			dragmark = marker;
		} else if(nfo[3] == 'multidrag') {
			CreateMultiDrag(map, markers, markers.length, 0, nfo);
		} else if(nfo[3] == 'noinfo') {
			CreateMultiMarkers(map, markers, markers.length, 0, nfo);
		} else {
			if (markers.length>1) {
				var pBar = new ProgressbarControl(map, {width:150});
				var pBarMax = markers.length;
				pBar.start(pBarMax);
				ShowPoint(map, markers, pBar, pBarMax, 0, nfo);
			} else {
				point = new GLatLng(parseFloat(markers[0].getAttribute("lat")), parseFloat(markers[0].getAttribute("lng")));
				pid = parseFloat(markers[0].getAttribute("id"));
				var color = markers[0].getAttribute("color");
				var ptitle = markers[0].getAttribute("ptitle");
				map.setCenter(point, 3);
				map.addOverlay(createMarker(point, pid, nfo, color, ptitle));
			}
		}
	}
}

function CreateMaps(num){
	var mlist = ReturnMapList();
	if(num<mlist.length) {
		var i = num;
		var nfo = mlist[i];
		map = new GMap2(document.getElementById(nfo[0]));
		map.enableScrollWheelZoom();
		map.addMapType(G_PHYSICAL_MAP);
		map.setMapType(G_PHYSICAL_MAP);
		if (nfo[1] == "big") {
    		map.addControl(new GMapTypeControl());
    		map.addControl(new GLargeMapControl());
    		map.addControl(new GScaleControl());
    		map.setCenter(new GLatLng(20, 0), 1);
		} else if (nfo[1] == "small") {
			map.addControl(new GSmallZoomControl());
			map.setCenter(new GLatLng(30, 0), 0);
		}
		//geocoder = new GClientGeocoder(); // für Adresssuche
		ajaxmap(mlist[i][2], map, num, nfo);
	}
	
}

function initialize() {
    if (GBrowserIsCompatible()) {
    	CreateIcons();
    	CreateMaps(0);
    }
}

function ajaxmap(url, map, num, nfo) {
	if(window.XMLHttpRequest){
		xmlhttp=new XMLHttpRequest();
		if(xmlhttp.overrideMimeType){
			xmlhttp.overrideMimeType('text/xml');
		}
	} else if(window.ActiveXObject){
		try{
			xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try{
				xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e){
			}
		}
	}

	if(!xmlhttp) {
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}

	this.xmlhttp.onreadystatechange = function() {
	if (xmlhttp.readyState==4) {
			DataLoaded(xmlhttp.responseText, map, nfo);
			num++;
			CreateMaps(num);
		}
	}

	this.xmlhttp.open('GET',url,true);
	this.xmlhttp.send(null);
}

google.setOnLoadCallback(initialize);
