Map = {

        _cachebust : (new Date()).valueOf().toString(),

        

		_icons : {},

		_map : null,

		_mgr : null,

		

		getMarkerManager : function() {

			if (!Map._mgr)

				Map._mgr = new GMarkerManager(Map.getMap());

			return Map._mgr;

		},

		

		getMap : function() {

			if (!Map._map)

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

			return Map._map;

		},

		

	    load : function(lat, lon, zoom) {

			if (GBrowserIsCompatible()) {

				var m = Map.getMap();

				m.addControl(new GLargeMapControl());

				m.setCenter(new GLatLng(lat, lon),10);

			}

		},

		

		loadSmall : function(lat, lon, zoom) {

			if (GBrowserIsCompatible()) {

				var m = Map.getMap();

				m.addControl(new GSmallMapControl());

				m.setCenter(new GLatLng(lat, lon), 10);

			}			

		},

		

		updateCenter : function(divId) {

			var map = Map.getMap();

			GEvent.addListener(map, "moveend", function() {

				this.doUpdateCenter(divId);

			});

			this.doUpdateCenter(divId);			

		},

		

		doUpdateCenter : function(divId) {

			var map = Map.getMap();

			var center = map.getCenter();

			var lon = "<strong>Lon</strong>: " + center.lng().toPrecision(6);

			var lat = "<strong>Lat</strong>: " + center.lat().toPrecision(6);

			document.getElementById(divId).innerHTML =  lon + " " + lat ;

		},

		

		show : function(areaid) {

			window.setTimeout(function() { Map.getHouses(areaid); }, 0);

		},
		
		showCity : function(cityid) {
			window.setTimeout(function() { Map.getCityHouses(cityid); }, 0);
		},
	

		getIcon : function(level) {

			if (!Map._icons[level]) {

				var icon = new GIcon();

				icon.image = "images/map/level-" + level + "-icon.png";

				icon.iconAnchor = new GPoint(16, 16);

				icon.infoWindowAnchor = new GPoint(22, 23);

				icon.iconSize = new GSize(44, 46);

				icon.shadow = "images/map/level-" + level + "-shadow.png";

				icon.shadowSize = new GSize(30, 16);

				Map._icons[level] = icon;

			}

			return Map._icons[level];

		},

							

		createMarkers : function(markers) {

			var batch = [];

			for (var i=0;i<markers.length;i++)

			{

				var marker = markers[i];

				var latlong = new GLatLng(marker.lat, marker.lon);

				var options = { icon: Map.getIcon(marker.icon) };

				var gmarker = new GMarker(latlong, options);

				if (!!marker.content)

					gmarker.bindInfoWindowHtml(marker.content);

				batch.push( gmarker );

			}

			return batch;

		},

		

		parseMarkers : function(body) {

			return eval("("+ body + ")");

		},

		showHouses : function(body, status) {
			if (status == 200)
			{

				var markerinfo = Map.parseMarkers(body);
				var batch = Map.createMarkers(markerinfo.markers);

				if (batch.length > 0)
				{
					var m = Map.getMarkerManager();				
					m.addMarkers(batch, 10);
					m.refresh();
				}
			}

		},

        

		getHouses : function(areaid) {
			GDownloadUrl("api/map-markers.php?area=" + areaid + "&" + Map._cachebust, Map.showHouses);
		},
		
		getCityHouses : function(cityid) {
			GDownloadUrl("api/map-markers.php?city=" + cityid + "&" + Map._cachebust, Map.showHouses);
		}

};



LongLatPicker = {

	

	_map : null,

	_marker : null,

	_geocoder : null,

	_latFieldName : null,

	_lonFieldName : null,

		

	createAddressElement : function()

	{

		var input = document.createElement("INPUT");	

		input.setAttribute("type","text");

		input.id = "longlatmap_address";

		input.setAttribute("id","longlatmap_address");

		

		input.style.top = "20px";

		input.style.left = "20px";

		input.style.width = "250px";

		input.style.position = "absolute";

		

		var container = this.getMapContainer();

		container.appendChild(input);

		

		var button = document.createElement("INPUT");

		button.setAttribute("type","button");

		button.id = "longlatmap_address_submit";

		button.setAttribute("id","longlatmap_address_submit");

		button.setAttribute("value","Search");

		

		button.style.top = "20px";

		button.style.left = "280px";

		button.style.width = "100px";

		button.style.position = "absolute";

		container.appendChild(button);

		

		GEvent.addDomListener(button,"click",function() { LongLatPicker.DoSearch(); });

		

		return input;

	},



	createMapContainer : function()

	{

		var cW = 640;

		var cH = 480;

		var cX = (Html.Window.Width() / 2) - (cW / 2);

		var cY = (Html.Window.Height() / 2) - (cH / 2);		

		

		var container = document.createElement("DIV");

		container.id = "longlatmap_container";

		container.setAttribute("id","longlatmap_container");

		document.body.appendChild(container);

		

		container.style.top = cY + "px";

		container.style.left = cX + "px";

		container.style.width = cW + "px";

		container.style.height = cH + "px";

		container.style.position = "absolute";

		container.style.backgroundColor = "#FFFFFF";

		container.style.border = "solid 1px #000";

		container.style.zIndex = 101;

		

		var save = document.createElement("INPUT");

		save.setAttribute("type","button");

		save.id = "longlatmap_save";

		save.setAttribute("id","longlatmap_save");

		save.setAttribute("value","Save");

		save.style.top = "20px";

		save.style.left = "410px";

		save.style.width = "100px";

		save.style.position = "absolute";

		container.appendChild(save);

		GEvent.addDomListener(save,"click",function() { LongLatPicker.DoSave(); });		

		

		var cancel = document.createElement("INPUT");

		cancel.setAttribute("type","button");

		cancel.id = "longlatmap_save";

		cancel.setAttribute("id","longlatmap_cancel");

		cancel.setAttribute("value","Cancel");

		cancel.style.top = "20px";

		cancel.style.left = "520px";

		cancel.style.width = "100px";

		cancel.style.position = "absolute";

		container.appendChild(cancel);

		GEvent.addDomListener(cancel,"click",function() { LongLatPicker.DoCancel(); });

		

		return container;

	},



	createMapElement : function()

	{

		element = document.createElement("DIV");

		element.id = "longlatmap";

		element.setAttribute("id","longlatmap");



		var w = 600;

		var h = 400;



		var x = 0;

		var y = 60;



		element.style.top = y + "px";

		element.style.left = x + "px";		

		element.style.width = w + "px";

		element.style.height = h + "px";

		element.style.backgroundColor = '#ff0000';

		element.style.border = "solid 1px #000";

		element.style.margin = "0px auto 0px auto";



		this.getMapContainer().appendChild(element);

		

		return element;

	},

	

	getAddressElement : function()

	{

		var element = document.getElementById("longlatmap_address");

		if (!element)

			element = this.createAddressElement();

		return element;

	},

	

	getMapContainer : function()

	{

		var element = document.getElementById("longlatmap_container");

		if (!element)

			element = this.createMapContainer();

		return element;		

	},

	

	getMapElement : function() 

	{

		var element = document.getElementById("longlatmap");

		if (!element)

			element = this.createMapElement();

		return element;

	},



	showShadow : function()

	{

		Shadow.Show(0, Html.ElementOffset(this.getMapContainer()));

	},



	hideShadow : function()

	{

		Shadow.Hide(0);

	},

	

	showHiderFrame : function()

	{

		HiderFrame.Show(0, Html.ElementOffset(this.getMapContainer()));		

	},

	

	hideHiderFrame : function()

	{

		HiderFrame.Hide(0);

	},

	

	getGeoCoder : function()

	{

		if (!this._geocoder)

			this._geocoder = new GClientGeocoder();

		return this._geocoder;	

	},

	

	getMap : function() 

	{

		if (!this._map)

		{

			this._map = new GMap2(this.getMapElement());

			this._map.addControl(new GLargeMapControl());

		}

		return this._map;

	},

	

	getMarker : function(center)

	{

		if (!this._marker)

		{

			this._marker = new GMarker(center, {draggable: true});

			this.getMap().addOverlay(this._marker);

		}

		else

		{

			this._marker.setLatLng(center);

		}		

	},



	ClearAddress : function()

	{

			this.getAddressElement().value = '';

	},



	DoSearch : function()

	{

		var address = this.getAddressElement().value;

		if (address)

		{

			this.getGeoCoder().getLatLng(address, function(latlng) { 

				if (latlng) 

				{

					LongLatPicker.getMarker(latlng); 

					LongLatPicker.getMap().setCenter(latlng,16);

				}

				else

				{

					alert('Unable to find address: ' + address);

				}

			});

		}		

	},

	

	DoSave : function() 

	{

		var latField = document.getElementById(this._latFieldName);	

		var lonField = document.getElementById(this._lonFieldName);

		

		var ll = this._marker.getLatLng();

		

		latField.value = ll.lat();

		lonField.value = ll.lng();

		

		this.getMapContainer().style.display = 'none';		

		this.hideShadow();

		this.hideHiderFrame();		

	},

	

	DoCancel : function()

	{

		this.getMapContainer().style.display = 'none';

		this.hideShadow();

		this.hideHiderFrame();				

	},



	Show : function(latName, lonName) {

		if (GBrowserIsCompatible()) {

			

			this.ClearAddress();

			

			this.getMapContainer().style.display = '';

			

			this.showShadow();

			this.showHiderFrame();

			

			var m = this.getMap();

			

			this._latFieldName = latName;

			this._lonFieldName = lonName;

			

			var latField = document.getElementById(latName);	

			var lonField = document.getElementById(lonName);

		

			var lon = lonField.value;

			var lat = latField.value;

			

			if (!lon)

				lon = -84.2159;

			if (!lat)

				lat = 34.0363;



			var center = new GLatLng(lat, lon);

			m.setCenter(center,10);

			

			this.getMarker(center);

		}		

	}

};