var map;
var firstPointSet = false;
var firstPoint;
var firstMarker;
var area;
var drawEventHandler;
var lats = Array();
var lngs = Array();

function setupGoogleMap() {
	if (map) {
		return true;
	}

	map = new GMap2(document.getElementById("map"));
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());

	// Add SubmitExtent control
	map.addControl(new SubmitExtentControl());

	map.setCenter(new GLatLng(36.0045, -78.942), 4, G_SATELLITE_MAP);


	GEvent.addListener(map, "click", initializeAreaDrawing);
	GEvent.addListener(map, "mousemove", displayCoordinates);
}

function initializeAreaDrawing(marker, point) {
	// Ignore event issued by polyline click
	if (marker && (typeof(point) == 'undefined')) {
		return false;
	}
	if (marker && point == null) {		// Cancel/clear the drawing when the existing marker is clicked
		if (area) {
			map.removeOverlay(area);
		}
		if (firstMarker) {
			GEvent.removeListener(drawEventHandler);
			map.removeOverlay(firstMarker);
			firstPointSet = false;
		}
		return true;
	}

	if (firstPointSet == false) {		// Initialize
		if (firstMarker) {
			map.removeOverlay(firstMarker);
		}
		var icon = point_icon();
		firstPoint = point;
		lats[0] = firstPoint.lat();
		lngs[0] = firstPoint.lng();

		firstMarker = new GMarker(point, icon)
		map.addOverlay(firstMarker);
		drawEventHandler = GEvent.addListener(map, "mousemove", drawArea);
		firstPointSet = true;
	} else {
		GEvent.removeListener(drawEventHandler);
		firstPointSet = false;
	}
	return true;
}

var step = 1;
function drawArea (latlong) {
	var secondPoint = latlong;

	if (step % 3 != 0) {
		step++;
		if (step > 3) {
			step = 1;
		}
		return false;
	}

	lats[1] = secondPoint.lat();
	lngs[1] = secondPoint.lng();
	var thirdPoint = new GLatLng(lats[1], lngs[0]);
	var fourthPoint = new GLatLng(lats[0], lngs[1]);

	var linePoints = Array();
	linePoints[0] = firstPoint;
	linePoints[1] = thirdPoint;
	linePoints[2] = secondPoint;
	linePoints[3] = fourthPoint;
	linePoints[4] = firstPoint;

	if (area) {
		map.removeOverlay(area);
	}

	area = new GPolyline(linePoints, "#ff0000", 3, 0.5);
	GEvent.addListener(area,"click",function(point){
        initializeAreaDrawing(area, point);
      });
	map.addOverlay(area);
	var objName = "gm_status";
	var status = getObject(objName);
	status.innerHTML = sprintf("(%3.3f, %3.3f) : (%3.3f, %3.3f)", lats[0], lngs[0], lats[1], lngs[1]) ;

}

function displayCoordinates(latlong) {
	var objName = "gm_current";
	var status = getObject(objName);
	status.innerHTML = sprintf("(%3.3f, %3.3f)", latlong.lat(), latlong.lng()) ;
}

function point_icon () {
	var icon = new GIcon();
	icon.image = g_ROOT_URL + BASE_URL + "images/icons/ball_red.png";
	icon.iconSize = new GSize(10, 10);
	icon.iconAnchor = new GPoint(5, 5);
	return icon;
}

function SubmitExtentControl () {
}

SubmitExtentControl.prototype = new GControl();

SubmitExtentControl.prototype.initialize = function(map) {
	var SubmitExtentDiv = document.createElement("div");
	this.setButtonStyle_(SubmitExtentDiv);
	SubmitExtentDiv.appendChild(document.createTextNode("Submit Extent"));
	GEvent.addDomListener(SubmitExtentDiv, "click", function() {
		gm_set_extent();
	});

	map.getContainer().appendChild(SubmitExtentDiv);
	return SubmitExtentDiv;
}

SubmitExtentControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 30));
}

SubmitExtentControl.prototype.setButtonStyle_ = function(button) {
  button.style.textDecoration = "none";
  //button.style.color = "#0000cc";
  button.style.backgroundColor = "white";
  //button.style.font = "small Arial";
  //button.style.font = "small Arial";
  button.style.border = "1px solid black";
  button.style.padding = "2px";
  button.style.marginBottom = "3px";
  button.style.textAlign = "center";
  button.style.width = "8em";
  button.style.cursor = "pointer";
}

var google_map_window = "map_window";
var google_map_form = "FilterForm";

function showMapWindow() {
	var gm_window = getObject(google_map_window);
    gm_window.style.display = "block";

	setupGoogleMap();

	var filterForm = document.forms[google_map_form];
	if (filterForm.minlat.value != "" &&
        filterForm.maxlat.value != "" &&
        filterForm.minlon.value != "" &&
        filterForm.maxlon.value != "") {
	    firstPoint = new GLatLng(filterForm['maxlat'].value, filterForm['maxlon'].value);	// Global variable
		lats[0] = firstPoint.lat();
		lngs[0] = firstPoint.lng();
	    var secondPoint = new GLatLng(filterForm['minlat'].value, filterForm['minlon'].value);
	    step = 3;
		set_center(parseFloat(filterForm.minlon.value), parseFloat(filterForm.maxlon.value), parseFloat(filterForm.minlat.value), parseFloat(filterForm.maxlat.value));
		drawArea(secondPoint);
    } else {		// Clear the drawing
		if (area) {
			map.removeOverlay(area);
		}
		if (firstMarker) {
			GEvent.removeListener(drawEventHandler);
			map.removeOverlay(firstMarker);
			firstPointSet = false;
		}
		lats = new Array();
		lngs = new Array();

	}

    return true;
}


function set_center(minlon, maxlon, minlat, maxlat) {
	var scale = 4;		// default scale
	var centerlon = (minlon + maxlon) / 2;
	var centerlat = (minlat + maxlat) / 2;


	if (Math.abs(maxlon - minlon) < 10 || Math.abs(maxlat - minlat) < 10) {
		scale = 5;
	}

	if (Math.abs(maxlon - minlon) < 1 || Math.abs(maxlat - minlat) < 1) {
		scale = 6;
	}

	if (Math.abs(maxlon - minlon) > 60 || Math.abs(maxlat - minlat) > 20) {
		scale = 3;
	}

	if (Math.abs(maxlon - minlon) > 75 || Math.abs(maxlat - minlat) > 40) {
		scale = 2;
	}

	if (Math.abs(maxlon - minlon) > 90 || Math.abs(maxlat - minlat) > 50) {
		scale = 1;
	}

	if (Math.abs(maxlon - minlon) > 120 || Math.abs(maxlat - minlat) > 70) {
		scale = 0;
	}

	//alert(centerlon + ":" + centerlat + "\n" + (maxlon - minlon) + ":" + (maxlat - minlat) + "\n" + "scale: " + scale);
	map.setCenter(new GLatLng(centerlat, centerlon), scale, G_SATELLITE_MAP);

}


function gm_set_extent() {
	var filterForm = document.forms[google_map_form];

	if (!lats[0] || !lngs[0]) {
		closeDiv('map_window');
		return false;
	}

	if (lats[0] > lats[1]) {
		filterForm['minlat'].value = sprintf("%3.6f", lats[1]);
		filterForm['maxlat'].value = sprintf("%3.6f", lats[0]);
	} else {
		filterForm['minlat'].value = sprintf("%3.6f", lats[0]);
		filterForm['maxlat'].value = sprintf("%3.6f", lats[1]);
	}

	if (parseFloat(lngs[0]) > parseFloat(lngs[1])) {
		filterForm['minlon'].value = sprintf("%3.6f", lngs[1]);
		filterForm['maxlon'].value = sprintf("%3.6f", lngs[0]);
	} else {
		filterForm['minlon'].value = sprintf("%3.6f", lngs[0]);
		filterForm['maxlon'].value = sprintf("%3.6f", lngs[1]);
	}

	closeDiv(google_map_window);
    return true;
}

function clearExtent() {
    var theForm = document.forms[google_map_form];
    theForm.maxlat.value = "";
    theForm.minlon.value = "";
    theForm.maxlon.value = "";
    theForm.minlat.value = "";
    return true;
}