function breakout_address(response) {
    
    if (response.Placemark[0]) {
        // Google returned an array of placemarks.
        // Let's find the best one
        var place = response.Placemark[0];
        var counter = 0;
        
        while (!place.AddressDetails || !place.AddressDetails.Country || !place.AddressDetails.Country.CountryNameCode || !place.address || place.address.match(/[^[A-Za-z0-9 ,()\\-\\/\\\#&.:\'"]/)) {
            if (!response.Placemark[(counter + 1)]) {
                place = response.Placemark[0];
                break;
            }
            place = response.Placemark[++counter];
        }
    } else {
        // Google only returned one placemark
        var place = response.Placemark
    }
    
    
    var accuracy = place.AddressDetails.Accuracy;
    
    var address=[];
    address['zip'] = ''; // I do not know what the story is, but if we don't clear this out, it returns a js function
    address["lat"]=place.Point.coordinates[1];
    address["lng"]=place.Point.coordinates[0];
    address["fullText"]=place.address;
    if (place.AddressDetails.Country) {
        address["country"] = place.AddressDetails.Country.CountryNameCode;
    }
    
    if (accuracy == 9 && place.AddressDetails.Country) {
        if (place.AddressDetails.Country.Premise) {
            address['city'] = place.AddressDetails.Country.Premise.PremiseName;
        } else if (place.AddressDetails.Country.AddressLine) {
            if (place.AddressDetails.Country.AddressLine['0']) {
                address['city'] = place.AddressDetails.Country.AddressLine['0'];
            } else {
                address['city'] = place.AddressDetails.Country.AddressLine;
            }
        }
    } else if (accuracy == 9 && place.AddressDetails.AddressLine) {
        if (place.AddressDetails.AddressLine['0']) {
            address['city'] = place.AddressDetails.AddressLine['0'];
        } else {
            address['city'] = place.AddressDetails.AddressLine;
        }
    } else if (place.AddressDetails.Country) {
        if (place.AddressDetails.Country.AdministrativeArea) {
            address['state'] = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;

            if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea) {
                if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality)  {
                    address['city'] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;

                    if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode) {
                        address['zip'] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
                    }

                    if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare){
                        address['house_address'] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
                    }
                } else {
                    address['city'] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
                    if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Thoroughfare){
                        address['house_address'] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Thoroughfare.ThoroughfareName;
                    }
                    if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.PostalCode){
                        address['zip'] = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.PostalCode.PostalCodeNumber;
                    }
                }
            } else if  (place.AddressDetails.Country.AdministrativeArea.Locality) {
                if (place.AddressDetails.Country.AdministrativeArea.Locality.DependentLocality) {
                    address['city'] = place.AddressDetails.Country.AdministrativeArea.Locality.DependentLocality.DependentLocalityName;
                } else {
                    address['city'] = place.AddressDetails.Country.AdministrativeArea.Locality.LocalityName;
                }
                
                if (place.AddressDetails.Country.AdministrativeArea.Locality.PostalCode) {
                    address['zip'] = place.AddressDetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber;
                }
                if (place.AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare){
                    address['house_address'] = place.AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
                }
            } else if (place.AddressDetails.Country.AdministrativeArea.PostalCode) {
                address['zip'] = place.AddressDetails.Country.AdministrativeArea.PostalCode.PostalCodeNumber;
            }
        } else if (place.AddressDetails.Country.SubAdministrativeArea) {
            if (place.AddressDetails.Country.SubAdministrativeArea.Locality) {
                address['city'] = place.AddressDetails.Country.SubAdministrativeArea.Locality.LocalityName;
                if (place.AddressDetails.Country.SubAdministrativeArea.Locality.Thoroughfare) {
                    address['house_address'] = place.AddressDetails.Country.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
                }
            }
        }
    }
    
    // If for some reason Google is returning the state completely spelled out, convert it to the abbreviation.
	if ( address['country'] && address['state'] && ( address[ 'country' ] == 'US' || address[ 'country' ] == 'CA' ) && ( address[ 'state' ].length > 2 ) )  {
        if ( knownStates( address[ 'state' ] ) )
            address[ 'state' ] = knownStates( address[ 'state' ] );
    }
    
    return address;
}

function knownStates( state ) {
    
    state = state.toUpperCase();
    
    var USStateMapping = new Array();
    
    USStateMapping['ALABAMA'] = 'AL';
    USStateMapping["ALASKA"] = "AK";
    USStateMapping["ARIZONA"] = 'AZ';
    USStateMapping["ARKANSAS"] = "AR";
    USStateMapping["CALIFORNIA"] = "CA";
    USStateMapping["COLORADO"] = "CO";
    USStateMapping["CONNECTICUT"] = "CT";
    USStateMapping["DISTRICT OF COLUMBIA"] = "DC";
    USStateMapping["DELAWARE"] = "DE";
    USStateMapping["FLORIDA"] = "FL";
    USStateMapping["GEORGIA"] = "GA";
    USStateMapping["HAWAII"] = "HI";
    USStateMapping["IDAHO"] = "ID";
    USStateMapping["ILLINOIS"] = "IL";
    USStateMapping["INDIANA"] = "IN";
    USStateMapping["IOWA"] = "IA";
    USStateMapping["KANSAS"] = "KS";
    USStateMapping["KENTUCKY"] = "KY";
    USStateMapping["LOUISIANA"] = "LA";
    USStateMapping["MAINE"] = "ME";
    USStateMapping["MARYLAND"] = "MD";
    USStateMapping["MASSACHUSETTS"] = "MA";
    USStateMapping["MICHIGAN"] = "MI";
    USStateMapping["MINNESOTA"] = "MN";
    USStateMapping["MISSISSIPPI"] = "MS";
    USStateMapping["MISSOURI"] = "MO";
    USStateMapping['MONTANA'] = 'MT';
    USStateMapping['NEBRASKA'] = 'NE';
    USStateMapping['NEVADA'] = 'NV';
    USStateMapping['NEW HAMPSHIRE'] = 'NH';
    USStateMapping['NEW JERSEY'] = 'NJ';
    USStateMapping['NEW MEXICO'] = 'NM';
    USStateMapping['NEW YORK'] = 'NY';
    USStateMapping['NORTH CAROLINA'] = 'NC';
    USStateMapping['NORTH DAKOTA'] = 'ND';
    USStateMapping['OHIO'] = 'OH';
    USStateMapping['OKLAMOHA'] = 'OK';
    USStateMapping['OREGON'] = 'OR';
    USStateMapping['PENNSYLVANIA'] = 'PA';
    USStateMapping['RHODE ISLAND'] = 'RI';
    USStateMapping['SOUTH CAROLINA'] = 'SC';
    USStateMapping['SOUTH DAKOTA'] = 'SD';
    USStateMapping['TENNESSEE'] = 'TN';
    USStateMapping['TEXAS'] = 'TX';
    USStateMapping['UTAH'] = 'UT';
    USStateMapping['VERMONT'] = 'VT';
    USStateMapping['VIRGINIA'] = 'VA';
    USStateMapping['WASHINGTON'] = 'WA';
    USStateMapping['WEST VIRGINIA'] = 'WV';
    USStateMapping['WISCONSIN'] = 'WI';
    USStateMapping['WYOMING'] = 'WY';
    
    USStateMapping['N CAROLINA'] = 'NC';
    USStateMapping['S CAROLINA'] = 'SC';
    USStateMapping['DC'] = 'DC';
    USStateMapping['PUERTO RICO'] = 'PR';
    USStateMapping['RHODE ISL'] = 'RI';
    USStateMapping['N DAKOTA'] = 'ND';
    USStateMapping['S DAKOTA'] = 'SD';
    USStateMapping['MASS'] = 'MA';
    USStateMapping['W VIRGINIA'] = 'WV';
    USStateMapping['VIRGIN ISLANDS'] = 'VI';
    USStateMapping['AMERICAN SAMOA'] = 'AS';
    USStateMapping['GUAM'] = 'GU';
    USStateMapping['MARSHALL ISLANDS'] = 'MH';
    USStateMapping['NORTHERN MARIANA ISLANDS'] = 'MP';
    USStateMapping['FEDERATED STATES OF MICRONESIA'] = 'FM';
    
    for (var longName in USStateMapping) {
        if (state == longName) {
            return USStateMapping[longName];
        } else if (state == USStateMapping[longName]) {
            return USStateMapping[longName];
        }
    }
    
    var CAProvinceMapping = new Array();
    
    CAProvinceMapping['ALBERTA'] = "AB";
    CAProvinceMapping['BRITISH COLUMBIA'] = "BC";
    CAProvinceMapping['MANITOBA'] = "MB";
    CAProvinceMapping['NEW BRUNSWICK'] = "NB";
    CAProvinceMapping['NEWFOUNDLAND AND LABRADOR'] = "NL";
    CAProvinceMapping['NORTHWEST TERRITORIES'] = "NT";
    CAProvinceMapping['NOVA SCOTIA'] = "NS";
    CAProvinceMapping['NUNAVUT TERRITORY'] = "NU";
    CAProvinceMapping['NUNAVUT'] = "NU";
    CAProvinceMapping['ONTARIO'] = "ON";
    CAProvinceMapping['PRINCE EDWARD ISLAND'] = "PE";
    CAProvinceMapping['PRINCE EDWARD ISL'] = "PE";
    CAProvinceMapping['QUEBEC'] = "QC";
    CAProvinceMapping["SASKATCHEWAN"] = "SK";
    CAProvinceMapping["YUKON"] = "YT";
    
    for (var longName in CAProvinceMapping) {
        if (state == longName) {
            return CAProvinceMapping[longName];
        } else if (state == CAProvinceMapping[longName]) {
            return CAProvinceMapping[longName];
        }
    }
    
    return false;
}
