function startSearch(form, placemark) {
	var address = document.SearchForm.Query.value;
	var geocoder = new GClientGeocoder();

	if (geocoder) {
		geocoder.getLocations(address, function(result) {
			if (result.Status.code != G_GEO_SUCCESS) {
				showUnknownAddressError();
			} else {
				if (result.Placemark.length == 1) {
					submitSearchForm(form, result.Placemark[0]);
				} else {
					submitSearchForm(form);
				}
			}
		});
	} else {
		alert('Your search could not be completed because Google Maps is not available.');
	}
}


function showUnknownAddressError() {
	alert("Sorry, we couldn't find the address you entered.\n\nTry using one of the following formats:\n\n   \"ZIP or Postal Code\"\n\n   \"Street Address, City, State\"\n\n   \"Street Address, City, ZIP\"");
}


function getZipFromPlacemark(object, depth) {
	depth = depth || 0;
	var maxDepth = 20;

	if (depth > maxDepth) {
		return false;
	}

	for (var key in object) {
		if (key == 'PostalCodeNumber') {
			return object[key];
		} else if (typeof object.PostalCode == 'object') {
			return getZipFromPlacemark(object.PostalCode, depth + 1);
		} else if (typeof object[key] == 'object') {
			return getZipFromPlacemark(object[key], depth + 1);
		}
	}
}


function submitSearchForm(form, placemark) {
	if (placemark) {
		// zip is required for tracking searches and ads
		var zip = getZipFromPlacemark(placemark);
		if (!zip) {
			showUnknownAddressError();
			return false;
		}

		form.searchLat.value = placemark.Point.coordinates[1];
		form.searchLng.value = placemark.Point.coordinates[0];
		form.Zip.value = zip;
	} else {
		form.searchLat.value = '';
		form.searchLng.value = '';
		form.Zip.value = '';
		form.ShowOptions.value = '1';
	}

	form.submit();
}
