/*
 * Coordinate Functions
 */
function convertCoordinate(value,type,parse) {
	value = parse ? parseCoordinate(value) : parseFloat(value);
	if (!type) type = getValue("coordinate_format");
	switch (type) {
		case "DMS":
			var deg = Math.floor(value);
			var min = Math.floor((value-deg)*60);
			var sec = sprintf("%04.1f",((value-deg)*60-min)*60);
			if (sec == "60.0") {
				sec = "00.0";
				min = min+1;
			}
			value = sprintf("%d° %02d' %s\"",deg,min,sec);
			break;
		case "DM":
			var deg = Math.floor(value);
			var min = (value-deg)*60;
			value = sprintf("%d° %06.3f",deg,min);
			break;
		default:
			value = sprintf("%.6f",value);
			break;
	}
	return value;
}

function parseCoordinate(value) {
	/* Strip whitespace */
	var str = trim(value);
	var pattern = [/\s\s+/g,/(\D)\s/g,"''",'°'];
	var replace = [' ','$1','"','o'];
	for (var i = 0; i < pattern.length; i++) str = str.replace(pattern[i],replace[i]);
	var sign = false;
	/* Check sign */
	if (str.match(/^[+-]/)) {
		sign = str.substr(0,1);
		str = trim(str.substr(1));
	}
	/* Check direction */
	if (str.match(/[NSEW]$/)) {
		if (sign) return false;
		var list = {'N':'+','S':'-','W':'-','E':'+'};
		sign = list[str.substr(-1,1)];
		str = trim(str.substr(0,str.length-1));
	}
	if (sign == '+') sign = '';
	/* Check if format is dd.ddddd */
	if (str.match(/^\d+(\.\d+)?$/)) {
		value = parseFloat(str);
	} else if (str.match(/^\d+[\s\.o]\d+(\.\d+)?$/)) {
		/* Check if format is ddd° mm.mmm */
		var list = str.split(/[\s\.o]/);
		for (var i = 0; i < 3; i++) if (list[i] == undefined) list[i] = 0;
		for (var i = 0; i < 3; i++) list[i] = parseFloat(list[i]);
		if (list[1] > 59) return false;
		if (list[2] > 999) return false;
		value = list[0]+(list[1]+list[2]/1000)/60;
	} else if (str.match(/^\d+[\s\.o]\d+[\s\']?(|(\d+|\d+\.\d)\"?)$/)) {
		/* Check is format is ddd° mm' ss.s" */
		var list = str.split(/[\s\.o\'\"]/);
		for (var i = 0; i < 4; i++) if (list[i] == undefined || list[i] == "") list[i] = 0;
		for (var i = 0; i < list.length; i++) list[i] = parseFloat(list[i]);
		if (list[1] > 59) return false;
		if (list[2] > 59) return false;
		value = list[0]+(((list[3]/10+list[2])/60)+list[1])/60;
	} else return false;
	/* Check value */
	if (value > 180) return false;
	/* Return result in dd.ddddd */
	return (sign ? -1 : 1)*value;
}

function validateLatLon() {
	var list = [];
	var lat = getValue("latitude");
	var lon = getValue("longitude");
	var emptyLat = isEmpty(lat);
	var emptyLon = isEmpty(lon);
	lat = parseCoordinate(lat);
	lon = parseCoordinate(lon);
	var valid = (emptyLat && emptyLon) || (!emptyLat && lat > 35.8 && lat < 42.2);
	validateSetIcon("latitude",valid);
	if (!valid) list.push(getConstant("_ERR_INVALID_LATITUDE"));
	valid = (emptyLat && emptyLon) || (!emptyLon && lon > 25.8 && lon < 45.2);
	validateSetIcon("longitude",valid);
	if (!valid) list.push(getConstant("_ERR_INVALID_LONGITUDE"));
	return list;
}

function setLatLon(lat,lon) {
	/* Note: lat and lon should be in decimal degrees */
	var type = getValue("coordinate_format");
	setValue("latitude",lat ? convertCoordinate(lat,type) : "");
	setValue("longitude",lon ? convertCoordinate(lon,type) : "");
}

/*
 * Map Functions
 */
function createMarker(d) {
	var marker;
	if (d.active) {
		marker = new GMarker(new GLatLng(d.lat,d.lon));
	} else {
		marker = new GMarker(new GLatLng(d.lat,d.lon),map[d.icon]);
		if (d.title) GEvent.addListener(marker,"click",function() {
			marker.openInfoWindowHtml("<p>"+d.title+"</p>"+(d.info ? d.info : ""));
		});
	}
	return marker;
}

function initMap() {
	/* Check availability of Google Maps */
	if (!GMapAvailable()) {
		setVisible('map',false);
		setVisible('map_resize',false);
		return false;
	}
	map = new GMap2(getElement('map'));
	map.addControl(new GLargeMapControl());
	map.addControl(new GScaleControl());
	map.addControl(new GOverviewMapControl());
	map.addControl(new GMapTypeControl());
	map.enableContinuousZoom();
	map.enableScrollWheelZoom();
	var map_zoom = false;
	if (!map_reset) {
		map_center[0] = parseFloat(readCookie("XSMapLat"));
		map_center[1] = parseFloat(readCookie("XSMapLon"));
		map_zoom = parseInt(readCookie("XSMapZoom"));
	}
	if (!map_zoom) map_zoom = 5;
	map.setCenter(new GLatLng(map_center[0],map_center[1]),map_zoom,G_HYBRID_MAP);
	/* Create default marker */
	map.mm_blue = new GIcon();
	map.mm_blue.image = getPath('images/mm_small_blue.png');
	map.mm_blue.shadow = getPath('images/mm_small_shadow.png');
	map.mm_blue.iconSize = new GSize(12,20);
	map.mm_blue.shadowSize = new GSize(22,20);
	map.mm_blue.iconAnchor = new GPoint(6,20);
	map.mm_blue.infoWindowAnchor = new GPoint(5,1);
	/* Create colored markers */
	var icons = ["gray","green","purple","red","white","yellow"];
	for (var i in icons) map["mm_"+icons[i]] = new GIcon(map.mm_blue,getPath('images/mm_small_'+icons[i]+'.png'));
	/* Create map marker cluster manager */
	if (typeof(Clusterer) != "undefined") {
		map.marker_mgr = new Clusterer(map);
		/* Create cluster icon */
		map.mm_cluster = new GIcon();
		map.mm_cluster.image = getPath('images/mm_cluster.png');
		map.mm_cluster.shadow = getPath('images/mm_cluster_shadow.png');
		map.mm_cluster.iconSize = new GSize(20,34);
		map.mm_cluster.shadowSize = new GSize(37,34);
		map.mm_cluster.iconAnchor = new GPoint(9,34);
		map.mm_cluster.infoWindowAnchor = new GPoint(9,2);
		map.mm_cluster.infoShadowAnchor = new GPoint(18,25);
		map.marker_mgr.SetIcon(map.mm_cluster);
	}
	/* Add markers */
	var bounds = new GLatLngBounds();
	for (var i = 0; i < map_marker.length; i++) {
		var d = map_marker[i];
		if (typeof(Clusterer) != "undefined") {
			map.marker_mgr.AddMarker(createMarker(d),d.title);
		} else {
			map.addOverlay(createMarker(d));
		}
		if (d.active || (!d.skip && map_zoom_markers)) bounds.extend(new GLatLng(d.lat,d.lon));
		if (d.coordinates) {
			/* Add polygon */
			var list = d.coordinates.split(',');
			var polygon = [];
			for (var j = 0, n = list.length; j < n; j += 2) {
				polygon.push(new GLatLng(parseFloat(list[j]),parseFloat(list[j+1])));
			}
			var color = d.active ? "#00FF00" : "#FF0000";
			polygon = new GPolygon(polygon,color,2,1,color,0.1);
			map.addOverlay(polygon);
			if (d.active || (!d.skip && map_zoom_markers)) {
				bounds.extend(polygon.getBounds().getSouthWest());
				bounds.extend(polygon.getBounds().getNorthEast());
			}
		}
	}
	if (!bounds.isEmpty()) {
		var zoom = map.getBoundsZoomLevel(bounds);
		map.setCenter(bounds.getCenter(),zoom > 16 ? 16 : zoom);
	}
	/* Create unload event handler */
	addEvent(window,"unload",function() {
		var center = map.getCenter();
		createCookie("XSMapLat",center.lat());
		createCookie("XSMapLon",center.lng());
		createCookie("XSMapZoom",map.getZoom());
		GUnload();
	});
}

/* Initialize variables */
var map = null;
var map_marker = [];
var map_center = [39.0,35.5];
var map_zoom_markers = false;
var map_reset = false;

/* Initialize map */
addEvent(window,"load",initMap);

