Index: components/date.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/webform/components/date.inc,v
retrieving revision 1.15.2.18
diff -u -F^f -r1.15.2.18 date.inc
--- components/date.inc	4 Mar 2009 05:05:12 -0000	1.15.2.18
+++ components/date.inc	5 Aug 2009 00:24:52 -0000
@@ -115,10 +115,18 @@ function _webform_render_date($component
     '#process' => array('webform_expand_date'),
     '#element_validate' => array('webform_validate_date'),
   );
+  if (module_exists('date_popup')) {
+    $form_item['#type'] = 'date_popup';
+    // Get the system date format.
+    $date_format = variable_get('date_format_short', 'm/d/Y - H:i');
+    // Remove anything not date-related. This prevents date_popup from showing a time picker.
+    $date_format = date_limit_format($date_format, array('year', 'month', 'day'));
+    $form_item['#date_format'] = $date_format;
+  }
   return $form_item;
 }
 
-function webform_expand_date($element) {
+function webform_expand_date($element, $edit, &$form_state, $form) {
   $component = $element['#webform_component'];
 
   // Set defaults according to existing #default_value (set by Form API)
@@ -171,40 +179,57 @@ function webform_expand_date($element) {
     );
   }
 
-  // Let Drupal do it's normal expansion.
-  $element = expand_date($element);
+  if ($element['#type'] == 'date_popup') {
+    if (isset($default_values['month']) && intval($default_values['month'])) {
+      $date_value = mktime(0, 0, 0, $default_values['month'], $default_values['day'], $default_values['year']);
+    }
 
-  // Don't use Drupal's validation though.
-  $element['#element_validate'] = array('webform_validate_date');
+    if ($element['#disabled'] === TRUE) {
+      $element['#type'] = 'textfield';
+      $element['#size'] = 10;
+      $element['#value'] = isset($date_value) ? format_date($date_value, 'custom', 'Y-m-d') : '';
+    }
+    else {
+      if (!is_array($element['#value'])) {
+        $element['#value'] = isset($date_value) ? format_date($date_value, 'custom', 'Y-m-d H:i:s') : '';
+      }
 
-  // Set default values.
-  foreach ($default_values as $type => $value) {
-    switch ($type) {
-      case 'month':
-        $none = t('Month');
-        break;
-      case 'day':
-        $none = t('Day');
-        break;
-      case 'year':
-        $none = t('Year');
-        break;
-    }
-    unset($element[$type]['#value']);
-    $element[$type]['#default_value'] = isset($default_values[$type]) ? $default_values[$type] : NULL;
-    $element[$type]['#options'] = array('' => $none) + $element[$type]['#options'];
-  }
-
-  // Tweak the year field.
-  if ($component['extra']['year_textfield']) {
-    $element['year']['#type'] = 'textfield';
-    $element['year']['#size'] = 5;
-    $element['year']['#maxlength'] = 4;
-    unset($element['year']['#options']);
+      // Let date_popup do its normal expansion.
+      $element = date_popup_process($element, $edit, $form_state, $form);
+  
+      // Set default values.
+      foreach ($default_values as $type => $value) {
+        $element[$type] = array(
+          '#type' => 'value',
+          '#value' => isset($default_values[$type]) ? $default_values[$type] : NULL
+        );
+      }
+    }
   }
-  elseif (is_numeric($component['extra']['year_start']) && is_numeric($component['extra']['year_end'])) {
-    $element['year']['#options'] = array('' => t('Year')) + drupal_map_assoc(range($component['extra']['year_start'], $component['extra']['year_end']));
+  else {
+    // Let Drupal do its normal expansion.
+    $element = expand_date($element);
+  
+    // Set default values.
+    foreach ($default_values as $type => $value) {
+      unset($element[$type]['#value']);
+      $element[$type]['#default_value'] = isset($default_values[$type]) ? $default_values[$type] : NULL;
+      $element[$type]['#options'] = array('' => t(ucfirst($type))) + $element[$type]['#options'];
+    }
+  
+    // Tweak the year field.
+    if ($component['extra']['year_textfield']) {
+      $element['year']['#type'] = 'textfield';
+      $element['year']['#size'] = 5;
+      $element['year']['#maxlength'] = 4;
+      unset($element['year']['#options']);
+    }
+    elseif (is_numeric($component['extra']['year_start']) && is_numeric($component['extra']['year_end'])) {
+      $element['year']['#options'] = array('' => t('Year')) + drupal_map_assoc(range($component['extra']['year_start'], $component['extra']['year_end']));
+    }
   }
+  // Don't use Drupal's validation.
+  $element['#element_validate'] = array('webform_validate_date');
 
   return $element;
 }
@@ -212,11 +237,20 @@ function webform_expand_date($element) {
 /**
  * Element validation for Webform date fields.
  */
-function webform_validate_date($form_item, $form_state) {
+function webform_validate_date($form_item, &$form_state) {
   $component = $form_item['#webform_component'];
   $form_key = $component['form_key'];
   $name = $component['name'];
 
+  if ($form_item['#type'] == 'date_popup') {
+    $valid_date = date_popup_input_value($form_item);
+    $date_array = empty($valid_date) ? array() : date_convert($valid_date, DATE_DATETIME, DATE_ARRAY);
+    foreach (array('day', 'month', 'year') as $field_type) {
+      $form_item[$field_type]['#value'] = isset($date_array[$field_type]) ? $date_array[$field_type] : '';
+      form_set_value($form_item[$field_type], $form_item[$field_type]['#value'], $form_state);
+    }
+  }
+ 
   // Check if the user filled the required fields.
   foreach (array('day', 'month', 'year') as $field_type) {
     if (!is_numeric($form_item[$field_type]['#value']) && $form_item['#required']) {
