Index: modules/menu.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu.module,v
retrieving revision 1.68
diff -u -p -r1.68 menu.module
--- modules/menu.module	12 Mar 2006 16:21:40 -0000	1.68
+++ modules/menu.module	22 Mar 2006 13:40:44 -0000
@@ -7,62 +7,16 @@
  */
 
 /**
- * Implementation of hook_menu().
- */
-function menu_menu($may_cache) {
-  $items = array();
-
-  if ($may_cache) {
-    $items[] = array('path' => 'admin/menu', 'title' => t('menus'),
-      'callback' => 'menu_overview',
-      'access' => user_access('administer menu'));
-    $items[] = array('path' => 'admin/menu/item/edit', 'title' => t('edit menu item'),
-      'callback' => 'menu_edit_item',
-      'access' => user_access('administer menu'),
-      'type' => MENU_CALLBACK);
-    $items[] = array('path' => 'admin/menu/item/reset', 'title' => t('reset menu item'),
-      'callback' => 'menu_reset_item',
-      'access' => user_access('administer menu'),
-      'type' => MENU_CALLBACK);
-    $items[] = array('path' => 'admin/menu/item/disable', 'title' => t('disable menu item'),
-      'callback' => 'menu_disable_item',
-      'access' => user_access('administer menu'),
-      'type' => MENU_CALLBACK);
-    $items[] = array('path' => 'admin/menu/item/delete', 'title' => t('delete menu item'),
-      'callback' => 'menu_edit_item_delete',
-      'access' => user_access('administer menu'),
-      'type' => MENU_CALLBACK);
-
-    $items[] = array('path' => 'admin/menu/list', 'title' => t('list'),
-      'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);
-    $items[] = array('path' => 'admin/menu/menu/add', 'title' => t('add menu'),
-      'callback' => 'menu_add_menu',
-      'access' => user_access('administer menu'),
-      'type' => MENU_LOCAL_TASK);
-    $items[] = array('path' => 'admin/menu/item/add', 'title' => t('add menu item'),
-      'callback' => 'menu_edit_item',
-      'access' => user_access('administer menu'),
-      'type' => MENU_LOCAL_TASK);
-
-    $items[] = array('path' => 'admin/settings/menu',
-      'title' => t('menus'),
-      'callback' => 'menu_configure');
-  }
-
-  return $items;
-}
-
-/**
  * Implementation of hook_help().
  */
 function menu_help($section) {
   switch ($section) {
     case 'admin/help#menu':
-      $output = t('<p>The menu module allows for customization of the menus.  Menus are useful for providing navigation in your site.  The main menu for navigation is the navigation menu.  Menus appear in blocks on your site.</p>
+      $output = t('<p>The menu module allows for customization of the menus. Menus are useful for providing navigation in your site. The main menu for navigation is the navigation menu. Menus appear in blocks on your site.</p>
 <ul>
-<li>On the administer menu page administrators can \"edit\" to change the title, description, parent or weight of the menu item. Under the \"operations\" column, click on \"enable/disable\" to toggle the menu item on or off. Menu items which are disabled are not deleted; they are merely not available for navigating the site in the sidebar menu block.  Note that the default menu items generated by the menu module cannot be deleted, only disabled.</li>
-<li>Using the \"add menu\" tab submit a title for a new custom menu. Once submitted, the new menu will appear in a list toward the bottom of the administer menu page underneath the main navigation menu.</li>
-<li>Use the \"add menu item\" tab to create new links in either the navigation or a custom menu. Select the parent item to place the new link within an existing menu structure. For top level menu items, choose the name of the menu in which the link is to be added.</li>
+<li>On the administer menu page administrators can "edit" to change the title, description, parent or weight of the menu item. Under the "operations" column, click on "enable/disable" to toggle the menu item on or off. Menu items which are disabled are not deleted; they are merely not available for navigating the site in the sidebar menu block. Note that the default menu items generated by the menu module cannot be deleted, only disabled.</li>
+<li>Using the "add menu" tab submit a title for a new custom menu. Once submitted, the new menu will appear in a list toward the bottom of the administer menu page underneath the main navigation menu.</li>
+<li>Use the "add menu item" tab to create new links in either the navigation or a custom menu. Select the parent item to place the new link within an existing menu structure. For top level menu items, choose the name of the menu in which the link is to be added.</li>
 <li>To turn off the navigation menu block, administer the block page.</li>
 </ul>
 ');
@@ -89,67 +43,70 @@ function menu_help($section) {
   }
 }
 
-
 /**
- * Menu callback; presents menu configuration options.
+ * Implementation of hook_menu().
  */
-function menu_configure() {
-  $menu = menu_get_menu();
-  $root_menus = menu_get_root_menus();
-
-  $primary_options = $root_menus;
-  $primary_options[0] = t('No primary links');
-
-  $form['settings_links'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Primary links settings'),
-  );
-
-  $form['settings_links']['intro'] = array(
-    '#type' => 'item',
-    '#value' => t('Primary links is a navigation system which usually (depending on your theme) appears at the top-right of the browser window. There are usually two rows of links, primary and secondary. You may control which links appear in this area by choosing a menu from which the links will be generated and then placing your links into the menu using the <a href="%menu">menu administration</a> or the menu settings pane on each post authoring form.', array('%menu' => url('admin/menu'))),
-  );
-
-  $form['settings_links']['menu_primary_menu'] = array(
-    '#type' => 'select',
-    '#title' => t('Menu containing primary links'),
-    '#default_value' => variable_get('menu_primary_menu', 0),
-    '#options' => $primary_options,
-  );
-
-  $secondary_options = $root_menus;
-  $secondary_options[0] = t('No secondary links');
-
-  $form['settings_links']['menu_secondary_menu'] = array(
-    '#type' => 'select',
-    '#title' => t('Menu containing secondary links'),
-    '#default_value' => variable_get('menu_secondary_menu', 0),
-    '#options' => $secondary_options,
-    '#description' => t('If you select the same menu as primary links then secondary links will display the appropriate second level of your navigation hierarchy.'),
-  );
-
-  $form['settings_authoring'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Post authoring form settings'),
-  );
+function menu_menu($may_cache) {
+  $items = array();
 
-  $form['settings_authoring']['intro'] = array(
-    '#type' => 'item',
-    '#value' => t('On each post authoring form there is a menu settings pane. This setting allows you to limit what is displayed in the parent item drop-down menu of that pane. This can be used to force new menu items to be created in the primary links menu or to hide admin menu items.'),
-  );
+  if ($may_cache) {
+    $items[] = array('path' => 'admin/menu',
+      'title' => t('menus'),
+      'callback' => 'menu_overview',
+      'access' => user_access('administer menu'));
+    $items[] = array('path' => 'admin/menu/list',
+      'title' => t('list'),
+      'type' => MENU_DEFAULT_LOCAL_TASK,
+      'weight' => -10);
+
+    $items[] = array('path' => 'admin/menu/item/add',
+      'title' => t('add menu item'),
+      'callback' => 'menu_edit_item_form',
+      'access' => user_access('administer menu'),
+      'type' => MENU_LOCAL_TASK);
+    $items[] = array('path' => 'admin/menu/item/edit',
+      'title' => t('edit menu item'),
+      'callback' => 'menu_edit_item_form',
+      'access' => user_access('administer menu'),
+      'type' => MENU_CALLBACK);
+    $items[] = array('path' => 'admin/menu/item/reset',
+      'title' => t('reset menu item'),
+      'callback' => 'menu_reset_item',
+      'access' => user_access('administer menu'),
+      'type' => MENU_CALLBACK);
+    $items[] = array('path' => 'admin/menu/item/disable',
+      'title' => t('disable menu item'),
+      'callback' => 'menu_disable_item',
+      'access' => user_access('administer menu'),
+      'type' => MENU_CALLBACK);
+    $items[] = array('path' => 'admin/menu/item/delete',
+      'title' => t('delete menu item'),
+      'callback' => 'menu_item_delete_form',
+      'access' => user_access('administer menu'),
+      'type' => MENU_CALLBACK);
 
-  $authoring_options = $root_menus;
-  $authoring_options[0] = t('Show all menus');
+    $items[] = array('path' => 'admin/menu/menu/add',
+      'title' => t('add menu'),
+      'callback' => 'menu_edit_menu_form',
+      'access' => user_access('administer menu'),
+      'type' => MENU_LOCAL_TASK);
+    $items[] = array('path' => 'admin/menu/menu/edit',
+      'title' => t('add menu'),
+      'callback' => 'menu_edit_menu_form',
+      'access' => user_access('administer menu'),
+      'type' => MENU_CALLBACK);
+    $items[] = array('path' => 'admin/menu/menu/delete',
+      'title' => t('add menu'),
+      'callback' => 'menu_item_delete_form',
+      'access' => user_access('administer menu'),
+      'type' => MENU_CALLBACK);
 
-  $form['settings_authoring']['menu_parent_items'] = array(
-    '#type' => 'select',
-    '#title' => t('Restrict parent items to'),
-    '#default_value' => variable_get('menu_parent_items', 0),
-    '#options' => $authoring_options,
-    '#description' => t('Choose the menu from which parent items will be made available. Only this menu item and its children will be shown.'),
-   );
+    $items[] = array('path' => 'admin/settings/menu',
+      'title' => t('menus'),
+      'callback' => 'menu_configure');
+  }
 
-  return system_settings_form('menu_configure', $form);
+  return $items;
 }
 
 /**
@@ -211,207 +168,338 @@ function menu_perm() {
 }
 
 /**
- * Menu callback; present the main menu management page.
+ * Implementation of hook_form_alter().
+ * Add menu item fields to the node form.
  */
-function menu_overview() {
-  menu_rebuild();
+function menu_form_alter($form_id, &$form) {
+  if (user_access('administer menu') && isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id) {
+    $edit = isset($_POST['edit']) ? $_POST['edit'] : '';
+    $edit['nid'] = $form['nid']['#value'];
 
-  return menu_overview_tree();
+    $item = array();
+    if ($edit['nid'] > 0) {
+      $item = db_fetch_array(db_query("SELECT * FROM {menu} WHERE path = 'node/%d'", $edit['nid']));
+      if (is_array($edit['menu'])) {
+        $item = !is_array($item) ? $edit['menu'] : (($_POST['op'] == t('Preview')) ? array_merge($item, $edit['menu']) : array_merge($edit['menu'], $item));
+      }
+    }
+
+    $form['menu'] = array('#type' => 'fieldset',
+      '#title' => t('Menu settings'),
+      '#collapsible' => TRUE,
+      '#collapsed' => empty($item['title']),
+      '#tree' => TRUE,
+      '#weight' => 30,
+    );
+
+    $form['menu']['title'] = array('#type' => 'textfield',
+      '#title' => t('Title'),
+      '#default_value' => $item['title'],
+      '#description' => t('The name to display for this link.'),
+    );
+
+    $form['menu']['description'] = array('#type' => 'textfield',
+      '#title' => t('Description'),
+      '#default_value' => $item['description'],
+      '#description' => t('The description displayed when hovering over a menu item.'),
+    );
+
+    // Generate a list of possible parents.
+    $options = menu_parent_options($item['mid'], variable_get('menu_parent_items', 0));
+
+    $form['menu']['pid'] = array('#type' => 'select',
+      '#title' => t('Parent item'),
+      '#default_value' => $item['pid'],
+      '#options' => $options,
+    );
+
+    $form['menu']['path'] = array('#type' => 'hidden',
+      '#value' => $item['path'],
+    );
+
+    $form['menu']['weight'] = array('#type' => 'weight',
+      '#title' => t('Weight'),
+      '#default_value' => $item['weight'],
+      '#delta' => 10,
+      '#description' => t('Optional. In the menu, the heavier items will sink and the lighter items will be positioned nearer the top.'),
+    );
+
+    $form['menu']['mid'] = array('#type' => 'hidden',
+      '#value' => $item['mid'] ? $item['mid'] : 0,
+    );
+
+    $form['menu']['type'] = array('#type' => 'hidden',
+      '#value' => $item['type'] ? $item['type'] : MENU_CUSTOM_ITEM,
+    );
+
+    if ($item['mid'] > 0) {
+      $form['menu']['delete'] = array('#type' => 'checkbox',
+        '#title' => t('Check to delete this menu item.'),
+        '#default_value' => $item['delete'],
+      );
+
+      $form['menu']['advanced'] = array('#type' => 'item',
+        '#value' => t('You may also <a href="%edit">edit the advanced settings</a> for this menu item.', array('%edit' => url("admin/menu/item/edit/{$item['mid']}"))),
+      );
+    }
+  }
 }
 
 /**
- * Menu callback; handle the adding of a new menu.
+ * Menu callback; presents menu configuration options.
  */
-function menu_add_menu() {
-  $op = isset($_POST['op']) ? $_POST['op'] : '';
-  $edit = isset($_POST['edit']) ? $_POST['edit'] : '';
-  $output = '';
+function menu_configure() {
+  $menu = menu_get_menu();
+  $root_menus = menu_get_root_menus();
 
-  switch ($op) {
-    case t('Submit'):
-      menu_edit_item_validate($edit);
-      if (!form_get_errors()) {
-        menu_edit_item_save($edit);
-        drupal_goto('admin/menu');
-      }
-      // Fall through.
-    default:
-      $edit['pid'] = 0;
-      $edit['type'] = MENU_CUSTOM_MENU;
-      $output .= menu_edit_item_form($edit);
-  }
+  $primary_options = $root_menus;
+  $primary_options[0] = t('No primary links');
 
-  return $output;
+  $form['settings_links'] = array('#type' => 'fieldset',
+    '#title' => t('Primary and secondary links settings'),
+  );
+
+  $form['settings_links']['intro'] = array('#type' => 'item',
+    '#value' => t('Primary and secondary links provide a navigational menu system which usually (depending on your theme) appears at the top-right of the browser window. The links displayed can be generated either from a custom list created via the <a href="%menu">menu administration</a> page or from a built-in list of menu items such as the navigation menu links.', array('%menu' => url('admin/menu'))),
+  );
+
+  $form['settings_links']['menu_primary_menu'] = array('#type' => 'select',
+    '#title' => t('Menu containing primary links'),
+    '#default_value' => variable_get('menu_primary_menu', 0),
+    '#options' => $primary_options,
+  );
+
+  $secondary_options = $root_menus;
+  $secondary_options[0] = t('No secondary links');
+
+  $form['settings_links']['menu_secondary_menu'] = array('#type' => 'select',
+    '#title' => t('Menu containing secondary links'),
+    '#default_value' => variable_get('menu_secondary_menu', 0),
+    '#options' => $secondary_options,
+    '#description' => t('If you select the same menu as primary links then secondary links will display the appropriate second level of your navigation hierarchy.'),
+  );
+
+  $form['settings_authoring'] = array('#type' => 'fieldset',
+    '#title' => t('Post authoring form settings'),
+  );
+
+  $form['settings_authoring']['intro'] = array('#type' => 'item',
+    '#value' => t('The menu module allows on-the-fly creation of menu links in the post authoring forms. The following option limits the menus in which a new link may be added. For e.g. this can be used to force new menu items to be created in the primary links menu or to hide admin menu items.'),
+  );
+
+  $authoring_options = $root_menus;
+  $authoring_options[0] = t('Show all menus');
+
+  $form['settings_authoring']['menu_parent_items'] = array('#type' => 'select',
+    '#title' => t('Restrict parent items to'),
+    '#default_value' => variable_get('menu_parent_items', 0),
+    '#options' => $authoring_options,
+    '#description' => t('Choose the menu to be made available in the post authoring form. Only this menu item and its children will be shown.'),
+   );
+
+  return system_settings_form('menu_configure', $form);
 }
 
 /**
- * Menu callback; reset a single modified item.
+ * Menu callback; handle the adding/editing of a new menu.
  */
-function menu_reset_item($mid) {
-  $op = isset($_POST['op']) ? $_POST['op'] : '';
-  switch ($op) {
-    case t('Reset'):
-      menu_delete_item($mid);
-      drupal_set_message(t("The menu item was reset to its default settings."));
-      drupal_goto('admin/menu');
-      break;
-    default:
-      $title = db_result(db_query('SELECT title FROM {menu} WHERE mid = %d', $mid));
-      return confirm_form('menu_item_confirm_reset', array(),
-        t('Are you sure you want to reset the item %item to its default values?', array('%item' => theme('placeholder', $title))),
-        'admin/menu', t('Any customizations will be lost. This action cannot be undone.'),
-        t('Reset'));
+function menu_edit_menu_form($mid = 0) {
+  if (arg(3) == 'edit') {
+    if (!($item = db_fetch_array(db_query('SELECT * FROM {menu} WHERE mid = %d', $mid)))) {
+      drupal_not_found();
+      return;
+    }
   }
+  else {
+    $item = array('mid' => 0, 'pid' => 0, 'path' => '', 'weight' => 0, 'type' => MENU_CUSTOM_MENU);
+  }
+  $form['title'] = array('#type' => 'textfield',
+    '#title' => t('Title'),
+    '#default_value' => $item['title'],
+    '#description' => t('The name of the menu.'),
+    '#required' => TRUE,
+  );
+  $form['mid'] = array('#type' => 'value', '#value' => $item['mid']);
+  $form['pid'] = array('#type' => 'value', '#value' => $item['pid']);
+  $form['path'] = array('#type' => 'value', '#value' => $item['path']);
+  $form['weight'] = array('#type' => 'value', '#value' => $item['weight']);
+  $form['type'] = array('#type' => 'value', '#value' => $item['type']);
+  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
+
+  // Reuse the submit function of menu_edit_item_form.
+  return drupal_get_form('menu_edit_menu_form', $form, 'menu_edit_item_form');
 }
 
 /**
- * Menu callback; delete a single custom item.
+ * Present the menu item editing form.
  */
-function menu_edit_item_delete($mid) {
-  $op = isset($_POST['op']) ? $_POST['op'] : '';
-  $result = db_query('SELECT type, title FROM {menu} WHERE mid = %d', $mid);
-  $menu = db_fetch_object($result);
-  if (!$menu) {
-    drupal_goto('admin/menu');
-  }
-  switch ($op) {
-    case t('Delete'):
-      menu_delete_item($mid);
-      if ($menu->type & MENU_IS_ROOT) {
-        drupal_set_message(t('The menu has been removed.'));
-      }
-      else {
-        drupal_set_message(t('The menu item has been removed.'));
-      }
-      drupal_goto('admin/menu');
-      break;
-    default:
-      if ($menu->type & MENU_IS_ROOT) {
-        $message = t('Are you sure you want to delete the menu %item?', array('%item' => theme('placeholder', $menu->title)));
-      }
-      else {
-        $message = t('Are you sure you want to delete the custom menu item %item?', array('%item' => theme('placeholder', $menu->title)));
-      }
-      return confirm_form('menu_confirm_delete', $form, $message, 'admin/menu', t('This action cannot be undone.'), t('Delete'));
+function menu_edit_item_form($mid = 0) {
+  if (arg(3) == 'edit') {
+    if (!($item = db_fetch_array(db_query('SELECT * FROM {menu} WHERE mid = %d', $mid)))) {
+      drupal_not_found();
+      return;
+    }
+  }
+  else {
+    // This is an add form.
+    $item = array('mid' => 0, 'pid' => 1, 'weight' => 0, 'type' => MENU_CUSTOM_ITEM);
+  }
+
+  $form['title'] = array('#type' => 'textfield',
+    '#title' => t('Title'),
+    '#default_value' => $item['title'],
+    '#description' => t('The name of the menu item.'),
+    '#required' => TRUE,
+  );
+  $form['description'] = array('#type' => 'textfield',
+    '#title' => t('Description'),
+    '#default_value' => $item['description'],
+    '#description' => t('The description displayed when hovering over a menu item.'),
+  );
+
+  if ($item['type'] & MENU_CREATED_BY_ADMIN) {
+    $form['path'] = array('#type' => 'textfield',
+      '#title' => t('Path'),
+      '#default_value' => $item['path'],
+      '#description' => t('The Drupal path this menu item links to. Enter %front to link to the front page.', array('%front' => theme('placeholder', '<front>'))),
+      '#required' => TRUE,
+    );
+  }
+  else {
+    $form['_path'] = array('#type' => 'item',
+      '#title' => t('Path'),
+      '#description' => l($item['path'], $item['path']),
+    );
+    $form['path'] = array('#type' => 'value', '#value' => $item['path']);
+  }
+
+  $expanded = $item['type'] & MENU_EXPANDED ? 1 : 0;
+  $form['expanded'] = array('#type' => 'checkbox',
+    '#title' => t('Expanded'),
+    '#default_value' => $expanded,
+    '#description' => t('If selected and this menu item has children, the menu will always appear expanded.'),
+  );
+
+  // Generate a list of possible parents (not including this item or descendants).
+  // Default to "Navigation" menu for new items.
+  $options = menu_parent_options($item['mid']);
+  $form['pid'] = array('#type' => 'select',
+    '#title' => t('Parent item'),
+    '#default_value' => $item['pid'],
+    '#options' => $options,
+  );
+  $form['weight'] = array('#type' => 'weight',
+    '#title' => t('Weight'),
+    '#default_value' => $item['weight'],
+    '#description' => t('Optional. In the menu, the heavier items will sink and the lighter items will be positioned nearer the top.'),
+  );
+
+  // Always enable menu items (but not menus) when editing them.
+  if (!($item['type'] & MENU_IS_ROOT)) {
+    $item['type'] |= MENU_VISIBLE_IN_TREE | MENU_VISIBLE_IN_BREADCRUMB;
   }
+
+  $form['type'] = array('#type' => 'value', '#value' => $item['type']);
+  $form['mid'] = array('#type' => 'value', '#value' => $item['mid']);
+  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
+
+  return drupal_get_form('menu_edit_item_form', $form);
 }
 
 /**
- * Menu callback; hide a menu item.
+ * Process menu and menu item add/edit form submissions.
  */
-function menu_disable_item($mid) {
-  $item = menu_get_item($mid);
-  $type = $item['type'];
-  $type &= ~MENU_VISIBLE_IN_TREE;
-  $type &= ~MENU_VISIBLE_IN_BREADCRUMB;
-  $type |= MENU_MODIFIED_BY_ADMIN;
-  db_query('UPDATE {menu} SET type = %d WHERE mid = %d', $type, $mid);
-  drupal_set_message(t('The menu item has been disabled.'));
-  drupal_goto('admin/menu');
+function menu_edit_item_form_submit($form_id, $form_values) {
+  menu_edit_item_save($form_values);
+  return 'admin/menu';
 }
 
 /**
- * Menu callback; dispatch to the appropriate menu item edit function.
+ * Menu callback; delete a single custom item.
  */
-function menu_edit_item($mid = 0) {
-  $op = isset($_POST['op']) ? $_POST['op'] : '';
-  $edit = isset($_POST['edit']) ? $_POST['edit'] : '';
+function menu_item_delete_form($mid) {
+  if (!($menu = db_fetch_object(db_query('SELECT type, title FROM {menu} WHERE mid = %d', $mid)))) {
+    drupal_not_found();
+    return;
+  }
 
-  $output = '';
+  $form['mid'] = array('#type' => 'value', '#value' => $mid);
+  $form['type'] = array('#type' => 'value', '#value' => $menu->type);
+  $form['title'] = array('#type' => 'value', '#value' => $menu->title);
 
-  switch ($op) {
-    case t('Submit'):
-      menu_edit_item_validate($edit);
-      if (!form_get_errors()) {
-        menu_edit_item_save($edit);
-        drupal_goto('admin/menu');
-      }
-      $output .= menu_edit_item_form($edit);
-      break;
-    default:
-      if ($mid > 0) {
-        $item = db_fetch_object(db_query('SELECT * FROM {menu} WHERE mid = %d', $mid));
-
-        $edit['mid'] = $item->mid;
-        $edit['pid'] = $item->pid;
-        $edit['path'] = $item->path;
-        $edit['title'] = $item->title;
-        $edit['description'] = $item->description;
-        $edit['weight'] = $item->weight;
-        $edit['type'] = $item->type;
-      }
-      else {
-        $edit['mid'] = 0; // In case a negative ID was passed in.
-        $edit['pid'] = 1; // default to "Navigation" menu.
-        $edit['type'] = MENU_CUSTOM_ITEM;
-      }
-      $output .= menu_edit_item_form($edit);
+  if ($menu->type & MENU_IS_ROOT) {
+    $message = t('Are you sure you want to delete the menu %item?', array('%item' => theme('placeholder', $menu->title)));
+  }
+  else {
+    $message = t('Are you sure you want to delete the custom menu item %item?', array('%item' => theme('placeholder', $menu->title)));
   }
 
-  return $output;
+  return confirm_form('menu_confirm_delete_form', $form, $message, 'admin/menu', t('This action cannot be undone.'), t('Delete'));
 }
 
 /**
- * Present the menu item editing form.
+ * Process menu delete form submissions.
  */
-function menu_edit_item_form($edit) {
-  if ($edit['pid'] == 0) {
-    // Display a limited set of fields for menus (not items).
-    $form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#default_value' => $edit['title'], '#description' => t('The name of the menu.'), '#required' => TRUE);
-    $form['path'] = array('#type' => 'hidden', '#value' => '');
-    $form['pid'] = array('#type' => 'hidden', '#value' => 0);
-    $form['weight'] = array('#type' => 'hidden', '#value' => 0);
+function menu_confirm_delete_form_submit($form_id, $form_values) {
+  menu_delete_item($form_values['mid']);
+
+  $t_args = array('%title' => theme('placeholder', $form_values['title']));
+  if ($form_values['type'] & MENU_IS_ROOT) {
+    drupal_set_message(t('The menu %title has been deleted.', $t_args));
+    watchdog('menu', t('Deleted menu %title.', $t_args), WATCHDOG_NOTICE);
   }
   else {
-    $form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#default_value' => $edit['title'], '#description' => t('The name of the menu item.'), '#required' => TRUE);
-    $form['description'] = array('#type' => 'textfield', '#title' => t('Description'), '#default_value' => $edit['description'], '#description' => t('The description displayed when hovering over a menu item.'));
-
-    $path_description = t('The Drupal path this menu item links to. Enter %front to link to the front page.', array('%front' => theme('placeholder', '<front>')));
-
-    if ($edit['type'] & MENU_CREATED_BY_ADMIN) {
-      $form['path'] = array('#type' => 'textfield', '#title' => t('Path'), '#default_value' => $edit['path'], '#description' => $path_description, '#required' => TRUE);
-    }
-    else {
-      $form['_path'] = array('#type' => 'item', '#title' => t('Path'), '#description' => l($edit['path'], $edit['path']));
-      $form['path'] = array('#type' => 'hidden', '#value' => $edit['path']);
-    }
-    $expanded = $edit['type'] & MENU_EXPANDED ? 1 : 0;
-    $form['expanded'] = array('#type' => 'checkbox', '#title' => t('Expanded'), '#default_value' => $expanded, '#description' => t('If selected and this menu item has children, the menu will always appear expanded.'));
-
-    // Generate a list of possible parents (not including this item or descendants).
-    $options = menu_parent_options($edit['mid']);
-    $form['pid'] = array('#type' => 'select', '#title' => t('Parent item'), '#default_value' =>  $edit['pid'], '#options' => $options);
-
-    $form['weight'] = array('#type' => 'weight', '#title' => t('Weight'), '#default_value' => $edit['weight'], '#description' => t('Optional. In the menu, the heavier items will sink and the lighter items will be positioned nearer the top.'));
+    drupal_set_message(t('The menu item %title has been deleted.', $t_args));
+    watchdog('menu', t('Deleted menu item %title.', $t_args), WATCHDOG_NOTICE);
   }
 
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Submit'));
-
-  $form['mid'] = array('#type' => 'hidden', '#value' => $edit['mid']);
+  return 'admin/menu';
+}
 
-  // Always enable menu items (but not menus) when editing them.
-  if (!($edit['type'] & MENU_IS_ROOT)) {
-    $edit['type'] |= MENU_VISIBLE_IN_TREE | MENU_VISIBLE_IN_BREADCRUMB;
+/**
+ * Menu callback; reset a single modified item.
+ */
+function menu_reset_item($mid) {
+  if (isset($mid) && $title = db_result(db_query('SELECT title FROM {menu} WHERE mid = %d', $mid))) {
+    $form['mid'] = array('#type' => 'value', '#value' => $mid);
+    return confirm_form('menu_reset_item_form', $form, t('Are you sure you want to reset the item %item to its default values?', array('%item' => theme('placeholder', $title))), 'admin/menu', t('Any customizations will be lost. This action cannot be undone.'), t('Reset'));
+  }
+  else {
+    drupal_not_found();
   }
+}
 
-  $form['type'] = array('#type' => 'hidden', '#value' => $edit['type']);
+/**
+ * Process menu reset item form submissions.
+ */
+function menu_reset_item_form_submit($form_id, $form_values) {
+  menu_delete_item($form_values['mid']);
+  drupal_set_message(t('The menu item was reset to its default settings.'));
 
-  return drupal_get_form('menu_edit_item_form', $form);
+  return 'admin/menu';
 }
 
 /**
- * Confirm that an edited menu item has fields properly filled in.
+ * Menu callback; hide a menu item.
  */
-function menu_edit_item_validate($edit) {
-  if (empty($edit['title'])) {
-    form_set_error('title', t('You must specify a title.'));
-  }
+function menu_disable_item($mid) {
+  $item = menu_get_item($mid);
+  $type = $item['type'];
+  $type &= ~MENU_VISIBLE_IN_TREE;
+  $type &= ~MENU_VISIBLE_IN_BREADCRUMB;
+  $type |= MENU_MODIFIED_BY_ADMIN;
+  db_query('UPDATE {menu} SET type = %d WHERE mid = %d', $type, $mid);
+  drupal_set_message(t('The menu item has been disabled.'));
+  drupal_goto('admin/menu');
+}
 
-  if ($edit['pid'] != 0) {
-    if (empty($edit['path'])) {
-      form_set_error('path', t('You must specify a path.'));
-    }
-  }
+/**
+ * Menu callback; present the main menu management page.
+ */
+function menu_overview() {
+  menu_rebuild();
+
+  return menu_overview_tree();
 }
 
 /**
@@ -431,11 +519,13 @@ function menu_edit_item_save($edit) {
 
   $status = menu_save_item($edit);
 
+  $t_args = array('%title' => theme('placeholder', $edit['title']));
   if ($status == SAVED_UPDATED) {
-    drupal_set_message(t('The menu item %title has been updated.', array('%title' => theme('placeholder', $edit['title']))));
+    drupal_set_message(t('The menu item %title has been updated.', $t_args));
   }
   elseif ($status == SAVED_NEW) {
-    drupal_set_message(t('The menu item %title has been created.', array('%title' => theme('placeholder', $edit['title']))));
+    drupal_set_message(t('The menu item %title has been added.', $t_args));
+    watchdog('menu', t('Added menu item %title.', $t_args), WATCHDOG_NOTICE, l(t('view'), 'admin/menu'));
   }
   return $edit['mid'];
 }
@@ -468,7 +558,7 @@ function menu_save_item(&$item) {
   else {
     $item['mid'] = db_next_id('{menu}_mid');
     // Check explicitly for mid <= 2. If the database was improperly prefixed,
-    // this would cause a nasty infinite loop  or duplicate mid errors.
+    // this would cause a nasty infinite loop or duplicate mid errors.
     // TODO: have automatic prefixing through an installer to prevent this.
     while ($item['mid'] <= 2) {
       $item['mid'] = db_next_id('{menu}_mid');
@@ -510,10 +600,10 @@ function menu_overview_tree() {
   foreach ($root_menus as $mid => $title) {
     $operations = array();
     if ($menu['items'][$mid]['type'] & MENU_MODIFIABLE_BY_ADMIN) {
-      $operations[] = l(t('edit'), 'admin/menu/item/edit/'. $mid);
+      $operations[] = l(t('edit'), 'admin/menu/menu/edit/'. $mid);
     }
     if ($menu['items'][$mid]['type'] & MENU_CREATED_BY_ADMIN) {
-      $operations[] = l(t('delete'), 'admin/menu/item/delete/'. $mid);
+      $operations[] = l(t('delete'), 'admin/menu/menu/delete/'. $mid);
     }
     $table = theme('item_list', $operations);
     $table .= theme('table', $header, menu_overview_tree_rows($mid));
@@ -665,96 +755,8 @@ function menu_parent_options($mid, $pid 
 }
 
 /**
- * Add menu item fields to the node form.
- */
-function menu_form_alter($form_id, &$form) {
-  if (user_access('administer menu') && isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id) {
-    $edit = isset($_POST['edit']) ? $_POST['edit'] : '';
-    $edit['nid'] = $form['nid']['#value'];
-
-    $item = array();
-    if ($edit['nid'] > 0) {
-      $item = db_fetch_array(db_query("SELECT * FROM {menu} WHERE path = 'node/%d'", $edit['nid']));
-      if (is_array($edit['menu'])) {
-        $item = !is_array($item) ? $edit['menu'] : (($_POST['op'] == t('Preview')) ? array_merge($item, $edit['menu']) : array_merge($edit['menu'], $item));
-      }
-    }
-
-    $form['menu'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Menu settings'),
-      '#collapsible' => TRUE,
-      '#collapsed' => empty($item['title']),
-      '#tree' => TRUE,
-      '#weight' => 30,
-    );
-
-    $form['menu']['title'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Title'),
-      '#default_value' => $item['title'],
-      '#description' => t('The name to display for this link.'),
-    );
-
-    $form['menu']['description'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Description'),
-      '#default_value' => $item['description'],
-      '#description' => t('The description displayed when hovering over a menu item.'),
-    );
-
-    // Generate a list of possible parents.
-    $options = menu_parent_options($item['mid'], variable_get('menu_parent_items', 0));
-
-    $form['menu']['pid'] = array(
-      '#type' => 'select',
-      '#title' => t('Parent item'),
-      '#default_value' => $item['pid'],
-      '#options' => $options,
-    );
-
-    $form['menu']['path'] = array(
-      '#type' => 'hidden',
-      '#value' => $item['path'],
-    );
-
-    $form['menu']['weight'] = array(
-      '#type' => 'weight',
-      '#title' => t('Weight'),
-      '#default_value' => $item['weight'],
-      '#delta' => 10,
-      '#description' => t('Optional. In the menu, the heavier items will sink and the lighter items will be positioned nearer the top.'),
-    );
-
-    $form['menu']['mid'] = array(
-      '#type' => 'hidden',
-      '#value' => $item['mid'] ? $item['mid'] : 0,
-    );
-
-    $form['menu']['type'] = array(
-      '#type' => 'hidden',
-      '#value' => $item['type'] ? $item['type'] : MENU_CUSTOM_ITEM,
-    );
-
-    if ($item['mid'] > 0) {
-      $form['menu']['delete'] = array(
-        '#type' => 'checkbox',
-        '#title' => t('Check to delete this menu item.'),
-        '#default_value' => $item['delete'],
-      );
-
-      $form['menu']['advanced'] = array(
-        '#type' => 'item',
-        '#value' => t('You may also <a href="%edit">edit the advanced settings</a> for this menu item.', array('%edit' => url("admin/menu/item/edit/{$item['mid']}"))),
-      );
-    }
-  }
-}
-
-/**
  * Remove the menu item.
  */
 function menu_node_form_delete($node) {
   menu_delete_item(array('path' => 'node/'. $node->nid));
 }
-
