WordPress.org

Make WordPress Core

Ticket #23119: 23119.24.1.diff​

File 23119.24.1.diff​, 54.5 KB (added by lessbloat, 15 months ago)
Line 
1Index: wp-admin/includes/nav-menu.php
2===================================================================
3--- wp-admin/includes/nav-menu.php      (revision 23389)
4+++ wp-admin/includes/nav-menu.php      (working copy)
5@@ -81,11 +81,15 @@
6 
7                $title = empty( $item->label ) ? $title : $item->label;
8 
9+               $submenu_text = '';
10+               if (0 == $depth)
11+                       $submenu_text = 'style="display: none;"';
12+
13                ?>
14                <li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode(' ', $classes ); ?>">
15                        <dl class="menu-item-bar">
16                                <dt class="menu-item-handle">
17-                                       <span class="item-title"><?php echo esc_html( $title ); ?></span>
18+                                       <span class="item-title"><?php echo esc_html( $title ); ?> <span class="is-submenu" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span></span>
19                                        <span class="item-controls">
20                                                <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span>
21                                                <span class="item-order hide-if-js">
22@@ -382,10 +386,11 @@
23  **/
24 function wp_nav_menu_setup() {
25        // Register meta boxes
26-       if ( wp_get_nav_menus() )
27-               add_meta_box( 'nav-menu-theme-locations', __( 'Theme Locations' ), 'wp_nav_menu_locations_meta_box' , 'nav-menus', 'side', 'default' );
28-       add_meta_box( 'add-custom-links', __('Custom Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' );
29+       //if ( wp_get_nav_menus() )
30+//             add_meta_box( 'nav-menu-theme-locations', __( 'Menus within your theme' ), 'wp_nav_menu_locations_meta_box' , 'nav-menus', 'side', 'default' );
31+               // todo: if we stick with the theme location checkboxes then remove the metabox code all togehter
32        wp_nav_menu_post_type_meta_boxes();
33+       add_meta_box( 'add-custom-links', __('Add Links'), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' );
34        wp_nav_menu_taxonomy_meta_boxes();
35 
36        // Register advanced menu items (columns)
37@@ -411,7 +416,7 @@
38        if ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array($wp_meta_boxes) )
39                return;
40 
41-       $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-custom-links', 'add-page', 'add-category' );
42+       $initial_meta_boxes = array( 'nav-menu-theme-locations', 'add-page', 'add-custom-links', 'add-category' );
43        $hidden_meta_boxes = array();
44 
45        foreach ( array_keys($wp_meta_boxes['nav-menus']) as $context ) {
46@@ -445,7 +450,7 @@
47                $post_type = apply_filters( 'nav_menu_meta_box_object', $post_type );
48                if ( $post_type ) {
49                        $id = $post_type->name;
50-                       add_meta_box( "add-{$id}", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'default', $post_type );
51+                       add_meta_box( "add-{$id}", __('Add ') . $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', 'default', $post_type );
52                }
53        }
54 }
55@@ -465,7 +470,7 @@
56                $tax = apply_filters( 'nav_menu_meta_box_object', $tax );
57                if ( $tax ) {
58                        $id = $tax->name;
59-                       add_meta_box( "add-{$id}", $tax->labels->name, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax );
60+                       add_meta_box( "add-{$id}", __('Add ') . $tax->labels->name, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax );
61                }
62        }
63 }
64@@ -489,7 +494,7 @@
65        $menu_locations = get_nav_menu_locations();
66        $num_locations = count( array_keys($locations) );
67 
68-       echo '<p class="howto">' . sprintf( _n('Your theme supports %s menu. Select which menu you would like to use.', 'Your theme supports %s menus. Select which menu appears in each location.', $num_locations ), number_format_i18n($num_locations) ) . '</p>';
69+       echo '<p class="howto">' . _n('Select a menu to use within your theme.', 'Select the menus you will use in your theme.', $num_locations ) . '</p>';
70 
71        foreach ( $locations as $location => $description ) {
72                ?>
73@@ -512,12 +517,21 @@
74        }
75        ?>
76        <p class="button-controls">
77-               <?php submit_button( __( 'Save' ), 'primary right', 'nav-menu-locations', false, disabled( $nav_menu_selected_id, 0, false ) ); ?>
78+               <?php submit_button( __( 'Save' ), 'primary right', 'nav-menu-locations', false, wp_nav_menu_disabled_check( $nav_menu_selected_id ) ); ?>
79                <span class="spinner"></span>
80        </p>
81        <?php
82 }
83 
84+function wp_nav_menu_disabled_check( $nav_menu_selected_id ) {
85+       global $one_theme_location_no_menus;
86+       
87+       if ( $one_theme_location_no_menus )
88+               return false;
89+       
90+       return disabled( $nav_menu_selected_id, 0 );
91+}
92+
93 /**
94  * Displays a metabox for the custom links menu item.
95  *
96@@ -554,14 +568,14 @@
97 
98                        <p id="menu-item-name-wrap">
99                                <label class="howto" for="custom-menu-item-name">
100-                                       <span><?php _e('Label'); ?></span>
101+                                       <span><?php _e('Link Text'); ?></span>
102                                        <input id="custom-menu-item-name" name="menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-title]" type="text" class="regular-text menu-item-textbox input-with-default-title" title="<?php esc_attr_e('Menu Item'); ?>" />
103                                </label>
104                        </p>
105 
106                <p class="button-controls">
107                        <span class="add-to-menu">
108-                               <input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-custom-menu-item" id="submit-customlinkdiv" />
109+                               <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-custom-menu-item" id="submit-customlinkdiv" />
110                                <span class="spinner"></span>
111                        </span>
112                </p>
113@@ -779,7 +793,7 @@
114                        </span>
115 
116                        <span class="add-to-menu">
117-                               <input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-post-type-menu-item" id="submit-posttype-<?php echo $post_type_name; ?>" />
118+                               <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-post-type-menu-item" id="submit-posttype-<?php echo $post_type_name; ?>" />
119                                <span class="spinner"></span>
120                        </span>
121                </p>
122@@ -955,7 +969,7 @@
123                        </span>
124 
125                        <span class="add-to-menu">
126-                               <input type="submit"<?php disabled( $nav_menu_selected_id, 0 ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-taxonomy-menu-item" id="submit-taxonomy-<?php echo $taxonomy_name; ?>" />
127+                               <input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e('Add to Menu'); ?>" name="add-taxonomy-menu-item" id="submit-taxonomy-<?php echo $taxonomy_name; ?>" />
128                                <span class="spinner"></span>
129                        </span>
130                </p>
131@@ -1084,10 +1098,10 @@
132        // If the menu exists, get its items.
133        if ( is_nav_menu( $menu ) ) {
134                $menu_items = wp_get_nav_menu_items( $menu->term_id, array('post_status' => 'any') );
135-               $result = '<div id="menu-instructions" class="post-body-plain';
136+               $result = '<div id="menu-instructions" class="post-body-plain';
137                $result .= ( ! empty($menu_items) ) ? ' menu-instructions-inactive">' : '">';
138-               $result .= '<p>' . __('Select menu items (pages, categories, links) from the boxes at left to begin building your custom menu.') . '</p>';
139-               $result .= '</div>';
140+               $result .= '<p>' . __('Next, add menu items (i.e. pages, links, categories) from the column on the left.') . '</p>';
141+               $result .= '</div>';
142 
143                if( empty($menu_items) )
144                        return $result . ' <ul class="menu" id="menu-to-edit"> </ul>';
145@@ -1158,5 +1172,102 @@
146        foreach( (array) $menu_items_to_delete as $menu_item_id )
147                wp_delete_post( $menu_item_id, true );
148 }
149+add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items');
150 
151-add_action('admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items');
152+/**
153+* Delete nav menus from the nav menu management screen
154+*
155+* @access private
156+* @since 3.6
157+*/
158+function _wp_delete_nav_menu( $nav_menu_id ) {
159+
160+       if ( ! is_nav_menu( $nav_menu_id ) )
161+               return;
162+
163+       $deleted_nav_menu = wp_get_nav_menu_object( $nav_menu_id );
164+       $delete_nav_menu = wp_delete_nav_menu( $nav_menu_id );
165+
166+       if ( is_wp_error( $delete_nav_menu ) )
167+               return $delete_nav_menu;
168+
169+       // Remove this menu from any locations.
170+       $locations = get_theme_mod( 'nav_menu_locations' );
171+       foreach ( (array) $locations as $location => $menu_id ) {
172+               if ( $menu_id == $nav_menu_id )
173+                       $locations[ $location ] = 0;
174+       }
175+       set_theme_mod( 'nav_menu_locations', $locations );
176+       return true;
177+}
178+
179+/**
180+* Saves nav menu items
181+*
182+* @since 3.6
183+*/
184+function wp_nav_menu_update_menu_items ($nav_menu_selected_id, $nav_menu_selected_title) {
185+       $unsorted_menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID', 'post_status' => 'draft,publish') );
186+                               
187+       $menu_items = array();
188+       // Index menu items by db ID
189+       foreach( $unsorted_menu_items as $_item )
190+               $menu_items[$_item->db_id] = $_item;
191+
192+       $post_fields = array( 'menu-item-db-id', 'menu-item-object-id', 'menu-item-object', 'menu-item-parent-id', 'menu-item-position', 'menu-item-type', 'menu-item-title', 'menu-item-url', 'menu-item-description', 'menu-item-attr-title', 'menu-item-target', 'menu-item-classes', 'menu-item-xfn' );
193+       wp_defer_term_counting(true);
194+       // Loop through all the menu items' POST variables
195+       if ( ! empty( $_POST['menu-item-db-id'] ) ) {
196+               foreach( (array) $_POST['menu-item-db-id'] as $_key => $k ) {
197+
198+                       // Menu item title can't be blank
199+                       if ( empty( $_POST['menu-item-title'][$_key] ) )
200+                               continue;
201+
202+                       $args = array();
203+                       foreach ( $post_fields as $field )
204+                               $args[$field] = isset( $_POST[$field][$_key] ) ? $_POST[$field][$_key] : '';
205+
206+                       $menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, ( $_POST['menu-item-db-id'][$_key] != $_key ? 0 : $_key ), $args );
207+
208+                       if ( is_wp_error( $menu_item_db_id ) )
209+                               $messages[] = '<div id="message" class="error"><p>' . $menu_item_db_id->get_error_message() . '</p></div>';
210+                       elseif ( isset( $menu_items[$menu_item_db_id] ) )
211+                               unset( $menu_items[$menu_item_db_id] );
212+               }
213+       }
214+
215+       // Remove menu items from the menu that weren't in $_POST
216+       if ( ! empty( $menu_items ) ) {
217+               foreach ( array_keys( $menu_items ) as $menu_item_id ) {
218+                       if ( is_nav_menu_item( $menu_item_id ) ) {
219+                               wp_delete_post( $menu_item_id );
220+                       }
221+               }
222+       }
223+
224+       // Store 'auto-add' pages.
225+       $auto_add = ! empty( $_POST['auto-add-pages'] );
226+       $nav_menu_option = (array) get_option( 'nav_menu_options' );
227+       if ( ! isset( $nav_menu_option['auto_add'] ) )
228+               $nav_menu_option['auto_add'] = array();
229+       if ( $auto_add ) {
230+               if ( ! in_array( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) )
231+                       $nav_menu_option['auto_add'][] = $nav_menu_selected_id;
232+       } else {
233+               if ( false !== ( $key = array_search( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) ) )
234+                       unset( $nav_menu_option['auto_add'][$key] );
235+       }
236+       // Remove nonexistent/deleted menus
237+       $nav_menu_option['auto_add'] = array_intersect( $nav_menu_option['auto_add'], wp_get_nav_menus( array( 'fields' => 'ids' ) ) );
238+       update_option( 'nav_menu_options', $nav_menu_option );
239+
240+       wp_defer_term_counting(false);
241+
242+       do_action( 'wp_update_nav_menu', $nav_menu_selected_id );
243+
244+       $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('<strong>%1$s</strong> has been updated.'), $nav_menu_selected_title ) . '</p></div>';
245+       unset( $menu_items, $unsorted_menu_items );
246+       
247+       return $messages;
248+}
249\ No newline at end of file
250Index: wp-admin/js/nav-menu.js
251===================================================================
252--- wp-admin/js/nav-menu.js     (revision 23389)
253+++ wp-admin/js/nav-menu.js     (working copy)
254@@ -45,9 +45,15 @@
255                        if( api.menuList.length ) // If no menu, we're in the + tab.
256                                this.initSortables();
257 
258+                       if( oneThemeLocationNoMenus )
259+                               $('#posttype-page').addSelectedToMenu( api.addMenuItemToBottom );
260+
261                        this.initToggles();
262-
263-                       this.initTabManager();
264+                       
265+                       this.messageFadeIn();
266+                       
267+                       this.initSelectMenuDropdown();
268+                       this.initAccessibility();
269                },
270 
271                jQueryExtensions : function() {
272@@ -84,18 +90,53 @@
273                                        });
274                                        return result;
275                                },
276+                               shiftHorizontally : function(dir) {
277+                                       return this.each(function(){
278+                                               var t = $(this),
279+                                                       depth = t.menuItemDepth(),
280+                                                       newDepth = depth + dir;
281+
282+                                               // Change .menu-item-depth-n class
283+                                               t.moveHorizontally(newDepth, depth);
284+                                       });
285+                               },
286+                               moveHorizontally : function(newDepth, depth) {
287+                                       return this.each(function(){
288+                                               var t = $(this),
289+                                                       children = t.childMenuItems(),
290+                                                       diff = newDepth - depth,
291+                                                       subItemText = t.find('.is-submenu');
292+
293+                                               // Change .menu-item-depth-n class
294+                                               t.updateDepthClass(newDepth, depth).updateParentMenuItemDBId();
295+
296+                                               // If it has children, move those too
297+                                               if (children) {
298+                                                       children.each(function( index ) {
299+                                                               var thisDepth = $(this).menuItemDepth(),
300+                                                                       newDepth = thisDepth + diff;
301+                                                               $(this).updateDepthClass(newDepth, thisDepth).updateParentMenuItemDBId();
302+                                                       });
303+                                               }
304+
305+                                               // Show "Sub item" helper text
306+                                               if (0 === newDepth)
307+                                                       subItemText.hide();
308+                                               else
309+                                                       subItemText.show();
310+                                       });
311+                               },
312                                updateParentMenuItemDBId : function() {
313                                        return this.each(function(){
314                                                var item = $(this),
315                                                        input = item.find('.menu-item-data-parent-id'),
316-                                                       depth = item.menuItemDepth(),
317-                                                       parent = item.prev();
318+                                                       depth = parseInt(item.menuItemDepth()),
319+                                                       parentDepth = depth - 1;
320+                                                       parent = item.prevAll('.menu-item-depth-' + parentDepth).first();
321 
322                                                if( depth == 0 ) { // Item is on the top level, has no parent
323                                                        input.val(0);
324                                                } else { // Find the parent item, and retrieve its object id.
325-                                                       while( ! parent[0] || ! parent[0].className || -1 == parent[0].className.indexOf('menu-item') || ( parent.menuItemDepth() != depth - 1 ) )
326-                                                               parent = parent.prev();
327                                                        input.val( parent.find('.menu-item-data-db-id').val() );
328                                                }
329                                        });
330@@ -120,7 +161,7 @@
331 
332                                        return this.each(function() {
333                                                var t = $(this), menuItems = {},
334-                                                       checkboxes = t.find('.tabs-panel-active .categorychecklist li input:checked'),
335+                                                       checkboxes = ( oneThemeLocationNoMenus && 0 == t.find('.tabs-panel-active .categorychecklist li input:checked').length ) ? t.find('#page-all li input[type="checkbox"]') : t.find('.tabs-panel-active .categorychecklist li input:checked'),
336                                                        re = new RegExp('menu-item\\[(\[^\\]\]*)');
337 
338                                                processMethod = processMethod || api.addMenuItemToBottom;
339@@ -222,7 +263,140 @@
340                                }
341                        });
342                },
343+               
344+               initSelectMenuDropdown : function () {
345+                       var menuSelector = $('.manage-menus select');
346 
347+                       menuSelector.on('change', function () {
348+                               var url = $(this).val();
349+
350+                               if (url && '--' !== url) {
351+                                       $('.menu-selector .spinner').show();
352+                                       window.location = url;
353+                               }
354+                       });
355+               },
356+               
357+               initAccessibility : function() {
358+                       $('.item-edit').on('focus', function () {
359+                               $(this).on('keydown', function (e) {
360+
361+                                       // Bail if it's not an arrow key
362+                                       if (e.which !== 37 && e.which !== 38 && e.which !== 39 && e.which !== 40)
363+                                               return;
364+
365+                                       // Avoid multiple keydown events
366+                                       $(this).off('keydown');
367+
368+                                       var menuItems = $('#menu-to-edit li');
369+                                               menuItemsCount = menuItems.length,
370+                                               thisItem = $(this).parents('li.menu-item'),
371+                                               thisItemChildren = thisItem.childMenuItems(),
372+                                               thisItemData = thisItem.getItemData(),
373+                                               thisItemDepth = parseInt(thisItem.menuItemDepth()),
374+                                               thisItemPosition = parseInt(thisItem.index()),
375+                                               nextItem = thisItem.next(),
376+                                               nextItemChildren = nextItem.childMenuItems(),
377+                                               nextItemDepth = parseInt(nextItem.menuItemDepth()) + 1,
378+                                               prevItem = thisItem.prev(),
379+                                               prevItemDepth = parseInt(prevItem.menuItemDepth()),
380+                                               prevItemId = prevItem.getItemData()['menu-item-db-id'];
381+
382+                                       // Bail if there is only one menu item
383+                                       if (1 === menuItemsCount)
384+                                               return;
385+                                               
386+                                       // If RTL, swap left/right arrows
387+                                       var arrows = { '38' : 'up', '40' : 'down', '37' : 'left', '39' : 'right' };
388+                                       if ($('body').hasClass('rtl'))
389+                                               arrows = { '38' : 'up', '40' : 'down', '39' : 'left', '37' : 'right' };
390+
391+                                       switch (arrows[e.which]) {
392+                                       case 'up':
393+                                               var newItemPosition = thisItemPosition - 1;
394+
395+                                               // Already at top
396+                                               if (0 === thisItemPosition)
397+                                                       break;
398+
399+                                               // If a sub item is moved to top, shift it to 0 depth
400+                                               if (0 === newItemPosition && 0 !== thisItemDepth)
401+                                                       thisItem.moveHorizontally(0, thisItemDepth);
402+
403+                                               // If prev item is sub item, shift to match depth
404+                                               if (0 !== prevItemDepth)
405+                                                       thisItem.moveHorizontally(prevItemDepth, thisItemDepth);
406+
407+                                               // Does this item have sub items?
408+                                               if (thisItemChildren) {
409+                                                       var items = thisItem.add(thisItemChildren);
410+                                                       // Move the entire block
411+                                                       items.detach().insertBefore(menuItems.eq(newItemPosition));
412+                                               } else {
413+                                                       thisItem.detach().insertBefore(menuItems.eq(newItemPosition));
414+                                               }
415+                                               break;
416+                                       case 'down':
417+                                               // Does this item have sub items?
418+                                               if (thisItemChildren) {
419+                                                       var items = thisItem.add(thisItemChildren),
420+                                                               nextItem = menuItems.eq(items.length + thisItemPosition),
421+                                                               nextItemChildren = 0 !== nextItem.childMenuItems().length;
422+
423+                                                       if (nextItemChildren) {
424+                                                               var newDepth = parseInt(nextItem.menuItemDepth()) + 1;
425+                                                               thisItem.moveHorizontally(newDepth, thisItemDepth);
426+                                                       }
427+
428+                                                       // Have we reached the bottom?
429+                                                       if (menuItemsCount === thisItemPosition + items.length)
430+                                                               break;
431+
432+                                                       items.detach().insertAfter(menuItems.eq(thisItemPosition + items.length));
433+                                               } else {
434+                                                       // If next item has sub items, shift depth
435+                                                       if (0 !== nextItemChildren.length)
436+                                                               thisItem.moveHorizontally(nextItemDepth, thisItemDepth);
437+
438+                                                       // Have we reached the bottom
439+                                                       if (menuItemsCount === thisItemPosition + 1)
440+                                                               break;
441+                                                       thisItem.detach().insertAfter(menuItems.eq(thisItemPosition + 1));
442+                                               }
443+                                               break;
444+                                       case 'left':
445+                                               // As far left as possible
446+                                               if (0 === thisItemDepth)
447+                                                       break;
448+                                               thisItem.shiftHorizontally(-1);
449+                                               break;
450+                                       case 'right':
451+                                               // Can't be sub item at top
452+                                               if (0 === thisItemPosition)
453+                                                       break;
454+                                               // Already sub item of prevItem
455+                                               if (thisItemData['menu-item-parent-id'] === prevItemId)
456+                                                       break;
457+                                               thisItem.shiftHorizontally(1);
458+                                               break;
459+                                       }
460+                                       api.registerChange();
461+                                       // Put focus back on same menu item
462+                                       $('#edit-' + thisItemData['menu-item-db-id']).focus();
463+                                       return false;
464+                               });
465+                       }).blur(function () {
466+                               $(this).off('keydown');
467+                       });
468+               },
469+               
470+               messageFadeIn : function() {
471+                       var messages = $('#message');
472+                       
473+                       // Visual change when users save menus multiple times in a row
474+                       messages.slideDown('slow');
475+               },
476+
477                initToggles : function() {
478                        // init postboxes
479                        postboxes.add_postbox_toggles('nav-menus');
480@@ -245,6 +419,9 @@
481                                menuEdge = api.menuList.offset().left,
482                                body = $('body'), maxChildDepth,
483                                menuMaxDepth = initialMenuMaxDepth();
484+                               
485+                       if( 0 != $('#menu-to-edit li').length )
486+                               $('.drag-instructions').show();
487 
488                        // Use the right edge if RTL.
489                        menuEdge += api.isRTL ? api.menuList.width() : 0;
490@@ -307,6 +484,13 @@
491 
492                                        // Return child elements to the list
493                                        children = transport.children().insertAfter(ui.item);
494+                                       
495+                                       // Add "sub menu" description
496+                                       var subMenuTitle = ui.item.find('.item-title .is-submenu');
497+                                       if (0 < currentDepth)
498+                                               subMenuTitle.show();
499+                                       else
500+                                               subMenuTitle.hide();
501 
502                                        // Update depth classes
503                                        if( depthChange != 0 ) {
504@@ -327,9 +511,6 @@
505                                                ui.item[0].style.left = 'auto';
506                                                ui.item[0].style.right = 0;
507                                        }
508-
509-                                       // The width of the tab bar might have changed. Just in case.
510-                                       api.refreshMenuTabs( true );
511                                },
512                                change: function(e, ui) {
513                                        // Make sure the placeholder is inside the menu.
514@@ -461,6 +642,8 @@
515                                if( '' == $t.val() )
516                                        $t.addClass( name ).val( $t.data(name) );
517                        });
518+                       
519+                       $('.blank-slate .input-with-default-title').focus();
520                },
521 
522                attachThemeLocationsListeners : function() {
523@@ -572,6 +755,9 @@
524                        $.post( ajaxurl, params, function(menuMarkup) {
525                                var ins = $('#menu-instructions');
526                                processMethod(menuMarkup, params);
527+                               // Make it stand out a bit more visually, by adding a fadeIn
528+                               $('li.pending').hide().fadeIn('slow');
529+                               $('.drag-instructions').show();
530                                if( ! ins.hasClass('menu-instructions-inactive') && ins.siblings().length )
531                                        ins.addClass('menu-instructions-inactive');
532                                callback();
533@@ -604,7 +790,7 @@
534                                };
535                        } else {
536                                // Make the post boxes read-only, as they can't be used yet
537-                               $('#menu-settings-column').find('input,select').prop('disabled', true).end().find('a').attr('href', '#').unbind('click');
538+                               $('#menu-settings-column').find('input,select').end().find('a').attr('href', '#').unbind('click');
539                        }
540                },
541 
542@@ -688,139 +874,6 @@
543                        });
544                },
545 
546-               initTabManager : function() {
547-                       var fixed = $('.nav-tabs-wrapper'),
548-                               fluid = fixed.children('.nav-tabs'),
549-                               active = fluid.children('.nav-tab-active'),
550-                               tabs = fluid.children('.nav-tab'),
551-                               tabsWidth = 0,
552-                               fixedRight, fixedLeft,
553-                               arrowLeft, arrowRight, resizeTimer, css = {},
554-                               marginFluid = api.isRTL ? 'margin-right' : 'margin-left',
555-                               marginFixed = api.isRTL ? 'margin-left' : 'margin-right',
556-                               msPerPx = 2;
557-
558-                       /**
559-                        * Refreshes the menu tabs.
560-                        * Will show and hide arrows where necessary.
561-                        * Scrolls to the active tab by default.
562-                        *
563-                        * @param savePosition {boolean} Optional. Prevents scrolling so
564-                        *                that the current position is maintained. Default false.
565-                        **/
566-                       api.refreshMenuTabs = function( savePosition ) {
567-                               var fixedWidth = fixed.width(),
568-                                       margin = 0, css = {};
569-                               fixedLeft = fixed.offset().left;
570-                               fixedRight = fixedLeft + fixedWidth;
571-
572-                               if( !savePosition )
573-                                       active.makeTabVisible();
574-
575-                               // Prevent space from building up next to the last tab if there's more to show
576-                               if( tabs.last().isTabVisible() ) {
577-                                       margin = fixed.width() - tabsWidth;
578-                                       margin = margin > 0 ? 0 : margin;
579-                                       css[marginFluid] = margin + 'px';
580-                                       fluid.animate( css, 100, "linear" );
581-                               }
582-
583-                               // Show the arrows only when necessary
584-                               if( fixedWidth > tabsWidth )
585-                                       arrowLeft.add( arrowRight ).hide();
586-                               else
587-                                       arrowLeft.add( arrowRight ).show();
588-                       }
589-
590-                       $.fn.extend({
591-                               makeTabVisible : function() {
592-                                       var t = this.eq(0), left, right, css = {}, shift = 0;
593-
594-                                       if( ! t.length ) return this;
595-
596-                                       left = t.offset().left;
597-                                       right = left + t.outerWidth();
598-
599-                                       if( right > fixedRight )
600-                                               shift = fixedRight - right;
601-                                       else if ( left < fixedLeft )
602-                                               shift = fixedLeft - left;
603-
604-                                       if( ! shift ) return this;
605-
606-                                       css[marginFluid] = "+=" + api.negateIfRTL * shift + 'px';
607-                                       fluid.animate( css, Math.abs( shift ) * msPerPx, "linear" );
608-                                       return this;
609-                               },
610-                               isTabVisible : function() {
611-                                       var t = this.eq(0),
612-                                               left = t.offset().left,
613-                                               right = left + t.outerWidth();
614-                                       return ( right <= fixedRight && left >= fixedLeft ) ? true : false;
615-                               }
616-                       });
617-
618-                       // Find the width of all tabs
619-                       tabs.each(function(){
620-                               tabsWidth += $(this).outerWidth(true);
621-                       });
622-
623-                       // Set up fixed margin for overflow, unset padding
624-                       css['padding'] = 0;
625-                       css[marginFixed] = (-1 * tabsWidth) + 'px';
626-                       fluid.css( css );
627-
628-                       // Build tab navigation
629-                       arrowLeft = $('<div class="nav-tabs-arrow nav-tabs-arrow-left"><a>&laquo;</a></div>');
630-                       arrowRight = $('<div class="nav-tabs-arrow nav-tabs-arrow-right"><a>&raquo;</a></div>');
631-                       // Attach to the document
632-                       fixed.wrap('<div class="nav-tabs-nav"/>').parent().prepend( arrowLeft ).append( arrowRight );
633-
634-                       // Set the menu tabs
635-                       api.refreshMenuTabs();
636-                       // Make sure the tabs reset on resize
637-                       $(window).resize(function() {
638-                               if( resizeTimer ) clearTimeout(resizeTimer);
639-                               resizeTimer = setTimeout( api.refreshMenuTabs, 200);
640-                       });
641-
642-                       // Build arrow functions
643-                       $.each([{
644-                                       arrow : arrowLeft,
645-                                       next : "next",
646-                                       last : "first",
647-                                       operator : "+="
648-                               },{
649-                                       arrow : arrowRight,
650-                                       next : "prev",
651-                                       last : "last",
652-                                       operator : "-="
653-                               }], function(){
654-                               var that = this;
655-                               this.arrow.mousedown(function(){
656-                                       var marginFluidVal = Math.abs( parseInt( fluid.css(marginFluid) ) ),
657-                                               shift = marginFluidVal,
658-                                               css = {};
659-
660-                                       if( "-=" == that.operator )
661-                                               shift = Math.abs( tabsWidth - fixed.width() ) - marginFluidVal;
662-
663-                                       if( ! shift ) return;
664-
665-                                       css[marginFluid] = that.operator + shift + 'px';
666-                                       fluid.animate( css, shift * msPerPx, "linear" );
667-                               }).mouseup(function(){
668-                                       var tab, next;
669-                                       fluid.stop(true);
670-                                       tab = tabs[that.last]();
671-                                       while( (next = tab[that.next]()) && next.length && ! next.isTabVisible() ) {
672-                                               tab = next;
673-                                       }
674-                                       tab.makeTabVisible();
675-                               });
676-                       });
677-               },
678-
679                eventOnClickEditLink : function(clickedEl) {
680                        var settings, item,
681                        matchedSection = /#(.*)$/.exec(clickedEl.href);
682@@ -945,8 +998,10 @@
683                                        var ins = $('#menu-instructions');
684                                        el.remove();
685                                        children.shiftDepthClass(-1).updateParentMenuItemDBId();
686-                                       if( ! ins.siblings().length )
687+                                       if( 0 == $('#menu-to-edit li').length ) {
688+                                               $('.drag-instructions').hide();
689                                                ins.removeClass('menu-instructions-inactive');
690+                                       }
691                                });
692                },
693 
694Index: wp-admin/nav-menus.php
695===================================================================
696--- wp-admin/nav-menus.php      (revision 23389)
697+++ wp-admin/nav-menus.php      (working copy)
698@@ -221,50 +221,61 @@
699                if ( is_nav_menu_item( $menu_item_id ) && wp_delete_post( $menu_item_id, true ) )
700                        $messages[] = '<div id="message" class="updated"><p>' . __('The menu item has been successfully deleted.') . '</p></div>';
701                break;
702+
703        case 'delete':
704                check_admin_referer( 'delete-nav_menu-' . $nav_menu_selected_id );
705-
706                if ( is_nav_menu( $nav_menu_selected_id ) ) {
707-                       $deleted_nav_menu = wp_get_nav_menu_object( $nav_menu_selected_id );
708-                       $delete_nav_menu = wp_delete_nav_menu( $nav_menu_selected_id );
709-
710-                       if ( is_wp_error($delete_nav_menu) ) {
711-                               $messages[] = '<div id="message" class="error"><p>' . $delete_nav_menu->get_error_message() . '</p></div>';
712-                       } else {
713-                               // Remove this menu from any locations.
714-                               $locations = get_theme_mod( 'nav_menu_locations' );
715-                               foreach ( (array) $locations as $location => $menu_id ) {
716-                                       if ( $menu_id == $nav_menu_selected_id )
717-                                               $locations[ $location ] = 0;
718-                               }
719-                               set_theme_mod( 'nav_menu_locations', $locations );
720-                               $messages[] = '<div id="message" class="updated"><p>' . __('The menu has been successfully deleted.') . '</p></div>';
721-                               // Select the next available menu
722-                               $nav_menu_selected_id = 0;
723-                               $_nav_menus = wp_get_nav_menus( array('orderby' => 'name') );
724-                               foreach( $_nav_menus as $index => $_nav_menu ) {
725-                                       if ( strcmp( $_nav_menu->name, $deleted_nav_menu->name ) >= 0
726-                                        || $index == count( $_nav_menus ) - 1 ) {
727-                                               $nav_menu_selected_id = $_nav_menu->term_id;
728-                                               break;
729-                                       }
730-                               }
731-                       }
732-                       unset( $delete_nav_menu, $deleted_nav_menu, $_nav_menus );
733+                       $deletion = _wp_delete_nav_menu( $nav_menu_selected_id );
734                } else {
735                        // Reset the selected menu
736                        $nav_menu_selected_id = 0;
737                        unset( $_REQUEST['menu'] );
738                }
739+               
740+               if ( ! isset( $deletion ) )
741+                       break;
742+
743+               if ( is_wp_error( $deletion ) )
744+                       $messages[] = '<div id="message" class="error"><p>' . $deletion->get_error_message() . '</p></div>';
745+               else
746+                       $messages[] = '<div id="message" class="updated"><p>' . __( 'The menu has been successfully deleted.' ) . '</p></div>';
747                break;
748 
749+       case 'delete_menus':
750+               check_admin_referer( 'nav_menus_bulk_actions' );
751+               foreach ( $_REQUEST['delete_menus'] as $menu_id_to_delete ) {
752+                       if ( ! is_nav_menu( $menu_id_to_delete ) )
753+                               continue;
754+
755+                       $deletion = _wp_delete_nav_menu( $menu_id_to_delete );
756+                       if ( is_wp_error( $deletion ) ) {
757+                               $messages[] = '<div id="message" class="error"><p>' . $deletion->get_error_message() . '</p></div>';
758+                               $deletion_error = true;
759+                       }
760+               }
761+
762+               if ( empty( $deletion_error ) )
763+                       $messages[] = '<div id="message" class="updated"><p>' . __( 'Selected menus have been successfully deleted.' ) . '</p></div>';
764+               break;
765+
766        case 'update':
767                check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' );
768 
769                // Update menu theme locations
770-               if ( isset( $_POST['menu-locations'] ) )
771+               if ( isset( $_POST['menu-locations'] ) ) {
772                        set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_POST['menu-locations'] ) );
773+               } else {
774+                       // remove menu locations that have been unchecked
775+                       $locations = get_registered_nav_menus();
776+                       $menu_locations = get_nav_menu_locations();
777+                       foreach ( $locations as $location => $description ) {
778+                               if ( isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] == $nav_menu_selected_id )
779+                                       unset( $menu_locations[ $location ] );
780+                       }
781+                       set_theme_mod( 'nav_menu_locations', array_map( 'absint', (array) $menu_locations ) );
782+               }
783 
784+
785                // Add Menu
786                if ( 0 == $nav_menu_selected_id ) {
787                        $new_menu_title = trim( esc_html( $_POST['menu-name'] ) );
788@@ -278,7 +289,20 @@
789                                        $_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id );
790                                        $nav_menu_selected_id = $_nav_menu_selected_id;
791                                        $nav_menu_selected_title = $_menu_object->name;
792-                                       $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been successfully created.'), $nav_menu_selected_title ) . '</p></div>';
793+                                       if ( isset( $_REQUEST['menu-item'] ) )
794+                                               wp_save_nav_menu_items( $nav_menu_selected_id, $_REQUEST['menu-item'] );
795+                                       if ( isset( $_REQUEST['zero-menu-state'] ) ) {
796+                                               // If there are menu items, add them
797+                                               wp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title );
798+                                               // Auto-save nav_menu_locations
799+                                               $locations = get_theme_mod( 'nav_menu_locations' );
800+                                               foreach ( (array) $locations as $location => $menu_id ) {
801+                                                               $locations[ $location ] = $nav_menu_selected_id;
802+                                                               break; // There should only be 1
803+                                               }
804+                                               set_theme_mod( 'nav_menu_locations', $locations );
805+                                       }
806+                                       $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('<strong>%s</strong> has been created.'), $nav_menu_selected_title ) . '</p></div>';
807                                }
808                        } else {
809                                $messages[] = '<div id="message" class="error"><p>' . __('Please enter a valid menu name.') . '</p></div>';
810@@ -309,66 +333,7 @@
811                        // Update menu items
812 
813                        if ( ! is_wp_error( $_menu_object ) ) {
814-                               $unsorted_menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID', 'post_status' => 'draft,publish') );
815-                               $menu_items = array();
816-                               // Index menu items by db ID
817-                               foreach( $unsorted_menu_items as $_item )
818-                                       $menu_items[$_item->db_id] = $_item;
819-
820-                               $post_fields = array( 'menu-item-db-id', 'menu-item-object-id', 'menu-item-object', 'menu-item-parent-id', 'menu-item-position', 'menu-item-type', 'menu-item-title', 'menu-item-url', 'menu-item-description', 'menu-item-attr-title', 'menu-item-target', 'menu-item-classes', 'menu-item-xfn' );
821-                               wp_defer_term_counting(true);
822-                               // Loop through all the menu items' POST variables
823-                               if ( ! empty( $_POST['menu-item-db-id'] ) ) {
824-                                       foreach( (array) $_POST['menu-item-db-id'] as $_key => $k ) {
825-
826-                                               // Menu item title can't be blank
827-                                               if ( empty( $_POST['menu-item-title'][$_key] ) )
828-                                                       continue;
829-
830-                                               $args = array();
831-                                               foreach ( $post_fields as $field )
832-                                                       $args[$field] = isset( $_POST[$field][$_key] ) ? $_POST[$field][$_key] : '';
833-
834-                                               $menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, ( $_POST['menu-item-db-id'][$_key] != $_key ? 0 : $_key ), $args );
835-
836-                                               if ( is_wp_error( $menu_item_db_id ) )
837-                                                       $messages[] = '<div id="message" class="error"><p>' . $menu_item_db_id->get_error_message() . '</p></div>';
838-                                               elseif ( isset( $menu_items[$menu_item_db_id] ) )
839-                                                       unset( $menu_items[$menu_item_db_id] );
840-                                       }
841-                               }
842-
843-                               // Remove menu items from the menu that weren't in $_POST
844-                               if ( ! empty( $menu_items ) ) {
845-                                       foreach ( array_keys( $menu_items ) as $menu_item_id ) {
846-                                               if ( is_nav_menu_item( $menu_item_id ) ) {
847-                                                       wp_delete_post( $menu_item_id );
848-                                               }
849-                                       }
850-                               }
851-
852-                               // Store 'auto-add' pages.
853-                               $auto_add = ! empty( $_POST['auto-add-pages'] );
854-                               $nav_menu_option = (array) get_option( 'nav_menu_options' );
855-                               if ( ! isset( $nav_menu_option['auto_add'] ) )
856-                                       $nav_menu_option['auto_add'] = array();
857-                               if ( $auto_add ) {
858-                                       if ( ! in_array( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) )
859-                                               $nav_menu_option['auto_add'][] = $nav_menu_selected_id;
860-                               } else {
861-                                       if ( false !== ( $key = array_search( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) ) )
862-                                               unset( $nav_menu_option['auto_add'][$key] );
863-                               }
864-                               // Remove nonexistent/deleted menus
865-                               $nav_menu_option['auto_add'] = array_intersect( $nav_menu_option['auto_add'], wp_get_nav_menus( array( 'fields' => 'ids' ) ) );
866-                               update_option( 'nav_menu_options', $nav_menu_option );
867-
868-                               wp_defer_term_counting(false);
869-
870-                               do_action( 'wp_update_nav_menu', $nav_menu_selected_id );
871-
872-                               $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been updated.'), $nav_menu_selected_title ) . '</p></div>';
873-                               unset( $menu_items, $unsorted_menu_items );
874+                               $messages = array_merge( $messages, wp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title ) );
875                        }
876                }
877                break;
878@@ -376,22 +341,33 @@
879 
880 // Get all nav menus
881 $nav_menus = wp_get_nav_menus( array('orderby' => 'name') );
882+$menu_count = count( $nav_menus );
883 
884+// Are we on the add new screen?
885+$add_new_screen = ( isset( $_GET['menu'] ) && 0 == $_GET['menu'] ) ? true : false;
886+
887+// If we have one theme location, and zero menus, we take them right into editing their first menu
888+$one_theme_location_no_menus = ( 1 == count( get_registered_nav_menus() ) && ! $add_new_screen && empty($nav_menus) && 0 < count(get_pages()) ) ? true : false;
889+
890+// Redirect to add screen if there are no menus and this users has either zero, or more than 1 theme locations
891+if ( 0 == $menu_count && ! $add_new_screen && ! $one_theme_location_no_menus )
892+       wp_redirect( admin_url( 'nav-menus.php?action=edit&menu=0' ) );
893+
894 // Get recently edited nav menu
895 $recently_edited = (int) get_user_option( 'nav_menu_recently_edited' );
896-
897-// If there was no recently edited menu, and $nav_menu_selected_id is a nav menu, update recently edited menu.
898-if ( !$recently_edited && is_nav_menu( $nav_menu_selected_id ) ) {
899+if ( !$recently_edited && is_nav_menu( $nav_menu_selected_id ) )
900        $recently_edited = $nav_menu_selected_id;
901 
902-// Else if $nav_menu_selected_id is not a menu and not requesting that we create a new menu, but $recently_edited is a menu, grab that one.
903-} elseif ( 0 == $nav_menu_selected_id && ! isset( $_REQUEST['menu'] ) && is_nav_menu( $recently_edited ) ) {
904+// Use $recently_edited if none are selected
905+if ( 0 == $nav_menu_selected_id && ! isset( $_GET['menu'] ) && is_nav_menu( $recently_edited ) )
906        $nav_menu_selected_id = $recently_edited;
907 
908-// Else try to grab the first menu from the menus list
909-} elseif ( 0 == $nav_menu_selected_id && ! isset( $_REQUEST['menu'] ) && ! empty($nav_menus) ) {
910+// On deletion of menu, if another menu exists, show it
911+if ( ! $add_new_screen && 0 < $menu_count && isset( $_GET['action'] ) && 'delete' == $_GET['action'] )
912        $nav_menu_selected_id = $nav_menus[0]->term_id;
913-}
914+       
915+if ( $one_theme_location_no_menus )
916+       $nav_menu_selected_id = 0;
917 
918 // Update the user's setting
919 if ( $nav_menu_selected_id != $recently_edited && is_nav_menu( $nav_menu_selected_id ) )
920@@ -418,8 +394,10 @@
921 $_wp_nav_menu_max_depth = 0;
922 
923 // Calling wp_get_nav_menu_to_edit generates $_wp_nav_menu_max_depth
924-if ( is_nav_menu( $nav_menu_selected_id ) )
925+if ( is_nav_menu( $nav_menu_selected_id ) ) {
926+       $menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array('post_status' => 'any') );
927        $edit_markup = wp_get_nav_menu_to_edit( $nav_menu_selected_id );
928+}
929 
930 function wp_nav_menu_max_depth($classes) {
931        global $_wp_nav_menu_max_depth;
932@@ -460,15 +438,31 @@
933 ?>
934 <div class="wrap">
935        <?php screen_icon(); ?>
936-       <h2><?php esc_html_e('Menus'); ?></h2>
937+       <h2>Menus <a href="<?php echo esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0, ), admin_url( 'nav-menus.php' ) ) ); ?>" class="add-new-h2">Add New</a></h2>
938        <?php
939        foreach( $messages as $message ) :
940                echo $message . "\n";
941        endforeach;
942        ?>
943+       <?php if ( 1 < $menu_count ) : ?>
944+       <div class="manage-menus">
945+               <span><?php _e('Selected menu'); ?></span>
946+               <select>
947+                       <?php
948+                       foreach( (array) $nav_menus as $_nav_menu ) : ?>
949+                       <option value="<?php echo esc_url(add_query_arg( array( 'action' => 'edit', 'menu' => $_nav_menu->term_id, ), admin_url( 'nav-menus.php' ) )); ?>" <?php if ( $nav_menu_selected_id == $_nav_menu->term_id ) echo 'selected="selected"'; ?>>
950+                               <?php echo esc_html( $_nav_menu->truncated_name ); ?>
951+                       </option>
952+               <?php endforeach; ?>
953+               </select>
954+               <span class="spinner"></span>
955+       </div>
956+       <?php endif; ?>
957        <div id="nav-menus-frame">
958-       <div id="menu-settings-column" class="metabox-holder<?php if ( !$nav_menu_selected_id ) { echo ' metabox-holder-disabled'; } ?>">
959+       <div id="menu-settings-column" class="metabox-holder<?php if ( isset( $_GET['menu'] ) && '0' == $_GET['menu'] ) { echo ' metabox-holder-disabled'; } ?>">
960 
961+               <div class="clear"></div>
962+
963                <form id="nav-menu-meta" action="<?php echo admin_url( 'nav-menus.php' ); ?>" class="nav-menu-meta" method="post" enctype="multipart/form-data">
964                        <input type="hidden" name="menu" id="nav-menu-meta-object-id" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
965                        <input type="hidden" name="action" value="add-menu-item" />
966@@ -479,129 +473,113 @@
967        </div><!-- /#menu-settings-column -->
968        <div id="menu-management-liquid">
969                <div id="menu-management">
970-                       <div id="select-nav-menu-container" class="hide-if-js">
971-                               <form id="select-nav-menu" action="">
972-                                       <strong><label for="select-nav-menu"><?php esc_html_e( 'Select Menu:' ); ?></label></strong>
973-                                       <select class="select-nav-menu" name="menu">
974-                                               <?php foreach( (array) $nav_menus as $_nav_menu ) : ?>
975-                                                       <option value="<?php echo esc_attr($_nav_menu->term_id) ?>" <?php selected($nav_menu_selected_id, $_nav_menu->term_id); ?>>
976-                                                               <?php echo esc_html( $_nav_menu->truncated_name ); ?>
977-                                                       </option>
978-                                               <?php endforeach; ?>
979-                                               <option value="0"><?php esc_html_e('Add New Menu'); ?></option>
980-                                       </select>
981-                                       <input type="hidden" name="action" value="edit" />
982-                                       <?php submit_button( __( 'Select' ), 'secondary', 'select_menu', false ); ?>
983-                               </form>
984-                       </div>
985-                       <div class="nav-tabs-wrapper">
986-                       <div class="nav-tabs">
987-                               <?php
988-                               foreach( (array) $nav_menus as $_nav_menu ) :
989-                                       if ( $nav_menu_selected_id == $_nav_menu->term_id ) : ?><span class="nav-tab nav-tab-active">
990-                                                       <?php echo esc_html( $_nav_menu->truncated_name ); ?>
991-                                               </span><?php else : ?><a href="<?php
992-                                                       echo esc_url(add_query_arg(
993-                                                               array(
994-                                                                       'action' => 'edit',
995-                                                                       'menu' => $_nav_menu->term_id,
996-                                                               ),
997-                                                               admin_url( 'nav-menus.php' )
998-                                                       ));
999-                                               ?>" class="nav-tab hide-if-no-js">
1000-                                                       <?php echo esc_html( $_nav_menu->truncated_name ); ?>
1001-                                               </a><?php endif;
1002-                               endforeach;
1003-                               if ( 0 == $nav_menu_selected_id ) : ?><span class="nav-tab menu-add-new nav-tab-active">
1004-                                       <?php printf( '<abbr title="%s">+</abbr>', esc_html__( 'Add menu' ) ); ?>
1005-                               </span><?php else : ?><a href="<?php
1006-                                       echo esc_url(add_query_arg(
1007-                                               array(
1008-                                                       'action' => 'edit',
1009-                                                       'menu' => 0,
1010-                                               ),
1011-                                               admin_url( 'nav-menus.php' )
1012-                                       ));
1013-                               ?>" class="nav-tab menu-add-new">
1014-                                       <?php printf( '<abbr title="%s">+</abbr>', esc_html__( 'Add menu' ) ); ?>
1015-                               </a><?php endif; ?>
1016-                       </div>
1017-                       </div>
1018-                       <div class="menu-edit">
1019-                               <form id="update-nav-menu" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
1020+                       <form id="update-nav-menu" action="<?php echo admin_url( 'nav-menus.php' ); ?>" method="post" enctype="multipart/form-data">
1021+                               <div class="menu-edit <?php if ( $add_new_screen ) echo 'blank-slate'; ?>">
1022+                                       <?php
1023+                                       wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
1024+                                       wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
1025+                                       wp_nonce_field( 'update-nav_menu', 'update-nav-menu-nonce' );
1026+                                       ?>
1027+                                       <?php if ( $one_theme_location_no_menus ) { ?>
1028+                                       <input type="hidden" name="zero-menu-state" value="true" />
1029+                                       <?php } ?>
1030+                                       <input type="hidden" name="action" value="update" />
1031+                                       <input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
1032                                        <div id="nav-menu-header">
1033-                                               <div id="submitpost" class="submitbox">
1034-                                                       <div class="major-publishing-actions">
1035-                                                               <label class="menu-name-label howto open-label" for="menu-name">
1036-                                                                       <span><?php _e('Menu Name'); ?></span>
1037-                                                                       <input name="menu-name" id="menu-name" type="text" class="menu-name regular-text menu-item-textbox input-with-default-title" title="<?php esc_attr_e('Enter menu name here'); ?>" value="<?php echo esc_attr( $nav_menu_selected_title ); ?>" />
1038-                                                               </label>
1039-                                                               <?php if ( !empty( $nav_menu_selected_id ) ) :
1040-                                                                       if ( ! isset( $auto_add ) ) {
1041-                                                                               $auto_add = get_option( 'nav_menu_options' );
1042-                                                                               if ( ! isset( $auto_add['auto_add'] ) )
1043-                                                                                       $auto_add = false;
1044-                                                                               elseif ( false !== array_search( $nav_menu_selected_id, $auto_add['auto_add'] ) )
1045-                                                                                       $auto_add = true;
1046-                                                                               else
1047-                                                                                       $auto_add = false;
1048-                                                                       }
1049-                                                               ?>
1050-                                                               <div class="auto-add-pages">
1051-                                                                       <label class="howto"><input type="checkbox"<?php checked( $auto_add ); ?> name="auto-add-pages" value="1" /> <?php printf( __('Automatically add new top-level pages' ), esc_url( admin_url( 'edit.php?post_type=page' ) ) ); ?></label>
1052-                                                               </div>
1053+                                               <div class="major-publishing-actions">
1054+                                                       <h2><?php if ( $one_theme_location_no_menus ) { _e('Menu 1'); } else { echo esc_attr( $nav_menu_selected_title ); } ?></h2>
1055+                                                       <div class="publishing-action">
1056+                                                               <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?>
1057+                                                       </div><!-- END .publishing-action -->
1058+                                               </div><!-- END .major-publishing-actions -->
1059+                                       </div><!-- END .nav-menu-header -->
1060+                                       <div id="post-body">
1061+                                               <div id="post-body-content">
1062+                                                       <div class="menu-settings" <?php if ( $one_theme_location_no_menus ) { ?>style="display: none;"<?php } ?>>
1063+                                                               <h3 class="settings-header"><?php _e('Settings'); ?></strong></h3>
1064+                                                               <?php if ( $add_new_screen ) : ?>
1065+                                                                       <h3><?php _e('Add a new menu'); ?></strong></h3>
1066+                                                                       <p class="post-body-plain"><?php _e('Give your menu a name, then click Create Menu.'); ?></p>
1067                                                                <?php endif; ?>
1068-                                                               <br class="clear" />
1069-                                                               <div class="publishing-action">
1070-                                                                       <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?>
1071-                                                               </div><!-- END .publishing-action -->
1072+                                                               <dl>
1073+                                                                       <dt class="howto"><label class="menu-name-label" for="menu-name"><?php _e('Menu Name'); ?></label></dt>
1074+                                                                       <dd>
1075+                                                                               <?php if ( $one_theme_location_no_menus ) { ?>
1076+                                                                               <input name="menu-name" id="menu-name" type="hidden" class="menu-name regular-text menu-item-textbox input-with-default-title" value="<?php _e('Menu 1'); ?>" />
1077+                                                                               <?php } else { ?>
1078+                                                                               <input name="menu-name" id="menu-name" type="text" class="menu-name regular-text menu-item-textbox input-with-default-title" title="<?php esc_attr_e('Enter menu name here'); ?>" value="<?php echo esc_attr( $nav_menu_selected_title ); ?>" />
1079+                                                                               <?php } ?>
1080+                                                                       </dd>
1081+                                                               </dl>
1082+                                                               <?php
1083+                                                               if ( ! isset( $auto_add ) ) {
1084+                                                                       $auto_add = get_option( 'nav_menu_options' );
1085+                                                                       if ( ! isset( $auto_add['auto_add'] ) )
1086+                                                                               $auto_add = false;
1087+                                                                       elseif ( false !== array_search( $nav_menu_selected_id, $auto_add['auto_add'] ) )
1088+                                                                               $auto_add = true;
1089+                                                                       else
1090+                                                                               $auto_add = false;
1091+                                                               } ?>
1092 
1093-                                                               <?php if ( ! empty( $nav_menu_selected_id ) ) : ?>
1094-                                                               <div class="delete-action">
1095-                                                                       <a class="submitdelete deletion menu-delete" href="<?php echo esc_url( wp_nonce_url( admin_url('nav-menus.php?action=delete&amp;menu=' . $nav_menu_selected_id), 'delete-nav_menu-' . $nav_menu_selected_id ) ); ?>"><?php _e('Delete Menu'); ?></a>
1096-                                                               </div><!-- END .delete-action -->
1097+                                                               <dl class="auto-add-pages">
1098+                                                                       <dt class="howto"><?php _e('Auto add pages'); ?></dt>
1099+                                                                       <dd class="checkbox-input"><input type="checkbox"<?php checked( $auto_add ); ?> name="auto-add-pages" id="auto-add-pages" value="1" /> <label for="auto-add-pages"><?php printf( __('Automatically add new top-level pages to this menu' ), esc_url( admin_url( 'edit.php?post_type=page' ) ) ); ?></label></dd>
1100+                                                               </dl>
1101+
1102+                                                               <?php if ( current_theme_supports( 'menus' ) ) :
1103+                                                                       $locations = get_registered_nav_menus();
1104+                                                                       $menu_locations = get_nav_menu_locations();
1105+                                                               ?>
1106+
1107+                                                                       <dl class="menu-theme-locations">
1108+                                                                               <dt class="howto"><?php _e( 'Theme locations' ); ?></dt>
1109+                                                                               <?php foreach ( $locations as $location => $description ) : ?>
1110+                                                                               <dd class="checkbox-input">
1111+                                                                                       <input type="checkbox"<?php checked( isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] == $nav_menu_selected_id ); ?> name="menu-locations[<?php echo esc_attr( $location ); ?>]" id="locations-<?php echo esc_attr( $location ); ?>" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" /> <label for="locations-<?php echo esc_attr( $location ); ?>"><?php echo $description; ?></label>
1112+                                                                                       <?php if ( isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] != $nav_menu_selected_id ) : ?>
1113+                                                                                       <span class="theme-location-set"><?php printf( __( "(Set to: %s)" ), wp_get_nav_menu_object( $menu_locations[ $location ] )->name ); ?></span>
1114+                                                                                       <?php endif; ?>
1115+                                                                               </dd>
1116+                                                                               <?php endforeach; ?>
1117+                                                                       </dl>
1118+
1119                                                                <?php endif; ?>
1120-                                                       </div><!-- END .major-publishing-actions -->
1121-                                               </div><!-- END #submitpost .submitbox -->
1122-                                               <?php
1123-                                               wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
1124-                                               wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
1125-                                               wp_nonce_field( 'update-nav_menu', 'update-nav-menu-nonce' );
1126-                                               ?>
1127-                                               <input type="hidden" name="action" value="update" />
1128-                                               <input type="hidden" name="menu" id="menu" value="<?php echo esc_attr( $nav_menu_selected_id ); ?>" />
1129-                                       </div><!-- END #nav-menu-header -->
1130-                                       <div id="post-body">
1131-                                               <div id="post-body-content">
1132+
1133+                                                       </div>
1134+                                                       <?php if ( ! $add_new_screen ) : ?>
1135+                                                       <h3><?php _e('Menu Structure'); ?></strong></h3>
1136+                                                       <?php $starter_copy = ( $one_theme_location_no_menus ) ? __("Edit your default menu by adding or removing items. Drag each item into the order you prefer. Click Create Menu to save your changes.") : __('Drag each item into the order you prefer. Click an item to reveal additional configuration options.') ; ?>
1137+                                                       <div class="drag-instructions post-body-plain" <?php if ( isset( $menu_items ) && 0 == count( $menu_items ) ) { ?>style="display: none;"<?php } ?>>
1138+                                                               <p><?php echo $starter_copy; ?></p>
1139+                                                       </div>
1140                                                        <?php
1141-                                                       if ( isset( $edit_markup ) ) {
1142-                                                               if ( ! is_wp_error( $edit_markup ) )
1143-                                                                       echo $edit_markup;
1144-                                                       } else if ( empty( $nav_menu_selected_id ) ) {
1145-                                                               echo '<div class="post-body-plain">';
1146-                                                               echo '<p>' . __('To create a custom menu, give it a name above and click Create Menu. Then choose items like pages, categories or custom links from the left column to add to this menu.') . '</p>';
1147-                                                               echo '<p>' . __('After you have added your items, drag and drop to put them in the order you want. You can also click each item to reveal additional configuration options.') . '</p>';
1148-                                                               echo '<p>' . __('When you have finished building your custom menu, make sure you click the Save Menu button.') . '</p>';
1149-                                                               echo '</div>';
1150-                                                       }
1151+                                                       if ( isset( $edit_markup ) && ! is_wp_error( $edit_markup ) ) {
1152+                                                               echo $edit_markup;
1153+                                                       } else {
1154                                                        ?>
1155+                                                       <ul class="menu" id="menu-to-edit"></ul>
1156+                                                       <?php } ?>
1157+                                                       <?php endif; ?>
1158                                                </div><!-- /#post-body-content -->
1159                                        </div><!-- /#post-body -->
1160                                        <div id="nav-menu-footer">
1161                                                <div class="major-publishing-actions">
1162-                                               <div class="publishing-action">
1163-                                                       <?php
1164-                                                       if ( ! empty( $nav_menu_selected_id ) )
1165-                                                               submit_button( __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_footer' ) );
1166-                                                       ?>
1167-                                               </div>
1168-                                               </div>
1169+                                                       <?php if ( 0 != $menu_count && ! $add_new_screen ) : ?>
1170+                                                       <span class="delete-action">
1171+                                                               <a class="submitdelete deletion menu-delete" href="<?php echo esc_url( wp_nonce_url( admin_url('nav-menus.php?action=delete&amp;menu=' . $nav_menu_selected_id), 'delete-nav_menu-' . $nav_menu_selected_id ) ); ?>"><?php _e('Delete Menu'); ?></a>
1172+                                                       </span><!-- END .delete-action -->
1173+                                                       <?php endif; ?>
1174+                                                       <div class="publishing-action">
1175+                                                               <?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?>
1176+                                                       </div><!-- END .publishing-action -->
1177+                                               </div><!-- END .major-publishing-actions -->
1178                                        </div><!-- /#nav-menu-footer -->
1179-                               </form><!-- /#update-nav-menu -->
1180-                       </div><!-- /.menu-edit -->
1181+                               </div><!-- /.menu-edit -->
1182+                       </form><!-- /#update-nav-menu -->
1183                </div><!-- /#menu-management -->
1184        </div><!-- /#menu-management-liquid -->
1185        </div><!-- /#nav-menus-frame -->
1186 </div><!-- /.wrap-->
1187-
1188-<?php include( './admin-footer.php' ); ?>
1189+<script type="text/javascript">var oneThemeLocationNoMenus = <?php if ( $one_theme_location_no_menus ) { echo 'true'; } else { echo 'false'; } ?>;</script>
1190+<?php include( './admin-footer.php' ); ?>
1191\ No newline at end of file
1192Index: wp-admin/css/wp-admin.css
1193===================================================================
1194--- wp-admin/css/wp-admin.css   (revision 23389)
1195+++ wp-admin/css/wp-admin.css   (working copy)
1196@@ -2433,7 +2433,8 @@
1197 .fixed .column-categories,
1198 .fixed .column-tags,
1199 .fixed .column-rel,
1200-.fixed .column-role {
1201+.fixed .column-role,
1202+.fixed .column-count {
1203        width: 15%;
1204 }
1205 
1206@@ -6760,8 +6761,17 @@
1207 
1208 /* nav-menu */
1209 
1210+.nav-menus-php #message {
1211+       display: none;
1212+}
1213+
1214+.nav-menus-php .nav-tab-wrapper {
1215+       margin-bottom: 20px;
1216+}
1217+
1218 #nav-menus-frame {
1219        margin-left: 300px;
1220+       margin-top: 20px;
1221 }
1222 
1223 #wpbody-content #menu-settings-column {
1224@@ -6770,7 +6780,7 @@
1225        margin-left: -300px;
1226        clear: both;
1227        float: left;
1228-       padding-top: 24px;
1229+       padding-top: 0;
1230 }
1231 
1232 .no-js #wpbody-content #menu-settings-column {
1233@@ -6795,10 +6805,88 @@
1234        position: relative;
1235 }
1236 
1237+.blank-slate br {
1238+       display: none;
1239+}
1240+
1241+.blank-slate .menu-name {
1242+       height: 2em;
1243+}
1244+
1245+.is-submenu {
1246+       color: #999;
1247+       font-style: italic;
1248+       font-weight: normal;
1249+       margin-left: 4px;
1250+}
1251+
1252+.manage-menus {
1253+       border: 1px solid #eee;
1254+       background: #fbfbfb;
1255+       margin-top: 13px;
1256+       padding: 10px;
1257+       overflow: hidden;
1258+       -webkit-border-radius: 3px;
1259+       border-radius: 3px;
1260+}
1261+
1262+.manage-menus select {
1263+       float: left;
1264+       min-width: 180px;
1265+}
1266+
1267+.manage-menus .spinner {
1268+       float: left;
1269+}
1270+
1271+.manage-menus span {
1272+       float: left;
1273+       margin: 4px 6px 0 0;
1274+}
1275+
1276+.menu-edit p {
1277+       margin: .3em 0 .6em;
1278+}
1279+
1280+.menu-settings {
1281+       overflow: hidden;
1282+}
1283+
1284+.menu-settings dl {
1285+       margin: 0 0 10px;
1286+       overflow: hidden;
1287+       position: relative;
1288+}
1289+
1290+.menu-settings dd {
1291+       float: left;
1292+       margin: 0;
1293+       width: 60%;
1294+       padding-left: 170px;
1295+}
1296+
1297+.menu-settings dt {
1298+       clear: both;
1299+       display: inline;
1300+       float: left;
1301+       padding: 3px 0 0;
1302+       position: absolute;
1303+}
1304+
1305+.menu-edit .checkbox-input {
1306+       margin-top: 4px;
1307+}
1308+
1309+.theme-location-set {
1310+       color: #999;
1311+       font-size: 11px;
1312+}
1313+
1314 /* Menu Container */
1315 #menu-management-liquid {
1316        float: left;
1317        min-width: 100%;
1318+       margin-top: 3px;
1319 }
1320 
1321 #menu-management {
1322@@ -6812,8 +6900,12 @@
1323        margin-bottom: 20px;
1324 }
1325 
1326+#menu-management p.search-box {
1327+       margin: 5px 0;
1328+}
1329+
1330 .nav-menus-php #post-body {
1331-       padding: 10px;
1332+       padding: 0 10px;
1333        border-width: 1px 0;
1334        border-style: solid;
1335 }
1336@@ -6827,6 +6919,14 @@
1337        border-bottom: 1px solid;
1338 }
1339 
1340+#nav-menu-header h2 {
1341+       float: left;
1342+       line-height: 18px;
1343+       margin: 0;
1344+       padding: 6px 0 0 0;
1345+       font-size: 18px;
1346+}
1347+
1348 #nav-menu-footer {
1349        border-top: 1px solid;
1350 }
1351@@ -6845,55 +6945,6 @@
1352        font-weight:bold;
1353 }
1354 
1355-/* Menu Tabs */
1356-
1357-#menu-management .nav-tabs-nav {
1358-       margin: 0 20px;
1359-}
1360-
1361-#menu-management .nav-tabs-arrow {
1362-       width: 10px;
1363-       padding: 0 5px 4px;
1364-       cursor: pointer;
1365-       position: absolute;
1366-       top: 0;
1367-       line-height: 22px;
1368-       font-size: 18px;
1369-       text-shadow: 0 1px 0 #fff;
1370-}
1371-
1372-#menu-management .nav-tabs-arrow-left {
1373-       left: 0;
1374-}
1375-
1376-#menu-management .nav-tabs-arrow-right {
1377-       right: 0;
1378-       text-align: right;
1379-}
1380-
1381-#menu-management .nav-tabs-wrapper {
1382-       width: 100%;
1383-       height: 28px;
1384-       margin-bottom: -1px;
1385-       overflow: hidden;
1386-}
1387-
1388-#menu-management .nav-tabs {
1389-       padding-left: 20px;
1390-       padding-right: 10px;
1391-}
1392-
1393-.js #menu-management .nav-tabs {
1394-       float: left;
1395-       margin-left: 0px;
1396-       margin-right: -400px;
1397-}
1398-
1399-#menu-management .nav-tab {
1400-       margin-bottom: 0;
1401-       font-size: 14px;
1402-}
1403-
1404 #select-nav-menu-container {
1405        text-align: right;
1406        padding: 0 10px 3px 10px;
1407@@ -7090,7 +7141,8 @@
1408 }
1409 
1410 #menu-to-edit {
1411-       padding: 1em 0;
1412+       margin: 0;
1413+       padding: 0.1em 0;
1414 }
1415 
1416 .menu ul {
1417@@ -7106,7 +7158,7 @@
1418        clear:both;
1419        line-height:1.5em;
1420        position:relative;
1421-       margin: 13px 0 0 0;
1422+       margin-top: 9px;
1423 }
1424 
1425 .menu-item-handle {
1426@@ -7333,34 +7385,24 @@
1427        text-align: right;
1428        float: right;
1429        line-height: 23px;
1430-       margin: 5px 0 1px;
1431+       margin: 2px 0 1px;
1432 }
1433 
1434-.nav-menus-php .major-publishing-actions .delete-action {
1435-       vertical-align: middle;
1436-       text-align: left;
1437-       float: left;
1438-       padding-right: 15px;
1439-       margin-top: 5px;
1440+.nav-menus-php .blank-slate .auto-add-pages,
1441+.nav-menus-php .blank-slate .settings-header,
1442+.nav-menus-php .blank-slate dt,
1443+.nav-menus-php .blank-slate .auto-add-pages,
1444+.nav-menus-php .blank-slate .menu-theme-locations {
1445+       display: none;
1446 }
1447 
1448-.menu-name-label span,
1449-.auto-add-pages label {
1450-       font-size: 12px;
1451-       font-style: normal;
1452+.nav-menus-php .blank-slate dd {
1453+       padding: 0;
1454 }
1455 
1456-.menu-name-label {
1457-       margin-right: 15px;
1458-}
1459-
1460-.auto-add-pages input {
1461-       margin-top: 0;
1462-}
1463-
1464-.auto-add-pages {
1465-       margin-top: 4px;
1466+.nav-menus-php .delete-action {
1467        float: left;
1468+       margin-top: 2px;
1469 }
1470 
1471 .nav-menus-php .submitbox .submitcancel {