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

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"));
		geocoder = new GClientGeocoder();
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(37.4419, -122.1419), 13);

		// center on nyc
		geocoder.getLatLng('nyc', function(point) { if (point) { map.setCenter(point, 12); } });

		initBalloonForm();

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

		window.onresize = handleResize;
	    }
}

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();
}

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 mapClick(overlay, point)
{
	alert('map clicked: overlay=' + overlay + ' point=' + point);
	if (overlay)
	    {
		if (overlay == openMarker && !map.getInfoWindow().isHidden())
			map.getInfoWindow().hide();
		else if (overlay.draggingEnabled)  // make sure its a GMarker
			showBalloon(overlay);
	    }
	else
	    {
		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);
			map.removeOverlay(polyline);
			polyline = new GPolyline(points);
			map.addOverlay(polyline);
		    }
	    }
}

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);
	    }
}

