var wpDebugBar;

( function( $ ) {
	var api;

	wpDebugBar = api = {
		// The element that we will pad to prevent the debug bar
		// from overlapping the bottom of the page.
		body: undefined,

		init: function init() {
			// If we're not in the admin, pad the body.
			api.body = $( document.body );

			api.toggle.init();
			api.tabs();
			api.actions.init();
		},

		isVisible: function isVisible() {
			return api.body.hasClass( 'debug-bar-visible' );
		},

		toggle: {
			init: function init() {
				$( '#wp-admin-bar-debug-bar' ).on( 'click', function onClickAdminBarMenu( event ) {
					event.preventDefault();

					// Click on submenu item.
					if ( event.target.hash ) {
						var $menuLink = $( event.target.rel );

						// Open/close debug bar.
						if ( ! api.isVisible() ) {
							api.toggle.visibility();
						} else if ( $menuLink.hasClass( 'current' ) ) {
							$menuLink.removeClass( 'current' );
							api.toggle.visibility();

							return;
						}

						// Deselect other tabs and hide other panels.
						$( '.debug-menu-target' ).hide().trigger( 'debug-bar-hide' );
						$( '.debug-menu-link' ).removeClass( 'current' );

						$menuLink.addClass( 'current' );
						$( event.target.hash ).show().trigger( 'debug-bar-show' );
					} else {
						api.toggle.visibility();
					}
				} );
			},
			visibility: function visibility( show ) {
				show = typeof show == 'undefined' ? ! api.isVisible() : show;

				// Show/hide the debug bar.
				api.body.toggleClass( 'debug-bar-visible', show );

				// Press/unpress the button.
				$( this ).toggleClass( 'active', show );
			}
		},

		tabs: function tabs() {
			var debugMenuLinks = $( '.debug-menu-link' ),
				debugMenuTargets = $( '.debug-menu-target' );

			debugMenuLinks.on( 'click', function onClickLink( event ) {
				var $this = $( this );

				event.preventDefault();

				if ( $this.hasClass( 'current' ) ) {
					return;
				}

				// Deselect other tabs and hide other panels.
				debugMenuTargets.hide().trigger( 'debug-bar-hide' );
				debugMenuLinks.removeClass( 'current' );

				// Select the current tab and show the current panel.
				$this.addClass( 'current' );
				// The hashed component of the href is the id that we want to display.
				$( '#' + this.href.substr( this.href.indexOf( '#' ) + 1 ) ).show().trigger( 'debug-bar-show' );
			} );
		},

		actions: {
			init: function init() {
				var actions = $( '#debug-bar-actions' );

				// Close the panel with the esc key if it's open.
				$( document ).on( 'keydown', function maybeClosePanel( event ) {
					var key = event.key || event.which || event.keyCode;

					if ( (27 === key || 'Escape' === key) && api.isVisible() ) {
						event.preventDefault();
						api.actions.close();
					}
				} );

				$( '.maximize', actions ).on( 'click', api.actions.maximize );
				$( '.restore',  actions ).on( 'click', api.actions.restore  );
				$( '.close',    actions ).on( 'click', api.actions.close    );
			},
			maximize: function maximize() {
				api.body.removeClass( 'debug-bar-partial' );
				api.body.addClass( 'debug-bar-maximized' );
			},
			restore: function restore() {
				api.body.removeClass( 'debug-bar-maximized' );
				api.body.addClass( 'debug-bar-partial' );
			},
			close: function close() {
				api.toggle.visibility( false );
			}
		}
	};

	$( wpDebugBar.init );

} )( jQuery );
