/*
 Google Geocoder plugin for jQuery
 Version: 1.6

 Copyright (c) 2009 VolunteerMatch

 Tested with: jQuery 1.3.2+
 Depends on Google Maps libary being pre-loaded.

 ------------------------------------------------------*/
(function(a){function k(a,b){this.latitude=0;this.longitude=0;this.accuracy=0;this.country=null;this.region=null;this.city=null;this.postalCode=null;this.street=null;this.address=null;this.placemark=a;if(a){if(a.Point&&a.Point.coordinates){this.latitude=a.Point.coordinates[1];this.longitude=a.Point.coordinates[0]}var c=a.AddressDetails;if(c){this.accuracy=c.Accuracy;if(c.Country){c=c.Country;this.country=c.CountryNameCode}if(c.AdministrativeArea){c=c.AdministrativeArea;this.region=c.AdministrativeAreaName}if(c.SubAdministrativeArea){c=c.SubAdministrativeArea}if(c.Locality){c=c.Locality;this.city=c.LocalityName;if(c.PostalCode){this.postalCode=c.PostalCode.PostalCodeNumber}if(c.Thoroughfare){this.street=c.Thoroughfare.ThoroughfareName}}if(c.DependentLocality){c=c.DependentLocality;this.city=c.DependentLocalityName;if(c.PostalCode){this.postalCode=c.PostalCode.PostalCodeNumber}if(c.Thoroughfare){this.street=c.Thoroughfare.ThoroughfareName}}this.buildAddress(b)}}}var b="gcFlag",c="gcFields",d="gcFieldValue",e="gcWantsSubmission",f="gcNeedsGeocoding",g="gcIsGeocoding",h=null,i={AD:"Andorra",AE:"United Arab Emirates",AF:"Afghanistan",AG:"Antigua and Barbuda",AI:"Anguilla",AL:"Albania",AM:"Armenia",AN:"Netherlands Antilles",AO:"Angola",AQ:"Antarctica",AR:"Argentina",AS:"American Samoa",AT:"Austria",AU:"Australia",AW:"Aruba",AX:"åland Islands",AZ:"Azerbaijan",BA:"Bosnia and Herzegovina",BB:"Barbados",BD:"Bangladesh",BE:"Belgium",BF:"Burkina Faso",BG:"Bulgaria",BH:"Bahrain",BI:"Burundi",BJ:"Benin",BL:"Saint BarthÉlemy",BM:"Bermuda",BN:"Brunei",BO:"Bolivia",BR:"Brazil",BS:"Bahamas",BT:"Bhutan",BV:"Bouvet Island",BW:"Botswana",BY:"Belarus",BZ:"Belize",CA:"Canada",CC:"Cocos Islands",CD:"Democratic Republic of the Congo",CF:"Central African Republic",CG:"Congo",CH:"Switzerland",CI:"Cöte d'Ivoire",CK:"Cook Islands",CL:"Chile",CM:"Cameroon",CN:"China",CO:"Colombia",CR:"Costa Rica",CU:"Cuba",CV:"Cape Verde",CX:"Christmas Island",CY:"Cyprus",CZ:"Czech Republic",DE:"Germany",DJ:"Djibouti",DK:"Denmark",DM:"Dominica",DO:"Dominican Republic",DZ:"Algeria",EC:"Ecuador",EE:"Estonia",EG:"Egypt",EH:"Western Sahara",ER:"Eritrea",ES:"Spain",ET:"Ethiopia",FI:"Finland",FJ:"Fiji",FK:"Falkland Islands",FM:"Federated States of Micronesia",FO:"Faroe Islands",FR:"France",GA:"Gabon",GB:"United Kingdom",GD:"Grenada",GE:"Georgia",GF:"French Guiana",GG:"Guernsey",GH:"Ghana",GI:"Gibraltar",GL:"Greenland",GM:"Gambia",GN:"Guinea",GP:"Guadeloupe",GQ:"Equatorial Guinea",GR:"Greece",GS:"South Georgia and the South Sandwich Islands",GT:"Guatemala",GU:"Guam",GW:"Guinea-Bissau",GY:"Guyana",HK:"Hong Kong",HM:"Heard Island and McDonald Islands",HN:"Honduras",HR:"Croatia",HT:"Haiti",HU:"Hungary",ID:"Indonesia",IE:"Ireland",IL:"Israel",IM:"Isle of Man",IN:"India",IO:"British Indian Ocean Territory",IQ:"Iraq",IR:"Iran",IS:"Iceland",IT:"Italy",JE:"Jersey",JM:"Jamaica",JO:"Jordan",JP:"Japan",KE:"Kenya",KG:"Kyrgyzstan",KH:"Cambodia",KI:"Kiribati",KM:"Comoros",KN:"Saint Kitts and Nevis",KP:"North Korea",KR:"South Korea",KW:"Kuwait",KY:"Cayman Islands",KZ:"Kazakhstan",LA:"Laos",LB:"Lebanon",LC:"Saint Lucia",LI:"Liechtenstein",LK:"Sri Lanka",LR:"Liberia",LS:"Lesotho",LT:"Lithuania",LU:"Luxembourg",LV:"Latvia",LY:"Libya",MA:"Morocco",MC:"Monaco",MD:"Moldova",ME:"Montenegro",MF:"Saint Martin",MG:"Madagascar",MH:"Marshall Islands",MK:"Macedonia",ML:"Mali",MM:"Myanmar",MN:"Mongolia",MO:"Macao",MP:"Northern Mariana Islands",MQ:"Martinique",MR:"Mauritania",MS:"Montserrat",MT:"Malta",MU:"Mauritius",MV:"Maldives",MW:"Malawi",MX:"Mexico",MY:"Malaysia",MZ:"Mozambique",NA:"Namibia",NC:"New Caledonia",NE:"Niger",NF:"Norfolk Island",NG:"Nigeria",NI:"Nicaragua",NL:"Netherlands",NO:"Norway",NP:"Nepal",NR:"Nauru",NU:"Niue",NZ:"New Zealand",OM:"Oman",PA:"Panama",PE:"Peru",PF:"French Polynesia",PG:"Papua New Guinea",PH:"Philippines",PK:"Pakistan",PL:"Poland",PM:"Saint Pierre and Miquelon",PN:"Pitcairn",PR:"Puerto Rico",PS:"Palestinian Territory",PT:"Portugal",PW:"Palau",PY:"Paraguay",QA:"Qatar",RE:"Réunion",RO:"Romania",RS:"Serbia",RU:"Russian Federation",RW:"Rwanda",SA:"Saudi Arabia",SB:"Solomon Islands",SC:"Seychelles",SD:"Sudan",SE:"Sweden",SG:"Singapore",SH:"Saint Helena",SI:"Slovenia",SJ:"Svalbard and Jan Mayen",SK:"Slovakia",SL:"Sierra Leone",SM:"San Marino",SN:"Senegal",SO:"Somalia",SR:"Suriname",ST:"Sao Tome and Principe",SV:"El Salvador",SY:"Syrian Arab Republic",SZ:"Swaziland",TC:"Turks and Caicos Islands",TD:"Chad",TF:"French Southern Territories",TG:"Togo",TH:"Thailand",TJ:"Tajikistan",TK:"Tokelau",TL:"Timor-Leste",TM:"Turkmenistan",TN:"Tunisia",TO:"Tonga",TR:"Turkey",TT:"Trinidad and Tobago",TV:"Tuvalu",TW:"Taiwan",TZ:"Tanzania",UA:"Ukraine",UG:"Uganda",UM:"United States Minor Outlying Islands",US:"United States",UY:"Uruguay",UZ:"Uzbekistan",VA:"Holy See",VC:"Saint Vincent and the Grenadines",VE:"Venezuela",VG:"British Virgin Islands",VI:"U.S. Virgin Islands",VN:"Vietnam",VU:"Vanuatu",WF:"Wallis and Futuna",WS:"Samoa",YE:"Yemen",YT:"Mayotte",ZA:"South Africa",ZM:"Zambia",ZW:"Zimbabwe"},j={US:{AL:"Alabama",AK:"Alaska",AS:"American Samoa",AZ:"Arizona",AR:"Arkansas",CA:"California",CO:"Colorado",CT:"Connecticut",DE:"Delaware",DC:"District of Columbia",FM:"Federated States of Micronesia",FL:"Florida",GA:"Georgia",GU:"Guam",HI:"Hawaii",ID:"Idaho",IL:"Illinois",IN:"Indiana",IA:"Iowa",KS:"Kansas",KY:"Kentucky",LA:"Louisiana",ME:"Maine",MH:"Marshall Islands",MD:"Maryland",MA:"Massachusetts",MI:"Michigan",MN:"Minnesota",MS:"Mississippi",MO:"Missouri",MT:"Montana",NE:"Nebraska",NV:"Nevada",NH:"New Hampshire",NJ:"New Jersey",NM:"New Mexico",NY:"New York",NC:"North Carolina",ND:"North Dakota",MP:"Northern Mariana Islands",OH:"Ohio",OK:"Oklahoma",OR:"Oregon",PW:"Palau",PA:"Pennsylvania",PR:"Puerto Rico",RI:"Rhode Island",SC:"South Carolina",SD:"South Dakota",TN:"Tennessee",TX:"Texas",UT:"Utah",VT:"Vermont",VI:"Virgin Islands",VA:"Virginia",WA:"Washington",WV:"West Virginia",WI:"Wisconsin",WY:"Wyoming"}};k.prototype.buildAddress=function(b){var c=this.address,d,e;if(c===null){if(this.street!==null){c=this.street}if(this.city!==null){c=c===null?this.city:c+", "+this.city}if(this.region!==null){d=this.region;if(c===null||this.street===null){if(b&&b.mapRegion&&j[this.country]&&j[this.country][this.region]){d=j[this.country][this.region]}}c=c===null?d:c+", "+d}if(this.postalCode!==null){c=c===null?this.postalCode:c+", "+this.postalCode}if(this.country!==null){e=this.country;if(b&&b.mapCountry&&i[this.country]){e=i[this.country]}if(c!==null){if(b&&a.inArray(this.country,b.implicitCountries)===-1){c=c+", "+e}}else{c=e}}this.address=c}return c};k.prototype.isValid=function(b){var c=true;if(this.address===null){c=false}if(c&&this.country&&b.countries.length>0){c=a.inArray(this.country.toUpperCase(),b.countries)!==-1}return c};k.prototype.compareTo=function(a){if(this.country!==a.country){return this.country<a.country?-1:1}return this.address<a.address?-1:this.address===a.address?0:1};var l=function(b,c){var d=[],e=[];a.each(b,function(){if(this&&this.AddressDetails){var b=new k(this,c);if(b.isValid(c)){if(a.inArray(b.address,e)===-1){d.push(b);e.push(b.address)}}}});d=m(d);d=n(d);d.sort(function(a,b){return a.compareTo(b)});return d};var m=function(b){if(b.length>0){var c=[];var d=b[0];var e=b[0].country;var f=false;a.each(b,function(){if(this&&this.country&&(e!=this.country||this.country=="US")){f=true;return false}if(d.accuracy<this.accuracy){d=this}});if(f){return b}c.push(d);return c}else{return b}};var n=function(b){if(b.length>0){var c=[];var d=b[0];var e=b[0].region;var f=false;a.each(b,function(){if(this&&this.region&&(e!=this.region||this.country!="US")){f=true;return false}if(d.accuracy<this.accuracy&&this.accuracy<=5){d=this}});if(f){return b}c.push(d);return c}else{return b}};var o=function(b,c,d,h){var i=function(c){if(!a(c.target).hasClass("disambiguation")){a(document).unbind("keypress",i);a(document).unbind("mousedown",i);a(".disambiguation").remove();b.data(f,1);b.data(g,0);var d=b[0].form;if(d){a(d).data(e,0)}}};var j=a(document.createElement("div")),k=b.position();a.each(c,function(){var c=document.createElement("div");c.mark=this;a(c).text(this.address).addClass("disambiguationLink").bind("click",function(){b.val(a(this).text());b.data(g,0);if(h&&h.choiceCallback){h.choiceCallback(this.mark)}j.remove();if(d){d.submit()}else if(u(b)){a(b[0].form).submit()}});j.append(c)});j.addClass("disambiguation");j.css({left:k.left,top:k.top+b.outerHeight(),width:b.width()});b.after(j);a(document).bind("keypress",i).bind("click",i);j.show()};var p=function(b,d){if(a(b).is("form")){b=a(b);a.each(a(b).data(c),function(){q(this,d,b)})}else{q(b,d)}};var q=function(b,c,d){var e=a(b);if(v(e)){return}e.data(g,1);if(c.baseCountryCode!==null){h.setBaseCountryCode(c.baseCountryCode)}var f=a.trim(e.val());h.getLocations(f,r(e,c,d))};var r=function(a,b,c){return function(d){return s(a,b,c,d)}};var s=function(a,b,c,d){var e=!d?-1:d.Status.code;if(e===500||e===603||e===620){a.data(f,0);a.data(g,0)}else if(e===-1||e!==200){a.data(f,0);a.data(g,0)}else{var h=l(d.Placemark,b);if(h.length<1){a.data(f,0);a.data(g,0)}else if(h.length===1){a.data(f,0);a.data(g,0);a.val(h[0].address);if(b.choiceCallback){b.choiceCallback(h[0])}}else{a.data(f,0);a.data(g,1);b.disambiguationCallback(a,h,c,b)}}if(c){c.submit()}};var t=function(b){var e=false;if(a(b).is("form")){a.each(a(b).data(c),function(){e=t(this);return!e})}else{e=a(b).data(f);if(!e){e=a(b).val()!==a(b).data(d);a(b).data(d,a(b).val())}}return e};var u=function(b){var c=0;if(a(b).is("form")){c=a(b).data(e)}else{var d=a(b)[0].form;if(d){c=a(d).data(e)}}return c===1};var v=function(b){var d=0;if(a(b).is("form")){a.each(a(b).data(c),function(){d+=a(this).data(g)})}else{d=a(b).data(g)}return d!==0};var w=function(h,i){var j=a(h);if(!j.data(b)){j.data(b,1);j.data(f,0);j.data(g,0);j.data(d,j.text());j.change(function(){if(a.trim(a(this).val()).length>1){a(this).data(f,1)}});if(i.onBlur){j.blur(function(){if(t(this)){p(this,i)}})}if(h.form&&i.onSubmit){var k=a(h.form);var l=k.data(c);if(l===undefined){l=[];k.data(c,l);k.submit(function(){if(t(this)){p(this,i);return false}else if(v(this)){a(this).data(e,1);return false}return true})}l.push(h)}}};a.fn.geocodable=function(b){var c=jQuery.extend({disambiguationCallback:o,choiceCallback:null,onSubmit:true,onBlur:true,submitOnFailure:true,countries:["US","PR","GU","VI","MP"],implicitCountries:["US"],baseCountryCode:null,mapCountry:true,mapRegion:true,disambiguate:null},b);if(h===null&&typeof GBrowserIsCompatible!=="undefined"&&GBrowserIsCompatible()){h=new GClientGeocoder}return this.each(function(){var b=a(this);if(h===null||!b.is(":text")||!c.onBlur&&!c.onSubmit){return}w(this,c);if(c.disambiguate){var d=[];for(var e in c.disambiguate){var f=new k;f.address=c.disambiguate[e];d.push(f)}o(b,d)}})}})(jQuery)
