? date-206127.patch
Index: date_api.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date_api.module,v
retrieving revision 1.64.2.5.2.105
diff -u -p -r1.64.2.5.2.105 date_api.module
--- date_api.module	13 Aug 2010 14:36:31 -0000	1.64.2.5.2.105
+++ date_api.module	28 Oct 2010 19:34:58 -0000
@@ -2522,8 +2522,15 @@ function date_range_years($string, $date
   // If there is a current value, stretch the range to include it.
   $value_year = is_object($date) ? date_format($date, 'Y') : '';
   if (!empty($value_year)) {
-    $min_year = min($value_year, $min_year);
-    $max_year = max($value_year, $max_year);
+    // See if the range is in reverse
+    if ($min_year <= $max_year) {
+      $min_year = min($value_year, $min_year);
+      $max_year = max($value_year, $max_year);
+    }
+    else {
+      $min_year = max($value_year, $min_year);
+      $max_year = min($value_year, $max_year);
+    }
   }
   return array($min_year, $max_year);
 }
Index: date_api_elements.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date_api_elements.inc,v
retrieving revision 1.49.2.1.2.58
diff -u -p -r1.49.2.1.2.58 date_api_elements.inc
--- date_api_elements.inc	14 Aug 2010 04:44:08 -0000	1.49.2.1.2.58
+++ date_api_elements.inc	28 Oct 2010 19:34:58 -0000
@@ -258,12 +258,24 @@ function date_parts_element($element, $d
     switch ($field) {
       case 'year':
         $range = date_range_years($element['#date_year_range'], $date);
-        $min_year = $range[0];
-        $max_year = $range[1];
+        if ($range[0] <= $range[1]) {
+          $min_year = $range[0];
+          $max_year = $range[1];
+        }
+        else {
+          $min_year = $range[1];
+          $max_year = $range[0];
+        }
         
         $sub_element[$field]['#default_value'] = is_object($date) ? date_format($date, 'Y') : '';
         if ($part_type == 'select') {
-          $sub_element[$field]['#options'] = drupal_map_assoc(date_years($min_year, $max_year, $part_required));
+          if ($range[0] <= $range[1]) {
+            $sub_element[$field]['#options'] = drupal_map_assoc(date_years($min_year, $max_year, $part_required));
+          }
+          else {
+            $options = array_reverse(drupal_map_assoc(date_years($min_year, $max_year, TRUE)), TRUE);
+            $sub_element[$field]['#options'] = !$part_required ? array('' => '') + $options : $options;
+          }
         }
         break;
       case 'month':
