docs: function( offsetParent, corner, offsetX, offsetY ) {
  				// Not for sub menu.
  				if ( !this.parent ) {
  					this._.onShow();
  					// Don't menu with zero items.
  					if ( !this.items.length )
  						return;
  				}
  
  				corner = corner || ( this.editor.lang.dir == 'rtl' ? 2 : 1 );
  
  				var items = this.items,
  					editor = this.editor,
  					panel = this._.panel,
  					element = this._.element;
  
  				// Create the floating panel for this menu.
  				if ( !panel ) {
  					panel = this._.panel = new CKEDITOR.ui.floatPanel( this.editor, CKEDITOR.document.getBody(), this._.panelDefinition, this._.level );
  
  					panel.onEscape = CKEDITOR.tools.bind( function( keystroke ) {
  						if ( this._.onEscape( keystroke ) === false )
  							return false;
  					}, this );
  
  					panel.onShow = function() {
  						// Menu need CSS resets, compensate class name.
  						var holder = panel._.panel.getHolderElement();
  						holder.getParent().addClass( 'cke cke_reset_all' );
  					};
  
  					panel.onHide = CKEDITOR.tools.bind( function() {
  						this._.onHide && this._.onHide();
  					}, this );
  
  					// Create an autosize block inside the panel.
  					var block = panel.addBlock( this.id, this._.panelDefinition.block );
  					block.autoSize = true;
  
  					var keys = block.keys;
  					keys[ 40 ] = 'next'; // ARROW-DOWN
  					keys[ 9 ] = 'next'; // TAB
  					keys[ 38 ] = 'prev'; // ARROW-UP
  					keys[ CKEDITOR.SHIFT + 9 ] = 'prev'; // SHIFT + TAB
  					keys[ ( editor.lang.dir == 'rtl' ? 37 : 39 ) ] = CKEDITOR.env.ie ? 'mouseup' : 'click'; // ARROW-RIGHT/ARROW-LEFT(rtl)
  					keys[ 32 ] = CKEDITOR.env.ie ? 'mouseup' : 'click'; // SPACE
  					CKEDITOR.env.ie && ( keys[ 13 ] = 'mouseup' ); // Manage ENTER, since onclick is blocked in IE (#8041).
  
  					element = this._.element = block.element;
  
  					var elementDoc = element.getDocument();
  					elementDoc.getBody().setStyle( 'overflow', 'hidden' );
  					elementDoc.getElementsByTag( 'html' ).getItem( 0 ).setStyle( 'overflow', 'hidden' );
  
  					this._.itemOverFn = CKEDITOR.tools.addFunction( function( index ) {
  						clearTimeout( this._.showSubTimeout );
  						this._.showSubTimeout = CKEDITOR.tools.setTimeout( this._.showSubMenu, editor.config.menu_subMenuDelay || 400, this, [ index ] );
  					}, this );
  
  					this._.itemOutFn = CKEDITOR.tools.addFunction( function( index ) {
  						clearTimeout( this._.showSubTimeout );
  					}, this );
  
  					this._.itemClickFn = CKEDITOR.tools.addFunction( function( index ) {
  						var item = this.items[ index ];
  
  						if ( item.state == CKEDITOR.TRISTATE_DISABLED ) {
  							this.hide( 1 );
  							return;
  						}
  
  						if ( item.getItems )
  							this._.showSubMenu( index );
  						else
  							this._.onClick( item );
  					}, this );
  				}
  
  				// Put the items in the right order.
  				sortItems( items );
  
  				// Apply the editor mixed direction status to menu.
  				var path = editor.elementPath(),
  					mixedDirCls = ( path && path.direction() != editor.lang.dir ) ? ' cke_mixed_dir_content' : '';
  
  				// Build the HTML that composes the menu and its items.
  				var output = [ '<div class="cke_menu' + mixedDirCls + '" role="presentation">' ];
  
  				var length = items.length,
  					lastGroup = length && items[ 0 ].group;
  
  				for ( var i = 0; i < length; i++ ) {
  					var item = items[ i ];
  					if ( lastGroup != item.group ) {
  						output.push( '<div class="cke_menuseparator" role="separator"></div>' );
  						lastGroup = item.group;
  					}
  
  					item.render( this, i, output );
  				}
  
  				output.push( '</div>' );
  
  				// Inject the HTML inside the panel.
  				element.setHtml( output.join( '' ) );
  
  				CKEDITOR.ui.fire( 'ready', this );
  
  				// Show the panel.
  				if ( this.parent )
  					this.parent._.panel.showAsChild( panel, this.id, offsetParent, corner, offsetX, offsetY );
  				else
  					panel.showBlock( this.id, offsetParent, corner, offsetX, offsetY );
  
  				editor.fire( 'menuShow', [ panel ] );
  			}