Index: includes/form.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/form.inc,v
retrieving revision 1.5
diff -u -F^f -r1.5 form.inc
--- includes/form.inc	13 Oct 2005 10:02:31 -0000	1.5
+++ includes/form.inc	22 Oct 2005 23:43:49 -0000
@@ -49,25 +49,26 @@ function drupal_get_form($form_id, &$for
   global $form_values, $form_execute;
   $form_values = array();
   $form_execute = FALSE;
-  $form['#type'] = 'form';
-  $form['#attributes']['class'] .= ' form-api';
-  if (isset($form['#token'])) {
-    $form['form_token'] = array('#type' => 'hidden', '#value' => md5($_SERVER['REMOTE_ADDR'] . $form['#token'] . variable_get('drupal_private_key', '')));
-  }
-  $form = array_merge(_element_info('form'), $form);
 
+  $form = _form_start_builder($form);
+  $alters = array($form_id . '_alter', $callback . '_alter');
+  $need_build = FALSE;
   foreach (module_implements('form_alter') as $module) {
     $function = $module .'_form_alter';
-    $function($form);
+    if (!in_array($function, $alters) {
+      $function($form);
+      $need_build = TRUE;
+    }
   }
 
-  $function = $form_id . '_alter';
-  if (function_exists($function)) {
-    $function($form);
+  foreach ($alters as $function) {
+    if (function_exists($function)) {
+      $function($form);
+      $need_build = TRUE;
+    }
   }
-
-  if (!$form['#built']) {
-    $form = _form_builder($form);
+  if ($need_build) {
+    $form = _form_start_builder($form);
   }
   if (!empty($_POST['edit'])) {
     drupal_validate_form($form_id, $form, $callback);
@@ -204,31 +205,32 @@ function form_error(&$element, $message)
   form_set_error(implode('][', $element['#parents']), $message);
 }
 
+function _form_start_builder($form, $parents = array()) {
+  $form['#type'] = 'form';
+  $form['#attributes']['class'] .= ' form-api';
+  if (isset($form['#token'])) {
+    $form['form_token'] = array('#type' => 'hidden', '#value' => md5($_SERVER['REMOTE_ADDR'] . $form['#token'] . variable_get('drupal_private_key',
+'')));
+  }
+  $form = array_merge(_element_info('form'), $form);
+  return _form_builder($form);
+}
+
 /**
  * Adds some required properties to each form element, which are used internally in the form api.
  * This function also automatically assigns the value property from the $edit array, provided the
  * element doesn't already have an assigned value.
  */
-function _form_builder($form, $parents = array(), $multiple = FALSE) {
+function _form_builder($form) {
   global $form_values;
   global $form_execute;
 
-  if ($form['#built'] == TRUE) {
-    return $form;
-  }
-  $form['#built'] = TRUE;
-
-  $form['#parents'] = ($form['#parents']) ? $form['#parents'] : $parents;
   /* Use element defaults */
   if ((!empty($form['#type'])) && ($info = _element_info($form['#type']))) {
     $form += $info;
   }
 
   if ($form['#input']) {
-    if (!$form['#tree']) {
-      $form['#parents'] = array(array_pop($form['#parents']));
-    }
-
     $form['#name'] = ($form['#name']) ? $form['#name'] : 'edit[' . implode('][', $form['#parents']) . ']';
     $form['#id'] =  ($form['#id']) ? $form['#id'] : 'edit-' . implode('-', $form['#parents']);
 
@@ -261,9 +263,22 @@ function _form_builder($form, $parents =
   $count  = 0;
   foreach (element_children($form) as $key) {
     $form[$key]['#tree'] = (isset($form[$key]['#tree'])) ? $form[$key]['#tree'] : $form['#tree'];
+    if ($form[$key]['#tree']) {
+      if ($form['#tree']) {
+        $parents = array_merge($form['#parents'], array($key));
+      }
+      else {
+        $parents = array($key);
+      }
+    }
+    else {
+      $parents = array($key);
+    }
+    $form[$key]['#parents'] = (isset($form[$key]['#parents'])) ? $form[$key]['#parents'] : $parents;
+
     # Assign a decimal placeholder weight, to preserve original array order
-    $form[$key]['#weight'] = $form[$key]['#weight'] ? $form[$key]['#weight'] : $count/10;
-    $form[$key] = _form_builder($form[$key], array_merge($form['#parents'], array($key)));
+    $form[$key]['#weight'] = $form[$key]['#weight'] ? $form[$key]['#weight'] : $count/1000;
+    $form[$key] = _form_builder($form[$key]);
     $count++;
   }
 
Index: includes/locale.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/locale.inc,v
retrieving revision 1.56
diff -u -F^f -r1.56 locale.inc
--- includes/locale.inc	21 Oct 2005 11:14:28 -0000	1.56
+++ includes/locale.inc	22 Oct 2005 23:43:51 -0000
@@ -132,7 +132,7 @@ function _locale_admin_import_screen() {
   $form['mode'] = array('#type' => 'radios', '#title' => t('Mode'), '#default_value' => 'overwrite', '#options' => array('overwrite' => t('Strings in the uploaded file replace existing ones, new ones are added'), 'keep' => t('Existing strings are kept, only new strings are added')));
   $form['submit'] = array('#type' => 'submit', '#value' => t('Import'));
   $form['#attributes']['enctype'] = 'multipart/form-data';
-  $form['#action'] = 'admin/locale/language/import';
+  $form['#action'] = url('admin/locale/language/import');
 
   return drupal_get_form('_locale_admin_import', $form);
 }
@@ -1127,7 +1127,7 @@ function _locale_string_seek_form() {
   $form['search']['language'] = array('#type' => 'radios', '#title' => t('Language'), '#default_value' => ($query->language ? $query->language : 'all'), '#options' => array_merge(array('all' => t('All languages'), 'en' => t('English (provided by Drupal)')), $languages['name']));
   $form['search']['searchin'] = array('#type' => 'radios', '#title' => t('Search in'), '#default_value' => ($query->searchin ? $query->searchin : 'all'), '#options' => array('all' => t('All strings in that language'), 'translated' => t('Only translated strings'), 'untranslated' => t('Only untranslated strings')));
   $form['search']['submit'] = array('#type' => 'submit', '#value' => t('Search'));
-  $form['#action'] = 'admin/locale/string/search';
+  $form['#action'] = url('admin/locale/string/search');
 
   return drupal_get_form('_locale_string_seek', $form);
 }
Index: modules/comment.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment.module,v
retrieving revision 1.384
diff -u -F^f -r1.384 comment.module
--- modules/comment.module	20 Oct 2005 09:27:36 -0000	1.384
+++ modules/comment.module	22 Oct 2005 23:43:52 -0000
@@ -1211,7 +1211,7 @@ function comment_controls($mode = 2, $or
 
   $form['nid'] = array('#type' => 'hidden', '#value' => $nid);
 
-  $form['#action'] = 'comment/reply';
+  $form['#action'] = url('comment/reply');
 
   return drupal_get_form('comment_controls'. $top_or_bottom, $form, 'comment_controls');
 }
Index: modules/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node.module,v
retrieving revision 1.538
diff -u -F^f -r1.538 node.module
--- modules/node.module	22 Oct 2005 15:14:46 -0000	1.538
+++ modules/node.module	22 Oct 2005 23:43:53 -0000
@@ -1578,12 +1578,11 @@ function node_validate_title($node, $mes
  * Generate the node editing form.
  */
 function node_form($node) {
-  $op = isset($_POST['op']) ? $_POST['op'] : '';
-
-  if (!isset($node) || !isset($node->validated) || !$node->validated) {
-    $node = node_validate($node);
-  }
+  return drupal_get_form($node['type'] .'_node_form', _node_form($node), 'node_form');
+}
 
+function _node_form($node) {
+  $node = array2object($node);
   // Set the id of the top-level form tag
   $form['#attributes']['id'] = 'node-form';
 
@@ -1598,18 +1597,7 @@ function node_form($node) {
   $form['changed'] = array('#type' => 'value', '#value' => $node->changed);
   $form['type']    = array('#type' => 'value', '#value' => $node->type);
 
-  if ($op == t('Preview')) {
-    $form['node_preview'] = array('#value' => node_preview(array2object($_POST['edit'])), '#weight' => -100);
-  }
-
-  // Get the node-specific bits.
-  // We can't use node_invoke() because $param must be passed by reference.
-  $function = node_get_base($node) .'_form';
-  $param = array();
-  if (function_exists($function)) {
-    $node_form = $function($node, $param);
-    $form = array_merge($form, $function($node, $param));
-  }
+  $form = array_merge($form, node_invoke($node, 'form'));
 
   /**
    * Node author information
@@ -1649,18 +1637,19 @@ function node_form($node) {
   // Add the buttons.
   $form['preview'] = array('#type' => 'button', '#value' => t('Preview'), '#weight' => 19);
 
-  if ($node->type) {
-    if (!form_get_errors()) {
-      if ($_POST['op'] == t('Preview')|| !variable_get('node_preview', 0)) {
-
-      }
-    }
-  }
   $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'), '#weight' => 20);
   if ($node->nid && node_access('delete', $node)) {
     $form['delete'] = array('#type' => 'button', '#value' => t('Delete'), '#weight' => 21);
   }
-  return drupal_get_form($node->type . '_node_form', $form, 'node_form');
+  return $form;
+}
+
+function node_form_alter(&$form) {
+  global $form_values;
+  $node = node_validate($form_values);
+  if (isset($_POST['op']) && $_POST['op'] == t('Preview')) {
+    $form['node_preview'] = array('#value' => node_preview($node), '#weight' => -100);
+  }
 }
 
 function theme_node_form($form) {
@@ -1733,10 +1722,6 @@ function node_add($type) {
  * Generate a node preview.
  */
 function node_preview($node) {
-  if (!isset($node) || !isset($node->validated) || !$node->validated) {
-    $node = node_validate($node);
-  }
-
   if (node_access('create', $node) || node_access('update', $node)) {
     // Load the user's name when needed:
     if (isset($node->name)) {
Index: modules/watchdog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/watchdog.module,v
retrieving revision 1.131
diff -u -F^f -r1.131 watchdog.module
--- modules/watchdog.module	21 Oct 2005 10:50:03 -0000	1.131
+++ modules/watchdog.module	22 Oct 2005 23:43:54 -0000
@@ -80,7 +80,7 @@ function watchdog_overview() {
     '#options' => $names,
     '#default_value' => $_SESSION['watchdog_overview_filter']
   );
-  $form['#action'] = 'admin/logs';
+  $form['#action'] = url('admin/logs');
 
   $form['submit'] = array('#type' => 'submit', '#value' =>t('Filter'));
   $output = drupal_get_form('watchdog_form_overview', $form);
