2015-08-17 17:00:26 -07:00
/ * *
2018-11-23 12:29:20 +00:00
* DO NOT EDIT THIS FILE .
* See the following change record for more information ,
* https : //www.drupal.org/node/2815083
* @ preserve
* * /
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
( function ( $ , Drupal ) {
function TabbingManager ( ) {
this . stack = [ ] ;
}
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
function TabbingContext ( options ) {
$ . extend ( this , {
level : null ,
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
$tabbableElements : $ ( ) ,
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
$disabledElements : $ ( ) ,
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
released : false ,
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
active : false
} , options ) ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
$ . extend ( TabbingManager . prototype , {
constrain : function constrain ( elements ) {
2015-08-17 17:00:26 -07:00
var il = this . stack . length ;
for ( var i = 0 ; i < il ; i ++ ) {
this . stack [ i ] . deactivate ( ) ;
}
var $elements = $ ( elements ) . find ( ':tabbable' ) . addBack ( ':tabbable' ) ;
var tabbingContext = new TabbingContext ( {
level : this . stack . length ,
$tabbableElements : $elements
} ) ;
this . stack . push ( tabbingContext ) ;
tabbingContext . activate ( ) ;
$ ( document ) . trigger ( 'drupalTabbingConstrained' , tabbingContext ) ;
return tabbingContext ;
} ,
2018-11-23 12:29:20 +00:00
release : function release ( ) {
2015-08-17 17:00:26 -07:00
var toActivate = this . stack . length - 1 ;
while ( toActivate >= 0 && this . stack [ toActivate ] . released ) {
toActivate -- ;
}
this . stack . splice ( toActivate + 1 ) ;
if ( toActivate >= 0 ) {
this . stack [ toActivate ] . activate ( ) ;
}
} ,
2018-11-23 12:29:20 +00:00
activate : function activate ( tabbingContext ) {
2015-08-17 17:00:26 -07:00
var $set = tabbingContext . $tabbableElements ;
var level = tabbingContext . level ;
2018-11-23 12:29:20 +00:00
var $disabledSet = $ ( ':tabbable' ) . not ( $set ) ;
2015-08-17 17:00:26 -07:00
tabbingContext . $disabledElements = $disabledSet ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
var il = $disabledSet . length ;
for ( var i = 0 ; i < il ; i ++ ) {
this . recordTabindex ( $disabledSet . eq ( i ) , level ) ;
}
2018-11-23 12:29:20 +00:00
$disabledSet . prop ( 'tabindex' , - 1 ) . prop ( 'autofocus' , false ) ;
2015-08-17 17:00:26 -07:00
var $hasFocus = $set . filter ( '[autofocus]' ) . eq ( - 1 ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( $hasFocus . length === 0 ) {
$hasFocus = $set . eq ( 0 ) ;
}
$hasFocus . trigger ( 'focus' ) ;
} ,
2018-11-23 12:29:20 +00:00
deactivate : function deactivate ( tabbingContext ) {
2015-08-17 17:00:26 -07:00
var $set = tabbingContext . $disabledElements ;
var level = tabbingContext . level ;
var il = $set . length ;
for ( var i = 0 ; i < il ; i ++ ) {
this . restoreTabindex ( $set . eq ( i ) , level ) ;
}
} ,
2018-11-23 12:29:20 +00:00
recordTabindex : function recordTabindex ( $el , level ) {
2015-08-17 17:00:26 -07:00
var tabInfo = $el . data ( 'drupalOriginalTabIndices' ) || { } ;
tabInfo [ level ] = {
tabindex : $el [ 0 ] . getAttribute ( 'tabindex' ) ,
autofocus : $el [ 0 ] . hasAttribute ( 'autofocus' )
} ;
$el . data ( 'drupalOriginalTabIndices' , tabInfo ) ;
} ,
2018-11-23 12:29:20 +00:00
restoreTabindex : function restoreTabindex ( $el , level ) {
2015-08-17 17:00:26 -07:00
var tabInfo = $el . data ( 'drupalOriginalTabIndices' ) ;
if ( tabInfo && tabInfo [ level ] ) {
var data = tabInfo [ level ] ;
if ( data . tabindex ) {
$el [ 0 ] . setAttribute ( 'tabindex' , data . tabindex ) ;
2018-11-23 12:29:20 +00:00
} else {
$el [ 0 ] . removeAttribute ( 'tabindex' ) ;
}
2015-08-17 17:00:26 -07:00
if ( data . autofocus ) {
$el [ 0 ] . setAttribute ( 'autofocus' , 'autofocus' ) ;
}
if ( level === 0 ) {
$el . removeData ( 'drupalOriginalTabIndices' ) ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
var levelToDelete = level ;
while ( tabInfo . hasOwnProperty ( levelToDelete ) ) {
delete tabInfo [ levelToDelete ] ;
levelToDelete ++ ;
}
$el . data ( 'drupalOriginalTabIndices' , tabInfo ) ;
}
}
}
} ) ;
2018-11-23 12:29:20 +00:00
$ . extend ( TabbingContext . prototype , {
release : function release ( ) {
2015-08-17 17:00:26 -07:00
if ( ! this . released ) {
this . deactivate ( ) ;
this . released = true ;
Drupal . tabbingManager . release ( this ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$ ( document ) . trigger ( 'drupalTabbingContextReleased' , this ) ;
}
} ,
2018-11-23 12:29:20 +00:00
activate : function activate ( ) {
2015-08-17 17:00:26 -07:00
if ( ! this . active && ! this . released ) {
this . active = true ;
Drupal . tabbingManager . activate ( this ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$ ( document ) . trigger ( 'drupalTabbingContextActivated' , this ) ;
}
} ,
2018-11-23 12:29:20 +00:00
deactivate : function deactivate ( ) {
2015-08-17 17:00:26 -07:00
if ( this . active ) {
this . active = false ;
Drupal . tabbingManager . deactivate ( this ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$ ( document ) . trigger ( 'drupalTabbingContextDeactivated' , this ) ;
}
}
} ) ;
if ( Drupal . tabbingManager ) {
return ;
}
Drupal . tabbingManager = new TabbingManager ( ) ;
2018-11-23 12:29:20 +00:00
} ) ( jQuery , Drupal ) ;