/*
 * JS knihovna funkci pro modul google map ve WebRedie.
 */

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 orderOfCreation(marker,b) {
        return 1;
      }

  function orderOfCreation2(marker,b) {
        return 10;
      }

 function inverseOrder(marker,b) {
        return -GOverlay.getZIndex(marker.getPoint().lat());
      }

function createMarker(point, label, html, icontype)
{
	var marker = new GMarker(point, {icon: types[icontype], title: label, zIndexProcess:orderOfCreation});
	//var marker = new GMarker(point, {icon: types[icontype], title: label, zIndexProcess:orderOfCreation});

	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;

//var boundaries = new GLatLngBounds(new GLatLng(49.9235, 14.1912), new GLatLng(50.181, 14.737));
//var allowedBounds = new GLatLngBounds(new GLatLng(49.95, 14.21), new GLatLng(50.17,14.7));
//var allowedBounds = boundaries;
// global array of marker references
//var gmarkers = [];

function gmaps(kde, width, height, map_id, lastCoords, zoom, min_zoom, max_zoom, map_type, controls, overlay, bounds)
{
    var mapa_pozice = new GLatLngBounds(new GLatLng(overlay["overlay_x1"], overlay["overlay_y1"]), new GLatLng(overlay["overlay_x2"], overlay["overlay_y2"]));
    var mapa_omezeni_scroolingu = new GLatLngBounds(new GLatLng(bounds["bounds_x1"], bounds["bounds_y1"]), new GLatLng(bounds["bounds_x2"], bounds["bounds_y2"]));

	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 překrytí
		if(overlay["overlay_url"]) {
		    if (overlay["overlay_url"] != "") {
		    //var boundaries = new GLatLngBounds(new GLatLng(49.9235, 14.1912), new GLatLng(50.181, 14.737));
		    //var overlay_map = new GGroundOverlay(overlay["overlay_url"], boundaries);
		    var overlay_map = new GGroundOverlay(overlay["overlay_url"], mapa_pozice);
		    map.addOverlay(overlay_map);
		    }
		}

		// 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;
/*

					GEvent.addListener(marker, "click", function() {

					//alert(marker);
		marker.openInfoWindowHtml(html);
	});
	*/


				GEvent.addListener(marker, "mouseover", function() {
					//alert(this.point_id);
					///changeMarker(this,map)  ;

					//this.openInfoWindowHtml(html);



				});
/*
				GEvent.addListener(marker, "mouseout", function() {
					//alert(this.point_id);


					closeInfoWindow();



				});


*/
				function changeMarker(marker,map) {
				//alert(gmarkers);
				   // var icon = new Google.maps.MarkerImage({ url:"http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=1|ffffff|c41200"});
				//marker.setIcon(icon);
				//m = marker;
				//m.point_id = 1000;

				//var newmarker = createMarker(map.point, map.label, map.html, map.type, map.point_id);


				//marker.hide();
				map.removeOverlay(marker);


				//alert(m.point_id);
/*
					GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
	});
				    */

				map.addOverlay(marker);
				//marker.show();
				//alert(marker.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";
						    //alert(marker.point_id);
				});

				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);
				//gmarkers.push(marker); // store the reference
			}
		});

		limitZoom(map, min_zoom, max_zoom);

    // Add a move listener to restrict the bounds range
    if ((bounds["bounds_x1"]!=0)&&(bounds["bounds_y1"]!=0)&&(bounds["bounds_x2"]!=0)&&(bounds["bounds_y2"]!=0)) {
      GEvent.addListener(map, "move", function() {
        checkBounds(mapa_omezeni_scroolingu);
      });
    }


		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 = [];


     // The allowed region which the whole map must be within
      //var allowedBounds = new GLatLngBounds(new GLatLng(49.9574, 14.05426), new GLatLng(50.21382, 14.85489));
      //var allowedBounds = boundaries;

      // If the map position is out of range, move it back
      function checkBounds(mapa_omezeni_scroolingu) {
        // Perform the check and return if OK
        if (mapa_omezeni_scroolingu.contains(map.getCenter())) {
          return;
        }
        // It`s not OK, so find the nearest allowed point and move there
        var C = map.getCenter();
        var X = C.lng();
        var Y = C.lat();

        var AmaxX = mapa_omezeni_scroolingu.getNorthEast().lng();
        var AmaxY = mapa_omezeni_scroolingu.getNorthEast().lat();
        var AminX = mapa_omezeni_scroolingu.getSouthWest().lng();
        var AminY = mapa_omezeni_scroolingu.getSouthWest().lat();

        if (X < AminX) {X = AminX;}
        if (X > AmaxX) {X = AmaxX;}
        if (Y < AminY) {Y = AminY;}
        if (Y > AmaxY) {Y = AmaxY;}
        //alert ("Restricting "+Y+" "+X);
        map.setCenter(new GLatLng(Y,X));
      }

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);
}

/*
 * 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;
}

