Index: modules/geocode_widget/geocode_widget.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/geocode/modules/geocode_widget/geocode_widget.module,v
retrieving revision 1.9
diff -u -p -r1.9 geocode_widget.module
--- modules/geocode_widget/geocode_widget.module	28 Jan 2010 02:02:22 -0000	1.9
+++ modules/geocode_widget/geocode_widget.module	7 Apr 2010 12:17:36 -0000
@@ -78,29 +78,68 @@ function geocode_widget_set_form_value($
 
     if (!isset($form_state['storage']['geocode'])) return $form;
 
-    foreach ($form_state['storage']['geocode'] as $key => $element) {
+    $url_string = array();
+    $url_params = array();
+    $field_info = array();
 
+    foreach ($form_state['storage']['geocode'] as $key => $element) {
       foreach ($element['#geocode_fields'] as $field => $info) {
 
         if (!$info['status']) continue;
 
+        $field_info = $info;
+
         $type = 'wkt:'. $element['#geocode_fields'][$field]['return'];
 
         $values = array();
     
         if (is_array($form_state['values'][$field])) {
           foreach ($form_state['values'][$field] as $delta => $value) {
-            if ($geo = geocode($info['handler'], $value, $type, $info['options'])) {
-              $values[$delta]['geo'] = $geo;
+            if ($info['handler'] == 'geocode_google') {
+              if ($value['value']) {
+                $url_params[$info['type']] .= $value['value'] . ',';
+              }
+            }
+            else {
+              $url_string = $value;
             }
           }
         }
+      }
 
-        if ($values) {
-          // First matched field wins.
-          break;
+      // Building the url string
+      if (isset($url_params['generic'])) {
+        if ($field_info['handler'] == 'geocode_google') {
+          $url_string['value'] = $url_params['generic'];
+          $url_string['value'] = substr($url_string['value'], 0, -1);
         }
       }
+      else {
+        if (isset($url_params['street'])) {
+          $url_string['value'] .= $url_params['street'];
+        }
+
+        if (isset($url_params['str_number'])) {
+          $url_string['value'] .= $url_params['str_number'];
+        }
+
+        if (isset($url_params['zipcode'])) {
+          $url_string['value'] .= $url_params['zipcode'];
+        }
+
+        if (isset($url_params['city'])) {
+          $url_string['value'] .= $url_params['city'];
+        }
+
+        if (isset($url_params['country'])) {
+          $url_string['value'] .= $url_params['country'];
+        }
+
+        $url_string['value'] = substr($url_string['value'], 0, -1);
+      }
+      
+      $values[$delta]['geo'] = geocode($field_info['handler'], $url_string, $type, $field_info['options']);
+
       // Set the resulting value, which may be empty if there were no results.
       form_set_value($element, $values, $form_state);
     }
Index: modules/geocode_widget/includes/geocode_widget.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/geocode/modules/geocode_widget/includes/geocode_widget.admin.inc,v
retrieving revision 1.4
diff -u -p -r1.4 geocode_widget.admin.inc
--- modules/geocode_widget/includes/geocode_widget.admin.inc	22 Dec 2009 19:43:37 -0000	1.4
+++ modules/geocode_widget/includes/geocode_widget.admin.inc	7 Apr 2010 12:17:36 -0000
@@ -31,6 +31,20 @@ function geocode_widget_admin_widget_set
             // $return[$handler] = $info['return types'][$geo_type];
             foreach ($info['return types']['geo'] as $type) $return[$type] = $type;
           }
+          
+          $form['geocode_fields'][$name]['type'] = array(
+            '#type' => 'select',
+            '#title' => t('Field type'),
+            '#options' => array(
+              'generic' => t('Generic'),
+              'street' => t('Street'),
+              'str_number' => t('Street number'),
+              'zipcode' => t('Zip code'),
+              'city' => t('City'),
+              'country' => t('Country'),
+            ),
+            '#default_value' => $widget['geocode_fields'][$name]['type'],
+          );
 
           $form['geocode_fields'][$name]['handler'] = array(
             '#type' => 'select',
Index: modules/geocode_widget/theme/geocode_widget.theme.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/geocode/modules/geocode_widget/theme/geocode_widget.theme.inc,v
retrieving revision 1.1
diff -u -p -r1.1 geocode_widget.theme.inc
--- modules/geocode_widget/theme/geocode_widget.theme.inc	4 Nov 2009 20:44:15 -0000	1.1
+++ modules/geocode_widget/theme/geocode_widget.theme.inc	7 Apr 2010 12:17:36 -0000
@@ -12,11 +12,14 @@ function geocode_widget_theme_theme() {
 }
 
 function theme_geocode_widget_settings_form(&$form) {
-  $hdrs = array('', t('Geocode handler'), t('Return value'));
+  $hdrs = array('', t('Field type'), t('Geocode handler'), t('Return value'));
   foreach (element_children($form) as $key) {
     $row = array();
     $row[] = drupal_render($form[$key]['status']);
 
+    unset($form[$key]['type']['#title']);
+    $row[] = drupal_render($form[$key]['type']);
+
     unset($form[$key]['handler']['#title']);
     $row[] = drupal_render($form[$key]['handler']);
 
