diff -rup ./location_autocomplete.js ../location-new/location_autocomplete.js
--- ./location_autocomplete.js	2008-12-02 23:50:21.000000000 +0100
+++ ../location-new/location_autocomplete.js	2010-07-08 20:01:02.000000000 +0200
@@ -31,4 +31,31 @@ Drupal.behaviors.location = function(con
       Drupal.behaviors.autocomplete(document);
     }
   }).addClass('location-processed');
+  $('select.location_auto_city:not(.location-processed)', context).change(function(e) {
+    var obj = this;
+    var input = null;
+    var result = this.className.match(/(location_auto_join_[^ ]*)/);
+    if (result) {
+      input = $('.location_auto_city.' + result)
+    }
+    else {
+      // No joining class found, fallback to searching the immediate area.
+      input = $('.location_auto_city', $(this).parents('fieldset:first, .views-exposed-form:first'))
+    }
+
+    if (input && input.length) {
+      //Unbind events on province field and empty its value
+      input.unbind().val('');
+      input.each(function(i) {
+        //Get the (hidden) *-autocomplete input element
+        var input_autocomplete = $('#' + this.id + '-autocomplete');
+        // Update autocomplete url
+        input_autocomplete.val(input_autocomplete.val().substr(0, input_autocomplete.val().lastIndexOf('/') + 1) + $(obj).val());
+        // Mark as not processed.
+        input_autocomplete.removeClass('autocomplete-processed');
+      });
+      // Reprocess.
+      Drupal.behaviors.autocomplete(document);
+    }
+  }).addClass('location-processed');  
 };
diff -rup ./location.inc ../location-new/location.inc
--- ./location.inc	2010-07-04 16:10:07.000000000 +0200
+++ ../location-new/location.inc	2010-07-08 19:38:05.000000000 +0200
@@ -17,6 +17,36 @@
 
 include_once drupal_get_path('module', 'location') .'/earth.inc';
 
+
+/**
+ * Fetch the cities for a country.
+ */
+function location_get_cities($country = 'us') {
+  static $cities = array();
+  location_standardize_country_code($country);
+  if (isset($cities[$country])) {
+    return $cities[$country];
+  }
+  if ($cache = cache_get("cities:$country", 'cache_location')) {
+    $cities[$country] = $cache->data;
+    return $cities[$country];
+  }
+  location_load_country($country);
+
+  // Get all of the cities from the zipcodes table.
+  $cities_array = array();
+  $result = db_query("
+    SELECT DISTINCT CONCAT(city, ',', state) AS city FROM {zipcodes}
+  ");
+  while ($current_city = db_fetch_array($result)) {
+    $cities_array[$current_city['city']] = $current_city['city'];
+  }
+
+  $cities[$country] = $cities_array;
+  cache_set("cities:$country", $cities[$country], 'cache_location');
+  return $cities[$country];
+}
+
 /**
  * Get a deep-link to a mapping service such as Yahoo! Maps or MapPoint given an location.  The
  * call is delegated based on the 'country' value in the $location parameter.
Seulement dans ../location-new/: location.inc.orig
diff -rup ./location.module ../location-new/location.module
--- ./location.module	2010-07-04 14:27:36.000000000 +0200
+++ ../location-new/location.module	2010-07-08 19:58:20.000000000 +0200
@@ -33,7 +33,12 @@ function location_menu() {
     'page callback' => '_location_autocomplete',
     'type' => MENU_CALLBACK,
   );
-
+  $items['location/autocomplete_city'] = array(
+    'access arguments' => array('access content'),
+    'page callback' => '_location_autocomplete_city',
+    'file' => 'location.inc',
+    'type' => MENU_CALLBACK,
+  );
   $items['admin/settings/location'] = array(
     'title' => 'Location',
     'description' => 'Settings for Location module',
@@ -631,9 +636,12 @@ function location_locationapi(&$obj, $op
           );
 
         case 'city':
+          drupal_add_js(drupal_get_path('module', 'location') .'/location_autocomplete.js');
+          $country = $a5['country'] ? $a5['country'] : variable_get('location_default_country', 'us');
           return array(
             '#type'           => 'textfield',
             '#title'          => t('City'),
+            '#autocomplete_path' => 'location/autocomplete_city/'. $country,
             '#default_value'  => $obj,
             '#size'           => 64,
             '#maxlength'      => 255,
@@ -729,6 +737,48 @@ function location_locationapi(&$obj, $op
 
   }
 }
+ 
+/**
+ * Create a list of cities from a given country.
+ *
+ * @param $country
+ *   String. The country code
+ * @param $string
+ *   String (optional). The city name typed by user
+ * @return
+ *   Javascript array. List of cities
+ */
+function _location_autocomplete_city($country, $string = '') {
+  $counter = 0;
+  $string   = strtolower($string);
+  $string   = '/^'. $string .'/';
+  $matches  = array();
+
+  if (strpos($country, ',') !== FALSE) {
+    // Multiple countries specified.
+    $cities = array();
+    $country = explode(',', $country);
+    foreach($country as $c) {
+      $cities = $cities + location_get_cities($c);
+    }
+  }
+  else {
+    $cities = location_get_cities($country);
+  }
+
+  if (!empty($cities)) {
+    while (list($code, $name) = each($cities)) {
+      if ($counter < 5) {
+        if (preg_match($string, strtolower($name))) {
+          $matches[$name] = $name;
+          ++$counter;
+        }
+      }
+    }
+  }
+  echo drupal_to_js($matches);
+  return;
+}
 
 function location_geocoding_parameters_page($country_iso, $service) {
   drupal_set_title(t('Configure parameters for %service geocoding', array('%service' => $service)));
