I completely agree with your idea of making it easy for the user and having all address info in 1 single input box. However, each user may input the information somewhat differently, and it will be very hard to come up with an algo that covers every case. The best bet is to see if someone has done this already, and as you mention, google has. Luckily, they have an API for just such a problem.
If you use the Google Maps Geocoder (https://developers.google.com/maps/documentation/geocoding/#GeocodingRequests), you can basically pass it anything that reasonably looks like an address, and it will return a well-structured address result.
Google's example: https://google-developers.appspot.com/maps/documentation/javascript/examples/geocoding-simple
Another Example - looking up the white house: Put this URL in your browser:
http://maps.googleapis.com/maps/api/geocode/json?address=1600%20pennsylvania%20ave%20washongton%20dc&sensor=false (note I intentionally misspelled here to show the API's tolerance).
The API call returns a very useful JSON object:
{
"results" : [
{
"address_components" : [
{
"long_name" : "1600",
"short_name" : "1600",
"types" : [ "street_number" ]
},
{
"long_name" : "Pennsylvania Ave NW",
"short_name" : "Pennsylvania Ave NW",
"types" : [ "route" ]
},
{
"long_name" : "Washington",
"short_name" : "Washington",
"types" : [ "locality", "political" ]
},
{
"long_name" : "District of Columbia",
"short_name" : "DC",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "20502",
"short_name" : "20502",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "1600 Pennsylvania Ave NW, Washington, DC 20502, USA",
"geometry" : {
"location" : {
"lat" : 38.89767770,
"lng" : -77.03651700000002
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 38.89902668029149,
"lng" : -77.03516801970852
},
"southwest" : {
"lat" : 38.89632871970850,
"lng" : -77.03786598029153
}
}
},
"partial_match" : true,
"types" : [ "street_address" ]
},
{
"address_components" : [
{
"long_name" : "1600",
"short_name" : "1600",
"types" : [ "street_number" ]
},
{
"long_name" : "Pennsylvania Ave NW",
"short_name" : "Pennsylvania Ave NW",
"types" : [ "route" ]
},
{
"long_name" : "Washington",
"short_name" : "Washington",
"types" : [ "locality", "political" ]
},
{
"long_name" : "District of Columbia",
"short_name" : "DC",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "20500",
"short_name" : "20500",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "1600 Pennsylvania Ave NW, Washington, DC 20500, USA",
"geometry" : {
"location" : {
"lat" : 38.89871490,
"lng" : -77.03765550
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 38.90006388029150,
"lng" : -77.03630651970849
},
"southwest" : {
"lat" : 38.89736591970851,
"lng" : -77.03900448029150
}
}
},
"partial_match" : true,
"types" : [ "street_address" ]
},
{
"address_components" : [
{
"long_name" : "1600",
"short_name" : "1600",
"types" : [ "street_number" ]
},
{
"long_name" : "Pennsylvania Ave NW",
"short_name" : "Pennsylvania Ave NW",
"types" : [ "route" ]
},
{
"long_name" : "Washington",
"short_name" : "Washington",
"types" : [ "locality", "political" ]
},
{
"long_name" : "District of Columbia",
"short_name" : "DC",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "20004",
"short_name" : "20004",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "1600 Pennsylvania Ave NW, Washington, DC 20004, USA",
"geometry" : {
"location" : {
"lat" : 38.89549710,
"lng" : -77.03008090000002
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 38.89684608029150,
"lng" : -77.02873191970852
},
"southwest" : {
"lat" : 38.89414811970850,
"lng" : -77.03142988029153
}
}
},
"partial_match" : true,
"types" : [ "street_address" ]
},
{
"address_components" : [
{
"long_name" : "1600",
"short_name" : "1600",
"types" : [ "street_number" ]
},
{
"long_name" : "Pennsylvania Ave SE",
"short_name" : "Pennsylvania Ave SE",
"types" : [ "route" ]
},
{
"long_name" : "Hill East",
"short_name" : "Hill East",
"types" : [ "neighborhood", "political" ]
},
{
"long_name" : "Washington",
"short_name" : "Washington",
"types" : [ "locality", "political" ]
},
{
"long_name" : "District of Columbia",
"short_name" : "DC",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "20003",
"short_name" : "20003",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "1600 Pennsylvania Ave SE, Washington, DC 20003, USA",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 38.87865290,
"lng" : -76.98170180
},
"southwest" : {
"lat" : 38.87865220,
"lng" : -76.98170229999999
}
},
"location" : {
"lat" : 38.87865290,
"lng" : -76.98170180
},
"location_type" : "RANGE_INTERPOLATED",
"viewport" : {
"northeast" : {
"lat" : 38.88000153029150,
"lng" : -76.98035306970850
},
"southwest" : {
"lat" : 38.87730356970850,
"lng" : -76.98305103029151
}
}
},
"partial_match" : true,
"types" : [ "street_address" ]
}
],
"status" : "OK"
}