// globals
var map;
var PI = 3.141592654;
var markerDraggable;
var places = [];
// geocoder variables and constants
var geo = new GClientGeocoder();
var reasons = [];
var point;
var CentrePoint;
reasons[G_GEO_SUCCESS] = "Úspech";
reasons[G_GEO_MISSING_ADDRESS] = "Chýbajúca adresa: Adresa chýba alebo nemá žiadnu hodnotu.";
reasons[G_GEO_UNKNOWN_ADDRESS] = "Neznáma adresa: K zadanej adrese nebola nájdená žiadna geografická poloha.";
reasons[G_GEO_UNAVAILABLE_ADDRESS] = "Nedostupná adresa: Adresa nebola nájdená kvôli právnych alebo zmluvných dôvodov.";
reasons[G_GEO_BAD_KEY] = "Zlý kľúč: API kľúč je nesprávny alebo sa nezhoduje doménou, pre ktorú bol vytvorený.";
reasons[G_GEO_TOO_MANY_QUERIES] = "Priveľa dopytov: Denná kvóta pre vyhľadávanie adries bola prekročená.";
reasons[G_GEO_SERVER_ERROR] = "Serverová chyba: Vyhľadávací dopyt nemohol byť úspešne spracovaný.";
reasons[G_GEO_BAD_REQUEST] = "Zadaná adresa nemohla byť správne analyzovaná.";
reasons[G_GEO_MISSING_QUERY] = "Nebola zadaná žiadna adresa.";
reasons[G_GEO_UNKNOWN_DIRECTIONS] = "Nebolo možné nájsť spojenie dvoch zadaných bodov.";
var accuracy = [];
accuracy[0] = 'Neznáma';
accuracy[1] = 'Krajina';
accuracy[2] = 'Región';
accuracy[3] = 'Podregión';
accuracy[4] = 'Mesto';
accuracy[5] = 'PSČ';
accuracy[6] = 'Ulica';
accuracy[7] = 'Križovatka';
accuracy[8] = 'Adresa';
accuracy[9] = 'Pozemok';

function setMapCenter(result) {
	if (result.Placemark.length > 0) {
		point = new GLatLng(result.Placemark[0].Point.coordinates[1],
				result.Placemark[0].Point.coordinates[0]);
		map.setCenter(point, result.Placemark[0].AddressDetails.Accuracy + 10);
	}
}

function drawDraggableMarker(isRestaurant) {
	markerDraggable = new GMarker(point, {
		draggable : true
	});
	GEvent.addListener(markerDraggable, "dragend", function() {
		point = markerDraggable.getPoint();
		document.location = "search.map.php?gps_lat=" + point.lat()
				+ "&gps_lng=" + point.lng() + "&radius=" + radius;
	});
	map.addOverlay(markerDraggable);
	if (isRestaurant) {
		drawCircle(point);
	}
}

function drawCircle(point) {
	var points = Array();
	with (Math) {
		var rLat = (circleRadius / 6378.8) * (180 / PI);
		var rLng = rLat / cos(point.lat() * (PI / 180));
		for ( var a = 0; a < 361; a += 1) {
			var aRad = a * (PI / 180);
			var x = point.lng() + (rLng * cos(aRad));
			var y = point.lat() + (rLat * sin(aRad));
			var point2 = new GLatLng(parseFloat(y), parseFloat(x));
			points.push(point2);
		}
	}

	var polygon = new GPolygon(points, '#0000FF', 4, 0.5, '#000000', 0);
	map.addOverlay(polygon);
}

function load_map_normal() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map"));
		if (mapType == 'normal') {
			point = new GLatLng(restaurant[0].lat, restaurant[0].lng);
			map.setCenter(point, zoom);
		} 
		if (mapType == 'search') {
			if (document.getElementById("gps_lat").value == "0") {
				geo.getLocations(locationName, function(result) {
					if (result.Status.code == G_GEO_SUCCESS) {
						setMapCenter(result);
						drawDraggableMarker(false);
					}
				})
			} else {
				point = new GLatLng(document.getElementById("gps_lat").value,
						document.getElementById("gps_lng").value);
				map.setCenter(point, zoom);
				drawDraggableMarker(true);
			}
		}
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		map.enableScrollWheelZoom();
		map.enableContinuousZoom();

		var icon = new GIcon(G_DEFAULT_ICON);
		icon.image = "http://" + location.host + "/bratislava/imgs/gmap.icon.png";
		icon.shadow = "http://" + location.host + "/bratislava/imgs/gmap.shadow.png";
//		icon.infoWindowAnchor = new GPoint(16, 0);
		icon.iconSize = new GSize(12, 20);
		icon.shadowSize = new GSize(22, 20);
		icon.iconAnchor = new GPoint(6, 20);

		if (mapType == 'normal') {
			createMarker(map, icon, 0);
			createInfoWindow(map, 0);

			drawCircle(point);

			var i;
			for (i = 1; i <= rows; i++) {
				createMarker(map, icon, i);
			}
		}
		if (mapType == 'search') {
			var i;
			for (i = 0; i < rows; i++) {
				createMarker(map, icon, i);
			}

			if (searchType == 'restaurant') {
				createInfoWindow(map, 0);
			}
		}
	}
}

function createMarker(map, icon, i) {
	var opts = {
		title : restaurant[i].name,
		icon : icon
	};
	var markerLatLng = new GLatLng(restaurant[i].lat, restaurant[i].lng);
	if (map.getCenter().distanceFrom(markerLatLng) < radius) {
		var marker = new GMarker(markerLatLng, opts);
		GEvent.addListener(marker, "click", function() {
			createInfoWindow(map, i);
		});
		map.addOverlay(marker);
	}
}

function createInfoWindow(map, i) {
	var restPoint = new GLatLng(restaurant[i].lat, restaurant[i].lng);
	var html = "<span style=\"font-size: 120%; font-weight: bold;\"><a href=\"restaurant.php?id="
			+ restaurant[i].id
			+ "\">"
			+ restaurant[i].name
			+ "</a></span><br />";
	html += "<span>" + restaurant[i].street + "<br />" + restaurant[i].zip
			+ ", " + restaurant[i].city + "</span><br /><br />";
	html += restaurant[i].tabs;
	map.openInfoWindowHtml(restPoint, html);
}

// main map drawing function
function load_map_admin() {
	if (GBrowserIsCompatible()) {
		// Reset the initial size of the map div to fill screen
		// setDivSize();
		// Start processing the map
		map = new GMap2(document.getElementById("map"));
		// GEvent.addListener(map, "moveend", function() {
		// var center = map.getCenter();
		// document.getElementById("message").innerHTML = "Centre of map @ " +
		// center.lat() + " , " + center.lng();
		// });
		GEvent.addListener(map, "dblclick", function(moverlay, mpoint) {
			markerDraggable.setPoint(mpoint);
			GEvent.trigger(markerDraggable, 'click');
		});

		if (restaurant[0].lat == 0) {
			CentrePoint = new GLatLng(gps_default_lat, gps_default_lng);
		} else {
			CentrePoint = new GLatLng(restaurant[0].lat, restaurant[0].lng);
		}

		// Add controls
		map.addMapType(G_PHYSICAL_MAP);
		map.addControl(new GLargeMapControl());
		map.addControl(new GScaleControl());
		map.addControl(new GMapTypeControl());
		map.enableScrollWheelZoom();
		map.setCenter(CentrePoint, 15);
		// Now the marker and click label
		markerDraggable = new GMarker(CentrePoint, {
			draggable : true
		});
		// GEvent.addListener(marker, "click", function() {
		// var point = marker.getPoint();
		// marker.openInfoWindowHtml( fix6ToString(point.lat()) + " , " +
		// fix6ToString(point.lng()));
		// });
		// GEvent.addListener(marker, "dragstart", function() {
		// map.closeInfoWindow();
		// });
		GEvent.addListener(markerDraggable, "dragend", function() {
			var point = markerDraggable.getPoint();
			document.getElementById('gps_lat').value = point.lat();
			document.getElementById('gps_lng').value = point.lng();
			// marker.openInfoWindowHtml( fix6ToString(point.lat()) + " , " +
				// fix6ToString(point.lng()));
			});
		map.addOverlay(markerDraggable);
		// Monitor the window resize event and let the map know when it occurs
		if (window.attachEvent) { // IE
			window.attachEvent("onresize", function() {
				resizeAndCenterMap();
			});
		} else { // others
			window.addEventListener("resize", function() {
				resizeAndCenterMap();
			}, false);
		}
		// Display marker info window
		GEvent.trigger(markerDraggable, 'click');
		// Add Lat Long to centre report at base of map
		GEvent.trigger(map, 'moveend');
	}
}

// Find an Address...
function findaddress_normal() {
	if (document.getElementById("addressfind").value) {
		var address = document.getElementById("addressfind").value;
		geo
				.getLocations(
						address,
						function(result) {
							if (result.Status.code == G_GEO_SUCCESS) {
								if (result.Placemark.length == 1) {
									document.location = "search.map.php?gps_lat="
											+ result.Placemark[0].Point.coordinates[1]
											+ "&gps_lng="
											+ result.Placemark[0].Point.coordinates[0]
											+ "&radius="
											+ radius
											+ "&text="
											+ urlencode(address);
									return;
								} else {
									document.getElementById("geomessage").innerHTML = "Nájdených "
											+ result.Placemark.length
											+ " výsledkov";
									for ( var i = 0; i < result.Placemark.length; i++) {
										places[i] = result.Placemark[i];
										var p = places[i].Point.coordinates;
										document.getElementById("geomessage").innerHTML += "<br /><b>"
												+ (i + 1)
												+ ":</b> » <a href='search.map.php?gps_lat="
												+ p[1]
												+ "&gps_lng="
												+ p[0]
												+ "&radius="
												+ radius
												+ "&text="
												+ urlencode(address)
												+ "'>"
												+ places[i].address
												+ "</a>"
										" <input type='button' class='buttonfind' value='Choď' onclick='setPlaceMarker("
												+ i
												+ ")' name='goto"
												+ i
												+ "' />";
									}
								}
							} else {
								var reason = "Kód " + result.Status.code;
								if (reasons[result.Status.code]) {
									reason = reasons[result.Status.code]
								}
								alert('Nebolo možné nájsť "' + address + '" '
										+ reason);
							}
						});
	} else {
		alert('Musíte zadať adresu pre vyhľadávanie!')
	}
}

// Find an Address...
function findaddress_admin() {
	if (document.getElementById("addressfind").value) {
		var address = document.getElementById("addressfind").value;
		geo
				.getLocations(
						address,
						function(result) {
							if (result.Status.code == G_GEO_SUCCESS) {
								document.getElementById("geomessage").innerHTML = "Found "
										+ result.Placemark.length
										+ " result(s)";
								for ( var i = 0; i < result.Placemark.length; i++) {
									places[i] = result.Placemark[i];
									var p = places[i].Point.coordinates;
									document.getElementById("geomessage").innerHTML += "<br /> <input type='button' value='Go To' onclick='setPlaceMarker("
											+ i
											+ ")' name='goto"
											+ i
											+ "' /> "
											+ (i + 1)
											+ ": "
											+ places[i].address
											+ " : "
											+ p[1]
											+ " , "
											+ p[0]
											+ "<br /> Presnosť: "
											+ accuracy[places[i].AddressDetails.Accuracy]
											+ ", Kód: "
											+ reasons[result.Status.code];
								}
								setPlaceMarker(0);
							} else {
								var reason = "Code " + result.Status.code;
								if (reasons[result.Status.code]) {
									reason = reasons[result.Status.code]
								}
								alert('Could not find "' + address + '" '
										+ reason);
							}
						});
	} else {
		alert('Must have something in the address!')
	}
}

// resize map keeping same centre
function resizeAndCenterMap() {
	var mapcenter = map.getCenter();
	map.checkResize();
	map.setCenter(mapcenter);
}

// Set marker for placemark
function setPlaceMarker(n) {
	var p = places[n].Point.coordinates;
	map.setCenter(new GLatLng(p[1], p[0]),
			8 + places[n].AddressDetails.Accuracy);
	markerDraggable.setPoint(new GLatLng(p[1], p[0]));
	markerDraggable.redraw();
	GEvent.trigger(markerDraggable, 'click');
}


function submit_search_map_form(){
	var search_type = document.getElementById('map_search_type').value;
	if (search_type == 0){
		findaddress_normal();
		return false;
	} else {
		var text = document.getElementById('addressfind').value;
		document.location = 'search.map.php?text=' + encodeURIComponent(text.toString()) + '&resulttype=map&action=search';
		return false;
	}
}

function setCursor(el,st,end) {
	if(el.setSelectionRange) {
		el.focus();
		el.setSelectionRange(st,end);
	}
	else {
		if(el.createTextRange) {
			range=el.createTextRange();
			range.collapse(true);
			range.moveEnd('character',end);
			range.moveStart('character',st);
			range.select();
		}
	}
}
// ]]>
