var map = null;
var previousMarker = null;
var addedMarker = null;

var mm;

//init icons
var imgMarker = '/noRW_wr/gm_marker.png';

var iconMarker = new GIcon();
iconMarker.image = imgMarker;
iconMarker.iconSize = new GSize(29, 28);
iconMarker.iconAnchor = new GPoint(29, 28);
iconMarker.infoWindowAnchor = new GPoint(23, 5);

var markers = [];

GMarker.prototype.hide = function ()
{
  if (this.getPoint().lat() < 90) {
    try {
      this.savePoint = this.getPoint();
      this.setPoint(new GLatLng(90, 0));
    } catch(e) {}
  }  
}

GMarker.prototype.show = function ()
{
  if (this.getPoint().lat() == 90) {
    if (this.savePoint) {
      try {
        this.setPoint(this.savePoint);
        this.savePoint = null;
      } catch(e) {}
    }
	}
}

function createMarker(point, label, html, icontype) {
	var marker = new GMarker(point, {icon: types[icontype], title: label});
	
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
	});
	
	return marker;
}

function limitZoom(map, min, max)
{
  var mapTypes = map.getMapTypes();
	// overwrite the getMinimumResolution() and getMaximumResolution() methods for each map type
	for(var i = 0; i < mapTypes.length; i++) {
		mapTypes[i].getMinimumResolution = function() {return min;}
		mapTypes[i].getMaximumResolution = function() {return max;}
	}
}

var map_types_assoc = {
	"map" : G_NORMAL_MAP,
	"sat" : G_SATELLITE_MAP,
	"hyb" : G_HYBRID_MAP
};

// objekty controlu
var overview_map_ctrl;
var map_type_ctrl;
var large_map_ctrl;
var scale_ctrl;
var small_zoom_ctrl;

function gmaps(kde, width, height, map_id, lastCoords, zoom, min_zoom, max_zoom, map_type, controls) {

	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById('map'), { "size": new GSize(width, height) });
		
		map.setMapType(map_types_assoc[map_type]);

		//init coordinates
		if ((lastCoords == undefined) || (lastCoords == "")) {
			map.setCenter(new GLatLng(49.868939,15.300608), 7);
		} else {
			var p = lastCoords.split(",");
			map.setCenter(new GLatLng(p[0], p[1]), zoom);
			
			if(kde == "points")
			  markerToMap(new GLatLng(p[0], p[1]));
		}

		// Nastavujeme controly
		if(controls["overview_map"]) {
		  overview_map_ctrl = new GOverviewMapControl(new GSize(90, 90));
		
			map.addControl(overview_map_ctrl);
		}

		if(controls["map_type"]) {
			map_type_ctrl = new GMapTypeControl(1);
			
			map.addControl(map_type_ctrl);
		}

		if(controls["large_map"]) {
			large_map_ctrl = new GLargeMapControl();
			
			map.addControl(large_map_ctrl);
		}
		
		if(controls["scale"]) {
			scale_ctrl = new GScaleControl();

			map.addControl(scale_ctrl);
		}
		
		if(controls["small_zoom"]) {
			small_zoom_ctrl = new GSmallZoomControl();
			
			map.addControl(small_zoom_ctrl);
		}

			  // Read the data from example.xml
	  GDownloadUrl("/noRW_/gm_points_" + map_id + ".xml?" + Math.random(), function(doc) {
      var xmlDoc = GXml.parse(doc);
      var markers = xmlDoc.documentElement.getElementsByTagName("marker");

      mm = new GMarkerManager(map, {
				borderPadding : 1
			});
      
      for(var i = 0; i < markers.length; i++) {
      	// obtain the attribues of each marker
      	var point_id = parseFloat(markers[i].getAttribute("id"));
				var lat = parseFloat(markers[i].getAttribute("lat"));
				var lng = parseFloat(markers[i].getAttribute("lng"));
				var zoom_min = parseInt(markers[i].getAttribute("zoom_min"));
				var zoom_max = parseInt(markers[i].getAttribute("zoom_max"));
				var point = new GLatLng(lat,lng);
				var html = GXml.value(markers[i].getElementsByTagName("infowindow")[0]);
				var label = markers[i].getAttribute("label");
				var type = markers[i].getAttribute("type");

        var marker = createMarker(point, label, html, type);
        
        types[type].markers.push(marker);
        
        marker.point_id = point_id;

				/*
				  Nasledujici listenery zpusobuji, ze v adminu po najeti na bod na mape se zvyrazni
				  prislusni radek bodu v prehledu.
				*/

        GEvent.addListener(marker, "mouseover", function() {
					var tr = document.getElementById("tr_point_" + this.point_id);
					
					if(tr != null)
					  for(var i = 0; i < tr.childNodes.length; i++)
							if(tr.childNodes[i].tagName != undefined)
								tr.childNodes[i].style.backgroundColor = "#DDDDDD";
				});
				
				GEvent.addListener(marker, "mouseout", function() {
					var tr = document.getElementById("tr_point_" + this.point_id);

					if(tr != null)
					  for(var i = 0; i < tr.childNodes.length; i++)
							if(tr.childNodes[i].tagName != undefined)
								tr.childNodes[i].style.backgroundColor = "#FFFFFF";
				});

				map.addOverlay(marker);
			}
	  });
		
		limitZoom(map, min_zoom, max_zoom);
		
		GEvent.addListener(map, "click", function(overlay, latlng) {
		  if(latlng) {
		    /*
					Centruje mapu na souradnice kliknuti a kopiruje do prislusneho inputu
		    */
		    if(kde == "maps") {
			    map.setCenter(latlng, map.getZoom());

			    var pos_str = latlng.toString().substr(1);

			    pos_str = pos_str.substr(0, pos_str.length - 1);

					var pos = pos_str.split(",");

					var lat = roundNumber(parseFloat(pos[0]), 5);
					var lng = roundNumber(parseFloat(pos[1]), 5);

			    document.getElementById("position").value = lat + ", " + lng;

			    inputChange();
				}
				else if(kde == "points") {
					// prenastavi marker na bod kliknuti
				
			    markerToMap(latlng);

			    inputChange();
				}
			}
		});
	}
}

/*
	V adminu po najeti na radku bodu se oznaci bod na mape markerem ...
*/

var markers_over = [];

function markerOver(turnon, point_id, lat, lng)
{
	if(turnon) {
		markers_over[point_id] = new GMarker(new GLatLng(lat, lng), { draggable :true });
		
		map.addOverlay(markers_over[point_id]);
		
		markers_over[point_id].setImage(imgMarker);
	}
	else
	  map.removeOverlay(markers_over[point_id]);
}

/*
	Na latlng umisti marker, pricemz zrusi posledni.
	
	Pouziva se pro nastaveni bodu.
*/

function markerToMap(latlng) {
	if (previousMarker != null)
		map.removeOverlay(previousMarker);

	var marker = new GMarker(latlng, {
		draggable :true,
		autoPan :false
	});
	
	map.addOverlay(marker);
	marker.setImage(imgMarker);
	
	previousMarker = marker;
	
	document.getElementById('position').setAttribute("value",
			marker.getPoint().toUrlValue());

	GEvent.addListener(marker, 'dragend', function() {
		document.getElementById('position').setAttribute(
				"value", marker.getPoint().toUrlValue());
	});
}

/*
	Najde zadane misto a vycentruje tam pohled (zoom 14)
*/

function getLocation() {
	var search = document.getElementById('gm_get_loc_input').value;
	if (search == "") {
		window.alert("Zadejte prosím město k hledání.");
		return false;
	}
	search = search + ", czech republic";
	var geo = new GClientGeocoder();

	geo.getLocations(search, function(result) {
		if (result.Status.code == G_GEO_SUCCESS) {
			map.clearOverlays();
			var p = result.Placemark[0].Point.coordinates;
			place(p[1], p[0]);
		} else if (result.Status.code == G_GEO_UNKNOWN_ADDRESS) {
			window.alert("Adresa nenalezena, zkuste to prosím znovu.");
		}
	});

	return false;
}

function place(lat, lng) {
	var point = new GLatLng(lat, lng);
	map.setCenter(point, 14);
	// map.addOverlay(new GMarker(point));
}

/*
	Vyvola se kliknutim na checkbox
	
	Schovava/zobrazuje typy bodu
*/

function boxclick(box, type) {
  if (box.checked)
    for (var i = 0; i < types[type].markers.length; i++)
	  	types[type].markers[i].show();
  else {
    for (var i = 0; i < types[type].markers.length; i++)
    	types[type].markers[i].hide();

  	// == close the info window, in case its open on a marker that we just hid
  	map.closeInfoWindow();
  }
}

/*
	Zaokrouhluje cislo na dec pocet destinnych mist
*/

function roundNumber(num, dec) {
	var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
	return result;
}

