{"version":3,"sources":["oojs-ui-widgets.js"],"names":["OO","ui","mixin","DraggableElement","config","this","index","$handle","$element","wasHandleUsed","addClass","attr","on","mousedown","onDragMouseDown","bind","dragstart","onDragStart","dragover","onDragOver","dragend","onDragEnd","drop","onDrop","initClass","cancelButtonMouseDownEvents","prototype","e","contains","target","element","dataTransfer","originalEvent","dropEffect","effectAllowed","setData","getIndex","err","setTimeout","removeClass","emit","preventDefault","setIndex","data","DraggableGroupElement","GroupElement","call","orientation","dragItem","itemKeys","dir","itemsOrder","aggregate","connect","itemDragStart","itemDrop","itemDragEnd","Array","isArray","items","addItems","append","$status","toggleClass","mixinClass","onItemDragStart","item","slice","updateIndexes","css","setDragItem","i","len","length","onItemDropOrDragEnd","targetIndex","originalIndex","getDragItem","indexOf","reorder","unsetDragItem","overIndex","dragItemIndex","$","closest","undefined","$group","children","eq","after","prepend","splice","newIndex","off","RequestManager","requestCache","requestQuery","requestRequest","getRequestData","ourRequest","widget","value","getRequestQuery","deferred","Deferred","abortRequest","Object","hasOwnProperty","resolve","pushPending","getRequest","always","popPending","done","response","getRequestCacheDataFromResponse","fail","reject","promise","oldRequest","abort","LookupElement","extend","highlightFirst","$overlay","lookupMenu","FloatingMenuSelectWidget","input","$container","allowSuggestionsWhenEmpty","lookupsDisabled","lookupInputFocused","lookupHighlightFirstItem","$input","focus","onLookupInputFocus","blur","onLookupInputBlur","onLookupInputMouseDown","change","toggle","choose","populateLookupMenu","closeLookupMenu","isVisible","onLookupInputChange","onLookupMenuToggle","visible","abortLookupRequest","clearItems","onLookupMenuItemChoose","setValue","getData","getLookupMenu","setLookupsDisabled","disabled","openLookupMenu","isEmpty","getValue","isReadOnly","lookupQuery","getLookupMenuItems","initializeLookupMenuSelection","getSelectedItem","highlightItem","getFirstSelectableItem","then","getLookupMenuOptionsFromData","getLookupRequest","getLookupCacheDataFromResponse","setReadOnly","readOnly","TextInputWidget","CardLayout","name","isPlainObject","scrollable","parent","label","tabItem","active","inheritClass","PanelLayout","getName","isActive","getTabItem","setTabItem","setupTabItem","setLabel","setActive","PageLayout","outlineItem","getOutlineItem","setOutlineItem","setupOutlineItem","StackLayout","currentItem","continuous","debounce","onScroll","getRect","getBoundingClientRect","rect","bottom","containerRect","top","currentRect","currentIndex","getCurrentItem","unsetCurrentItem","prevItem","updateHiddenState","setItem","removeItems","selectedItem","removeAttr","MenuLayout","showMenu","menuPosition","$menu","$content","setMenuPosition","toggleMenu","Layout","isMenuVisible","position","getMenuPosition","BookletLayout","currentPageName","pages","ignoreFocus","stackLayout","autoFocus","outlineVisible","outlined","editable","outlineControlsWidget","outlineSelectWidget","OutlineSelectWidget","outlinePanel","OutlineControlsWidget","set","select","scrolling","visibleItemChange","onStackLayoutFocus","$target","setPage","onStackLayoutVisibleItemChange","page","selectItemByData","onStackLayoutSet","layout","scrollElementIntoView","complete","itemIndex","getItems","selectFirstSelectablePage","getElementDocument","activeElement","focusFirstFocusable","findFocusable","onOutlineSelectWidgetSelect","isOutlined","isEditable","isOutlineVisible","toggleOutline","show","getClosestPage","next","prev","level","getItemFromData","getLevel","getOutline","getOutlineControls","getPage","getCurrentPage","getCurrentPageName","addPages","stackLayoutPages","remove","push","removePages","OutlineOptionWidget","clearPages","$focused","previousPage","find","selectItem","IndexLayout","currentCardName","cards","expanded","tabSelectWidget","TabSelectWidget","tabPanel","setCard","card","selectFirstSelectableCard","onTabSelectWidgetSelect","getClosestCard","getTabs","getCard","getCurrentCard","getCurrentCardName","addCards","stackLayoutCards","removeCards","TabOptionWidget","clearCards","previousCard","ToggleWidget","Widget","toString","ToggleButtonWidget","ButtonElement","IconElement","IndicatorElement","LabelElement","TitledElement","$titled","$button","FlaggedElement","TabIndexedElement","$tabIndexed","click","$icon","$label","$indicator","onAction","setButtonElement","ToggleSwitchWidget","dragging","dragStart","sliding","$glow","$grip","onClick","keypress","onKeyPress","isDisabled","which","MouseButtons","LEFT","Keys","SPACE","ENTER","outline","icon","$movers","upButton","ButtonWidget","framed","title","msg","downButton","removeButton","abilities","move","add","setAbilities","ability","onOutlineChange","firstMovable","lastMovable","movable","isMovable","removable","isRemovable","setDisabled","setLevel","DecoratedOptionWidget","highlightable","scrollIntoViewOnSelect","levelClass","levels","setMovable","updateThemeClasses","setRemovable","constructor","Math","max","min","bindKeyDownListener","unbindKeyDownListener","SelectWidget","ButtonOptionWidget","OptionWidget","setSelected","state","selectable","ButtonSelectWidget","CapsuleItemWidget","ItemWidget","closeButton","indicator","tabIndex","onCloseClick","keydown","onKeyDown","getElementGroup","isFunction","editItem","keyCode","BACKSPACE","DELETE","getPreviousItem","RIGHT","getNextItem","CapsuleMultiselectWidget","$tabFocus","allowArbitrary","popup","align","anchor","PopupElement","menu","filterFromInput","onFocusForPopup","onPopupFocusOut","$autoCloseIgnore","onInputFocus","onInputBlur","propertychange change click mouseup keydown keyup input cut paste select focus","updateInputSize","onMouseDown","prop","role","aria-autocomplete","setItemsFromData","onMenuItemsChange","createItemWidget","getItemsData","map","datas","each","j","String","addItemsFromData","addItemFromLabel","getItemFromLabel","compare","removeItemsFromData","same","l","oldItems","updateIfHeightChanged","val","getMenu","clearInput","setSize","width","document","has","ESCAPE","metaKey","ctrlKey","$lastItem","direction","contentWidth","currentWidth","bestWidth","last","Element","getDir","scrollWidth","innerWidth","left","outerWidth","floor","height","onMenuChoose","updateDisabled","CapsuleMultiSelectWidget","SelectFileWidget","dragHandler","accept","placeholder","notsupported","droppable","showDropTarget","thumbnailSizeLimit","PendingElement","$pending","$info","isSupported","currentFile","onFileSelectedHandler","onFileSelected","selectButton","classes","clearButton","onDragEnterOrOver","dragenter","dragleave","onDragLeave","addInput","setIcon","$thumbnail","setPendingElement","onDropTargetClick","text","updateUI","isSupportedCache","files","file","type","loadAndGetImageUrl","url","IconWidget","empty","reader","FileReader","getProp","size","onload","event","img","createElement","addEventListener","naturalWidth","naturalHeight","result","src","readAsDataURL","stopPropagation","tabindex","join","isAllowedType","mimeType","mimeTest","substr","onClearClick","itemOrFile","droppableFile","dt","ProgressBarWidget","$bar","progress","setProgress","aria-valuemin","aria-valuemax","tagName","getProgress","SearchWidget","query","results","$query","$results","enter","onQueryKeydown","highlightedItem","nextItem","DOWN","UP","getHighlightedItem","getRelativeSelectableItem","onQueryChange","onQueryEnter","chooseItem","getQuery","getResults","NumberInputWidget","isInteger","Infinity","step","pageStep","showButtons","minusButton","plusButton","wheel mousewheel DOMMouseScroll","onWheel","setIsInteger","setRange","setStep","$field","setValidation","validateNumber","flag","setValidityFlag","getIsInteger","Error","getRange","getStep","getNumericValue","adjustValue","delta","n","v","isNaN","isFinite","round","onButtonClick","is","deltaMode","sawWheelEvent","deltaY","deltaX","wheelDeltaX","wheelDeltaY","wheelDelta","detail","PAGEUP","PAGEDOWN"],"mappings":"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","file":"oojs-ui-widgets.min.js","sourcesContent":["/*!\n * OOjs UI v0.17.7\n * https://www.mediawiki.org/wiki/OOjs_UI\n *\n * Copyright 2011–2016 OOjs UI Team and other contributors.\n * Released under the MIT license\n * http://oojs.mit-license.org\n *\n * Date: 2016-08-03T16:38:22Z\n */\n( function ( OO ) {\n\n'use strict';\n\n/**\n * DraggableElement is a mixin class used to create elements that can be clicked\n * and dragged by a mouse to a new position within a group. This class must be used\n * in conjunction with OO.ui.mixin.DraggableGroupElement, which provides a container for\n * the draggable elements.\n *\n * @abstract\n * @class\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$handle] The part of the element which can be used for dragging, defaults to the whole element\n */\nOO.ui.mixin.DraggableElement = function OoUiMixinDraggableElement( config ) {\n\tconfig = config || {};\n\n\t// Properties\n\tthis.index = null;\n\tthis.$handle = config.$handle || this.$element;\n\tthis.wasHandleUsed = null;\n\n\t// Initialize and events\n\tthis.$element.addClass( 'oo-ui-draggableElement' )\n\t\t// We make the entire element draggable, not just the handle, so that\n\t\t// the whole element appears to move. wasHandleUsed prevents drags from\n\t\t// starting outside the handle\n\t\t.attr( 'draggable', true )\n\t\t.on( {\n\t\t\tmousedown: this.onDragMouseDown.bind( this ),\n\t\t\tdragstart: this.onDragStart.bind( this ),\n\t\t\tdragover: this.onDragOver.bind( this ),\n\t\t\tdragend: this.onDragEnd.bind( this ),\n\t\t\tdrop: this.onDrop.bind( this )\n\t\t} );\n\tthis.$handle.addClass( 'oo-ui-draggableElement-handle' );\n};\n\nOO.initClass( OO.ui.mixin.DraggableElement );\n\n/* Events */\n\n/**\n * @event dragstart\n *\n * A dragstart event is emitted when the user clicks and begins dragging an item.\n * @param {OO.ui.mixin.DraggableElement} item The item the user has clicked and is dragging with the mouse.\n */\n\n/**\n * @event dragend\n * A dragend event is emitted when the user drags an item and releases the mouse,\n * thus terminating the drag operation.\n */\n\n/**\n * @event drop\n * A drop event is emitted when the user drags an item and then releases the mouse button\n * over a valid target.\n */\n\n/* Static Properties */\n\n/**\n * @inheritdoc OO.ui.mixin.ButtonElement\n */\nOO.ui.mixin.DraggableElement.static.cancelButtonMouseDownEvents = false;\n\n/* Methods */\n\n/**\n * Respond to mousedown event.\n *\n * @private\n * @param {jQuery.Event} e jQuery event\n */\nOO.ui.mixin.DraggableElement.prototype.onDragMouseDown = function ( e ) {\n\tthis.wasHandleUsed =\n\t\t// Optimization: if the handle is the whole element this is always true\n\t\tthis.$handle[ 0 ] === this.$element[ 0 ] ||\n\t\t// Check the mousedown occurred inside the handle\n\t\tOO.ui.contains( this.$handle[ 0 ], e.target, true );\n};\n\n/**\n * Respond to dragstart event.\n *\n * @private\n * @param {jQuery.Event} e jQuery event\n * @fires dragstart\n */\nOO.ui.mixin.DraggableElement.prototype.onDragStart = function ( e ) {\n\tvar element = this,\n\t\tdataTransfer = e.originalEvent.dataTransfer;\n\n\tif ( !this.wasHandleUsed ) {\n\t\treturn false;\n\t}\n\n\t// Define drop effect\n\tdataTransfer.dropEffect = 'none';\n\tdataTransfer.effectAllowed = 'move';\n\t// Support: Firefox\n\t// We must set up a dataTransfer data property or Firefox seems to\n\t// ignore the fact the element is draggable.\n\ttry {\n\t\tdataTransfer.setData( 'application-x/OOjs-UI-draggable', this.getIndex() );\n\t} catch ( err ) {\n\t\t// The above is only for Firefox. Move on if it fails.\n\t}\n\t// Briefly add a 'clone' class to style the browser's native drag image\n\tthis.$element.addClass( 'oo-ui-draggableElement-clone' );\n\t// Add placeholder class after the browser has rendered the clone\n\tsetTimeout( function () {\n\t\telement.$element\n\t\t\t.removeClass( 'oo-ui-draggableElement-clone' )\n\t\t\t.addClass( 'oo-ui-draggableElement-placeholder' );\n\t} );\n\t// Emit event\n\tthis.emit( 'dragstart', this );\n\treturn true;\n};\n\n/**\n * Respond to dragend event.\n *\n * @private\n * @fires dragend\n */\nOO.ui.mixin.DraggableElement.prototype.onDragEnd = function () {\n\tthis.$element.removeClass( 'oo-ui-draggableElement-placeholder' );\n\tthis.emit( 'dragend' );\n};\n\n/**\n * Handle drop event.\n *\n * @private\n * @param {jQuery.Event} e jQuery event\n * @fires drop\n */\nOO.ui.mixin.DraggableElement.prototype.onDrop = function ( e ) {\n\te.preventDefault();\n\tthis.emit( 'drop', e );\n};\n\n/**\n * In order for drag/drop to work, the dragover event must\n * return false and stop propogation.\n *\n * @private\n */\nOO.ui.mixin.DraggableElement.prototype.onDragOver = function ( e ) {\n\te.preventDefault();\n};\n\n/**\n * Set item index.\n * Store it in the DOM so we can access from the widget drag event\n *\n * @private\n * @param {number} index Item index\n */\nOO.ui.mixin.DraggableElement.prototype.setIndex = function ( index ) {\n\tif ( this.index !== index ) {\n\t\tthis.index = index;\n\t\tthis.$element.data( 'index', index );\n\t}\n};\n\n/**\n * Get item index\n *\n * @private\n * @return {number} Item index\n */\nOO.ui.mixin.DraggableElement.prototype.getIndex = function () {\n\treturn this.index;\n};\n\n/**\n * DraggableGroupElement is a mixin class used to create a group element to\n * contain draggable elements, which are items that can be clicked and dragged by a mouse.\n * The class is used with OO.ui.mixin.DraggableElement.\n *\n * @abstract\n * @class\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {string} [orientation] Item orientation: 'horizontal' or 'vertical'. The orientation\n * should match the layout of the items. Items displayed in a single row\n * or in several rows should use horizontal orientation. The vertical orientation should only be\n * used when the items are displayed in a single column. Defaults to 'vertical'\n */\nOO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.mixin.GroupElement.call( this, config );\n\n\t// Properties\n\tthis.orientation = config.orientation || 'vertical';\n\tthis.dragItem = null;\n\tthis.itemKeys = {};\n\tthis.dir = null;\n\tthis.itemsOrder = null;\n\n\t// Events\n\tthis.aggregate( {\n\t\tdragstart: 'itemDragStart',\n\t\tdragend: 'itemDragEnd',\n\t\tdrop: 'itemDrop'\n\t} );\n\tthis.connect( this, {\n\t\titemDragStart: 'onItemDragStart',\n\t\titemDrop: 'onItemDropOrDragEnd',\n\t\titemDragEnd: 'onItemDropOrDragEnd'\n\t} );\n\n\t// Initialize\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n\tthis.$element\n\t\t.addClass( 'oo-ui-draggableGroupElement' )\n\t\t.append( this.$status )\n\t\t.toggleClass( 'oo-ui-draggableGroupElement-horizontal', this.orientation === 'horizontal' );\n};\n\n/* Setup */\nOO.mixinClass( OO.ui.mixin.DraggableGroupElement, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * An item has been dragged to a new position, but not yet dropped.\n *\n * @event drag\n * @param {OO.ui.mixin.DraggableElement} item Dragged item\n * @param {number} [newIndex] New index for the item\n */\n\n/**\n * And item has been dropped at a new position.\n *\n * @event reorder\n * @param {OO.ui.mixin.DraggableElement} item Reordered item\n * @param {number} [newIndex] New index for the item\n */\n\n/* Methods */\n\n/**\n * Respond to item drag start event\n *\n * @private\n * @param {OO.ui.mixin.DraggableElement} item Dragged item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.onItemDragStart = function ( item ) {\n\t// Make a shallow copy of this.items so we can re-order it during previews\n\t// without affecting the original array.\n\tthis.itemsOrder = this.items.slice();\n\tthis.updateIndexes();\n\tif ( this.orientation === 'horizontal' ) {\n\t\t// Calculate and cache directionality on drag start - it's a little\n\t\t// expensive and it shouldn't change while dragging.\n\t\tthis.dir = this.$element.css( 'direction' );\n\t}\n\tthis.setDragItem( item );\n};\n\n/**\n * Update the index properties of the items\n */\nOO.ui.mixin.DraggableGroupElement.prototype.updateIndexes = function () {\n\tvar i, len;\n\n\t// Map the index of each object\n\tfor ( i = 0, len = this.itemsOrder.length; i < len; i++ ) {\n\t\tthis.itemsOrder[ i ].setIndex( i );\n\t}\n};\n\n/**\n * Handle drop or dragend event and switch the order of the items accordingly\n *\n * @private\n * @param {OO.ui.mixin.DraggableElement} item Dropped item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.onItemDropOrDragEnd = function () {\n\tvar targetIndex, originalIndex,\n\t\titem = this.getDragItem();\n\n\t// TODO: Figure out a way to configure a list of legally droppable\n\t// elements even if they are not yet in the list\n\tif ( item ) {\n\t\toriginalIndex = this.items.indexOf( item );\n\t\t// If the item has moved forward, add one to the index to account for the left shift\n\t\ttargetIndex = item.getIndex() + ( item.getIndex() > originalIndex ? 1 : 0 );\n\t\tif ( targetIndex !== originalIndex ) {\n\t\t\tthis.reorder( this.getDragItem(), targetIndex );\n\t\t\tthis.emit( 'reorder', this.getDragItem(), targetIndex );\n\t\t}\n\t\tthis.updateIndexes();\n\t}\n\tthis.unsetDragItem();\n\t// Return false to prevent propogation\n\treturn false;\n};\n\n/**\n * Respond to dragover event\n *\n * @private\n * @param {jQuery.Event} e Dragover event\n * @fires reorder\n */\nOO.ui.mixin.DraggableGroupElement.prototype.onDragOver = function ( e ) {\n\tvar overIndex, targetIndex,\n\t\titem = this.getDragItem(),\n\t\tdragItemIndex = item.getIndex();\n\n\t// Get the OptionWidget item we are dragging over\n\toverIndex = $( e.target ).closest( '.oo-ui-draggableElement' ).data( 'index' );\n\n\tif ( overIndex !== undefined && overIndex !== dragItemIndex ) {\n\t\ttargetIndex = overIndex + ( overIndex > dragItemIndex ? 1 : 0 );\n\n\t\tif ( targetIndex > 0 ) {\n\t\t\tthis.$group.children().eq( targetIndex - 1 ).after( item.$element );\n\t\t} else {\n\t\t\tthis.$group.prepend( item.$element );\n\t\t}\n\t\t// Move item in itemsOrder array\n\t\tthis.itemsOrder.splice( overIndex, 0,\n\t\t\tthis.itemsOrder.splice( dragItemIndex, 1 )[ 0 ]\n\t\t);\n\t\tthis.updateIndexes();\n\t\tthis.emit( 'drag', item, targetIndex );\n\t}\n\t// Prevent default\n\te.preventDefault();\n};\n\n/**\n * Reorder the items in the group\n *\n * @param {OO.ui.mixin.DraggableElement} item Reordered item\n * @param {number} newIndex New index\n */\nOO.ui.mixin.DraggableGroupElement.prototype.reorder = function ( item, newIndex ) {\n\tthis.addItems( [ item ], newIndex );\n};\n\n/**\n * Set a dragged item\n *\n * @param {OO.ui.mixin.DraggableElement} item Dragged item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.setDragItem = function ( item ) {\n\tif ( this.dragItem !== item ) {\n\t\tthis.dragItem = item;\n\t\tthis.$element.on( 'dragover', this.onDragOver.bind( this ) );\n\t\tthis.$element.addClass( 'oo-ui-draggableGroupElement-dragging' );\n\t}\n};\n\n/**\n * Unset the current dragged item\n */\nOO.ui.mixin.DraggableGroupElement.prototype.unsetDragItem = function () {\n\tif ( this.dragItem ) {\n\t\tthis.dragItem = null;\n\t\tthis.$element.off( 'dragover' );\n\t\tthis.$element.removeClass( 'oo-ui-draggableGroupElement-dragging' );\n\t}\n};\n\n/**\n * Get the item that is currently being dragged.\n *\n * @return {OO.ui.mixin.DraggableElement|null} The currently dragged item, or `null` if no item is being dragged\n */\nOO.ui.mixin.DraggableGroupElement.prototype.getDragItem = function () {\n\treturn this.dragItem;\n};\n\n/**\n * RequestManager is a mixin that manages the lifecycle of a promise-backed request for a widget, such as\n * the {@link OO.ui.mixin.LookupElement}.\n *\n * @class\n * @abstract\n *\n * @constructor\n */\nOO.ui.mixin.RequestManager = function OoUiMixinRequestManager() {\n\tthis.requestCache = {};\n\tthis.requestQuery = null;\n\tthis.requestRequest = null;\n};\n\n/* Setup */\n\nOO.initClass( OO.ui.mixin.RequestManager );\n\n/**\n * Get request results for the current query.\n *\n * @return {jQuery.Promise} Promise object which will be passed response data as the first argument of\n * the done event. If the request was aborted to make way for a subsequent request, this promise\n * may not be rejected, depending on what jQuery feels like doing.\n */\nOO.ui.mixin.RequestManager.prototype.getRequestData = function () {\n\tvar widget = this,\n\t\tvalue = this.getRequestQuery(),\n\t\tdeferred = $.Deferred(),\n\t\tourRequest;\n\n\tthis.abortRequest();\n\tif ( Object.prototype.hasOwnProperty.call( this.requestCache, value ) ) {\n\t\tdeferred.resolve( this.requestCache[ value ] );\n\t} else {\n\t\tif ( this.pushPending ) {\n\t\t\tthis.pushPending();\n\t\t}\n\t\tthis.requestQuery = value;\n\t\tourRequest = this.requestRequest = this.getRequest();\n\t\tourRequest\n\t\t\t.always( function () {\n\t\t\t\t// We need to pop pending even if this is an old request, otherwise\n\t\t\t\t// the widget will remain pending forever.\n\t\t\t\t// TODO: this assumes that an aborted request will fail or succeed soon after\n\t\t\t\t// being aborted, or at least eventually. It would be nice if we could popPending()\n\t\t\t\t// at abort time, but only if we knew that we hadn't already called popPending()\n\t\t\t\t// for that request.\n\t\t\t\tif ( widget.popPending ) {\n\t\t\t\t\twidget.popPending();\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.done( function ( response ) {\n\t\t\t\t// If this is an old request (and aborting it somehow caused it to still succeed),\n\t\t\t\t// ignore its success completely\n\t\t\t\tif ( ourRequest === widget.requestRequest ) {\n\t\t\t\t\twidget.requestQuery = null;\n\t\t\t\t\twidget.requestRequest = null;\n\t\t\t\t\twidget.requestCache[ value ] = widget.getRequestCacheDataFromResponse( response );\n\t\t\t\t\tdeferred.resolve( widget.requestCache[ value ] );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.fail( function () {\n\t\t\t\t// If this is an old request (or a request failing because it's being aborted),\n\t\t\t\t// ignore its failure completely\n\t\t\t\tif ( ourRequest === widget.requestRequest ) {\n\t\t\t\t\twidget.requestQuery = null;\n\t\t\t\t\twidget.requestRequest = null;\n\t\t\t\t\tdeferred.reject();\n\t\t\t\t}\n\t\t\t} );\n\t}\n\treturn deferred.promise();\n};\n\n/**\n * Abort the currently pending request, if any.\n *\n * @private\n */\nOO.ui.mixin.RequestManager.prototype.abortRequest = function () {\n\tvar oldRequest = this.requestRequest;\n\tif ( oldRequest ) {\n\t\t// First unset this.requestRequest to the fail handler will notice\n\t\t// that the request is no longer current\n\t\tthis.requestRequest = null;\n\t\tthis.requestQuery = null;\n\t\toldRequest.abort();\n\t}\n};\n\n/**\n * Get the query to be made.\n *\n * @protected\n * @method\n * @abstract\n * @return {string} query to be used\n */\nOO.ui.mixin.RequestManager.prototype.getRequestQuery = null;\n\n/**\n * Get a new request object of the current query value.\n *\n * @protected\n * @method\n * @abstract\n * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method\n */\nOO.ui.mixin.RequestManager.prototype.getRequest = null;\n\n/**\n * Pre-process data returned by the request from #getRequest.\n *\n * The return value of this function will be cached, and any further queries for the given value\n * will use the cache rather than doing API requests.\n *\n * @protected\n * @method\n * @abstract\n * @param {Mixed} response Response from server\n * @return {Mixed} Cached result data\n */\nOO.ui.mixin.RequestManager.prototype.getRequestCacheDataFromResponse = null;\n\n/**\n * LookupElement is a mixin that creates a {@link OO.ui.FloatingMenuSelectWidget menu} of suggested values for\n * a {@link OO.ui.TextInputWidget text input widget}. Suggested values are based on the characters the user types\n * into the text input field and, in general, the menu is only displayed when the user types. If a suggested value is chosen\n * from the lookup menu, that value becomes the value of the input field.\n *\n * Note that a new menu of suggested items is displayed when a value is chosen from the lookup menu. If this is\n * not the desired behavior, disable lookup menus with the #setLookupsDisabled method, then set the value, then\n * re-enable lookups.\n *\n * See the [OOjs UI demos][1] for an example.\n *\n * [1]: https://tools.wmflabs.org/oojs-ui/oojs-ui/demos/index.html#widgets-apex-vector-ltr\n *\n * @class\n * @abstract\n * @mixins OO.ui.mixin.RequestManager\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {jQuery} [$overlay] Overlay for the lookup menu; defaults to relative positioning\n * @cfg {jQuery} [$container=this.$element] The container element. The lookup menu is rendered beneath the specified element.\n * @cfg {boolean} [allowSuggestionsWhenEmpty=false] Request and display a lookup menu when the text input is empty.\n * By default, the lookup menu is not generated and displayed until the user begins to type.\n * @cfg {boolean} [highlightFirst=true] Whether the first lookup result should be highlighted (so, that the user can\n * take it over into the input with simply pressing return) automatically or not.\n */\nOO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { highlightFirst: true }, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.RequestManager.call( this, config );\n\n\t// Properties\n\tthis.$overlay = config.$overlay || this.$element;\n\tthis.lookupMenu = new OO.ui.FloatingMenuSelectWidget( {\n\t\twidget: this,\n\t\tinput: this,\n\t\t$container: config.$container || this.$element\n\t} );\n\n\tthis.allowSuggestionsWhenEmpty = config.allowSuggestionsWhenEmpty || false;\n\n\tthis.lookupsDisabled = false;\n\tthis.lookupInputFocused = false;\n\tthis.lookupHighlightFirstItem = config.highlightFirst;\n\n\t// Events\n\tthis.$input.on( {\n\t\tfocus: this.onLookupInputFocus.bind( this ),\n\t\tblur: this.onLookupInputBlur.bind( this ),\n\t\tmousedown: this.onLookupInputMouseDown.bind( this )\n\t} );\n\tthis.connect( this, { change: 'onLookupInputChange' } );\n\tthis.lookupMenu.connect( this, {\n\t\ttoggle: 'onLookupMenuToggle',\n\t\tchoose: 'onLookupMenuItemChoose'\n\t} );\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-lookupElement' );\n\tthis.lookupMenu.$element.addClass( 'oo-ui-lookupElement-menu' );\n\tthis.$overlay.append( this.lookupMenu.$element );\n};\n\n/* Setup */\n\nOO.mixinClass( OO.ui.mixin.LookupElement, OO.ui.mixin.RequestManager );\n\n/* Methods */\n\n/**\n * Handle input focus event.\n *\n * @protected\n * @param {jQuery.Event} e Input focus event\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputFocus = function () {\n\tthis.lookupInputFocused = true;\n\tthis.populateLookupMenu();\n};\n\n/**\n * Handle input blur event.\n *\n * @protected\n * @param {jQuery.Event} e Input blur event\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputBlur = function () {\n\tthis.closeLookupMenu();\n\tthis.lookupInputFocused = false;\n};\n\n/**\n * Handle input mouse down event.\n *\n * @protected\n * @param {jQuery.Event} e Input mouse down event\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputMouseDown = function () {\n\t// Only open the menu if the input was already focused.\n\t// This way we allow the user to open the menu again after closing it with Esc\n\t// by clicking in the input. Opening (and populating) the menu when initially\n\t// clicking into the input is handled by the focus handler.\n\tif ( this.lookupInputFocused && !this.lookupMenu.isVisible() ) {\n\t\tthis.populateLookupMenu();\n\t}\n};\n\n/**\n * Handle input change event.\n *\n * @protected\n * @param {string} value New input value\n */\nOO.ui.mixin.LookupElement.prototype.onLookupInputChange = function () {\n\tif ( this.lookupInputFocused ) {\n\t\tthis.populateLookupMenu();\n\t}\n};\n\n/**\n * Handle the lookup menu being shown/hidden.\n *\n * @protected\n * @param {boolean} visible Whether the lookup menu is now visible.\n */\nOO.ui.mixin.LookupElement.prototype.onLookupMenuToggle = function ( visible ) {\n\tif ( !visible ) {\n\t\t// When the menu is hidden, abort any active request and clear the menu.\n\t\t// This has to be done here in addition to closeLookupMenu(), because\n\t\t// MenuSelectWidget will close itself when the user presses Esc.\n\t\tthis.abortLookupRequest();\n\t\tthis.lookupMenu.clearItems();\n\t}\n};\n\n/**\n * Handle menu item 'choose' event, updating the text input value to the value of the clicked item.\n *\n * @protected\n * @param {OO.ui.MenuOptionWidget} item Selected item\n */\nOO.ui.mixin.LookupElement.prototype.onLookupMenuItemChoose = function ( item ) {\n\tthis.setValue( item.getData() );\n};\n\n/**\n * Get lookup menu.\n *\n * @private\n * @return {OO.ui.FloatingMenuSelectWidget}\n */\nOO.ui.mixin.LookupElement.prototype.getLookupMenu = function () {\n\treturn this.lookupMenu;\n};\n\n/**\n * Disable or re-enable lookups.\n *\n * When lookups are disabled, calls to #populateLookupMenu will be ignored.\n *\n * @param {boolean} disabled Disable lookups\n */\nOO.ui.mixin.LookupElement.prototype.setLookupsDisabled = function ( disabled ) {\n\tthis.lookupsDisabled = !!disabled;\n};\n\n/**\n * Open the menu. If there are no entries in the menu, this does nothing.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.openLookupMenu = function () {\n\tif ( !this.lookupMenu.isEmpty() ) {\n\t\tthis.lookupMenu.toggle( true );\n\t}\n\treturn this;\n};\n\n/**\n * Close the menu, empty it, and abort any pending request.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.closeLookupMenu = function () {\n\tthis.lookupMenu.toggle( false );\n\tthis.abortLookupRequest();\n\tthis.lookupMenu.clearItems();\n\treturn this;\n};\n\n/**\n * Request menu items based on the input's current value, and when they arrive,\n * populate the menu with these items and show the menu.\n *\n * If lookups have been disabled with #setLookupsDisabled, this function does nothing.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.populateLookupMenu = function () {\n\tvar widget = this,\n\t\tvalue = this.getValue();\n\n\tif ( this.lookupsDisabled || this.isReadOnly() ) {\n\t\treturn;\n\t}\n\n\t// If the input is empty, clear the menu, unless suggestions when empty are allowed.\n\tif ( !this.allowSuggestionsWhenEmpty && value === '' ) {\n\t\tthis.closeLookupMenu();\n\t// Skip population if there is already a request pending for the current value\n\t} else if ( value !== this.lookupQuery ) {\n\t\tthis.getLookupMenuItems()\n\t\t\t.done( function ( items ) {\n\t\t\t\twidget.lookupMenu.clearItems();\n\t\t\t\tif ( items.length ) {\n\t\t\t\t\twidget.lookupMenu\n\t\t\t\t\t\t.addItems( items )\n\t\t\t\t\t\t.toggle( true );\n\t\t\t\t\twidget.initializeLookupMenuSelection();\n\t\t\t\t} else {\n\t\t\t\t\twidget.lookupMenu.toggle( false );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.fail( function () {\n\t\t\t\twidget.lookupMenu.clearItems();\n\t\t\t} );\n\t}\n\n\treturn this;\n};\n\n/**\n * Highlight the first selectable item in the menu, if configured.\n *\n * @private\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.initializeLookupMenuSelection = function () {\n\tif ( this.lookupHighlightFirstItem && !this.lookupMenu.getSelectedItem() ) {\n\t\tthis.lookupMenu.highlightItem( this.lookupMenu.getFirstSelectableItem() );\n\t}\n};\n\n/**\n * Get lookup menu items for the current query.\n *\n * @private\n * @return {jQuery.Promise} Promise object which will be passed menu items as the first argument of\n * the done event. If the request was aborted to make way for a subsequent request, this promise\n * will not be rejected: it will remain pending forever.\n */\nOO.ui.mixin.LookupElement.prototype.getLookupMenuItems = function () {\n\treturn this.getRequestData().then( function ( data ) {\n\t\treturn this.getLookupMenuOptionsFromData( data );\n\t}.bind( this ) );\n};\n\n/**\n * Abort the currently pending lookup request, if any.\n *\n * @private\n */\nOO.ui.mixin.LookupElement.prototype.abortLookupRequest = function () {\n\tthis.abortRequest();\n};\n\n/**\n * Get a new request object of the current lookup query value.\n *\n * @protected\n * @method\n * @abstract\n * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method\n */\nOO.ui.mixin.LookupElement.prototype.getLookupRequest = null;\n\n/**\n * Pre-process data returned by the request from #getLookupRequest.\n *\n * The return value of this function will be cached, and any further queries for the given value\n * will use the cache rather than doing API requests.\n *\n * @protected\n * @method\n * @abstract\n * @param {Mixed} response Response from server\n * @return {Mixed} Cached result data\n */\nOO.ui.mixin.LookupElement.prototype.getLookupCacheDataFromResponse = null;\n\n/**\n * Get a list of menu option widgets from the (possibly cached) data returned by\n * #getLookupCacheDataFromResponse.\n *\n * @protected\n * @method\n * @abstract\n * @param {Mixed} data Cached result data, usually an array\n * @return {OO.ui.MenuOptionWidget[]} Menu items\n */\nOO.ui.mixin.LookupElement.prototype.getLookupMenuOptionsFromData = null;\n\n/**\n * Set the read-only state of the widget.\n *\n * This will also disable/enable the lookups functionality.\n *\n * @param {boolean} readOnly Make input read-only\n * @chainable\n */\nOO.ui.mixin.LookupElement.prototype.setReadOnly = function ( readOnly ) {\n\t// Parent method\n\t// Note: Calling #setReadOnly this way assumes this is mixed into an OO.ui.TextInputWidget\n\tOO.ui.TextInputWidget.prototype.setReadOnly.call( this, readOnly );\n\n\t// During construction, #setReadOnly is called before the OO.ui.mixin.LookupElement constructor\n\tif ( this.isReadOnly() && this.lookupMenu ) {\n\t\tthis.closeLookupMenu();\n\t}\n\n\treturn this;\n};\n\n/**\n * @inheritdoc OO.ui.mixin.RequestManager\n */\nOO.ui.mixin.LookupElement.prototype.getRequestQuery = function () {\n\treturn this.getValue();\n};\n\n/**\n * @inheritdoc OO.ui.mixin.RequestManager\n */\nOO.ui.mixin.LookupElement.prototype.getRequest = function () {\n\treturn this.getLookupRequest();\n};\n\n/**\n * @inheritdoc OO.ui.mixin.RequestManager\n */\nOO.ui.mixin.LookupElement.prototype.getRequestCacheDataFromResponse = function ( response ) {\n\treturn this.getLookupCacheDataFromResponse( response );\n};\n\n/**\n * CardLayouts are used within {@link OO.ui.IndexLayout index layouts} to create cards that users can select and display\n * from the index's optional {@link OO.ui.TabSelectWidget tab} navigation. Cards are usually not instantiated directly,\n * rather extended to include the required content and functionality.\n *\n * Each card must have a unique symbolic name, which is passed to the constructor. In addition, the card's tab\n * item is customized (with a label) using the #setupTabItem method. See\n * {@link OO.ui.IndexLayout IndexLayout} for an example.\n *\n * @class\n * @extends OO.ui.PanelLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of card\n * @param {Object} [config] Configuration options\n * @cfg {jQuery|string|Function|OO.ui.HtmlSnippet} [label] Label for card's tab\n */\nOO.ui.CardLayout = function OoUiCardLayout( name, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( name ) && config === undefined ) {\n\t\tconfig = name;\n\t\tname = config.name;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { scrollable: true }, config );\n\n\t// Parent constructor\n\tOO.ui.CardLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.name = name;\n\tthis.label = config.label;\n\tthis.tabItem = null;\n\tthis.active = false;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-cardLayout' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.CardLayout, OO.ui.PanelLayout );\n\n/* Events */\n\n/**\n * An 'active' event is emitted when the card becomes active. Cards become active when they are\n * shown in a index layout that is configured to display only one card at a time.\n *\n * @event active\n * @param {boolean} active Card is active\n */\n\n/* Methods */\n\n/**\n * Get the symbolic name of the card.\n *\n * @return {string} Symbolic name of card\n */\nOO.ui.CardLayout.prototype.getName = function () {\n\treturn this.name;\n};\n\n/**\n * Check if card is active.\n *\n * Cards become active when they are shown in a {@link OO.ui.IndexLayout index layout} that is configured to display\n * only one card at a time. Additional CSS is applied to the card's tab item to reflect the active state.\n *\n * @return {boolean} Card is active\n */\nOO.ui.CardLayout.prototype.isActive = function () {\n\treturn this.active;\n};\n\n/**\n * Get tab item.\n *\n * The tab item allows users to access the card from the index's tab\n * navigation. The tab item itself can be customized (with a label, level, etc.) using the #setupTabItem method.\n *\n * @return {OO.ui.TabOptionWidget|null} Tab option widget\n */\nOO.ui.CardLayout.prototype.getTabItem = function () {\n\treturn this.tabItem;\n};\n\n/**\n * Set or unset the tab item.\n *\n * Specify a {@link OO.ui.TabOptionWidget tab option} to set it,\n * or `null` to clear the tab item. To customize the tab item itself (e.g., to set a label or tab\n * level), use #setupTabItem instead of this method.\n *\n * @param {OO.ui.TabOptionWidget|null} tabItem Tab option widget, null to clear\n * @chainable\n */\nOO.ui.CardLayout.prototype.setTabItem = function ( tabItem ) {\n\tthis.tabItem = tabItem || null;\n\tif ( tabItem ) {\n\t\tthis.setupTabItem();\n\t}\n\treturn this;\n};\n\n/**\n * Set up the tab item.\n *\n * Use this method to customize the tab item (e.g., to add a label or tab level). To set or unset\n * the tab item itself (with a {@link OO.ui.TabOptionWidget tab option} or `null`), use\n * the #setTabItem method instead.\n *\n * @param {OO.ui.TabOptionWidget} tabItem Tab option widget to set up\n * @chainable\n */\nOO.ui.CardLayout.prototype.setupTabItem = function () {\n\tif ( this.label ) {\n\t\tthis.tabItem.setLabel( this.label );\n\t}\n\treturn this;\n};\n\n/**\n * Set the card to its 'active' state.\n *\n * Cards become active when they are shown in a index layout that is configured to display only one card at a time. Additional\n * CSS is applied to the tab item to reflect the card's active state. Outside of the index\n * context, setting the active state on a card does nothing.\n *\n * @param {boolean} active Card is active\n * @fires active\n */\nOO.ui.CardLayout.prototype.setActive = function ( active ) {\n\tactive = !!active;\n\n\tif ( active !== this.active ) {\n\t\tthis.active = active;\n\t\tthis.$element.toggleClass( 'oo-ui-cardLayout-active', this.active );\n\t\tthis.emit( 'active', this.active );\n\t}\n};\n\n/**\n * PageLayouts are used within {@link OO.ui.BookletLayout booklet layouts} to create pages that users can select and display\n * from the booklet's optional {@link OO.ui.OutlineSelectWidget outline} navigation. Pages are usually not instantiated directly,\n * rather extended to include the required content and functionality.\n *\n * Each page must have a unique symbolic name, which is passed to the constructor. In addition, the page's outline\n * item is customized (with a label, outline level, etc.) using the #setupOutlineItem method. See\n * {@link OO.ui.BookletLayout BookletLayout} for an example.\n *\n * @class\n * @extends OO.ui.PanelLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of page\n * @param {Object} [config] Configuration options\n */\nOO.ui.PageLayout = function OoUiPageLayout( name, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( name ) && config === undefined ) {\n\t\tconfig = name;\n\t\tname = config.name;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { scrollable: true }, config );\n\n\t// Parent constructor\n\tOO.ui.PageLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.name = name;\n\tthis.outlineItem = null;\n\tthis.active = false;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-pageLayout' );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.PageLayout, OO.ui.PanelLayout );\n\n/* Events */\n\n/**\n * An 'active' event is emitted when the page becomes active. Pages become active when they are\n * shown in a booklet layout that is configured to display only one page at a time.\n *\n * @event active\n * @param {boolean} active Page is active\n */\n\n/* Methods */\n\n/**\n * Get the symbolic name of the page.\n *\n * @return {string} Symbolic name of page\n */\nOO.ui.PageLayout.prototype.getName = function () {\n\treturn this.name;\n};\n\n/**\n * Check if page is active.\n *\n * Pages become active when they are shown in a {@link OO.ui.BookletLayout booklet layout} that is configured to display\n * only one page at a time. Additional CSS is applied to the page's outline item to reflect the active state.\n *\n * @return {boolean} Page is active\n */\nOO.ui.PageLayout.prototype.isActive = function () {\n\treturn this.active;\n};\n\n/**\n * Get outline item.\n *\n * The outline item allows users to access the page from the booklet's outline\n * navigation. The outline item itself can be customized (with a label, level, etc.) using the #setupOutlineItem method.\n *\n * @return {OO.ui.OutlineOptionWidget|null} Outline option widget\n */\nOO.ui.PageLayout.prototype.getOutlineItem = function () {\n\treturn this.outlineItem;\n};\n\n/**\n * Set or unset the outline item.\n *\n * Specify an {@link OO.ui.OutlineOptionWidget outline option} to set it,\n * or `null` to clear the outline item. To customize the outline item itself (e.g., to set a label or outline\n * level), use #setupOutlineItem instead of this method.\n *\n * @param {OO.ui.OutlineOptionWidget|null} outlineItem Outline option widget, null to clear\n * @chainable\n */\nOO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {\n\tthis.outlineItem = outlineItem || null;\n\tif ( outlineItem ) {\n\t\tthis.setupOutlineItem();\n\t}\n\treturn this;\n};\n\n/**\n * Set up the outline item.\n *\n * Use this method to customize the outline item (e.g., to add a label or outline level). To set or unset\n * the outline item itself (with an {@link OO.ui.OutlineOptionWidget outline option} or `null`), use\n * the #setOutlineItem method instead.\n *\n * @param {OO.ui.OutlineOptionWidget} outlineItem Outline option widget to set up\n * @chainable\n */\nOO.ui.PageLayout.prototype.setupOutlineItem = function () {\n\treturn this;\n};\n\n/**\n * Set the page to its 'active' state.\n *\n * Pages become active when they are shown in a booklet layout that is configured to display only one page at a time. Additional\n * CSS is applied to the outline item to reflect the page's active state. Outside of the booklet\n * context, setting the active state on a page does nothing.\n *\n * @param {boolean} active Page is active\n * @fires active\n */\nOO.ui.PageLayout.prototype.setActive = function ( active ) {\n\tactive = !!active;\n\n\tif ( active !== this.active ) {\n\t\tthis.active = active;\n\t\tthis.$element.toggleClass( 'oo-ui-pageLayout-active', active );\n\t\tthis.emit( 'active', this.active );\n\t}\n};\n\n/**\n * StackLayouts contain a series of {@link OO.ui.PanelLayout panel layouts}. By default, only one panel is displayed\n * at a time, though the stack layout can also be configured to show all contained panels, one after another,\n * by setting the #continuous option to 'true'.\n *\n * @example\n * // A stack layout with two panels, configured to be displayed continously\n * var myStack = new OO.ui.StackLayout( {\n * items: [\n * new OO.ui.PanelLayout( {\n * $content: $( '
Panel One
' ),\n * padded: true,\n * framed: true\n * } ),\n * new OO.ui.PanelLayout( {\n * $content: $( 'Panel Two
' ),\n * padded: true,\n * framed: true\n * } )\n * ],\n * continuous: true\n * } );\n * $( 'body' ).append( myStack.$element );\n *\n * @class\n * @extends OO.ui.PanelLayout\n * @mixins OO.ui.mixin.GroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [continuous=false] Show all panels, one after another. By default, only one panel is displayed at a time.\n * @cfg {OO.ui.Layout[]} [items] Panel layouts to add to the stack layout.\n */\nOO.ui.StackLayout = function OoUiStackLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( { scrollable: true }, config );\n\n\t// Parent constructor\n\tOO.ui.StackLayout.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, $.extend( {}, config, { $group: this.$element } ) );\n\n\t// Properties\n\tthis.currentItem = null;\n\tthis.continuous = !!config.continuous;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-stackLayout' );\n\tif ( this.continuous ) {\n\t\tthis.$element.addClass( 'oo-ui-stackLayout-continuous' );\n\t\tthis.$element.on( 'scroll', OO.ui.debounce( this.onScroll.bind( this ), 250 ) );\n\t}\n\tif ( Array.isArray( config.items ) ) {\n\t\tthis.addItems( config.items );\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.StackLayout, OO.ui.PanelLayout );\nOO.mixinClass( OO.ui.StackLayout, OO.ui.mixin.GroupElement );\n\n/* Events */\n\n/**\n * A 'set' event is emitted when panels are {@link #addItems added}, {@link #removeItems removed},\n * {@link #clearItems cleared} or {@link #setItem displayed}.\n *\n * @event set\n * @param {OO.ui.Layout|null} item Current panel or `null` if no panel is shown\n */\n\n/**\n * When used in continuous mode, this event is emitted when the user scrolls down\n * far enough such that currentItem is no longer visible.\n *\n * @event visibleItemChange\n * @param {OO.ui.PanelLayout} panel The next visible item in the layout\n */\n\n/* Methods */\n\n/**\n * Handle scroll events from the layout element\n *\n * @param {jQuery.Event} e\n * @fires visibleItemChange\n */\nOO.ui.StackLayout.prototype.onScroll = function () {\n\tvar currentRect,\n\t\tlen = this.items.length,\n\t\tcurrentIndex = this.items.indexOf( this.currentItem ),\n\t\tnewIndex = currentIndex,\n\t\tcontainerRect = this.$element[ 0 ].getBoundingClientRect();\n\n\tif ( !containerRect || ( !containerRect.top && !containerRect.bottom ) ) {\n\t\t// Can't get bounding rect, possibly not attached.\n\t\treturn;\n\t}\n\n\tfunction getRect( item ) {\n\t\treturn item.$element[ 0 ].getBoundingClientRect();\n\t}\n\n\tfunction isVisible( item ) {\n\t\tvar rect = getRect( item );\n\t\treturn rect.bottom > containerRect.top && rect.top < containerRect.bottom;\n\t}\n\n\tcurrentRect = getRect( this.currentItem );\n\n\tif ( currentRect.bottom < containerRect.top ) {\n\t\t// Scrolled down past current item\n\t\twhile ( ++newIndex < len ) {\n\t\t\tif ( isVisible( this.items[ newIndex ] ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else if ( currentRect.top > containerRect.bottom ) {\n\t\t// Scrolled up past current item\n\t\twhile ( --newIndex >= 0 ) {\n\t\t\tif ( isVisible( this.items[ newIndex ] ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( newIndex !== currentIndex ) {\n\t\tthis.emit( 'visibleItemChange', this.items[ newIndex ] );\n\t}\n};\n\n/**\n * Get the current panel.\n *\n * @return {OO.ui.Layout|null}\n */\nOO.ui.StackLayout.prototype.getCurrentItem = function () {\n\treturn this.currentItem;\n};\n\n/**\n * Unset the current item.\n *\n * @private\n * @param {OO.ui.StackLayout} layout\n * @fires set\n */\nOO.ui.StackLayout.prototype.unsetCurrentItem = function () {\n\tvar prevItem = this.currentItem;\n\tif ( prevItem === null ) {\n\t\treturn;\n\t}\n\n\tthis.currentItem = null;\n\tthis.emit( 'set', null );\n};\n\n/**\n * Add panel layouts to the stack layout.\n *\n * Panels will be added to the end of the stack layout array unless the optional index parameter specifies a different\n * insertion point. Adding a panel that is already in the stack will move it to the end of the array or the point specified\n * by the index.\n *\n * @param {OO.ui.Layout[]} items Panels to add\n * @param {number} [index] Index of the insertion point\n * @chainable\n */\nOO.ui.StackLayout.prototype.addItems = function ( items, index ) {\n\t// Update the visibility\n\tthis.updateHiddenState( items, this.currentItem );\n\n\t// Mixin method\n\tOO.ui.mixin.GroupElement.prototype.addItems.call( this, items, index );\n\n\tif ( !this.currentItem && items.length ) {\n\t\tthis.setItem( items[ 0 ] );\n\t}\n\n\treturn this;\n};\n\n/**\n * Remove the specified panels from the stack layout.\n *\n * Removed panels are detached from the DOM, not removed, so that they may be reused. To remove all panels,\n * you may wish to use the #clearItems method instead.\n *\n * @param {OO.ui.Layout[]} items Panels to remove\n * @chainable\n * @fires set\n */\nOO.ui.StackLayout.prototype.removeItems = function ( items ) {\n\t// Mixin method\n\tOO.ui.mixin.GroupElement.prototype.removeItems.call( this, items );\n\n\tif ( items.indexOf( this.currentItem ) !== -1 ) {\n\t\tif ( this.items.length ) {\n\t\t\tthis.setItem( this.items[ 0 ] );\n\t\t} else {\n\t\t\tthis.unsetCurrentItem();\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Clear all panels from the stack layout.\n *\n * Cleared panels are detached from the DOM, not removed, so that they may be reused. To remove only\n * a subset of panels, use the #removeItems method.\n *\n * @chainable\n * @fires set\n */\nOO.ui.StackLayout.prototype.clearItems = function () {\n\tthis.unsetCurrentItem();\n\tOO.ui.mixin.GroupElement.prototype.clearItems.call( this );\n\n\treturn this;\n};\n\n/**\n * Show the specified panel.\n *\n * If another panel is currently displayed, it will be hidden.\n *\n * @param {OO.ui.Layout} item Panel to show\n * @chainable\n * @fires set\n */\nOO.ui.StackLayout.prototype.setItem = function ( item ) {\n\tif ( item !== this.currentItem ) {\n\t\tthis.updateHiddenState( this.items, item );\n\n\t\tif ( this.items.indexOf( item ) !== -1 ) {\n\t\t\tthis.currentItem = item;\n\t\t\tthis.emit( 'set', item );\n\t\t} else {\n\t\t\tthis.unsetCurrentItem();\n\t\t}\n\t}\n\n\treturn this;\n};\n\n/**\n * Update the visibility of all items in case of non-continuous view.\n *\n * Ensure all items are hidden except for the selected one.\n * This method does nothing when the stack is continuous.\n *\n * @private\n * @param {OO.ui.Layout[]} items Item list iterate over\n * @param {OO.ui.Layout} [selectedItem] Selected item to show\n */\nOO.ui.StackLayout.prototype.updateHiddenState = function ( items, selectedItem ) {\n\tvar i, len;\n\n\tif ( !this.continuous ) {\n\t\tfor ( i = 0, len = items.length; i < len; i++ ) {\n\t\t\tif ( !selectedItem || selectedItem !== items[ i ] ) {\n\t\t\t\titems[ i ].$element.addClass( 'oo-ui-element-hidden' );\n\t\t\t\titems[ i ].$element.attr( 'aria-hidden', 'true' );\n\t\t\t}\n\t\t}\n\t\tif ( selectedItem ) {\n\t\t\tselectedItem.$element.removeClass( 'oo-ui-element-hidden' );\n\t\t\tselectedItem.$element.removeAttr( 'aria-hidden' );\n\t\t}\n\t}\n};\n\n/**\n * MenuLayouts combine a menu and a content {@link OO.ui.PanelLayout panel}. The menu is positioned relative to the content (after, before, top, or bottom)\n * and its size is customized with the #menuSize config. The content area will fill all remaining space.\n *\n * @example\n * var menuLayout = new OO.ui.MenuLayout( {\n * position: 'top'\n * } ),\n * menuPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),\n * contentPanel = new OO.ui.PanelLayout( { padded: true, expanded: true, scrollable: true } ),\n * select = new OO.ui.SelectWidget( {\n * items: [\n * new OO.ui.OptionWidget( {\n * data: 'before',\n * label: 'Before',\n * } ),\n * new OO.ui.OptionWidget( {\n * data: 'after',\n * label: 'After',\n * } ),\n * new OO.ui.OptionWidget( {\n * data: 'top',\n * label: 'Top',\n * } ),\n * new OO.ui.OptionWidget( {\n * data: 'bottom',\n * label: 'Bottom',\n * } )\n * ]\n * } ).on( 'select', function ( item ) {\n * menuLayout.setMenuPosition( item.getData() );\n * } );\n *\n * menuLayout.$menu.append(\n * menuPanel.$element.append( 'Menu panel', select.$element )\n * );\n * menuLayout.$content.append(\n * contentPanel.$element.append( 'Content panel', 'Note that the menu is positioned relative to the content panel: top, bottom, after, before.
')\n * );\n * $( 'body' ).append( menuLayout.$element );\n *\n * If menu size needs to be overridden, it can be accomplished using CSS similar to the snippet\n * below. MenuLayout's CSS will override the appropriate values with 'auto' or '0' to display the\n * menu correctly. If `menuPosition` is known beforehand, CSS rules corresponding to other positions\n * may be omitted.\n *\n * .oo-ui-menuLayout-menu {\n * height: 200px;\n * width: 200px;\n * }\n * .oo-ui-menuLayout-content {\n * top: 200px;\n * left: 200px;\n * right: 200px;\n * bottom: 200px;\n * }\n *\n * @class\n * @extends OO.ui.Layout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [showMenu=true] Show menu\n * @cfg {string} [menuPosition='before'] Position of menu: `top`, `after`, `bottom` or `before`\n */\nOO.ui.MenuLayout = function OoUiMenuLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( {\n\t\tshowMenu: true,\n\t\tmenuPosition: 'before'\n\t}, config );\n\n\t// Parent constructor\n\tOO.ui.MenuLayout.parent.call( this, config );\n\n\t/**\n\t * Menu DOM node\n\t *\n\t * @property {jQuery}\n\t */\n\tthis.$menu = $( 'First page
(This booklet has an outline, displayed on the left)
' );\n * }\n * OO.inheritClass( PageOneLayout, OO.ui.PageLayout );\n * PageOneLayout.prototype.setupOutlineItem = function () {\n * this.outlineItem.setLabel( 'Page One' );\n * };\n *\n * function PageTwoLayout( name, config ) {\n * PageTwoLayout.parent.call( this, name, config );\n * this.$element.append( 'Second page
' );\n * }\n * OO.inheritClass( PageTwoLayout, OO.ui.PageLayout );\n * PageTwoLayout.prototype.setupOutlineItem = function () {\n * this.outlineItem.setLabel( 'Page Two' );\n * };\n *\n * var page1 = new PageOneLayout( 'one' ),\n * page2 = new PageTwoLayout( 'two' );\n *\n * var booklet = new OO.ui.BookletLayout( {\n * outlined: true\n * } );\n *\n * booklet.addPages ( [ page1, page2 ] );\n * $( 'body' ).append( booklet.$element );\n *\n * @class\n * @extends OO.ui.MenuLayout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [continuous=false] Show all pages, one after another\n * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed.\n * @cfg {boolean} [outlined=false] Show the outline. The outline is used to navigate through the pages of the booklet.\n * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages\n */\nOO.ui.BookletLayout = function OoUiBookletLayout( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.BookletLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.currentPageName = null;\n\tthis.pages = {};\n\tthis.ignoreFocus = false;\n\tthis.stackLayout = new OO.ui.StackLayout( { continuous: !!config.continuous } );\n\tthis.$content.append( this.stackLayout.$element );\n\tthis.autoFocus = config.autoFocus === undefined || !!config.autoFocus;\n\tthis.outlineVisible = false;\n\tthis.outlined = !!config.outlined;\n\tif ( this.outlined ) {\n\t\tthis.editable = !!config.editable;\n\t\tthis.outlineControlsWidget = null;\n\t\tthis.outlineSelectWidget = new OO.ui.OutlineSelectWidget();\n\t\tthis.outlinePanel = new OO.ui.PanelLayout( { scrollable: true } );\n\t\tthis.$menu.append( this.outlinePanel.$element );\n\t\tthis.outlineVisible = true;\n\t\tif ( this.editable ) {\n\t\t\tthis.outlineControlsWidget = new OO.ui.OutlineControlsWidget(\n\t\t\t\tthis.outlineSelectWidget\n\t\t\t);\n\t\t}\n\t}\n\tthis.toggleMenu( this.outlined );\n\n\t// Events\n\tthis.stackLayout.connect( this, { set: 'onStackLayoutSet' } );\n\tif ( this.outlined ) {\n\t\tthis.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );\n\t\tthis.scrolling = false;\n\t\tthis.stackLayout.connect( this, { visibleItemChange: 'onStackLayoutVisibleItemChange' } );\n\t}\n\tif ( this.autoFocus ) {\n\t\t// Event 'focus' does not bubble, but 'focusin' does\n\t\tthis.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );\n\t}\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-bookletLayout' );\n\tthis.stackLayout.$element.addClass( 'oo-ui-bookletLayout-stackLayout' );\n\tif ( this.outlined ) {\n\t\tthis.outlinePanel.$element\n\t\t\t.addClass( 'oo-ui-bookletLayout-outlinePanel' )\n\t\t\t.append( this.outlineSelectWidget.$element );\n\t\tif ( this.editable ) {\n\t\t\tthis.outlinePanel.$element\n\t\t\t\t.addClass( 'oo-ui-bookletLayout-outlinePanel-editable' )\n\t\t\t\t.append( this.outlineControlsWidget.$element );\n\t\t}\n\t}\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.BookletLayout, OO.ui.MenuLayout );\n\n/* Events */\n\n/**\n * A 'set' event is emitted when a page is {@link #setPage set} to be displayed by the booklet layout.\n * @event set\n * @param {OO.ui.PageLayout} page Current page\n */\n\n/**\n * An 'add' event is emitted when pages are {@link #addPages added} to the booklet layout.\n *\n * @event add\n * @param {OO.ui.PageLayout[]} page Added pages\n * @param {number} index Index pages were added at\n */\n\n/**\n * A 'remove' event is emitted when pages are {@link #clearPages cleared} or\n * {@link #removePages removed} from the booklet.\n *\n * @event remove\n * @param {OO.ui.PageLayout[]} pages Removed pages\n */\n\n/* Methods */\n\n/**\n * Handle stack layout focus.\n *\n * @private\n * @param {jQuery.Event} e Focusin event\n */\nOO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {\n\tvar name, $target;\n\n\t// Find the page that an element was focused within\n\t$target = $( e.target ).closest( '.oo-ui-pageLayout' );\n\tfor ( name in this.pages ) {\n\t\t// Check for page match, exclude current page to find only page changes\n\t\tif ( this.pages[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentPageName ) {\n\t\t\tthis.setPage( name );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Handle visibleItemChange events from the stackLayout\n *\n * The next visible page is set as the current page by selecting it\n * in the outline\n *\n * @param {OO.ui.PageLayout} page The next visible page in the layout\n */\nOO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page ) {\n\t// Set a flag to so that the resulting call to #onStackLayoutSet doesn't\n\t// try and scroll the item into view again.\n\tthis.scrolling = true;\n\tthis.outlineSelectWidget.selectItemByData( page.getName() );\n\tthis.scrolling = false;\n};\n\n/**\n * Handle stack layout set events.\n *\n * @private\n * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel\n */\nOO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {\n\tvar layout = this;\n\tif ( !this.scrolling && page ) {\n\t\tpage.scrollElementIntoView( {\n\t\t\tcomplete: function () {\n\t\t\t\tif ( layout.autoFocus ) {\n\t\t\t\t\tlayout.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n};\n\n/**\n * Focus the first input in the current page.\n *\n * If no page is selected, the first selectable page will be selected.\n * If the focus is already in an element on the current page, nothing will happen.\n *\n * @param {number} [itemIndex] A specific item to focus on\n */\nOO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {\n\tvar page,\n\t\titems = this.stackLayout.getItems();\n\n\tif ( itemIndex !== undefined && items[ itemIndex ] ) {\n\t\tpage = items[ itemIndex ];\n\t} else {\n\t\tpage = this.stackLayout.getCurrentItem();\n\t}\n\n\tif ( !page && this.outlined ) {\n\t\tthis.selectFirstSelectablePage();\n\t\tpage = this.stackLayout.getCurrentItem();\n\t}\n\tif ( !page ) {\n\t\treturn;\n\t}\n\t// Only change the focus if is not already in the current page\n\tif ( !OO.ui.contains( page.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {\n\t\tpage.focus();\n\t}\n};\n\n/**\n * Find the first focusable input in the booklet layout and focus\n * on it.\n */\nOO.ui.BookletLayout.prototype.focusFirstFocusable = function () {\n\tOO.ui.findFocusable( this.stackLayout.$element ).focus();\n};\n\n/**\n * Handle outline widget select events.\n *\n * @private\n * @param {OO.ui.OptionWidget|null} item Selected item\n */\nOO.ui.BookletLayout.prototype.onOutlineSelectWidgetSelect = function ( item ) {\n\tif ( item ) {\n\t\tthis.setPage( item.getData() );\n\t}\n};\n\n/**\n * Check if booklet has an outline.\n *\n * @return {boolean} Booklet has an outline\n */\nOO.ui.BookletLayout.prototype.isOutlined = function () {\n\treturn this.outlined;\n};\n\n/**\n * Check if booklet has editing controls.\n *\n * @return {boolean} Booklet is editable\n */\nOO.ui.BookletLayout.prototype.isEditable = function () {\n\treturn this.editable;\n};\n\n/**\n * Check if booklet has a visible outline.\n *\n * @return {boolean} Outline is visible\n */\nOO.ui.BookletLayout.prototype.isOutlineVisible = function () {\n\treturn this.outlined && this.outlineVisible;\n};\n\n/**\n * Hide or show the outline.\n *\n * @param {boolean} [show] Show outline, omit to invert current state\n * @chainable\n */\nOO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {\n\tif ( this.outlined ) {\n\t\tshow = show === undefined ? !this.outlineVisible : !!show;\n\t\tthis.outlineVisible = show;\n\t\tthis.toggleMenu( show );\n\t}\n\n\treturn this;\n};\n\n/**\n * Get the page closest to the specified page.\n *\n * @param {OO.ui.PageLayout} page Page to use as a reference point\n * @return {OO.ui.PageLayout|null} Page closest to the specified page\n */\nOO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {\n\tvar next, prev, level,\n\t\tpages = this.stackLayout.getItems(),\n\t\tindex = pages.indexOf( page );\n\n\tif ( index !== -1 ) {\n\t\tnext = pages[ index + 1 ];\n\t\tprev = pages[ index - 1 ];\n\t\t// Prefer adjacent pages at the same level\n\t\tif ( this.outlined ) {\n\t\t\tlevel = this.outlineSelectWidget.getItemFromData( page.getName() ).getLevel();\n\t\t\tif (\n\t\t\t\tprev &&\n\t\t\t\tlevel === this.outlineSelectWidget.getItemFromData( prev.getName() ).getLevel()\n\t\t\t) {\n\t\t\t\treturn prev;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnext &&\n\t\t\t\tlevel === this.outlineSelectWidget.getItemFromData( next.getName() ).getLevel()\n\t\t\t) {\n\t\t\t\treturn next;\n\t\t\t}\n\t\t}\n\t}\n\treturn prev || next || null;\n};\n\n/**\n * Get the outline widget.\n *\n * If the booklet is not outlined, the method will return `null`.\n *\n * @return {OO.ui.OutlineSelectWidget|null} Outline widget, or null if the booklet is not outlined\n */\nOO.ui.BookletLayout.prototype.getOutline = function () {\n\treturn this.outlineSelectWidget;\n};\n\n/**\n * Get the outline controls widget.\n *\n * If the outline is not editable, the method will return `null`.\n *\n * @return {OO.ui.OutlineControlsWidget|null} The outline controls widget.\n */\nOO.ui.BookletLayout.prototype.getOutlineControls = function () {\n\treturn this.outlineControlsWidget;\n};\n\n/**\n * Get a page by its symbolic name.\n *\n * @param {string} name Symbolic name of page\n * @return {OO.ui.PageLayout|undefined} Page, if found\n */\nOO.ui.BookletLayout.prototype.getPage = function ( name ) {\n\treturn this.pages[ name ];\n};\n\n/**\n * Get the current page.\n *\n * @return {OO.ui.PageLayout|undefined} Current page, if found\n */\nOO.ui.BookletLayout.prototype.getCurrentPage = function () {\n\tvar name = this.getCurrentPageName();\n\treturn name ? this.getPage( name ) : undefined;\n};\n\n/**\n * Get the symbolic name of the current page.\n *\n * @return {string|null} Symbolic name of the current page\n */\nOO.ui.BookletLayout.prototype.getCurrentPageName = function () {\n\treturn this.currentPageName;\n};\n\n/**\n * Add pages to the booklet layout\n *\n * When pages are added with the same names as existing pages, the existing pages will be\n * automatically removed before the new pages are added.\n *\n * @param {OO.ui.PageLayout[]} pages Pages to add\n * @param {number} index Index of the insertion point\n * @fires add\n * @chainable\n */\nOO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {\n\tvar i, len, name, page, item, currentIndex,\n\t\tstackLayoutPages = this.stackLayout.getItems(),\n\t\tremove = [],\n\t\titems = [];\n\n\t// Remove pages with same names\n\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\tpage = pages[ i ];\n\t\tname = page.getName();\n\n\t\tif ( Object.prototype.hasOwnProperty.call( this.pages, name ) ) {\n\t\t\t// Correct the insertion index\n\t\t\tcurrentIndex = stackLayoutPages.indexOf( this.pages[ name ] );\n\t\t\tif ( currentIndex !== -1 && currentIndex + 1 < index ) {\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\tremove.push( this.pages[ name ] );\n\t\t}\n\t}\n\tif ( remove.length ) {\n\t\tthis.removePages( remove );\n\t}\n\n\t// Add new pages\n\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\tpage = pages[ i ];\n\t\tname = page.getName();\n\t\tthis.pages[ page.getName() ] = page;\n\t\tif ( this.outlined ) {\n\t\t\titem = new OO.ui.OutlineOptionWidget( { data: name } );\n\t\t\tpage.setOutlineItem( item );\n\t\t\titems.push( item );\n\t\t}\n\t}\n\n\tif ( this.outlined && items.length ) {\n\t\tthis.outlineSelectWidget.addItems( items, index );\n\t\tthis.selectFirstSelectablePage();\n\t}\n\tthis.stackLayout.addItems( pages, index );\n\tthis.emit( 'add', pages, index );\n\n\treturn this;\n};\n\n/**\n * Remove the specified pages from the booklet layout.\n *\n * To remove all pages from the booklet, you may wish to use the #clearPages method instead.\n *\n * @param {OO.ui.PageLayout[]} pages An array of pages to remove\n * @fires remove\n * @chainable\n */\nOO.ui.BookletLayout.prototype.removePages = function ( pages ) {\n\tvar i, len, name, page,\n\t\titems = [];\n\n\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\tpage = pages[ i ];\n\t\tname = page.getName();\n\t\tdelete this.pages[ name ];\n\t\tif ( this.outlined ) {\n\t\t\titems.push( this.outlineSelectWidget.getItemFromData( name ) );\n\t\t\tpage.setOutlineItem( null );\n\t\t}\n\t}\n\tif ( this.outlined && items.length ) {\n\t\tthis.outlineSelectWidget.removeItems( items );\n\t\tthis.selectFirstSelectablePage();\n\t}\n\tthis.stackLayout.removeItems( pages );\n\tthis.emit( 'remove', pages );\n\n\treturn this;\n};\n\n/**\n * Clear all pages from the booklet layout.\n *\n * To remove only a subset of pages from the booklet, use the #removePages method.\n *\n * @fires remove\n * @chainable\n */\nOO.ui.BookletLayout.prototype.clearPages = function () {\n\tvar i, len,\n\t\tpages = this.stackLayout.getItems();\n\n\tthis.pages = {};\n\tthis.currentPageName = null;\n\tif ( this.outlined ) {\n\t\tthis.outlineSelectWidget.clearItems();\n\t\tfor ( i = 0, len = pages.length; i < len; i++ ) {\n\t\t\tpages[ i ].setOutlineItem( null );\n\t\t}\n\t}\n\tthis.stackLayout.clearItems();\n\n\tthis.emit( 'remove', pages );\n\n\treturn this;\n};\n\n/**\n * Set the current page by symbolic name.\n *\n * @fires set\n * @param {string} name Symbolic name of page\n */\nOO.ui.BookletLayout.prototype.setPage = function ( name ) {\n\tvar selectedItem,\n\t\t$focused,\n\t\tpage = this.pages[ name ],\n\t\tpreviousPage = this.currentPageName && this.pages[ this.currentPageName ];\n\n\tif ( name !== this.currentPageName ) {\n\t\tif ( this.outlined ) {\n\t\t\tselectedItem = this.outlineSelectWidget.getSelectedItem();\n\t\t\tif ( selectedItem && selectedItem.getData() !== name ) {\n\t\t\t\tthis.outlineSelectWidget.selectItemByData( name );\n\t\t\t}\n\t\t}\n\t\tif ( page ) {\n\t\t\tif ( previousPage ) {\n\t\t\t\tpreviousPage.setActive( false );\n\t\t\t\t// Blur anything focused if the next page doesn't have anything focusable.\n\t\t\t\t// This is not needed if the next page has something focusable (because once it is focused\n\t\t\t\t// this blur happens automatically). If the layout is non-continuous, this check is\n\t\t\t\t// meaningless because the next page is not visible yet and thus can't hold focus.\n\t\t\t\tif (\n\t\t\t\t\tthis.autoFocus &&\n\t\t\t\t\tthis.stackLayout.continuous &&\n\t\t\t\t\tOO.ui.findFocusable( page.$element ).length !== 0\n\t\t\t\t) {\n\t\t\t\t\t$focused = previousPage.$element.find( ':focus' );\n\t\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentPageName = name;\n\t\t\tpage.setActive( true );\n\t\t\tthis.stackLayout.setItem( page );\n\t\t\tif ( !this.stackLayout.continuous && previousPage ) {\n\t\t\t\t// This should not be necessary, since any inputs on the previous page should have been\n\t\t\t\t// blurred when it was hidden, but browsers are not very consistent about this.\n\t\t\t\t$focused = previousPage.$element.find( ':focus' );\n\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.emit( 'set', page );\n\t\t}\n\t}\n};\n\n/**\n * Select the first selectable page.\n *\n * @chainable\n */\nOO.ui.BookletLayout.prototype.selectFirstSelectablePage = function () {\n\tif ( !this.outlineSelectWidget.getSelectedItem() ) {\n\t\tthis.outlineSelectWidget.selectItem( this.outlineSelectWidget.getFirstSelectableItem() );\n\t}\n\n\treturn this;\n};\n\n/**\n * IndexLayouts contain {@link OO.ui.CardLayout card layouts} as well as\n * {@link OO.ui.TabSelectWidget tabs} that allow users to easily navigate through the cards and\n * select which one to display. By default, only one card is displayed at a time. When a user\n * navigates to a new card, the index layout automatically focuses on the first focusable element,\n * unless the default setting is changed.\n *\n * TODO: This class is similar to BookletLayout, we may want to refactor to reduce duplication\n *\n * @example\n * // Example of a IndexLayout that contains two CardLayouts.\n *\n * function CardOneLayout( name, config ) {\n * CardOneLayout.parent.call( this, name, config );\n * this.$element.append( 'First card
' );\n * }\n * OO.inheritClass( CardOneLayout, OO.ui.CardLayout );\n * CardOneLayout.prototype.setupTabItem = function () {\n * this.tabItem.setLabel( 'Card one' );\n * };\n *\n * var card1 = new CardOneLayout( 'one' ),\n * card2 = new CardLayout( 'two', { label: 'Card two' } );\n *\n * card2.$element.append( 'Second card
' );\n *\n * var index = new OO.ui.IndexLayout();\n *\n * index.addCards ( [ card1, card2 ] );\n * $( 'body' ).append( index.$element );\n *\n * @class\n * @extends OO.ui.MenuLayout\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [continuous=false] Show all cards, one after another\n * @cfg {boolean} [expanded=true] Expand the content panel to fill the entire parent element.\n * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed.\n */\nOO.ui.IndexLayout = function OoUiIndexLayout( config ) {\n\t// Configuration initialization\n\tconfig = $.extend( {}, config, { menuPosition: 'top' } );\n\n\t// Parent constructor\n\tOO.ui.IndexLayout.parent.call( this, config );\n\n\t// Properties\n\tthis.currentCardName = null;\n\tthis.cards = {};\n\tthis.ignoreFocus = false;\n\tthis.stackLayout = new OO.ui.StackLayout( {\n\t\tcontinuous: !!config.continuous,\n\t\texpanded: config.expanded\n\t} );\n\tthis.$content.append( this.stackLayout.$element );\n\tthis.autoFocus = config.autoFocus === undefined || !!config.autoFocus;\n\n\tthis.tabSelectWidget = new OO.ui.TabSelectWidget();\n\tthis.tabPanel = new OO.ui.PanelLayout();\n\tthis.$menu.append( this.tabPanel.$element );\n\n\tthis.toggleMenu( true );\n\n\t// Events\n\tthis.stackLayout.connect( this, { set: 'onStackLayoutSet' } );\n\tthis.tabSelectWidget.connect( this, { select: 'onTabSelectWidgetSelect' } );\n\tif ( this.autoFocus ) {\n\t\t// Event 'focus' does not bubble, but 'focusin' does\n\t\tthis.stackLayout.$element.on( 'focusin', this.onStackLayoutFocus.bind( this ) );\n\t}\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-indexLayout' );\n\tthis.stackLayout.$element.addClass( 'oo-ui-indexLayout-stackLayout' );\n\tthis.tabPanel.$element\n\t\t.addClass( 'oo-ui-indexLayout-tabPanel' )\n\t\t.append( this.tabSelectWidget.$element );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.IndexLayout, OO.ui.MenuLayout );\n\n/* Events */\n\n/**\n * A 'set' event is emitted when a card is {@link #setCard set} to be displayed by the index layout.\n * @event set\n * @param {OO.ui.CardLayout} card Current card\n */\n\n/**\n * An 'add' event is emitted when cards are {@link #addCards added} to the index layout.\n *\n * @event add\n * @param {OO.ui.CardLayout[]} card Added cards\n * @param {number} index Index cards were added at\n */\n\n/**\n * A 'remove' event is emitted when cards are {@link #clearCards cleared} or\n * {@link #removeCards removed} from the index.\n *\n * @event remove\n * @param {OO.ui.CardLayout[]} cards Removed cards\n */\n\n/* Methods */\n\n/**\n * Handle stack layout focus.\n *\n * @private\n * @param {jQuery.Event} e Focusin event\n */\nOO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {\n\tvar name, $target;\n\n\t// Find the card that an element was focused within\n\t$target = $( e.target ).closest( '.oo-ui-cardLayout' );\n\tfor ( name in this.cards ) {\n\t\t// Check for card match, exclude current card to find only card changes\n\t\tif ( this.cards[ name ].$element[ 0 ] === $target[ 0 ] && name !== this.currentCardName ) {\n\t\t\tthis.setCard( name );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Handle stack layout set events.\n *\n * @private\n * @param {OO.ui.PanelLayout|null} card The card panel that is now the current panel\n */\nOO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {\n\tvar layout = this;\n\tif ( card ) {\n\t\tcard.scrollElementIntoView( {\n\t\t\tcomplete: function () {\n\t\t\t\tif ( layout.autoFocus ) {\n\t\t\t\t\tlayout.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n};\n\n/**\n * Focus the first input in the current card.\n *\n * If no card is selected, the first selectable card will be selected.\n * If the focus is already in an element on the current card, nothing will happen.\n *\n * @param {number} [itemIndex] A specific item to focus on\n */\nOO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {\n\tvar card,\n\t\titems = this.stackLayout.getItems();\n\n\tif ( itemIndex !== undefined && items[ itemIndex ] ) {\n\t\tcard = items[ itemIndex ];\n\t} else {\n\t\tcard = this.stackLayout.getCurrentItem();\n\t}\n\n\tif ( !card ) {\n\t\tthis.selectFirstSelectableCard();\n\t\tcard = this.stackLayout.getCurrentItem();\n\t}\n\tif ( !card ) {\n\t\treturn;\n\t}\n\t// Only change the focus if is not already in the current page\n\tif ( !OO.ui.contains( card.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {\n\t\tcard.focus();\n\t}\n};\n\n/**\n * Find the first focusable input in the index layout and focus\n * on it.\n */\nOO.ui.IndexLayout.prototype.focusFirstFocusable = function () {\n\tOO.ui.findFocusable( this.stackLayout.$element ).focus();\n};\n\n/**\n * Handle tab widget select events.\n *\n * @private\n * @param {OO.ui.OptionWidget|null} item Selected item\n */\nOO.ui.IndexLayout.prototype.onTabSelectWidgetSelect = function ( item ) {\n\tif ( item ) {\n\t\tthis.setCard( item.getData() );\n\t}\n};\n\n/**\n * Get the card closest to the specified card.\n *\n * @param {OO.ui.CardLayout} card Card to use as a reference point\n * @return {OO.ui.CardLayout|null} Card closest to the specified card\n */\nOO.ui.IndexLayout.prototype.getClosestCard = function ( card ) {\n\tvar next, prev, level,\n\t\tcards = this.stackLayout.getItems(),\n\t\tindex = cards.indexOf( card );\n\n\tif ( index !== -1 ) {\n\t\tnext = cards[ index + 1 ];\n\t\tprev = cards[ index - 1 ];\n\t\t// Prefer adjacent cards at the same level\n\t\tlevel = this.tabSelectWidget.getItemFromData( card.getName() ).getLevel();\n\t\tif (\n\t\t\tprev &&\n\t\t\tlevel === this.tabSelectWidget.getItemFromData( prev.getName() ).getLevel()\n\t\t) {\n\t\t\treturn prev;\n\t\t}\n\t\tif (\n\t\t\tnext &&\n\t\t\tlevel === this.tabSelectWidget.getItemFromData( next.getName() ).getLevel()\n\t\t) {\n\t\t\treturn next;\n\t\t}\n\t}\n\treturn prev || next || null;\n};\n\n/**\n * Get the tabs widget.\n *\n * @return {OO.ui.TabSelectWidget} Tabs widget\n */\nOO.ui.IndexLayout.prototype.getTabs = function () {\n\treturn this.tabSelectWidget;\n};\n\n/**\n * Get a card by its symbolic name.\n *\n * @param {string} name Symbolic name of card\n * @return {OO.ui.CardLayout|undefined} Card, if found\n */\nOO.ui.IndexLayout.prototype.getCard = function ( name ) {\n\treturn this.cards[ name ];\n};\n\n/**\n * Get the current card.\n *\n * @return {OO.ui.CardLayout|undefined} Current card, if found\n */\nOO.ui.IndexLayout.prototype.getCurrentCard = function () {\n\tvar name = this.getCurrentCardName();\n\treturn name ? this.getCard( name ) : undefined;\n};\n\n/**\n * Get the symbolic name of the current card.\n *\n * @return {string|null} Symbolic name of the current card\n */\nOO.ui.IndexLayout.prototype.getCurrentCardName = function () {\n\treturn this.currentCardName;\n};\n\n/**\n * Add cards to the index layout\n *\n * When cards are added with the same names as existing cards, the existing cards will be\n * automatically removed before the new cards are added.\n *\n * @param {OO.ui.CardLayout[]} cards Cards to add\n * @param {number} index Index of the insertion point\n * @fires add\n * @chainable\n */\nOO.ui.IndexLayout.prototype.addCards = function ( cards, index ) {\n\tvar i, len, name, card, item, currentIndex,\n\t\tstackLayoutCards = this.stackLayout.getItems(),\n\t\tremove = [],\n\t\titems = [];\n\n\t// Remove cards with same names\n\tfor ( i = 0, len = cards.length; i < len; i++ ) {\n\t\tcard = cards[ i ];\n\t\tname = card.getName();\n\n\t\tif ( Object.prototype.hasOwnProperty.call( this.cards, name ) ) {\n\t\t\t// Correct the insertion index\n\t\t\tcurrentIndex = stackLayoutCards.indexOf( this.cards[ name ] );\n\t\t\tif ( currentIndex !== -1 && currentIndex + 1 < index ) {\n\t\t\t\tindex--;\n\t\t\t}\n\t\t\tremove.push( this.cards[ name ] );\n\t\t}\n\t}\n\tif ( remove.length ) {\n\t\tthis.removeCards( remove );\n\t}\n\n\t// Add new cards\n\tfor ( i = 0, len = cards.length; i < len; i++ ) {\n\t\tcard = cards[ i ];\n\t\tname = card.getName();\n\t\tthis.cards[ card.getName() ] = card;\n\t\titem = new OO.ui.TabOptionWidget( { data: name } );\n\t\tcard.setTabItem( item );\n\t\titems.push( item );\n\t}\n\n\tif ( items.length ) {\n\t\tthis.tabSelectWidget.addItems( items, index );\n\t\tthis.selectFirstSelectableCard();\n\t}\n\tthis.stackLayout.addItems( cards, index );\n\tthis.emit( 'add', cards, index );\n\n\treturn this;\n};\n\n/**\n * Remove the specified cards from the index layout.\n *\n * To remove all cards from the index, you may wish to use the #clearCards method instead.\n *\n * @param {OO.ui.CardLayout[]} cards An array of cards to remove\n * @fires remove\n * @chainable\n */\nOO.ui.IndexLayout.prototype.removeCards = function ( cards ) {\n\tvar i, len, name, card,\n\t\titems = [];\n\n\tfor ( i = 0, len = cards.length; i < len; i++ ) {\n\t\tcard = cards[ i ];\n\t\tname = card.getName();\n\t\tdelete this.cards[ name ];\n\t\titems.push( this.tabSelectWidget.getItemFromData( name ) );\n\t\tcard.setTabItem( null );\n\t}\n\tif ( items.length ) {\n\t\tthis.tabSelectWidget.removeItems( items );\n\t\tthis.selectFirstSelectableCard();\n\t}\n\tthis.stackLayout.removeItems( cards );\n\tthis.emit( 'remove', cards );\n\n\treturn this;\n};\n\n/**\n * Clear all cards from the index layout.\n *\n * To remove only a subset of cards from the index, use the #removeCards method.\n *\n * @fires remove\n * @chainable\n */\nOO.ui.IndexLayout.prototype.clearCards = function () {\n\tvar i, len,\n\t\tcards = this.stackLayout.getItems();\n\n\tthis.cards = {};\n\tthis.currentCardName = null;\n\tthis.tabSelectWidget.clearItems();\n\tfor ( i = 0, len = cards.length; i < len; i++ ) {\n\t\tcards[ i ].setTabItem( null );\n\t}\n\tthis.stackLayout.clearItems();\n\n\tthis.emit( 'remove', cards );\n\n\treturn this;\n};\n\n/**\n * Set the current card by symbolic name.\n *\n * @fires set\n * @param {string} name Symbolic name of card\n */\nOO.ui.IndexLayout.prototype.setCard = function ( name ) {\n\tvar selectedItem,\n\t\t$focused,\n\t\tcard = this.cards[ name ],\n\t\tpreviousCard = this.currentCardName && this.cards[ this.currentCardName ];\n\n\tif ( name !== this.currentCardName ) {\n\t\tselectedItem = this.tabSelectWidget.getSelectedItem();\n\t\tif ( selectedItem && selectedItem.getData() !== name ) {\n\t\t\tthis.tabSelectWidget.selectItemByData( name );\n\t\t}\n\t\tif ( card ) {\n\t\t\tif ( previousCard ) {\n\t\t\t\tpreviousCard.setActive( false );\n\t\t\t\t// Blur anything focused if the next card doesn't have anything focusable.\n\t\t\t\t// This is not needed if the next card has something focusable (because once it is focused\n\t\t\t\t// this blur happens automatically). If the layout is non-continuous, this check is\n\t\t\t\t// meaningless because the next card is not visible yet and thus can't hold focus.\n\t\t\t\tif (\n\t\t\t\t\tthis.autoFocus &&\n\t\t\t\t\tthis.stackLayout.continuous &&\n\t\t\t\t\tOO.ui.findFocusable( card.$element ).length !== 0\n\t\t\t\t) {\n\t\t\t\t\t$focused = previousCard.$element.find( ':focus' );\n\t\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentCardName = name;\n\t\t\tcard.setActive( true );\n\t\t\tthis.stackLayout.setItem( card );\n\t\t\tif ( !this.stackLayout.continuous && previousCard ) {\n\t\t\t\t// This should not be necessary, since any inputs on the previous card should have been\n\t\t\t\t// blurred when it was hidden, but browsers are not very consistent about this.\n\t\t\t\t$focused = previousCard.$element.find( ':focus' );\n\t\t\t\tif ( $focused.length ) {\n\t\t\t\t\t$focused[ 0 ].blur();\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.emit( 'set', card );\n\t\t}\n\t}\n};\n\n/**\n * Select the first selectable card.\n *\n * @chainable\n */\nOO.ui.IndexLayout.prototype.selectFirstSelectableCard = function () {\n\tif ( !this.tabSelectWidget.getSelectedItem() ) {\n\t\tthis.tabSelectWidget.selectItem( this.tabSelectWidget.getFirstSelectableItem() );\n\t}\n\n\treturn this;\n};\n\n/**\n * ToggleWidget implements basic behavior of widgets with an on/off state.\n * Please see OO.ui.ToggleButtonWidget and OO.ui.ToggleSwitchWidget for examples.\n *\n * @abstract\n * @class\n * @extends OO.ui.Widget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [value=false] The toggle’s initial on/off state.\n * By default, the toggle is in the 'off' state.\n */\nOO.ui.ToggleWidget = function OoUiToggleWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ToggleWidget.parent.call( this, config );\n\n\t// Properties\n\tthis.value = null;\n\n\t// Initialization\n\tthis.$element.addClass( 'oo-ui-toggleWidget' );\n\tthis.setValue( !!config.value );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToggleWidget, OO.ui.Widget );\n\n/* Events */\n\n/**\n * @event change\n *\n * A change event is emitted when the on/off state of the toggle changes.\n *\n * @param {boolean} value Value representing the new state of the toggle\n */\n\n/* Methods */\n\n/**\n * Get the value representing the toggle’s state.\n *\n * @return {boolean} The on/off state of the toggle\n */\nOO.ui.ToggleWidget.prototype.getValue = function () {\n\treturn this.value;\n};\n\n/**\n * Set the state of the toggle: `true` for 'on', `false' for 'off'.\n *\n * @param {boolean} value The state of the toggle\n * @fires change\n * @chainable\n */\nOO.ui.ToggleWidget.prototype.setValue = function ( value ) {\n\tvalue = !!value;\n\tif ( this.value !== value ) {\n\t\tthis.value = value;\n\t\tthis.emit( 'change', value );\n\t\tthis.$element.toggleClass( 'oo-ui-toggleWidget-on', value );\n\t\tthis.$element.toggleClass( 'oo-ui-toggleWidget-off', !value );\n\t\tthis.$element.attr( 'aria-checked', value.toString() );\n\t}\n\treturn this;\n};\n\n/**\n * ToggleButtons are buttons that have a state (‘on’ or ‘off’) that is represented by a\n * Boolean value. Like other {@link OO.ui.ButtonWidget buttons}, toggle buttons can be\n * configured with {@link OO.ui.mixin.IconElement icons}, {@link OO.ui.mixin.IndicatorElement indicators},\n * {@link OO.ui.mixin.TitledElement titles}, {@link OO.ui.mixin.FlaggedElement styling flags},\n * and {@link OO.ui.mixin.LabelElement labels}. Please see\n * the [OOjs UI documentation][1] on MediaWiki for more information.\n *\n * @example\n * // Toggle buttons in the 'off' and 'on' state.\n * var toggleButton1 = new OO.ui.ToggleButtonWidget( {\n * label: 'Toggle Button off'\n * } );\n * var toggleButton2 = new OO.ui.ToggleButtonWidget( {\n * label: 'Toggle Button on',\n * value: true\n * } );\n * // Append the buttons to the DOM.\n * $( 'body' ).append( toggleButton1.$element, toggleButton2.$element );\n *\n * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Buttons_and_Switches#Toggle_buttons\n *\n * @class\n * @extends OO.ui.ToggleWidget\n * @mixins OO.ui.mixin.ButtonElement\n * @mixins OO.ui.mixin.IconElement\n * @mixins OO.ui.mixin.IndicatorElement\n * @mixins OO.ui.mixin.LabelElement\n * @mixins OO.ui.mixin.TitledElement\n * @mixins OO.ui.mixin.FlaggedElement\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [value=false] The toggle button’s initial on/off\n * state. By default, the button is in the 'off' state.\n */\nOO.ui.ToggleButtonWidget = function OoUiToggleButtonWidget( config ) {\n\t// Configuration initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tOO.ui.ToggleButtonWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.ButtonElement.call( this, config );\n\tOO.ui.mixin.IconElement.call( this, config );\n\tOO.ui.mixin.IndicatorElement.call( this, config );\n\tOO.ui.mixin.LabelElement.call( this, config );\n\tOO.ui.mixin.TitledElement.call( this, $.extend( {}, config, { $titled: this.$button } ) );\n\tOO.ui.mixin.FlaggedElement.call( this, config );\n\tOO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$button } ) );\n\n\t// Events\n\tthis.connect( this, { click: 'onAction' } );\n\n\t// Initialization\n\tthis.$button.append( this.$icon, this.$label, this.$indicator );\n\tthis.$element\n\t\t.addClass( 'oo-ui-toggleButtonWidget' )\n\t\t.append( this.$button );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToggleButtonWidget, OO.ui.ToggleWidget );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.ButtonElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.IconElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.IndicatorElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.LabelElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TitledElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.FlaggedElement );\nOO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TabIndexedElement );\n\n/* Methods */\n\n/**\n * Handle the button action being triggered.\n *\n * @private\n */\nOO.ui.ToggleButtonWidget.prototype.onAction = function () {\n\tthis.setValue( !this.value );\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {\n\tvalue = !!value;\n\tif ( value !== this.value ) {\n\t\t// Might be called from parent constructor before ButtonElement constructor\n\t\tif ( this.$button ) {\n\t\t\tthis.$button.attr( 'aria-pressed', value.toString() );\n\t\t}\n\t\tthis.setActive( value );\n\t}\n\n\t// Parent method\n\tOO.ui.ToggleButtonWidget.parent.prototype.setValue.call( this, value );\n\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nOO.ui.ToggleButtonWidget.prototype.setButtonElement = function ( $button ) {\n\tif ( this.$button ) {\n\t\tthis.$button.removeAttr( 'aria-pressed' );\n\t}\n\tOO.ui.mixin.ButtonElement.prototype.setButtonElement.call( this, $button );\n\tthis.$button.attr( 'aria-pressed', this.value.toString() );\n};\n\n/**\n * ToggleSwitches are switches that slide on and off. Their state is represented by a Boolean\n * value (`true` for ‘on’, and `false` otherwise, the default). The ‘off’ state is represented\n * visually by a slider in the leftmost position.\n *\n * @example\n * // Toggle switches in the 'off' and 'on' position.\n * var toggleSwitch1 = new OO.ui.ToggleSwitchWidget();\n * var toggleSwitch2 = new OO.ui.ToggleSwitchWidget( {\n * value: true\n * } );\n *\n * // Create a FieldsetLayout to layout and label switches\n * var fieldset = new OO.ui.FieldsetLayout( {\n * label: 'Toggle switches'\n * } );\n * fieldset.addItems( [\n * new OO.ui.FieldLayout( toggleSwitch1, { label: 'Off', align: 'top' } ),\n * new OO.ui.FieldLayout( toggleSwitch2, { label: 'On', align: 'top' } )\n * ] );\n * $( 'body' ).append( fieldset.$element );\n *\n * @class\n * @extends OO.ui.ToggleWidget\n * @mixins OO.ui.mixin.TabIndexedElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @cfg {boolean} [value=false] The toggle switch’s initial on/off state.\n * By default, the toggle switch is in the 'off' position.\n */\nOO.ui.ToggleSwitchWidget = function OoUiToggleSwitchWidget( config ) {\n\t// Parent constructor\n\tOO.ui.ToggleSwitchWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.TabIndexedElement.call( this, config );\n\n\t// Properties\n\tthis.dragging = false;\n\tthis.dragStart = null;\n\tthis.sliding = false;\n\tthis.$glow = $( '' );\n\tthis.$grip = $( '' );\n\n\t// Events\n\tthis.$element.on( {\n\t\tclick: this.onClick.bind( this ),\n\t\tkeypress: this.onKeyPress.bind( this )\n\t} );\n\n\t// Initialization\n\tthis.$glow.addClass( 'oo-ui-toggleSwitchWidget-glow' );\n\tthis.$grip.addClass( 'oo-ui-toggleSwitchWidget-grip' );\n\tthis.$element\n\t\t.addClass( 'oo-ui-toggleSwitchWidget' )\n\t\t.attr( 'role', 'checkbox' )\n\t\t.append( this.$glow, this.$grip );\n};\n\n/* Setup */\n\nOO.inheritClass( OO.ui.ToggleSwitchWidget, OO.ui.ToggleWidget );\nOO.mixinClass( OO.ui.ToggleSwitchWidget, OO.ui.mixin.TabIndexedElement );\n\n/* Methods */\n\n/**\n * Handle mouse click events.\n *\n * @private\n * @param {jQuery.Event} e Mouse click event\n */\nOO.ui.ToggleSwitchWidget.prototype.onClick = function ( e ) {\n\tif ( !this.isDisabled() && e.which === OO.ui.MouseButtons.LEFT ) {\n\t\tthis.setValue( !this.value );\n\t}\n\treturn false;\n};\n\n/**\n * Handle key press events.\n *\n * @private\n * @param {jQuery.Event} e Key press event\n */\nOO.ui.ToggleSwitchWidget.prototype.onKeyPress = function ( e ) {\n\tif ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {\n\t\tthis.setValue( !this.value );\n\t\treturn false;\n\t}\n};\n\n/**\n * OutlineControlsWidget is a set of controls for an {@link OO.ui.OutlineSelectWidget outline select widget}.\n * Controls include moving items up and down, removing items, and adding different kinds of items.\n *\n * **Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}.**\n *\n * @class\n * @extends OO.ui.Widget\n * @mixins OO.ui.mixin.GroupElement\n * @mixins OO.ui.mixin.IconElement\n *\n * @constructor\n * @param {OO.ui.OutlineSelectWidget} outline Outline to control\n * @param {Object} [config] Configuration options\n * @cfg {Object} [abilities] List of abilties\n * @cfg {boolean} [abilities.move=true] Allow moving movable items\n * @cfg {boolean} [abilities.remove=true] Allow removing removable items\n */\nOO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {\n\t// Allow passing positional parameters inside the config object\n\tif ( OO.isPlainObject( outline ) && config === undefined ) {\n\t\tconfig = outline;\n\t\toutline = config.outline;\n\t}\n\n\t// Configuration initialization\n\tconfig = $.extend( { icon: 'add' }, config );\n\n\t// Parent constructor\n\tOO.ui.OutlineControlsWidget.parent.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, config );\n\tOO.ui.mixin.IconElement.call( this, config );\n\n\t// Properties\n\tthis.outline = outline;\n\tthis.$movers = $( '