Index: nav-menus.php
===================================================================
--- nav-menus.php	(revision 18610)
+++ nav-menus.php	(working copy)
@@ -268,7 +268,93 @@
 			unset( $_REQUEST['menu'] );
 		}
 		break;
+	case 'duplicate':
+		//check_admin_referer( 'duplicate-nav_menu', 'duplicate-nav-menu-nonce' );
+		
+		// Update menu theme locations
+		if ( isset( $_POST['menu-locations'] ) )
+			set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_POST['menu-locations'] ) );
+		
+		// capture current menu
+		if ( is_nav_menu( $nav_menu_selected_id ) ) {
+			$duplicated_nav_menu_selected_id = $nav_menu_selected_id;
+			$duplicated_nav_menu = wp_get_nav_menu_object( $nav_menu_selected_id );
+			$_menu_title = $duplicated_nav_menu->name.' (Copy)';
+		}
+		
+		// create new menu
+		if ( $_menu_title ) {
+			$_nav_menu_selected_id = wp_update_nav_menu_object( 0, array('menu-name' => $_menu_title) );
 
+			if ( is_wp_error( $_nav_menu_selected_id ) ) {
+				$messages[] = '<div id="message" class="error"><p>' . $_nav_menu_selected_id->get_error_message() . '</p></div>';
+			} else {
+				$_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id );
+				$nav_menu_selected_id = $_nav_menu_selected_id;
+				$nav_menu_selected_title = $_menu_object->name;
+				$messages[] = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been successfully created.'), $nav_menu_selected_title ) . '</p></div>';
+			}
+		} else {
+			$messages[] = '<div id="message" class="error"><p>' . __('Please enter a valid menu name.') . '</p></div>';
+		}
+		
+		// copy current menu into new menu 
+		if ( ! is_wp_error( $_menu_object ) ) {
+			$unsorted_menu_items = wp_get_nav_menu_items( $duplicated_nav_menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID', 'post_status' => 'draft,publish') );
+			$menu_items = array();
+			
+			// Index menu items by db ID
+			foreach( $unsorted_menu_items as $_item )
+				$menu_items[$_item->db_id] = $_item;
+
+			$post_fields = array( 'db-id', 'object-id', 'object', 'parent-id', 'position', 'type', 'title', 'url', 'description', 'attr-title', 'target', 'classes', 'xfn' );
+			wp_defer_term_counting(true);
+
+			// Loop through all the menu items' POST variables
+			global $_nav_menu_placeholder;
+			foreach( $menu_items as $_key => $k ) {
+				$args = array();
+				foreach ( $post_fields as $field ) {
+				
+					$_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;
+					$possible_object_id = $_nav_menu_placeholder;
+					$possible_db_id = ( ! empty( $k->ID ) ) && ( 0 < $possible_object_id ) ? (int) $k->ID : 0;
+				
+					switch ( $field ) {
+						case 'db-id':
+							//$args['menu-item-'.$field] = $k->db_id;
+							$args['menu-item-'.$field] = $possible_db_id;
+							break; 
+						case 'object-id' :
+							//$args['menu-item-'.$field] = $k->object_id;
+							$args['menu-item-'.$field] = $possible_object_id;
+							break; 
+						case 'parent-id':
+							$args['menu-item-'.$field] = $k->parent_id;
+							break; 
+						case 'attr-title' :
+							$args['menu-item-'.$field] = $k->attr_title;
+							break;
+						case 'classes' :
+							$args['menu-item-'.$field] = implode( ' ' , $k->classes );
+							break;
+						default:
+							$args['menu-item-'.$field] = $k->$field;
+							break;
+					}
+				}
+				
+				$menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, 0 , $args );
+
+				if ( is_wp_error( $menu_item_db_id ) )
+					$messages[] = '<div id="message" class="error"><p>' . $menu_item_db_id->get_error_message() . '</p></div>';
+				elseif ( isset( $menu_items[$menu_item_db_id] ) )
+					unset( $menu_items[$menu_item_db_id] );
+			}
+			
+		}
+		
+		break;
 	case 'update':
 		check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' );
 
@@ -560,6 +646,11 @@
 									<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>
 								</div><!-- END .delete-action -->
 								<?php endif; ?>
+								<?php if ( ! empty( $nav_menu_selected_id ) ) : ?>
+								<div class="duplicate-action">
+									<a class="submitduplicate duplicate menu-duplicate" href="<?php echo esc_url( wp_nonce_url( admin_url('nav-menus.php?action=duplicate&amp;menu=' . $nav_menu_selected_id), 'duplicate-nav_menu-' . $nav_menu_selected_id ) ); ?>"><?php _e('Duplicate Menu'); ?></a>
+								</div><!-- END .duplicate-action -->
+								<?php endif; ?>
 							</div><!-- END .major-publishing-actions -->
 						</div><!-- END #submitpost .submitbox -->
 						<?php
