var map;
var impath='/';
var postmarkers=new Array;

function setupUserMap() {
	if (GBrowserIsCompatible()) {
		var mdiv=createMapDiv();
/*		var content = document.getElementById('content');
		if (!content)
			return;
		content.parentNode.insertBefore(mdiv, content);*/
		var divs=document.getElementsByTagName('div');
		var secondary=null;
		for (var i=0; i < divs.length; i++)
		{
			if (inClass(divs[i], 'secondary'))
			{
				secondary=divs[i];
				break;
			}
		}
		if (!secondary)
			return;
		
		var wrapperdiv=document.createElement('div');
		wrapperdiv.id="mapwrap";
		wrapperdiv.appendChild(mdiv);
		secondary.insertBefore(wrapperdiv, secondary.firstChild);
		setupMap();
	}
}

function createMapDiv()
{
	var mdiv=document.createElement('div');
	mdiv.setAttribute('id', 'map');
	mdiv.style.height='150px';
	mdiv.style.border='solid silver 1px';
	return mdiv;
}

function setupMap(center, zoom)
{
	if (!GBrowserIsCompatible())
		return;

	var mdiv=document.getElementById('map');
	map = new GMap2(mdiv);
	addEvent(window, 'unload', GUnload, false);
	//map.addControl(new GSmallMapControl());
	//map.addControl(new GMapTypeControl());

	map.markers=new Array;			//add a field to store markers we've added
	map.addMarker=addMarker;	//add a member function to add markers to the field

	map.geocoder=new GClientGeocoder;
	
	if (postmarkers.length == 1)
	{
		center=new GLatLng(postmarkers[0].lat, postmarkers[0].lng);
		zoom=postmarkers[0].zoom-2;
	}
	else if (postmarkers.length > 1)
	{
		var bounds=new GLatLngBounds;
		for (var i=0; i < postmarkers.length; i++)
		{
			bounds.extend(new GLatLng(postmarkers[i].lat, postmarkers[i].lng));	
		}

		center=bounds.getCenter();
		zoom=map.getBoundsZoomLevel(bounds);
	}
	
	if (center && zoom)
	{
		map.setCenter(center, zoom);
	}
	else
	{
		//var center=new GLatLng(50.7900416666, -0.850052777); //Chi?
		//var center=new GLatLng(-8.651626379005748, 115.191650390625); //Bali?
		//var center=new GLatLng(-18.034892, 178.572378); //Fiji
		var center = new GLatLng(-31.910733, 115.778325); //Drabble Rd
		map.setCenter(center, 9);
	}
	map.setMapType(G_HYBRID_MAP);
	
	mdiv.parentNode.insertBefore(createMapUtils(), mdiv.nextSibling);

	var baseIcon = new GIcon();
	baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
	baseIcon.iconSize = new GSize(20, 34);
	baseIcon.shadowSize = new GSize(37, 34);
	baseIcon.iconAnchor = new GPoint(9, 34);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	baseIcon.infoShadowAnchor = new GPoint(18, 25);
	
	for (var i=0; i < postmarkers.length; i++)
	{
		var icon=new GIcon(baseIcon);
		icon.image=impath+'images/mapicons/iconb'+(i+1)+'.png';
		icon.hovimage=impath+'images/mapicons/icong'+(i+1)+'.png';
		var mark=new GMarker(new GLatLng(postmarkers[i].lat, postmarkers[i].lng), {icon: icon});
		map.addMarker(mark);
		var post=document.getElementById('post-'+postmarkers[i].id);
		var im=document.createElement('img');
		im.setAttribute('src', icon.image);
		im.className='postmarker';
		post.insertBefore(im, post.firstChild);
		setupMarkHover(mark, im, icon);
	}

	minifyMap();
}

function createMapUtils()
{
	var iconsbar = document.createElement('div');
	iconsbar.setAttribute('id', 'iconsbar');
	
	var search=document.createElement('img');
	search.setAttribute('id', 'searchbutton');
	search.setAttribute('src', impath+'images/viewmag.png');
	search.setAttribute('alt', 'Search for location');
	search.setAttribute('title', 'Search for location');

	iconsbar.appendChild(search);
	addEvent(search, 'click', searchLocation, false);
	
	var zoom=document.createElement('img');
	zoom.setAttribute('id', 'zoombutton');
	zoom.setAttribute('src', impath+'images/window_fullscreen.png');
	zoom.setAttribute('alt', 'Enlarge Map');
	zoom.setAttribute('title', 'Enlarge Map');

	iconsbar.appendChild(zoom);

	addEvent(zoom, 'click', toggleMapSize, false);

	return iconsbar;
}

function minifyMap()
{
	var mdiv=map.getContainer();
	
	if (mdiv.origHeight)
		mdiv.style.height=mdiv.origHeight+'px';
	if (mdiv.origWidth)
		mdiv.style.width=mdiv.origWidth+'px';
	if (mdiv.origHeight || mdiv.origWidth)
	{
		var zoom=document.getElementById('zoombutton');
		zoom.setAttribute('src', impath+'images/window_fullscreen.png');
		zoom.setAttribute('alt', 'Enlarge Map');
		zoom.setAttribute('title', 'Enlarge Map');
		map.checkResize();
	}

	if (mapcnt_largemap)
	{
		map.removeControl(mapcnt_largemap);
		mapcnt_largemap=null;
	}
	if (mapcnt_maptype)
	{
		map.removeControl(mapcnt_maptype);
		mapcnt_maptype=null;
	}

	mdiv.childNodes[1].style.fontSize="6px";
	mdiv.lastChild.style.width="30px";
	mdiv.lastChild.style.height="auto";
}

var mapcnt_largemap;
var mapcnt_maptype;

function magnifyMap()
{
	var mdiv=map.getContainer();

	if (!mdiv.origHeight)
		mdiv.origHeight=mdiv.offsetHeight-2;
	if (!mdiv.origWidth)
		mdiv.origWidth=mdiv.offsetWidth-2;
	mdiv.style.height="500px";
	mdiv.style.width="700px";

	var zoom=document.getElementById('zoombutton');
	zoom.setAttribute('src', impath+'images/window_nofullscreen.png');
	zoom.setAttribute('alt', 'Shrink Map');
	zoom.setAttribute('title', 'Shrink Map');
	map.checkResize();

	mdiv.childNodes[1].style.fontSize="11px";
	mdiv.lastChild.style.width="auto";
	mdiv.lastChild.style.height="auto";
	
	mapcnt_largemap=new GLargeMapControl();
	map.addControl(mapcnt_largemap);
	mapcnt_maptype=new GMapTypeControl();
	map.addControl(mapcnt_maptype);
}

function setupMarkHover(mark, im, icon)
{
	var hov=function() {
		var ims=map.getContainer().getElementsByTagName('img');
		for (var i=0; i < ims.length; i++)
		{
			if (ims[i].src.indexOf(icon.image) == (ims[i].src.length-icon.image.length))
			{
				ims[i].src=icon.hovimage;
				im.src=icon.hovimage;
				return;
			}
		}
	}
	var unhov=function() {
		var ims=map.getContainer().getElementsByTagName('img');
		for (var i=0; i < ims.length; i++)
		{
			if (ims[i].src.indexOf(icon.hovimage) == (ims[i].src.length-icon.hovimage.length))
			{
				ims[i].src=icon.image;
				im.src=icon.image;
				return;
			}
		}
	}
	GEvent.addListener(mark, 'mouseover', hov);
	GEvent.addListener(mark, 'mouseout', unhov);
	addEvent(im, 'mouseover', hov, false);
	addEvent(im, 'mouseout', unhov, false);
}

function addMarker(marker)
{
	this.addOverlay(marker);
	this.markers[this.markers.length]=marker;

	if (this.markers.length == 1)
	{
		var iconsbar=document.getElementById('iconsbar');
		
		var findmarkers=document.createElement('img');
		findmarkers.setAttribute('id', 'findmarkersbutton');
		findmarkers.setAttribute('src', impath+'images/findmarker.png');
		findmarkers.setAttribute('alt', 'Center marker(s)');
		findmarkers.setAttribute('title', 'Center marker(s)');

		addEvent(findmarkers, 'click', findMarkers, false);

		iconsbar.insertBefore(findmarkers, iconsbar.firstChild);
	}
}

function findMarkers()
{
	if (map.markers.length == 1)
	{
		map.panTo(map.markers[0].getPoint());
		return;
	}
	
	var bounds=new GLatLngBounds;
	for (var i=0; i < map.markers.length; i++)
	{
		bounds.extend(map.markers[i].getPoint());	
	}

	var newzoom=map.getBoundsZoomLevel(bounds);

	if (newzoom == map.getZoom())
	{
		map.panTo(bounds.getCenter());
	}
	else
	{
		map.setCenter(bounds.getCenter(), newzoom);
	}
	
}

var locsearch='';

function searchLocation()
{
	locsearch=prompt("Search for location:", locsearch);

	map.geocoder.getLocations(locsearch, searchFound);
}

function searchFound(result)
{
	var reasons=[];
	reasons[G_GEO_SUCCESS]            = "Success";
	reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
	reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
	reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
	reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
	reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
	reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";

	if (result.Status.code != G_GEO_SUCCESS)
	{
		alert(reasons[result.Status.code]);
		return;
	}
	
	var coords_arr=result.Placemark[0].Point.coordinates;
	var coord=new GLatLng(coords_arr[1], coords_arr[0]);

	if (map.searchmarker)
	{
		map.removeOverlay(map.searchmarker);
	}
	
	map.searchmarker=new GMarker(coord);
	map.addOverlay(map.searchmarker);
	map.searchmarker.setPoint(coord);
	map.panTo(coord);
	
}

function toggleMapSize()
{
	var mdiv=map.getContainer();
	var center=map.getCenter();
	var zoom=map.getZoom();
	if (mdiv.offsetHeight > 225)
	{
		minifyMap();
		map.setCenter(center, zoom-2);
	}
	else
	{
		magnifyMap();
		map.setCenter(center, zoom+2);
	}
	
//	map.panTo(center);
}

function setupMapAdmin()
{
	impath='../';
	
	var postgeo=document.getElementById('postgeo');
	var postgeodiv=postgeo.getElementsByTagName('div')[0];
	var els=postgeodiv.childNodes;
	for (var i=0; i < els.length; i++)
	{
		if (els[i].nodeType == 1)
		{
			//els[i].style.display='none';
//			els[i].getElementsByTagName('input')[0].readOnly='true';
		}
	}


	postgeodiv.appendChild(createMapUtils());
	postgeodiv.appendChild(createMapDiv());
	
	var geo_lat=document.getElementById('geo_lat');
	var geo_lon=document.getElementById('geo_lon');
	var geo_zoom=document.getElementById('geo_zoom');

	var center;
	if (geo_lon.value && geo_lat.value)
	{
		center=new GLatLng(parseFloat(geo_lat.value), parseFloat(geo_lon.value));
		if (!geo_zoom.value)
			geo_zoom.value='3';
		setupMap(center,parseInt(geo_zoom.value));
	}
	else
	{
		setupMap();
		center=map.getCenter();
		//geo_lat.value=center.lat();
		//geo_lon.value=center.lng();
		//geo_zoom.value=map.getZoom();
	}

	var marker=new GMarker(center, {draggable: true});
	map.addMarker(marker);

	var updateFields=function() {
		var p=marker.getPoint();
		geo_lat.value=p.lat();
		geo_lon.value=p.lng();

		if (!map.getBounds().contains(p))
			map.panTo(p);
	}

	var updateMarker=function() {
		var lat=parseFloat(geo_lat.value);
		var lon=parseFloat(geo_lon.value);

		marker.setPoint(new GLatLng(lat, lon));
	}

	addEvent(geo_lat, 'change', updateMarker, false);
	addEvent(geo_lon, 'change', updateMarker, false);
	
	GEvent.addListener(marker, "drag", updateFields);
	GEvent.addListener(map, "zoomend", function (oldLevel, newLevel) {
		geo_zoom.value=newLevel;
	});

	GEvent.addListener(marker, "dragend", updateFields);
}


function addPostMarker(id, lat, lng, zoom)
{
	postmarkers[postmarkers.length]={id: id, lat: lat, lng: lng, zoom: zoom};
}
