Index: includes/menu.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/menu.inc,v
retrieving revision 1.185
diff -u -p -r1.185 menu.inc
--- includes/menu.inc	5 Jul 2007 08:48:57 -0000	1.185
+++ includes/menu.inc	5 Jul 2007 18:10:09 -0000
@@ -943,6 +943,13 @@ function menu_get_names($reset = FALSE) 
 }
 
 /**
+ * Return an array containing the names of system-defined (default) menus.
+ */
+function menu_list_system_menus() {
+  return array('navigation', 'primary-links', 'secondary-links');
+}
+
+/**
  * Return an array of links to be rendered as the Primary links.
  */
 function menu_primary_links() {
Index: modules/menu/menu.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.module,v
retrieving revision 1.125
diff -u -p -r1.125 menu.module
--- modules/menu/menu.module	5 Jul 2007 08:48:57 -0000	1.125
+++ modules/menu/menu.module	5 Jul 2007 18:10:09 -0000
@@ -86,6 +86,11 @@ function menu_menu() {
     'page callback' => 'drupal_get_form',
     'page arguments' => array('menu_edit_menu', 'edit', 3),
     'type' => MENU_LOCAL_TASK);
+  $items['admin/build/menu-customize/%menu/delete'] = array(
+    'title' => 'Delete menu',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('menu_delete_menu_confirm', 3),
+    'type' => MENU_CALLBACK);
   $items['admin/build/menu/item/%menu_link/disable'] = array(
     'title' => 'Disable menu item',
     'page callback' => 'menu_flip_item',
@@ -104,7 +109,7 @@ function menu_menu() {
   $items['admin/build/menu/item/%menu_link/reset'] = array(
     'title' => 'Reset menu item',
     'page callback' => 'drupal_get_form',
-    'page arguments' => array('menu_reset_item', 4),
+    'page arguments' => array('menu_reset_item_confirm', 4),
     'type' => MENU_CALLBACK);
   $items['admin/build/menu/item/%menu_link/delete'] = array(
     'title' => 'Delete menu item',
@@ -133,6 +138,7 @@ function menu_enable() {
     $link['link_path'] = 'admin/build/menu-customize/'. $menu['menu_name'];
     menu_link_save($link);
   }
+  menu_cache_clear_all();
 }
 
 /**
@@ -383,6 +389,13 @@ function menu_edit_menu(&$form_state, $t
   if ($type == 'edit') {
     $form['menu_name'] = array('#type' => 'value', '#value' => $menu['menu_name']);
     $form['#insert'] = FALSE;
+    $form['delete'] = array(
+      '#type' => 'submit',
+      '#value' => t('Delete'),
+      '#access' => !in_array($menu['menu_name'], menu_list_system_menus()),
+      '#submit' => array('menu_custom_delete_submit'),
+      '#weight' => 10,
+    );
   }
   else {
     $menu = array('menu_name' => '', 'title' => '', 'description' => '');
@@ -415,6 +428,43 @@ function menu_edit_menu(&$form_state, $t
 }
 
 /**
+ * Submit function for the 'Delete' button on the menu editing form.
+ */
+function menu_custom_delete_submit($form, &$form_state) {
+  $form_state['redirect'] = 'admin/build/menu-customize/'. $form_state['values']['menu_name'] .'/delete';
+}
+
+/**
+ * Menu callback; Build a confirm form for deletion of a custom menu.
+ */
+function menu_delete_menu_confirm(&$form_state, $menu) {
+  if (in_array($menu['menu_name'], menu_list_system_menus())) {
+    drupal_access_denied();
+  }
+  $form['#menu'] = $menu;
+  return confirm_form($form, t('Are you sure you want to delete the custom menu %title?', array('%title' => $menu['title'])), 'admin/build/menu-customize/'. $menu['menu_name'], t('This action cannot be undone.  All the items in this menu will be deleted (or reset for system-defined items).'), t('Delete'));
+}
+
+/**
+ * Delete a custom menu and all items in it.
+ */
+function menu_delete_menu_confirm_submit($form, &$form_state) {
+  $menu = $form['#menu'];
+  $form_state['redirect'] = 'admin/build/menu';
+  if (in_array($menu['menu_name'], menu_list_system_menus())) {
+    return;
+  }
+  $result = db_query("SELECT * FROM {menu_links} ml INNER JOIN {menu_router} m ON ml.router_path = m.path WHERE ml.menu_name = '%s' AND ml.module = 'system' ORDER BY m.number_parts ASC", $menu['menu_name']);
+  while ($item = db_fetch_array($result)) {
+    menu_reset_item($item);
+  }
+  db_query("DELETE FROM {menu_links} WHERE menu_name = '%s'", $menu['menu_name']);
+  db_query("DELETE FROM {menu_custom} WHERE menu_name = '%s'", $menu['menu_name']);
+  menu_cache_clear_all();
+  cache_clear_all();
+}
+
+/**
  * Validates the human and machine-readable names when adding or editing a menu.
  */
 function menu_edit_menu_validate($form, &$form_state) {
@@ -484,7 +534,7 @@ function menu_item_delete_form_submit($f
 /**
  * Menu callback; reset a single modified item.
  */
-function menu_reset_item(&$form_state, $item) {
+function menu_reset_item_confirm(&$form_state, $item) {
   $form['item'] = array('#type' => 'value', '#value' => $item);
   return confirm_form($form, t('Are you sure you want to reset the item %item to its default values?', array('%item' => $item['link_title'])), 'admin/build/menu-customize/'. $item['menu_name'], t('Any customizations will be lost. This action cannot be undone.'), t('Reset'));
 }
@@ -492,16 +542,24 @@ function menu_reset_item(&$form_state, $
 /**
  * Process menu reset item form submissions.
  */
-function menu_reset_item_submit($form, &$form_state) {
+function menu_reset_item_confirm_submit($form, &$form_state) {
   $item = $form_state['values']['item'];
+  $new_item = menu_reset_item($item);
+  drupal_set_message(t('The menu item was reset to its default settings.'));
+  $form_state['redirect'] = 'admin/build/menu-customize/'. $new_item['menu_name'];
+}
+
+/**
+ * Reset a system-defined menu item.
+ */
+function menu_reset_item($item) {
   $router = menu_router_build();
   $new_item = _menu_link_build($router[$item['router_path']]);
   foreach (array('mlid', 'has_children') as $key) {
     $new_item[$key] = $item[$key];
   }
   menu_link_save($new_item);
-  drupal_set_message(t('The menu item was reset to its default settings.'));
-  $form_state['redirect'] = 'admin/build/menu-customize/'. $new_item['menu_name'];
+  return $new_item;
 }
 
 /**
