<?php

/**
 * Display menu.
 *
 * @access private
 * @since 2.7.0
 *
 * @param array $menu
 * @param array $submenu
 * @param bool $submenu_as_parent
 */
function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) {
	global $self, $parent_file, $submenu_file, $plugin_page, $pagenow, $typenow;

	$first_key = key( $menu );

	// 0 = title, 1 = capability, 2 = file, 3 = page title (ignore), 4 = class, 5 = id, 6 = icon src
	foreach ( $menu as $key => $item ) {

		$item = array_pad( $item, 7, '' );
		list( $title, $capability, $slug, $ignore, $class, $id, $icon_src ) = $item;

		// @todo: Clarify whether we should texturize or not.
		$title = wptexturize( $title );

		$has_submenu   = ! empty( $submenu[ $slug ] );
		$submenu_items = ( $has_submenu ) ? $submenu[ $slug ] : false;

		$parent = $slug;

		if ( $key == $first_key )
			$class .= ' wp-first-item';

		if ( $has_submenu )
			$class .= ' wp-has-submenu';

		if ( ( $parent_file && $slug == $parent_file ) || ( empty( $typenow ) && $self == $slug ) )
			$class .= ( $has_submenu ) ? ' wp-has-current-submenu wp-menu-open' : ' current';
		else
			$class .= ' wp-not-current-submenu';

		// GENERATE MENU ITEM
		if ( $submenu_as_parent && $has_submenu ) {
			$submenu_items = array_values( $submenu_items );  // Re-index.
			$item_slug     = $submenu_items[0][2];
			$item_hook     = get_plugin_page_hook( $item_slug, $slug );

		} elseif ( ! empty( $slug ) && current_user_can( $capability ) ) {
			$item_slug = $slug;
			$item_hook = get_plugin_page_hook( $item_slug, 'admin.php' );
		}

		if ( isset( $item_slug ) ) {
			$item_file = $item_slug;
			if ( false !== ( $pos = strpos( $item_file, '?' ) ) )
				$item_file = substr( $item_file, 0, $pos );

			$item_url = $item_slug;
			if ( ! empty( $item_hook ) || ( ('index.php' != $item_slug ) && file_exists( WP_PLUGIN_DIR . "/$item_file" ) ) ) {
				$parent   = 'admin.php';
				$item_url = "admin.php?page=$item_slug";
			}
		}

		// RENDER MENU ITEM
		echo '<li id="' . esc_attr( $id ) . '" class="' . esc_attr( $class ) . '">';

		if ( false !== strpos( $class, 'wp-menu-separator' ) ) {
			echo '<div class="separator"></div>';

		} elseif ( isset( $item_slug ) ) {
			// Menu image
			echo '<div class="wp-menu-image">';
			echo '<a href="' . esc_url( $item_url ) . '">';

			if ( ! empty( $icon_src ) ) {
				if ( 'div' === $icon_src )
					echo '<br />';
				else
					echo '<img src="' . esc_url( $icon_src ) . '" alt="" />';
			}

			echo '</a></div>';

			// Menu arrow
			echo '<div class="wp-menu-arrow"><div></div></div>';

			// Menu title
			echo '<a href="' . esc_url( $item_url ) . '" class="' . esc_attr( $class ) . '" tabindex="1">';
			echo $title;
			echo '</a>';
		}


		// HANDLE SUBMENUS
		if ( $has_submenu ) {

			// Submenu wrapper.
			echo "<div class='wp-submenu'><div class='wp-submenu-wrap'>";
			echo "<div class='wp-submenu-head'>$title</div><ul>";

			$menu_file = $slug;
			if ( false !== ( $pos = strpos( $menu_file, '?' ) ) )
				$menu_file = substr( $menu_file, 0, $pos );

			// Clarify the location of the parent.
			 if ( ( 'admin.php' != $parent && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! is_dir( WP_PLUGIN_DIR . "/$slug" ) ) || file_exists( $menu_file ) )
				$parent = $slug;
			else
				$parent = 'admin.php';

			// Handle current for post_type=post|page|foo pages, which won't match $self.
			$self_type = ! empty( $typenow ) ? $self . '?post_type=' . $typenow : 'nothing';

			$first_sub_key = key( $submenu_items );

			foreach ( $submenu_items as $sub_key => $sub_item ) {
				// 0 = title, 1 = cap, 2 = slug, 3 = page title
				list( $sub_title, $sub_cap, $sub_slug ) = $sub_item;

				if ( ! current_user_can( $sub_cap ) )
					continue;

				$sub_title = wptexturize( $sub_title );
				$class = '';

				if ( $sub_key == $first_sub_key )
					$class .= ' wp-first-item';

				// Determine if we are on the current page.
				if ( isset( $submenu_file ) ) {
					if ( $submenu_file == $sub_slug )
						$class .= ' current';

				// If plugin_page is set the parent must either match the current page or not physically exist.
				// This allows plugin pages with the same hook to exist under different parents.
				} else if (
					( ! isset( $plugin_page ) && $self == $sub_slug ) ||
					( isset( $plugin_page ) && $plugin_page == $sub_slug &&
						( $slug == $self_type || $slug == $self || file_exists( $menu_file ) === false )
					)
				) {
					$class .= ' current';
				}

				$sub_hook = get_plugin_page_hook( $sub_slug, $slug );
				$sub_file  = $sub_slug;
				if ( false !== ( $pos = strpos( $sub_file, '?' ) ) )
					$sub_file = substr( $sub_file, 0, $pos );


				$sub_url = $sub_slug;
				if ( ! empty( $sub_hook ) || ( ( 'index.php' != $sub_slug ) && file_exists( WP_PLUGIN_DIR . "/$sub_file" ) ) ) {
					$sub_url = add_query_arg( array( 'page' => $sub_slug ), $parent );
				}

				// RENDER SUBMENU ITEM
				echo '<li class="' . esc_attr( $class ) . '">';
				echo '<a href="' . esc_url( $sub_url ) . '" class="' . esc_attr( $class ) . '" tabindex="1">';
				echo $sub_title;
				echo '</a></li>';
			}

			echo '</ul></div></div>';
		}
		echo '</li>';
	}

	echo '<li id="collapse-menu" class="hide-if-no-js"><div id="collapse-button"><div></div></div>';
	echo '<span>' . esc_html__( 'Collapse menu' ) . '</span>';
	echo '</li>';
}