// Global variables
var centerLat = 37.426888345267244;
var centerLon = -8.153228759765625;
var defaultZoomLevel = 14;
var defaultZoomLevelForUploadMap = 9;
var uploadMap; // map in upload form
var geocoder; // geocoder for upload form
var province = "Portugal";
var cityName = "";
var globalMap;

var curr = 0;
var markersLoaded = new Object(); // Markers currently on map
var infoWindows= new Object(); // array of information bubbles 
var markerInFocus; // current marker in focus
var geocoder; // geocoder for upload form

// Local Search variables
var gLocalSearch;
var gCurrentResults = [];
var gSelectedResults = [];
var gSearchForm;
var gSmallIcon = null;
var gsearchControl;
var onClickAddMarkerListener;

// Map mouse over variables
var markerInFocusIcon = "/images/markers/lqpaleblue_Marker.png";
var markerNotInFocusIcon = "/images/markers/lqred_Marker.png";
var rowStyle = "";

// Print Preview
var miniMaps = [];
var printPreviewMap = false;
var printPreviewMarker = "/images/markers/printPreviewMarkers/";
var printPreviewMarkerCounter = 1;

var facebox;
var facebox2;
var lbox;

String.prototype.endsWith = function(str) 
{return (this.match(str+"$")==str)}

/********* Mouse Event Functions *********/

function toggleExtraInfo (id)
{
	var extraInfoDiv = document.getElementById(id+'_ExtraInfo');
	var arrowCollapsed = document.getElementById(id+'_ArrowCollapsed');
	var arrowExpanded = document.getElementById(id+'_ArrowExpanded');
	if (extraInfoDiv.style.display != "none")
	{
		//Effect.SlideUp(id, {duration: 0.5});
		extraInfoDiv.style.display = "none";
		arrowCollapsed.style.display = "";
		arrowExpanded.style.display = "none";
	}	
	else
	{
		//Effect.SlideDown(id,{duration: 0.5});
		extraInfoDiv.style.display = "";
		arrowCollapsed.style.display = "none";
		arrowExpanded.style.display = "";
		
	}
	
}

function focusMarker (id)
{
	markersLoaded[id].setImage(markerInFocusIcon);
}

function focusPropertyRow (id)
{
	var row = document.getElementById(id);
	var style = row.className;
	row.className = "highlight" + style;
}

function unFocusPropertyRow (id)
{
	var row = document.getElementById(id);
	var style = row.className;
	if (style.indexOf("even") != -1)
	{
		row.className="even";
	}
	else
	{
		row.className="odd";
	}
}

function unFocusMarker (id)
{
	markersLoaded[id].setImage(markerNotInFocusIcon);
}

/****** End Of Mouse Event Functions ******/


// Call this function when the page has been loaded
function init() 
{
	var URL = location.href;
	var tokens = URL.split("/");
	var id;
	var uploadProperty = false;
	var cityMap = false;
	var splashMap = false;
	var clientMap = false;
	var addCityMap = false;
	var editCity = false;
	var uploadCity = false;
	var geocodeProperty = false;
	var action = '/maps/getAttractionMarkers'; // default action
	if (GBrowserIsCompatible())
	{
		for (var i = 0; i < tokens.length;i++)
		{
			if (tokens[i] == "city")
			{
				if (i+1 >= tokens.length)
				{
					splashMap = true;
					break;
				}
				else if (tokens[i+1] == "show")
				{
					action = '/city/getAttractionMarkersFromSearch/' + tokens[i+2];
					cityMap = true;
					break;
				}				
				else if (tokens[i+1].indexOf("show?") == 0)
				{
					tokens[i+1] = tokens[i+1].substring(5);
					action = '/city/getAttractionMarkersFromSearch?' + tokens[i+1];
					cityMap = true;
					break;
				}
				else if (tokens[i+1] == "edit" || tokens[i+2] == "edit" || tokens[i+1] == "new")
				{
					uploadProperty = true;
					break;
				}
				else
				{
					splashMap = true;
					break;
				}
			}
			else if (tokens[i] == "my_attraction")
			{
				if (tokens[i+1] == "show")
				{
					action = '/my_attraction/getMyMapAttractionMarkers/' + tokens[i+2];
					cityMap = true;
					break;
				}
				else if (tokens[i+1] == "printPreview")
				{
					cityMap = true;
					printPreviewMap = true;
				}
			}
			else if (tokens[i] == "site")
			{
				splashMap = true;
				break;
			}
			else if (tokens[i] == "admin")
			{
				if (tokens[i+1] == "showAttractionsForCity")
				{
					cityMap = true;
					break;
				}
				else if (tokens[i+1] == "createAttraction" || tokens[i+1] == "saveAttraction")
				{
					uploadProperty = true;
					break;
				}
				else if (tokens[i+1] == "editAttraction" || tokens[i+1] == "createDuplicateAttraction")
				{
					uploadProperty = true;
					geocodeProperty = true;
					break;
				}
				else if (tokens[i+1] == "createCity")
				{
					uploadCity = true;
					break;
				}
				else if (tokens[i+1] == "editCity")
				{
					editCity = true;
					break;
				}
			}
			else if (i+1 >= tokens.length)
			{
				clientMap = true;
				break;
			}			
		}	
		
		if (uploadProperty || uploadCity)
		{			
		/*
			var mapOptions = {
				googleBarOptions : {
				  style : "new",
				}
			}
			uploadMap = new GMap2(document.getElementById("map"), mapOptions);*/
			uploadMap = new GMap2(document.getElementById("map"));
			uploadMap.setUIToDefault();
			uploadMap.setCenter(new GLatLng(centerLat, centerLon), defaultZoomLevelForUploadMap);
			//uploadMap.enableGoogleBar();
			onClickAddMarkerListener = GEvent.addListener(uploadMap, "click", placeMarker);
			geocoder = new GClientGeocoder();
					
/*
			gsearchControl = new GSmapSearchControl(
				document.getElementById("mapsearch"),             // container
				uploadMap.getCenter(),							   // center point
				null                                              // options
				);
*/

			// Initialize the local searcher
			gLocalSearch = new google.search.LocalSearch();
			gLocalSearch.setCenterPoint(uploadMap);
			gLocalSearch.setSearchCompleteCallback(null, OnLocalSearch);
			gLocalSearch.setResultSetSize(google.search.Search.LARGE_RESULTSET);	
		
			var lat = document.getElementById("attraction_latitude").value;
			var lon = document.getElementById("attraction_longitude").value;
			if (!geocodeProperty)
			{
				placeMarker(uploadMap, new GLatLng(centerLat, centerLon));
			}
			
			if (lat != null && lat != "")
			{
				var markerOverlay = addProperty (lat, lon, "", "", 1, uploadMap, true);
				uploadMap.setZoom(15);
			}
			else if (geocodeProperty)
			{
				geoCode(uploadProperty);
			}	
			
			// Initialize search bar		
			gSearchForm = new google.search.SearchForm(false, document.getElementById("searchform"));
			gSearchForm.setOnSubmitCallback(null, CaptureForm);
			//gSearchForm.input.focus();
		}
		else if (cityMap)
		{
			var map = new GMap2(document.getElementById("map"));
			plotMarkers (action, map);
			
			//centerMap();
			//map.setCenter(new GLatLng(centerLat, centerLon), defaultZoomLevel);
			
			var lat = document.getElementById("cityLat").value;
			var lon = document.getElementById("cityLon").value;
			var zoomLevel = document.getElementById("cityZoom").value;
			map.setCenter(new GLatLng(lon, lat), parseInt(zoomLevel));

			map.setUIToDefault();
			globalMap = map;
			
			if (printPreviewMap)
			{
				plotMiniMaps();
			}
		}
		else if (splashMap)
		{
			var map = new GMap2(document.getElementById("map"));
			map.setCenter(new GLatLng(centerLat, centerLon), 9);
			map.setUIToDefault();
			plotCities(map);
		}
		else if (editCity)
		{
			uploadMap = new GMap2(document.getElementById("map"));
			uploadMap.setUIToDefault();
			var lat = document.getElementById("city_latitude").value;
			var lon = document.getElementById("city_longitude").value;
			var zoomLevel = document.getElementById("city_zoomLevel").value;
			var cityName = document.getElementById("city_name").value;

			uploadMap.setCenter(new GLatLng(lon, lat), parseInt(zoomLevel));
	
			onClickAddMarkerListener = GEvent.addListener(uploadMap, "click", placeMarker);
			geocoder = new GClientGeocoder();
				
			var markerOverlay = addProperty (lon, lat, cityName, cityName, 1, uploadMap, false);
			
		}
		else
		{
			var map = new GMap2(document.getElementById("clientMap"));
			var lat = document.getElementById("attrLat").value;
			var lon = document.getElementById("attrLon").value;
			var id = document.getElementsByName("attrId");
			var desc = document.getElementsByName("attrDesc");
			var addr = document.getElementsByName("attrAddr");
			map.setCenter(new GLatLng(lat, lon), defaultZoomLevel);
			map.setUIToDefault();
			var markerOverlay = addProperty (lat, lon, desc, addr, id, map, false);
			Shadowbox.init({
				// include the quicktime and windows media player players for playing
				// movies (assuming we have some movies we want to show in either of
				// those formats)
				handleOversize: "drag",
				players: ["img"]
			});
		}
	}
}

function rePlotMarkers ()
{
	globalMap.clearOverlays();
	plotMarkers("", globalMap);
}

function removeMarker (id)
{
	if (readCookie("my_map") == "yes")
	{
		var rowToHide = document.getElementById(id);
		rowToHide.style = "display:none;";
		globalMap.removeOverlay(markersLoaded[id]);
		markersLoaded[id] = null;
	}
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function centerMap ()
{
	var request = GXmlHttp.create();
	request.open('GET', '/city/getCity/' + document.getElementById("cityId").getValue(), false);
	request.onreadystatechange = function ()
	{
		if (request.readyState == 4)
		{
			var cityJson, marker, lat, lng;
			cityJson = JSON.parse(request.responseText);
			if (typeof cityJson == 'object')
			{
				centerLat = cityJson['city']['latitude'];
				centerLon = cityJson['city']['longitude'];
			}
		} // end if
	} // end function
	request.send(null);	
}

function plotCities (map)
{
	var request = GXmlHttp.create();
	request.open('GET', '/city/getCities', true);
	request.onreadystatechange = function() 
	{
		if (request.readyState == 4)
		{
			var markers, marker, lat, lng;
			markers = JSON.parse(request.responseText);
			var i = 0;
			var name, latitude, longitude, id;
			marker = markers[i];
			if (typeof marker != 'object')
				marker = markers;
			while (typeof marker == 'object')
			{
				// Get necessary values
				id = marker['city']['id'];
				name = marker['city']['name'];
				latitude = marker['city']['latitude'];
				longitude = marker['city']['longitude'];
				i++;
				
				marker = markers[i];
				
				// Plot a marker
				var gMapMarker = addProperty (latitude, longitude, name, "", id, map, false, false);
				addCityEvents(gMapMarker, id, name, map);
				//map.removeOverlay(gMapMarker);
				map.addOverlay(gMapMarker);
				
				// Add the name overlay
/*
				var nameTooltip = "";
				for (var j = 0;j<name.length;j = j + 1)
				{
					nameTooltip = nameTooltip + name.charAt(j);
					if (name.charAt(j) == 32)
					{
						nameTooltip = nameTooltip + "&nbsp;"
					}
					else if (j+1 < name.length)
					{
						nameTooltip = nameTooltip + "<br>"
					}
				}
				gMapMarker.openToolTip(name, map, name.length);
				*/

			}
		} // end if
	} // end function
	request.send(null);
}

function plotMarkers (action, map) 
{
/*
	var request = GXmlHttp.create();
	request.open('GET', action, true);
	request.onreadystatechange = function() 
	{
		if (request.readyState == 4)
		{
			var markers, marker, lat, lng;
			markers = JSON.parse(request.responseText);
			var i = 0;
			var name, address, city, description, type, phoneNumber, website, postalCode, latitude, longitude, offTheMap;
			marker = markers[i];
			if (typeof marker != 'object')
				marker = markers;
			while (typeof marker == 'object')
			{
				// Get necessary values
				id = marker['attraction']['id'];
				name = marker['attraction']['name'];
				address = marker['attraction']['address'];
				city = marker['attraction']['city'];
				description = marker['attraction']['description'];
				type = marker['attraction']['type'];
				phoneNumber = marker['attraction']['phoneNumber'];
				website = marker['attraction']['website'];
				postalCode = marker['attraction']['postalCode'];
				latitude = marker['attraction']['latitude'];
				longitude = marker['attraction']['longitude'];
				offTheMap = marker['attraction']['offTheMap'];
				i++;
				
				marker = markers[i];
				// Plot a marker
				var markerOverlay = addProperty (latitude, longitude, description, address, id, map, false);
				addAttractionEvents(markerOverlay, id, description);			
				
			}
		} // end if
	} // end function
	request.send(null);
*/
	var ids = document.getElementsByName("attrId");
	var descriptions = document.getElementsByName("attrDesc");
	var lats = document.getElementsByName("attrLat");
	var lons = document.getElementsByName("attrLon");
	var addresses = document.getElementsByName("attrAddr");
	var names = document.getElementsByName("attrName");
	for (i = 0; i < ids.length; i++)
	{
		var id = ids[i].value;
		var desc = descriptions[i].value;
		var addr = addresses[i].value;
		var lat =  lats[i].value;
		var lon = lons[i].value;
		var name = names[i].value;
		//alert(id);
		var markerOverlay = addProperty (lat, lon, desc, name, id, map, false);
		
		if (!printPreviewMap)
		{
			addAttractionEvents(markerOverlay, id, desc);	
		}
		

	}
}

function plotMiniMaps()
{
	printPreviewMarkerCounter = 1;
	var ids = document.getElementsByName("attrId");
	var descriptions = document.getElementsByName("attrDesc");
	var lats = document.getElementsByName("attrLat");
	var lons = document.getElementsByName("attrLon");
	var addresses = document.getElementsByName("attrAddr");
	var mapDiv;
	var counter = 1;
	for (var i = 0; i < ids.length; i++)
	{
		var id = ids[i].value;
		var desc = descriptions[i].value;
		var addr = addresses[i].value;
		var lat =  lats[i].value;
		var lon = lons[i].value;
		mapDiv = new GMap2(document.getElementById("miniMap" + counter));	
		mapDiv.setCenter(new GLatLng(lat, lon), 16);
		miniMaps.push(mapDiv);
		var markerOverlay = addProperty (lat, lon, desc, addr, id, mapDiv, false);
		counter++;
	}
}

function addProperty(lat, lng, description, tooltip, id, map, centerMarker) 
{
	var redIcon = new GIcon(G_DEFAULT_ICON);
	redIcon.image = markerNotInFocusIcon;
	if (printPreviewMap)
	{
		redIcon.image = printPreviewMarker + printPreviewMarkerCounter + ".png";
		printPreviewMarkerCounter = printPreviewMarkerCounter + 1;
	}
	//alert(printPreviewMarker + id + ".png");
	var markerOptions = {title:tooltip, icon:redIcon};
	var marker = new GMarker(new GLatLng(lat, lng), markerOptions);

	map.addOverlay(marker);
	markersLoaded[id] = marker;
	infoWindows[id] = description;

	if (centerMarker)
	{
		map.setCenter (marker.getLatLng(), map.getZoom());
	}

	
	return marker;
}

function addAttractionEvents (marker, id, description)
{
	GEvent.addListener(marker,"mouseover", 
							function() 
							{								
								marker.setImage(markerInFocusIcon);								
								focusPropertyRow(id);
							});
	
	GEvent.addListener(marker,"mouseout", 
							function() 
							{
								marker.setImage(markerNotInFocusIcon);
								unFocusPropertyRow(id);
							});
	GEvent.addListener(marker, 'click',
							function() 
							{
								// Start loading facebox
								facebox.loading();
								
								// We are going to be loading a facebox div
								$('facebox').show();
								
									// Determine the URL to open
									var showCity = "/city/show";
									var mainURL = new String(window.location);
									var indexOfShowCity = mainURL.indexOf(showCity);
									mainURL = mainURL.substring(0, indexOfShowCity);
									var url = mainURL + "/attraction/show/" + id;
									
									// Make an ajax request to open that url
									new Ajax.Request(url, {
										method		: 'get',
										onFailure	: function(transport){
											facebox.reveal(transport.responseText, null);
											new Effect.Appear(facebox.facebox, {duration: .3});
										},
										onSuccess	: function(transport){
											facebox.reveal(transport.responseText, null);
											new Effect.Appear(facebox.facebox, {duration: .3});
										}
									});
							}
					);
	return marker;
}

function addCityEvents (marker, id, description, map)
{

	GEvent.addListener(marker,"mouseover", 
						function() 
						{			
							//marker.openToolTip(description, map, 11);	
							marker.setImage(markerInFocusIcon);				
							focusPropertyRow(id);
						});

	GEvent.addListener(marker,"mouseout", 
						function() 
						{	
							marker.setImage(markerNotInFocusIcon);
							unFocusPropertyRow(id);		
							//marker.closeToolTip(map);		
						});
							
	GEvent.addListener(marker, 'click',
						function() 
						{
							window.location = location.href + "/show/" + id;
						}
	);
	
	return marker;
}

// This function is used to take an address and try and determine its latitude and longitude
function getCityNameById (id)
{
	var request = GXmlHttp.create();
	request.open('GET', '/maps/getCityById/' + id, false);
	request.onreadystatechange = function ()
	{
		if (request.readyState == 4)
		{
			var cityJson, marker, lat, lng;
			cityJson = JSON.parse(request.responseText);
			if (typeof cityJson == 'object')
			{
				// City name is a global variable
				cityName = cityJson['city']['name'];
			}
		} // end if
	} // end function
	request.send(null);	
}
	
/* 
	This function is used to geocode an adress. It will read in the values from 
	the attractions/new and attractions/edit form
*/
function geoCode (geoCodeCity)
{		
	var address = document.getElementById("attraction_address").value;
	var cityId = document.getElementById("city_id").value;
	var city = "";
	var success = false;
	if (cityId != -1)
	{
		city = document.getElementById("cityName"+cityId).value;
	}
	if (address != null && address != "" && city != null && city != "")
	{
		// cityName is a global variable. It is set inside getCityNameById
		success = showAddress (address + ", " + city + ", Portugal");
	}	
	else if (city != null && city != "" && geoCodeCity != true)
	{
		//getCityNameById(city);
		
		success = showAddress (city + ", Portugal", true);
		//uploadMap.clearOverlays();
	}
	
	if (success == false && city != null && city != "")
	{
		showAddress (city + ", Portugal", true);
	}
}

/*
	This function is used to gecode a city name
*/
function geoCodeCity ()
{
	var cityName = document.getElementById("city_name").value;
	if (cityName != null && cityName != "")
	{
		// cityName is a global variable. It is set inside getCityNameById
		showAddress (cityName + ", Portugal");
	}	
}

function zoomIntoMap()
{
	var zoomLevel = document.getElementById("city_zoomLevel").value;
	//alert(uploadMap.getZoom());
	uploadMap.setCenter(uploadMap.getCenter(), parseInt(zoomLevel));
//	uploadMap.setCenter(new GLatLng(centerLat, centerLon), defaultZoomLevelForUploadMap);
	//alert(zoomLevel);
}

/* 
	This function is to redirect a user to a specific page
*/
function redirectAdminAttractions()
{
	var city = document.getElementById("city_id").value;
	var showAttractions = "/admin/showAttractions";
	var newLocation = new String(window.location);
	var indexOfShowAttractions = newLocation.indexOf(showAttractions);
	newLocation = newLocation.substring(0, indexOfShowAttractions);
	if (city == "-1")
	{
		window.location = newLocation + "/admin/showAttractions";
	}
	else
	{
		window.location = newLocation + "/admin/showAttractionsForCity/" + city;
	}
}

/*	This function will try caling the geocoder and see if the supplied
	address actually exists. If it does not it will throw an alert. If 
	the address DOES exist then it will plot it on the uploadMap
*/
function showAddress(address, hideMarker) 
{
  geocoder.getLatLng(address,
	function(point) {
	  if (!point) {
	  	document.getElementById("searchFailed").style.display = "block";
		return false;
	  } else {	  
		
		document.getElementById("searchFailed").style.display = "none";
	  	var marker = new GMarker(point);
		uploadMap.clearOverlays();
		uploadMap.setCenter(point, 15);
		
		if (!hideMarker)
			uploadMap.addOverlay(marker);	
		uploadMap.setZoom(15);

		//alert(uploadMap.getCenter());
		updateLatLngField(uploadMap.getCenter());
		return true;
	  }
	}
  );
}

function getLocationInfo(response) 
{
  if (!response || response.Status.code != 200) 
  {
	alert("Status Code:" + response.Status.code);
  } 
  else 
  {
/*
  	place = response.Placemark[0];
  	if ( place.AddressDetails.Accuracy > 7)
  	{
  		address = document.getElementById("attraction_address");
  		address.value = place.AddressDetails.Country.AdministrativeArea.Locality.DependentLocality.Thoroughfare.ThoroughfareName;
  		
  		postalCode = document.getElementById("attraction_postal_code");
		postalCode.value = place.AddressDetails.Country.AdministrativeArea.Locality.DependentLocality.PostalCode.PostalCodeNumber;
  	}
*/
/*
	EXAMPLE CODE
	place = response.Placemark[0];
	point = new GLatLng(place.Point.coordinates[1],
						place.Point.coordinates[0]);
	marker = new GMarker(point);
	map.addOverlay(marker);
	marker.openInfoWindowHtml(
	'<b>orig latlng:</b>' + response.name + '<br/>' + 
	'<b>latlng:</b>' + place.Point.coordinates[1] + "," + place.Point.coordinates[0] + '<br>' +
	'<b>Status Code:</b>' + response.Status.code + '<br>' +
	'<b>Status Request:</b>' + response.Status.request + '<br>' +
	'<b>Address:</b>' + place.address + '<br>' +
	'<b>Accuracy:</b>' + place.AddressDetails.Accuracy + '<br>' +
	'<b>Country code:</b> ' + place.AddressDetails.Country.CountryNameCode);
*/
  }
}


function updateLatLngField (latlng)
{
	if (document.getElementById("city_latitude"))
	{
		longitude = document.getElementById("city_latitude");
		latitude = document.getElementById("city_longitude");
	}
	else
	{
		longitude = document.getElementById("attraction_longitude");
		latitude = document.getElementById("attraction_latitude");
	}
	latitude.value = latlng.lat();
	longitude.value = latlng.lng();
	//geocoder.getLocations(latlng, getLocationInfo);
}

function updatePrimaryTypeList(item)
{
	var attractionTypeName = document.getElementById(item.value + ".id");
	var anOption = document.createElement("OPTION");
	var select = document.getElementById("primary_type");
	if (item.checked)
	{
		select.options[select.options.length] = new Option(attractionTypeName.value, item.value);
		anOption.innerHTML = attractionTypeName.value ;
		anOption.Value = item.value;	
	}
	else
	{
		for (var i = 0; i < select.length; i=i+1)
		{
			if (select.options[i].value == item.value)
			{
				select.remove(i);
				break;
			}
		}
	}
}

function createBookmarkLink(url, title) {
	if (window.sidebar)
	{ 
		// Mozilla Firefox Bookmark
		window.sidebar.addPanel(title, url,"");
	} 
	else if( window.external ) 
	{ 
		// IE Favorite
		window.external.AddFavorite( url, title); 
	}
	else if(window.opera && window.print) 
	{ 
		// Opera Hotlist
		return true; 
	}
 }
 
 function openImage (url, titleBar)
 {
// 	lbox.updateImageList();
 //	lbox.showImage();
 /*

    Shadowbox.open({
        content:    url,
        player:     "img",
        title:      titleBar,
        gallery:		'imageGallery'
    });
 
*/   								

 }
 
function placeMarker(overlay, latlng) 
{
	uploadMap.clearOverlays();
	addProperty(latlng.lat(), latlng.lng(), "", "", 1, uploadMap, true);
	updateLatLngField(latlng);
}

function flipCheckbox (name)
{
	var box = document.getElementById(name);
	if (box.checked)	
	{
		box.value = 0;
		box.checked = false;	
	}
	else
	{
		box.value = 1;
		box.checked =  true;
	}	
}

// Firefox worked fine. Internet Explorer shows scrollbar because of frameborder
function resizeFrame(f) 
{
	if (f != null)
	{
		f.style.height = f.contentWindow.document.body.scrollHeight + "px";
	}
}

/******** Local Result Stuff ********/ 

// A class representing a single Local Search result returned by the
// Google AJAX Search API.
function LocalResult(result) 
{
	this.result_ = result;
	this.resultNode_ = this.unselectedHtml();
	//document.getElementById("searchwell").appendChild(this.resultNode_);
	uploadMap.addOverlay(this.marker(gSmallIcon));
}

// Returns the GMap marker for this result, creating it with the given
// icon if it has not already been created.
LocalResult.prototype.marker = function(opt_icon) 
{
	if (this.marker_) return this.marker_;
	var marker = new google.maps.Marker(new google.maps.LatLng(parseFloat(this.result_.lat),
										 parseFloat(this.result_.lng)),
								opt_icon);
	GEvent.bind(marker, "click", this, function() {
		marker.openInfoWindow(this.selected() ? this.selectedHtml() :
											this.unselectedHtml());
	});
  this.marker_ = marker;
  return marker;
}

// "Saves" this result if it has not already been saved
LocalResult.prototype.select = function() 
{
	if (!this.selected()) 
	{
		this.selected_ = true;

		// Remove the old marker and add the new marker
		uploadMap.removeOverlay(this.marker());
		this.marker_ = null;
		uploadMap.addOverlay(this.marker(G_DEFAULT_ICON));
		// Add our result to the saved set
		document.getElementById("selected").appendChild(this.selectedHtml());

		// Remove the old search result from the search well
		this.resultNode_.parentNode.removeChild(this.resultNode_);
	}
}

// Returns the HTML we display for a result before it has been "saved"
LocalResult.prototype.unselectedHtml = function() 
{
	var container = document.createElement("div");
	container.className = "unselected";
	container.appendChild(this.result_.html.cloneNode(true));
	var saveDiv = document.createElement("div");
	saveDiv.className = "select";
	saveDiv.innerHTML = "Save this location";
	GEvent.bindDom(saveDiv, "click", this, function() {
		map.closeInfoWindow();
		this.select();
		gSelectedResults.push(this);
	});
	container.appendChild(saveDiv);
	return container;
}

// Returns the HTML we display for a result after it has been "saved"
LocalResult.prototype.selectedHtml = function() 
{
	return this.result_.html.cloneNode(true);
}

// Returns true if this result is currently "saved"
LocalResult.prototype.selected = function() 
{
	return this.selected_;
}


// Called when Local Search results are returned, we clear the old
// results and load the new ones.

function OnLocalSearch() 
{
	//gLocalSearch.setCenterPoint(uploadMap.getCenter());
	if (!gLocalSearch.results) 
		return;
	var searchWell = document.getElementById("searchwell");
	
	// Clear the map and the old search well
	searchWell.innerHTML = "";
	for (var i = 0; i < gCurrentResults.length; i++) 
	{
		if (!gCurrentResults[i].selected()) 
		{
		  uploadMap.removeOverlay(gCurrentResults[i].marker());
		}
	}
	
	removeRowsFromTable('searchResultTable');
	gCurrentResults = [];
	for (var i = 0; i < gLocalSearch.results.length; i++) 
	{
		gCurrentResults.push(new LocalResult(gLocalSearch.results[i]));
		addRowToTable('searchResultTable', gLocalSearch.results[i]);
	}
	
	/*
var attribution = gLocalSearch.getAttribution();
	if (attribution) 
	{
		//document.getElementById("searchwell").appendChild(attribution);
	}
*/
}

   // Cancel the form submission, executing an AJAX Search API search.
function CaptureForm(searchForm) 
{
		// Initialize the local searcher
		/*
gLocalSearch = new google.search.LocalSearch();
		gLocalSearch.setCenterPoint(uploadMap);
		gLocalSearch.setSearchCompleteCallback(null, OnLocalSearch);
		
*/
	gLocalSearch.setCenterPoint(uploadMap);
	gLocalSearch.setResultSetSize(google.search.Search.LARGE_RESULTSET);
		
	gLocalSearch.execute(searchForm.input.value);
  	return false;
}

function executeSearch (searchValue)
{
	gSearchForm.input.value = searchValue;
	CaptureForm(gSearchForm);
}

function populateFields(e, obj)
{
	var rowNum = this.id.substring(8);
	var i = rowNum - 1;
	document.getElementById('attraction_name').value = gLocalSearch.results[i].titleNoFormatting;
	document.getElementById('attraction_address').value = gLocalSearch.results[i].streetAddress;
	document.getElementById('attraction_latitude').value = gLocalSearch.results[i].lat;
	document.getElementById('attraction_longitude').value = gLocalSearch.results[i].lng;
	
	if (gLocalSearch.results[i].phoneNumbers)
	{
		document.getElementById('attraction_phone_number').value = gLocalSearch.results[i].phoneNumbers[0].number;
	}
	//document.getElementById('disableOnClickForMap_disableOnClickForMap').checked = true;
	//disableOnClickForMap(document.getElementById('disableOnClickForMap_disableOnClickForMap'));
	uploadMap.clearOverlays();
	uploadMap.setCenter(new GLatLng(gLocalSearch.results[i].lat, gLocalSearch.results[i].lng), defaultZoomLevel);
	uploadMap.addOverlay(new GMarker(new GLatLng(gLocalSearch.results[i].lat, gLocalSearch.results[i].lng)));
}    

function disableOnClickForMap(item)
{
	if (item.checked)
	{
		GEvent.removeListener(onClickAddMarkerListener);
	}
	else
	{
		onClickAddMarkerListener = GEvent.addListener(uploadMap, "click", placeMarker);
	}
}

function zoomIn()
{
	uploadMap.zoomIn();
	document.getElementById("city_zoomLevel").value = uploadMap.getZoom();
}

function zoomOut()
{
	uploadMap.zoomOut();
	document.getElementById("city_zoomLevel").value = uploadMap.getZoom();	
}

function convertDegToDec()
{	
	var degrees    = 0;
	var minutes    = 0;
	var seconds    = 0;
	var decDegrees = 0.0;
 
	degrees = parseInt(document.getElementById('latDegH').value);
	minutes = parseInt(document.getElementById('latDegM').value);
	seconds = parseInt(document.getElementById('latDegS').value);
	document.getElementById('attraction_latitude').value = degrees + minutes/60 + seconds/3600;

	degrees = parseInt(document.getElementById('lonDegH').value);
	minutes = parseInt(document.getElementById('lonDegM').value);
	seconds = parseInt(document.getElementById('lonDegS').value);
	document.getElementById('attraction_longitude').value = degrees + minutes/60 + seconds/3600;
	
	uploadMap.clearOverlays();
	uploadMap.setCenter(new GLatLng(document.getElementById('attraction_latitude').value, document.getElementById('attraction_longitude').value), defaultZoomLevel);
	uploadMap.addOverlay(new GMarker(new GLatLng(document.getElementById('attraction_latitude').value, document.getElementById('attraction_longitude').value)));
}

function updateMapBasedOnLatLng()
{
	uploadMap.clearOverlays();
	uploadMap.setCenter(new GLatLng(document.getElementById('attraction_latitude').value, document.getElementById('attraction_longitude').value), defaultZoomLevel);
	uploadMap.addOverlay(new GMarker(new GLatLng(document.getElementById('attraction_latitude').value, document.getElementById('attraction_longitude').value)));
}

window.onload = init; 
//window.onunload = GUnload;
