/*jslint browser: true */
/*global google,$,unknownAddr,window,areaSearchURL,unknownLocation,locationValidatorURL,extraParams */
function geoinit() {
	var geocoder = new google.maps.ClientGeocoder();
	var form = $("#search-form form");
	var addrInput = form.find("#search-keyword").children(":input");
	var createParams = function(addr) {
		var params = [];
		if (addr) {
			params.push({name:"q", value:addr});
		}
		if (typeof extraParams !== 'undefined') {
			for (var i in extraParams) {
			    if (extraParams.hasOwnProperty(i)) {
			    	params.push({name:i, value:extraParams[i]});
			    }
			}
		}
		return params;
	};		
	var showItems = function(items) {
		var str = "<ul style='margin:-12px 0px 0px 25px;padding-bottom:10px;padding-top:5px;'>";
		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>";
		var box=$("<div id='location-options'><div class='inner'><p style='padding-top:10px;margin-top:0;'><span class='askuser'>&nbsp;</span>" +
		"<span id='addr.errors' style='color:white;'>Do you want to go to:</span></p>"+str+
		"</div><div id='location-options-bottom' class='pngFix'><div class='pngFix'></div></div></div>");
		$("#ui-extra").html(box);
		$("#area-home-geo-wrapper #search-form").css("height","55px");
		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.replace("&amp;", "&");
		} 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;
		}
		var params = createParams(addr);
		$.getJSON(areaSearchURL+"?jsoncallback=?", params, 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.replace("&amp;", "&");
			} 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 = createParams(zip);
						params1.push({name:"lat", value:lat});
						params1.push({name:"lng", value:lng});
						$.getJSON(areaSearchURL+"?jsoncallback=?", params1, processLocations);
					} else {
						var params2 = createParams();
						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);