/**
 * SMTW Googlemaps V3 integration
 */

// 	maplist[0] = new Array("map_0", "big", "maps.php?x=all&id=0&size=big", "nodrag", "places_");
/*
 * 		maplist[0] = new Array("map_0", "small", "maps_v3.php?x=pagesMapNav&id=0&size=small&for_sa=tour&for_db=db_pages&hidden=", "noinfo", "link");
 *		maplist[1] = new Array("map_1", "big", "maps_v3.php?x=pagesMapNav&id=0&size=big&for_sa=tour&for_db=db_pages&hidden=", "noinfo", "link");
 *		
 *		maplist[0] = new Array("map_0", "big", "maps_v3.php?x=placeedit&id=1&size=big", "drag", "places_");
 * 				<marker lat="62.349140" lng="12.240701" id="1" color="green" ptitle="Revbua (Beispiel)">
 */

var infoWindow = new google.maps.InfoWindow();
var markerBounds = new Array();
var Polylines = new Array();
var dragmap = new Object();
var dragmark = new Object();

function customIcon(color) {
	ret = new Array();
	if (color == 'blue') {
		ret[0] = new google.maps.MarkerImage('images/blue-dot.png', new google.maps.Size(32, 32), new google.maps.Point(0,0));
		ret[1] = new google.maps.MarkerImage('images/msmarker.shadow.png', new google.maps.Size(59, 32), new google.maps.Point(0,0), new google.maps.Point(18,32));
		return ret;
	}
	if (color == 'green') {
		ret[0] = new google.maps.MarkerImage('images/green-dot.png', new google.maps.Size(32, 32), new google.maps.Point(0,0));
		ret[1] = new google.maps.MarkerImage('images/msmarker.shadow.png', new google.maps.Size(59, 32), new google.maps.Point(0,0), new google.maps.Point(18,32));
		return ret;
	}
	if (color == 'yellow') {
		ret[0] = new google.maps.MarkerImage('images/yellow-dot.png', new google.maps.Size(32, 32), new google.maps.Point(0,0));
		ret[1] = new google.maps.MarkerImage('images/msmarker.shadow.png', new google.maps.Size(59, 32), new google.maps.Point(0,0), new google.maps.Point(18,32));
		return ret;
	}
	if (color == 'orange') {
		ret[0] = new google.maps.MarkerImage('images/orange-dot.png', new google.maps.Size(32, 32), new google.maps.Point(0,0));
		ret[1] = new google.maps.MarkerImage('images/msmarker.shadow.png', new google.maps.Size(59, 32), new google.maps.Point(0,0), new google.maps.Point(18,32));
		return ret;
	}
	if (color == 'ltblue') {
		ret[0] = new google.maps.MarkerImage('images/ltblue-dot.png', new google.maps.Size(32, 32), new google.maps.Point(0,0));
		ret[1] = new google.maps.MarkerImage('images/msmarker.shadow.png', new google.maps.Size(59, 32), new google.maps.Point(0,0), new google.maps.Point(18,32));
		return ret;
	}
	ret[0] = new google.maps.MarkerImage('images/red-dot.png', new google.maps.Size(32, 32), new google.maps.Point(0,0));
	ret[1] = new google.maps.MarkerImage('images/msmarker.shadow.png', new google.maps.Size(59, 32), new google.maps.Point(0,0), new google.maps.Point(18,32));
	return ret;
}

function loadMaps() {
	var mapList = ReturnMapList();
	for (var i = 0; i < mapList.length; i++) {
		var map = createMap(mapList[i][0], mapList[i][1]);
		markerBounds[i] = new google.maps.LatLngBounds();
		Polylines[i] = new Array();
		ajaxReq(mapList[i][2], loadMarker, map, mapList[i], i);
	}
}

function showAddress(address) {
	geocoder = new google.maps.Geocoder();
    if (geocoder) {
    	geocoder.geocode( { 'address': address}, function(results, status) {
    		if (status == google.maps.GeocoderStatus.OK) {
    			dragmap.setCenter(results[0].geometry.location);
    			dragmap.setZoom(13);
    			dragmark.setPosition(results[0].geometry.location);
    			PointToSend(dragmark, 0);
    		} else {
    			alert("Geocode was not successful for the following reason: " + status);
    		}
    	});
    } 
}

function PointToSend(marker, id) {
	document.getElementsByName("newLat")[0].value = marker.getPosition().lat().toFixed(6);
	document.getElementsByName("newLng")[0].value = marker.getPosition().lng().toFixed(6);
}

function createDragMarker(markers, map, mapset, pos, mapid) {
	var title = markers[pos].getAttribute("ptitle");
	var link = markers[pos].getAttribute("link");
	var id = markers[pos].getAttribute("id");
    var color = markers[pos].getAttribute("color");
    var point = new google.maps.LatLng(
        parseFloat(markers[pos].getAttribute("lat")),
        parseFloat(markers[pos].getAttribute("lng")));
    var icon = customIcon(color); 
    var marker = new google.maps.Marker({
      map: map,
      position: point,
      icon: icon[0],
      title: title,
      shadow: icon[1],
      draggable: true
    });
    PointToSend(marker);
    google.maps.event.addListener(marker, 'dragend', function() {
    	PointToSend(marker, id);
	});
    dragmap = map;
	dragmark = marker;
}

function PointToSendMulti(marker, id) {
	document.getElementsByName("Lat[" + id + "]")[0].value = marker.getPosition().lat().toFixed(6);
	document.getElementsByName("Lng[" + id + "]")[0].value = marker.getPosition().lng().toFixed(6);
}

function createMultiDragMarker(markers, map, mapset, pos, mapid) {
	if (pos < markers.length) {
		var title = markers[pos].getAttribute("ptitle");
		var link = markers[pos].getAttribute("link");
		var id = markers[pos].getAttribute("id");
	    var color = markers[pos].getAttribute("color");
	    if (pos == (markers.length -1)) {
			color = "yellow";
		}
	    var point = new google.maps.LatLng(
	        parseFloat(markers[pos].getAttribute("lat")),
	        parseFloat(markers[pos].getAttribute("lng")));
	    var icon = customIcon(color); 
	    var marker = new google.maps.Marker({
	      map: map,
	      position: point,
	      icon: icon[0],
	      title: title,
	      shadow: icon[1],
	      draggable: true
	    });
	    PointToSendMulti(marker, id);
	    google.maps.event.addListener(marker, 'dragend', function() {
	    	PointToSendMulti(marker, id);
		});
	    Polylines[mapid].push(point);
//    	marker.setVisible(false);
	    markerBounds[mapid].extend(point);
	    pos++;
	    setTimeout(function(){
        	createMultiDragMarker(markers, map, mapset, pos, mapid);
		}, 2);
        return true;
	}
	if (pos > 0 ){
		var PolyPath = new google.maps.Polyline({
			path: Polylines[mapid],
			strokeColor: "#2222BA",
			strokeOpacity: 0.7,
			strokeWeight: 3});
		PolyPath.setMap(map);
		map.fitBounds(markerBounds[mapid]);
	}
}

function createMarker(markers, map, mapset, pos, mapid) {
	if (pos < markers.length) {
		var title = markers[pos].getAttribute("ptitle");
		var link = markers[pos].getAttribute("link");
		var id = markers[pos].getAttribute("id");
        var color = markers[pos].getAttribute("color");
        var point = new google.maps.LatLng(
            parseFloat(markers[pos].getAttribute("lat")),
            parseFloat(markers[pos].getAttribute("lng")));
        var icon = customIcon(color); 
        var marker = new google.maps.Marker({
          map: map,
          position: point,
          icon: icon[0],
          title: title,
          shadow: icon[1]
        });
        /*bindAction(marker, map, mapset, id);*/
        if (mapset[1] == 'big' && mapset[3] != 'noinfo') {
	        google.maps.event.addListener(marker, 'click', function() {
				var data = ajaxReqSync('maps_v3.php?x=info&id=' + id);
				infoWindow.setOptions({maxWidth: 300});
				infoWindow.setContent(data);
				infoWindow.open(map, marker);
			});
        }
        if (mapset[4] == 'link') {
        	google.maps.event.addListener(marker, 'click', function() {
        		window.location.href = link;
        	});
        }
        if (mapset[4] == 'line') {
        	Polylines[mapid].push(point);
        	marker.setVisible(false);
        }
        markerBounds[mapid].extend(point);
        pos++;
        if (markers.length == 1 && mapset[1] == 'small') {
        	map.setCenter(point);
        	map.setOptions({zoom:3});
        	return true;
        }
        setTimeout(function(){
        	createMarker(markers, map, mapset, pos, mapid);
		}, 2);
        return true;
	}
	if (pos > 1 ){
		if (mapset[4] == 'line') {
			var PolyPath = new google.maps.Polyline({
				path: Polylines[mapid],
				strokeColor: "#2222BA",
				strokeOpacity: 0.7,
				strokeWeight: 3});
			PolyPath.setMap(map);
		}
		map.fitBounds(markerBounds[mapid]);
		google.maps.event.addListener(map, "click", function(){
		  infoWindow.close();
		});
	}
}

function loadMarker(data, map, mapset, mapid) {
	var xml = parseXml(data);
    var markers = xml.documentElement.getElementsByTagName("marker");
    if (mapset[3] == 'drag') {
    	createDragMarker(markers, map, mapset, 0, mapid);
    } else if(mapset[3] == 'multidrag') {
    	createMultiDragMarker(markers, map, mapset, 0, mapid);
    } else {
    	createMarker(markers, map, mapset, 0, mapid);
    }
}

// create map depends on size
function createMap(div, size) {
	if (size == 'big') {
		return new google.maps.Map(document.getElementById(div), {
			center: new google.maps.LatLng(20, 0),
			mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
			scaleControl: true,
			zoom: 1,
			mapTypeId: 'terrain'
		});
	}
	if (size == 'small') {
		return map = new google.maps.Map(document.getElementById(div), {
		      center: new google.maps.LatLng(30, 0),
		      streetViewControl: 0,
		      zoom: 0,
		      mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
		      mapTypeId: 'terrain'
		    });
	}
}

function ajaxReq(url, callback, map, mapset, mapid) {
	 var request = window.ActiveXObject ?
	     new ActiveXObject('Microsoft.XMLHTTP') :
	     new XMLHttpRequest;

	     request.onreadystatechange = function() {
	    	 if (request.readyState == 4) {
	    		 request.onreadystatechange = doNothing;
	    		 callback(request.responseText, map, mapset, mapid);
	    	 }
	     };

	 request.open('GET', url, true);
	 request.send(null);
}

function ajaxReqSync(url) {
	 var request = window.ActiveXObject ?
	     new ActiveXObject('Microsoft.XMLHTTP') :
	     new XMLHttpRequest;

	 request.open('GET', url, false);
	 request.send(null);
	 return request.responseText;
}

function parseXml(str) {
    if (window.ActiveXObject) {
      var doc = new ActiveXObject('Microsoft.XMLDOM');
      doc.loadXML(str);
      return doc;
    } else if (window.DOMParser) {
      return (new DOMParser).parseFromString(str, 'text/xml');
    }
  }

function doNothing() {}



