var map;
var polyShape = Array();
var polygonMode;
var polygonDepth = "20";
var lengthOfPolyIndex = 0;
var activePolyIndex = 0;
var drawMode = "area";
var marker;
var fillColors = new Array();
fillColors[0] = "#00FF00"; // green fill
fillColors[1] = "#FFFF00"; // Yellow fill
fillColors[2] = "#FF9900"; // orange fill
fillColors[3] = "#FF0000"; // red fill
fillColors[4] = "#EE00EE"; // Only for countries
var lineColors = new Array();
lineColors[0] = "#000000"; // black line
lineColors[1] = "#000000";
lineColors[2] = "#000000";
lineColors[3] = "#000000";
lineColors[4] = "#000000";

var currentFillColor = fillColors[0];
var currentLineColor = lineColors[0];
var displayType = false;
var positionLatLng = '';
var opacity = ".100";
var lineWeight = 2;

var selectedMarker;

var mapObjs = new Array();

/**
* Load map with areas
*/
function loadMapWithAreas(usePoint){
	if (GBrowserIsCompatible()) {

		lengthOfPolyIndex = polyPoints.length;

		if (riskLevels.length > 0) {
			currentFillColor = fillColors[riskLevels[0]];
			currentLineColor = lineColors[riskLevels[0]];
		}
		else {
			currentFillColor = fillColors[0];
			currentLineColor = lineColors[0];
		}

		map = new GMap2(document.getElementById("map"));

		if (centerLatLng) {
			centerPos = centerLatLng.split(',');
			document.getElementById("GmapCenter").value = centerPos;
			document.getElementById("GmapZoomLevel").value = zoomLevel;
			map.setCenter(new GLatLng(parseFloat(centerPos[0]), parseFloat(centerPos[1])), parseInt(zoomLevel));
		}

		map.addControl(new GLargeMapControl());

		if (displayType) {
			map.addControl(new GMapTypeControl());
		}

		GEvent.addListener(map, "click", mapClick);

		// Get selected zoom level
		GEvent.addListener(map, "zoomend", function(){
			document.getElementById("GmapZoomLevel").value = map.getZoom();
		});

		// Get center long/lat
		GEvent.addListener(map, "moveend", function(){
			var center = map.getCenter();
			document.getElementById("GmapCenter").value = center.y + "," + center.x;
		});

		if (positionLatLng) {
			pointPos = positionLatLng.split(',');
			selectedMarker = new GMarker(new GLatLng(pointPos[0], pointPos[1]));
			document.getElementById("GmapPosition").value = pointPos[0] + "," + pointPos[1];
		}
		if (polyPoints.length > 0) {
			if (polyPoints[activePolyIndex].length > 0) {
				drawCoordinates();
			}
		}


	}
	else {
		alert('The map cannot be display because the browser is not compatible!');
	}
}

function loadSimpleMapWithArea(mapobject, params) {
	
	if (GBrowserIsCompatible()) {

		var centerLatLng = params['centerLatLng'];
		var riskLevels = params['riskLevels'];
		var polyPoints = params['polyPoints'];
		var zoomLevel = params['zoomLevel'];		

		if (centerLatLng) {
			centerPos = centerLatLng.split(',');
			mapobject.setCenter(new GLatLng(parseFloat(centerPos[0]), parseFloat(centerPos[1])), parseInt(zoomLevel));
		}

		mapobject.addControl(new GLargeMapControl());
	
		var lengthOfPolyIndex = polyPoints.length;

		currentFillColor = fillColors[0];
		currentLineColor = lineColors[0];
	
		polyShape = new Array();
		if (polyPoints[0] != null) {
			if (polyPoints[0].length > 0) {
				for (i = 0; i < lengthOfPolyIndex; i++) {
					if (polyPoints[i].length > 0) {
						opacity = .300;
						polyShape[i] = new GPolygon(polyPoints[i], fillColors[riskLevels[i]], lineWeight, opacity, fillColors[riskLevels[i]], opacity);
					}
				}

				for (i = 0; i < lengthOfPolyIndex; i++) {
					if (polyShape[i] != null) {
						mapobject.addOverlay(polyShape[i]);
					}
				}
			}
		}
	} else {
		alert('The map cannot be display because the browser is not compatible!');
	}
}

/**
* Loading the map with only one point
*/
function loadMapWithOnePoint(){

	if (GBrowserIsCompatible()) {

		map = new GMap2(document.getElementById("map"));

		if (centerLatLng) {
			centerPos = centerLatLng.split(',');
			document.getElementById("GmapCenter").value = centerPos;
			document.getElementById("GmapZoomLevel").value = zoomLevel;
			map.setCenter(new GLatLng(parseFloat(centerPos[0]), parseFloat(centerPos[1])), parseInt(zoomLevel));
		}


		map.addControl(new GLargeMapControl());
		if (displayType) {
			map.addControl(new GMapTypeControl());
		}

		if (point != '') {
			pointLatLng = point.split(',');
			selectedMarker = new GMarker(new GLatLng(pointLatLng[0], pointLatLng[1]));
			document.getElementById("GmapMarkers").value = point;
			map.addOverlay(selectedMarker);
		}
		GEvent.addListener(map, "click", mapPointClick);

		// Get selected zoom level
		GEvent.addListener(map, "zoomend", function(){
			document.getElementById("GmapZoomLevel").value = map.getZoom();
		});

		// Get center long/lat
		GEvent.addListener(map, "moveend", function(){
			var center = map.getCenter();
			document.getElementById("GmapCenter").value = center.y + "," + center.x;
		});
	}
	else {
		alert('The map cannot be display because the browser is not compatible!');
	}

}

/**
* Set draw mode (only for both area + point)
* @param {String} mode
*/
function setDrawMode(mode){

	if (mode == 'area') {
		drawMode = 'area';
		document.getElementById('btnDeleteArea').disabled = false;
		document.getElementById('btnNewArea').disabled = false;
		document.getElementById('btnDeletePoint').disabled = false;
		document.getElementById('area').disabled = false;
	}
	else {
		drawMode = 'point';
		document.getElementById('btnDeleteArea').disabled = true;
		document.getElementById('btnNewArea').disabled = true;
		document.getElementById('btnDeletePoint').disabled = true;
		document.getElementById('area').disabled = true;
	}
	drawCoordinates();
}

/**
* Clear marker
*/
function clearMarker(){
	map.removeOverlay(selectedMarker);
}

/**
* Map point clicked event
* @param {GMarker} marker
* @param {GPoint} clickedPoint
*/
function mapPointClick(marker, clickedPoint){

	if (point != null && marker == null) {
		if (selectedMarker != null) {
			map.removeOverlay(selectedMarker);
		}

		selectedMarker = new GMarker(clickedPoint);
		map.addOverlay(selectedMarker);
		document.getElementById("GmapMarkers").value = clickedPoint.y + "," + clickedPoint.x;
	}

	if (marker != null) {
		map.removeOverlay(selectedMarker);
		document.getElementById("GmapMarkers").value = "";
	}


}

/**
* Map area clicked event
* @param {GMarker} marker
* @param {GPoint} clickedPoint
*/
function mapClick(marker, clickedPoint){
	if (clickedPoint != null) {
		if (drawMode == 'area') {
			if (lengthOfPolyIndex > 0) {
				var mapNormalProj = G_NORMAL_MAP.getProjection();
				var mapZoom = map.getZoom();
				polygonMode = true;
				oldMarker = marker;
				var clickedPixel = mapNormalProj.fromLatLngToPixel(clickedPoint, mapZoom);
				var polyPixel = new GPoint(clickedPixel.x, clickedPixel.y);
				var polyPoint = mapNormalProj.fromPixelToLatLng(polyPixel, mapZoom);
				polyPoints[activePolyIndex].push(polyPoint);
				drawCoordinates();
			}
			else {
				alert('Please create area first');
			}
		}
		else {
			if (selectedMarker != null) {
				map.removeOverlay(selectedMarker);
			}
			selectedMarker = new GMarker(clickedPoint);
			map.addOverlay(selectedMarker);
			document.getElementById('GmapPosition').value = clickedPoint.y + ',' + clickedPoint.x;
			drawCoordinates();
		}
	}



}

/**
* Clear area by selected areaIndex
*/
function clearArea(){

	polyPoints[activePolyIndex] = Array();
	var tempPolyPoints = Array();
	var tempRiskLevels = Array();

	var counter = 0;
	for (i = 0; i < lengthOfPolyIndex; i++) {
		if (polyPoints[i] != null) {
			if (polyPoints[i].length > 0 && activePolyIndex != i) {
				tempPolyPoints[counter] = polyPoints[i];
				tempRiskLevels[counter] = riskLevels[i];
				counter++;
			}
		}
	}

	polyPoints = tempPolyPoints;
	riskLevels = tempRiskLevels;

	if (polyPoints.length == 0) {
		lengthOfPolyIndex = 0;
	}
	else {
		activePolyIndex = polyPoints.length - 1;
		lengthOfPolyIndex = polyPoints.length;
	}

	currentFillColor = fillColors[riskLevels[activePolyIndex]];
	currentLineColor = lineColors[riskLevels[activePolyIndex]];

	if (lengthOfPolyIndex == 0) {
		document.getElementById('area').options[0] = new Option('Please create area', 0);
		document.getElementById('btnDeleteArea').disabled = true;
		document.getElementById('btnDeletePoint').disabled = true;
		document.getElementById('area').disabled = true;
		document.getElementById('GmapAreas').value = '';
		map.clearOverlays();
		if (selectedMarker != null) {
			map.addOverlay(selectedMarker);
		}
	}
	else {
		drawCoordinates();
	}
}

/**
* Delete last point in area mode
*/
function deleteLastPoint(){
	map.removeOverlay(polyShape[activePolyIndex]);
	polyPoints[activePolyIndex].pop();
	drawCoordinates();
}

/**
* Create area in area mode
*/
function createArea(){
	if (document.getElementById('risk').selectedIndex != null) {
		selectedRiskLevel = document.getElementById('risk').options[document.getElementById('risk').selectedIndex].value;
	}
	else {
		selectedRiskLevel = document.getElementById('risk').value;
	}

	currentFillColor = fillColors[selectedRiskLevel];
	currentLineColor = lineColors[selectedRiskLevel];

	document.getElementById('GmapRiskLevel').value = selectedRiskLevel;
	document.getElementById('btnDeleteArea').disabled = false;
	document.getElementById('btnDeletePoint').disabled = false;

	if (lengthOfPolyIndex > 0) {
		document.getElementById('area').disabled = false;
		if (polyPoints[activePolyIndex].length >= 3) {
			polyPoints[polyPoints.length] = new Array();
			activePolyIndex = polyPoints.length - 1;
			riskLevels[activePolyIndex] = selectedRiskLevel;
			lengthOfPolyIndex = polyPoints.length;
			drawCoordinates();
		}
		else {
			alert('The current area must have least 3 points');
		}
	}
	else {
		activePolyIndex = 0;
		lengthOfPolyIndex = 1;
		riskLevels[activePolyIndex] = selectedRiskLevel;
		polyPoints[0] = new Array();
		drawCoordinates();
	}
}

/**
* Select area in area mode
*/
function selectArea(){

	selectedAreaIndex = document.getElementById('area').options[document.getElementById('area').selectedIndex].value;
	currentFillColor = fillColors[riskLevels[selectedAreaIndex]];
	currentLineColor = lineColors[riskLevels[selectedAreaIndex]];
	activePolyIndex = selectedAreaIndex;
	drawCoordinates();

}

/**
* Draw coordinates (area + point)
*/
function drawCoordinates(){
	map.clearOverlays();
	polyShape = new Array();
	if (polyPoints[0] != null) {
		if (polyPoints[0].length > 0) {
			for (i = 0; i < lengthOfPolyIndex; i++) {
				if (polyPoints[i].length > 0) {
					if (activePolyIndex == i && drawMode == 'area') {
						opacity = .300;
					}
					else {
						opacity = .100;
					}
					polyShape[i] = new GPolygon(polyPoints[i], lineColors[riskLevels[i]], lineWeight, opacity, fillColors[riskLevels[i]], opacity);
					if (activePolyIndex == i) {
						if (drawMode == 'area') {
							marker = new GMarker(polyPoints[i][polyPoints[i].length - 1]);
							map.addOverlay(marker);
						}
					}
				}
			}

			for (i = 0; i < lengthOfPolyIndex; i++) {
				if (polyShape[i] != null) {
					map.addOverlay(polyShape[i]);
				}
			}
		}
	}

	if (selectedMarker != null) {
		map.addOverlay(selectedMarker);
	}

	document.getElementById('area').options.length = 0;
	if (lengthOfPolyIndex > 0) {
		if (drawMode == 'area') {
			document.getElementById('area').disabled = false;
		}
		for (i = 0; i < lengthOfPolyIndex; i++) {
			document.getElementById('area').options[i] = new Option('Area ' + i, i);
			if (i == activePolyIndex) {
				document.getElementById('area').options[i].selected = true;
			}
		}
	}

	var pos = document.getElementById("GmapAreas");
	pos.value = "";

	for (j = 0; j < lengthOfPolyIndex; j++) {
		pos.value += '[AREA]\n';
		pos.value += 'RISKLEVEL:' + riskLevels[j] + '\n';
		for (i = 0; i < polyPoints[j].length; i++) {
			pos.value += polyPoints[j][i].y + "," + polyPoints[j][i].x + "\n";
		}
	}

}

