--- webform/components/date.inc.orig 2008-09-24 14:21:01.000000000 -0400 +++ webform/components/date.inc 2008-09-25 16:06:30.000000000 -0400 @@ -87,10 +87,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) @@ -143,29 +151,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) { - 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']); + // 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; } @@ -173,11 +209,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']) {