/*
 * jQuery geo_autocomplete plugin 1.0
 *
 * Copyright (c) 2009 Bob Hitching
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Requires jQuery Autocomplete plugin by Jörn Zaefferer - see http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/
 * jquery.autocomplete.js requires a minor modification for geo_autocomplete to work, as shown in /lib/jquery.autocomplete_geomod.js
 * 
 */
;(function($) {

$.fn.extend({
	geo_autocomplete: function(_geocoder, _options) {
		options = $.extend({}, $.Autocompleter.defaults, {
			geocoder: _geocoder,
			mapwidth: 100,
			mapheight: 100,
			maptype: 'terrain',
			mapkey: 'ABQIAAAAbnvDoAoYOSW2iqoXiGTpYBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxQNumU68AwGqjbSNF9YO8NokKst8w', // localhost
			mapsensor: false,
			parse: function(_results, _status, _query) {
				var _parsed = [];
				if (_results && _status && _status == 'OK') {
					$.each(_results, function(_key, _result) {
						if (_result.geometry && _result.geometry.viewport) {
                            _place = _result.formatted_address;
							_parsed.push({
								data: _result, 
								value: _place,
								result: _place
							});
						}
					});
				}
				return _parsed;
			},
			formatItem: function(_data) {
                if (_data.value == null)
                    return false;

                var parts = [];
			    if (_data.type == "cornerCase")
			    {
			        parts.push(_data.value.title);
			    }
                else
                if (_data.type == "geo")
                {
                    var addressComponents = $.Enumerable.From(_data.value.data.address_components);

                    var types = new Array(
                        "route",
                        "postal_code",
                        "locality",
                        "administrative_area_level_1",
                        "country"
                    );

                    for (var i=0; i<types.length; ++i)
                    {
                        var part = $.Enumerable.From(addressComponents).Where(function(t){
                            return ($.Enumerable.From(t.types).Any(function (x) { 
                                return x == types[i]; 
                            }));
                        }).FirstOrDefault();

                        if (part)
                            parts.push(part.long_name);
                    }                                       
                }
                else
                {
                    parts = new Array(
                        _data.value.Caption,
                        _data.value.Address.PostalCode,
                        _data.value.Address.City,
                        _data.value.Address.State,
                        _data.value.Address.Country
                        );
                                        
                }

                var result = "";
                for (var i=0; i<parts.length; ++i)
                {
                    if (parts[i])
                    {
                        if (result.length > 0)
                        {
                            result += ", ";
                        }
                        result += htmlDecode(parts[i]);
                    }
                }
                _data.formatted = result;
                return '<span><a href="#">' + result + '</a></span>';
			}
		}, _options);
		
		// if highlight is set to false, replace it with a do-nothing function
		options.highlight = options.highlight || function(value) { return value; };
		
		// if the formatMatch option is not specified, then use formatItem for backwards compatibility
		options.formatMatch = options.formatMatch || options.formatItem;

		return this.each(function() {
			new $.Autocompleter(this, options);
		});
	}
});

})(jQuery);
