{"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","static","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","isMobile","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","setPressed","state","pressed","setFlags","progressive","selected","setMovable","updateThemeClasses","setRemovable","setSelected","constructor","Math","max","min","bindKeyDownListener","unbindKeyDownListener","SelectWidget","ButtonOptionWidget","OptionWidget","selectable","ButtonSelectWidget","CapsuleItemWidget","ItemWidget","closeButton","indicator","tabIndex","onCloseClick","keydown","onKeyDown","getElementGroup","isFunction","editItem","keyCode","BACKSPACE","DELETE","getPreviousItem","RIGHT","getNextItem","CapsuleMultiselectWidget","$tabFocus","allowArbitrary","allowDuplicates","popup","placeholder","align","anchor","PopupElement","menu","filterFromInput","onPopupFocusOut","$autoCloseIgnore","onInputFocus","onInputBlur","propertychange change click mouseup keydown keyup input cut paste select focus","updateInputSize","onMouseDown","prop","role","aria-autocomplete","setItemsFromData","onMenuItemsChange","supportsSimpleLabel","createItemWidget","getInputId","id","generateElementId","getItemsData","map","datas","each","j","String","addItemsFromData","addItemFromLabel","getItemFromLabel","compare","removeItemsFromData","same","l","oldItems","updateIfHeightChanged","val","clearInput","updateItemVisibility","getMenu","get","document","ESCAPE","metaKey","ctrlKey","$lastItem","direction","contentWidth","currentWidth","bestWidth","last","Element","getDir","contentWidthWithPlaceholder","scrollWidth","width","innerWidth","left","outerWidth","floor","height","updateDimensions","onMenuChoose","onMenuToggle","updateDisabled","setSize","CapsuleMultiSelectWidget","warnDeprecation","apply","arguments","SelectFileWidget","dragHandler","accept","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","loadAndGetImageUrl","url","IconWidget","empty","reader","FileReader","getProp","size","onload","event","img","createElement","addEventListener","naturalWidth","naturalHeight","complete","result","src","readAsDataURL","stopPropagation","tabindex","join","isAllowedType","mimeType","mimeTest","substr","type","onClearClick","itemOrFile","droppableFile","dt","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.19.5\n * https://www.mediawiki.org/wiki/OOjs_UI\n *\n * Copyright 2011–2017 OOjs UI Team and other contributors.\n * Released under the MIT license\n * http://oojs.mit-license.org\n *\n * Date: 2017-03-07T22:57:01Z\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 Drag 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 Drag event\n * @return {boolean} False if the event is cancelled\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 Drop 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 * @param {jQuery.Event} e Drag event\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.attr( 'role', 'listbox' )\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. Disabled on mobile.\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().done( function () {\n\t\t\tif ( layout.autoFocus && !OO.ui.isMobile() ) {\n\t\t\t\tlayout.focus();\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\t!OO.ui.isMobile() &&\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 OO.ui.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. Disabled on mobile.\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().done( function () {\n\t\t\tif ( layout.autoFocus && !OO.ui.isMobile() ) {\n\t\t\t\tlayout.focus();\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\t!OO.ui.isMobile() &&\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, $.extend( {}, config, { active: this.active } ) );\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 = $( '