Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.14
diff -u -F^f -r1.14 form.inc
--- includes/form.inc	12 Nov 2005 03:45:57 -0000	1.14
+++ includes/form.inc	17 Nov 2005 22:15:59 -0000
@@ -378,12 +389,12 @@ function _element_info($type, $refresh =
     foreach (module_implements('elements') as $module) {
       $elements = module_invoke($module, 'elements');
       if (is_array($elements)) {
-        $cache = array_merge($cache, $elements);
+        $cache = form_array_merge($cache, $elements);
       }
     }
     if (sizeof($cache)) {
       foreach ($cache as $element_type => $info) {
-        $cache[$element_type] = array_merge($basic_defaults, $info);
+        $cache[$element_type] = form_array_merge($basic_defaults, $info);
       }
     }
   }
@@ -391,6 +402,31 @@ function _element_info($type, $refresh =
   return $cache[$type];
 }
 
+function form_array_merge($array1, $array2) {
+  foreach ($array2 as $key => $value) {
+    if (is_array($value)) {
+      if (!isset($array1[$key])) {
+        $array1[$key] = array();
+      }
+      $array1[$key] = form_array_merge($array1[$key], $value);
+    }
+    else {
+      if (isset($array1[$key]) && is_array($array1[$key])) {
+        $array1[$key][0] = $value;
+      }
+      else {
+        if (isset($array1) && !is_array($array1)) {
+          $temp = $array1;
+          $array1 = array();
+          $array1[0] = $temp;
+        }
+        $array1[$key] = $value;
+      }
+    }
+  }
+  return $array1;
+}
+
 /**
  * Format a dropdown menu or scrolling selection box.
  *
