/*jslint browser: true */
/*global google,$,unknownAddr,window,areaSearchURL,unknownLocation,locationValidatorURL */
function geoinit() {
	var geocoder = new google.maps.ClientGeocoder();
	var form = $("#search-form form");
	var addrInput = form.find("#search-keyword").children(":input");
	var showItems = function(items) {
		var box=$("<div style='clear:both;width:400px;'><p><span class='askuser'>&nbsp;</span>" +
		"<span id='addr.errors' style='color:white;'>Do you want to go to:</span></p></div>");
		$("#ui-extra").html(box);
		var str = "<ul style='margin:-12px 0px 5px 25px;'>";
		for (var i=0; i<items.length; i++) {
			str += "<li style='color:white;list-style-type:disc;'><a style='color:white' href='" +
			items[i].url + "'>" + items[i].name + "</a></li>";
		}
		str += "</ul>";
		box.append(str);
		return;
	};
	var showMessage = function(msg) {
		$("#ui-extra").html("").html("<div style='clear:both;width:400px;'><p>" + 
				"<span class='locerror'>&nbsp;</span><span id='addr.errors' style='color:white;'>" + 
				msg + "</span></p></div>");
		addrInput[0].focus();
		return;
	};
	var processLocations = function(data) {
		var items = data ? data.items : [];
		if (data.error) {
			showMessage(data.error);
		} else if (items.length === 0) {
			showMessage(unknownAddr);
		} else if (items.length === 1) {
			window.location = items[0].url;
		} else {
			showItems(items);
		}
		return;
	};
	var geoLocate = function() {
		var addr = addrInput.is('.tipField') ? "" : addrInput.val();
		addr = addr.replace(/^\s+/, '').replace(/\s+$/, '').replace(/\s+/, ' ');
		if (addr === "") {
			showMessage(addrInput.attr('title'));
			return false;
		}
		$.getJSON(areaSearchURL+"?jsoncallback=?", [{name:"q", value:addr}], function(data) {
			var items = data ? data.items : [];
			if (data.error) {
				showMessage(data.error);
			} else if (items.length > 1) {
				showItems(items);
			} else if (items.length === 1) {
				window.location = items[0].url;
			} else {
				geocoder.getLocations(addr, function(response) {
					if (!response || !response.Status || !response.Status.code || 
							response.Status.code !== 200 || !response.Placemark || 
							response.Placemark.length === 0 ) {
						showMessage(unknownAddr);
						return;
					}
					var usItems = [];
					for (var i=0; i<response.Placemark.length; i++) {
						var place = response.Placemark[i];
						if ((place.AddressDetails &&
								place.AddressDetails.Country &&
								place.AddressDetails.Country.CountryNameCode &&
								place.AddressDetails.Country.CountryNameCode === "US") ||
								(place.address && 
										/, USA$/.test(place.address))) {
							usItems.push(place);
						}
					}
					if (usItems.length === 0) {
						showMessage(unknownLocation);
					} else if (usItems.length > 5) {
						showMessage(unknownAddr);
					} else if (usItems.length === 1) {
						var zip = "";
						try {
							zip = usItems[0].AddressDetails.Country.AdministrativeArea.
							SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
						} catch (e) {
						}
						var lat = usItems[0].Point.coordinates[1];
						var lng = usItems[0].Point.coordinates[0];
						var params1 = [{name:"q", value:zip}, {name:"lat", value:lat}, {name:"lng", value:lng}];
						$.getJSON(areaSearchURL+"?jsoncallback=?", params1, processLocations);
					} else {
						var params2 = [];
						for (var j=0; j<usItems.length; j++) {
							params2.push({name:"lat" + j, value:usItems[j].Point.coordinates[1]});
							params2.push({name:"lng" + j, value:usItems[j].Point.coordinates[0]});
						}
						$.getJSON(locationValidatorURL+"?jsoncallback=?", params2, processLocations);
					}
					return;
				});
			}
			return;
		});
		return false;
	};
	form.submit(geoLocate);
}
google.setOnLoadCallback(geoinit);