
var map = false;
var polyline = false;
var polylines = [];
var points = [];
var geocoder = false;
var balloonForm = false;
var openMarker = false;
var mapMode = 'normal';
var tempLine = false;
var mouseMoveListener = false;

function saveNote()
{
	if (openMarker)
		openMarker.note = balloonForm.textarea.value;
}

function setAttribute(element, name, value)
{
	if (element.setAttribute)
		element.setAttribute(name, value);
	else if (element.setAttributeNode)
	    {
		var attr = document.createAttribute(name);
		attr.value = value;
		attr.nodeValue = value;
		element.setAttributeNode(attr);
	    }
}

function initBalloonForm()
{
	balloonForm = document.createElement('form');
	balloonForm.id = 'balloon-form';
	balloonForm.action = '#';
	balloonForm.onsubmit = function() { return false; };

	balloonForm.textarea = document.createElement('textarea');
	balloonForm.textarea.name = 'note';
	setAttribute(balloonForm.textarea, 'rows', '4');
	setAttribute(balloonForm.textarea, 'cols', '30');
	balloonForm.appendChild(balloonForm.textarea);
	balloonForm.textarea.onchange = saveNote;
	balloonForm.textarea.onkeypress = saveNote;

	var div = document.createElement('div');
	div.innerHTML = "<input type='submit' value='delete' onclick='removeOpenMarker();' />";
	balloonForm.appendChild(div);
}

function handleResize()
{
	var map = document.getElementById('map');
	// 1 pixel borders on each side
	var newHeight = document.documentElement.clientHeight - map.offsetTop - 6 - 2;
	var newWidth = document.documentElement.clientWidth - map.offsetLeft - 6 - 2;
	if (map.style.height != newHeight + 'px')
		map.style.height = newHeight + 'px';
	if (map.style.width != newWidth + 'px')
		map.style.width = newWidth + 'px';
}

function load() 
{
	if (GBrowserIsCompatible()) 
	    {
		handleResize();

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

		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(40.714, -74.006), 12);

		GEvent.addListener(map, 'click', mapClick);
		window.onresize = handleResize;

		geocoder = new GClientGeocoder();
		initBalloonForm();
	    }
}

function setMode()
{
	var form = document.getElementById('mode');
	for (var i = 0; i < form.mode.length; i++) 
		if (form.mode[i].checked)
			if (mapMode != form.mode[i].value)
				mapMode = form.mode[i].value;
			else
				return; // not changed, do nothing

	if (mapMode == 'normal')
		setNormalMode();
	else if (mapMode == 'draw')
		setDrawMode();
}

function setNormalMode()
{
	map.enableDragging();
	if (polyline)
	    {
		polylines.push(polyline);
		polyline = false;
		points = [];
	    }

	if (mouseMoveListener)
	    {
		GEvent.removeListener(mouseMoveListener);
		mouseMoveListener = false;
	    }
	if (tempLine)
		map.removeOverlay(tempLine);
}

function setDrawMode()
{
	// map.disableDragging();
}

function showBalloon(marker)
{ 
	map.getInfoWindow().hide();

	if (marker.note)
		balloonForm.textarea.value = marker.note;
	else
		balloonForm.textarea.value = '';

	marker.openInfoWindow(balloonForm);

	openMarker = marker;
}

function markerDrag()
{
	if (this == openMarker)
		showBalloon(openMarker);
}

function removeOpenMarker()
{
	if (openMarker)
	    {
		map.getInfoWindow().hide();
		map.removeOverlay(openMarker);
		openMarker = null;
	    }
}

function showLine(point)
{
	var pts = [];
	pts.push(points[points.length-1]);
	pts.push(point);
	if (tempLine)
		map.removeOverlay(tempLine);
	tempLine = new GPolyline(pts);
	map.addOverlay(tempLine);
}

function mapClick(overlay, point)
{
	if (overlay && !point)
	    {
		if (overlay == openMarker && !map.getInfoWindow().isHidden())
			map.getInfoWindow().hide();
		else if (overlay.draggingEnabled)  // make sure its a GMarker
			showBalloon(overlay);
	    }
	else if (point && !overlay)
	    {
		if (mapMode == 'normal')
		    {
			marker = new GMarker(point, { draggable: true });
			map.addOverlay(marker);
			GEvent.addListener(marker, 'dragend', markerDrag);
			showBalloon(marker);
		    }
		else if (mapMode == 'draw')
		    {
			points.push(point);
			if (polyline)
				map.removeOverlay(polyline);
			polyline = new GPolyline(points);
			map.addOverlay(polyline);

			if (!mouseMoveListener)
				mouseMoveListener = GEvent.addListener(map, 'mousemove', showLine);
		    }
	    }
}

function showAddress(address)
{
	if (geocoder)
	    {
		var handler = function(point)
		    {
			if (point)
			    {
				map.setCenter(point, 13);
				document.getElementById('bad-address').style.display = 'none';
				map.openInfoWindowHtml(point, 'right here biatch');
			    }
			else
				document.getElementById('bad-address').style.display = 'block';
		    };

		geocoder.getLatLng(address, handler);
	    }
}

