2016-06-23 09:21:57 +00:00
/ * *
2016-11-03 14:52:58 +00:00
* Owl Carousel v2 . 2.0
2016-06-23 09:21:57 +00:00
* Copyright 2013 - 2016 David Deutsch
* Licensed under MIT ( https : //github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
* /
2016-11-03 14:52:58 +00:00
! function ( a , b , c , d ) { function e ( b , c ) { this . settings = null , this . options = a . extend ( { } , e . Defaults , c ) , this . $element = a ( b ) , this . _handlers = { } , this . _plugins = { } , this . _supress = { } , this . _current = null , this . _speed = null , this . _coordinates = [ ] , this . _breakpoint = null , this . _width = null , this . _items = [ ] , this . _clones = [ ] , this . _mergers = [ ] , this . _widths = [ ] , this . _invalidated = { } , this . _pipe = [ ] , this . _drag = { time : null , target : null , pointer : null , stage : { start : null , current : null } , direction : null } , this . _states = { current : { } , tags : { initializing : [ "busy" ] , animating : [ "busy" ] , dragging : [ "interacting" ] } } , a . each ( [ "onResize" , "onThrottledResize" ] , a . proxy ( function ( b , c ) { this . _handlers [ c ] = a . proxy ( this [ c ] , this ) } , this ) ) , a . each ( e . Plugins , a . proxy ( function ( a , b ) { this . _plugins [ a . charAt ( 0 ) . toLowerCase ( ) + a . slice ( 1 ) ] = new b ( this ) } , this ) ) , a . each ( e . Workers , a . proxy ( function ( b , c ) { this . _pipe . push ( { filter : c . filter , run : a . proxy ( c . run , this ) } ) } , this ) ) , this . setup ( ) , this . initialize ( ) } e . Defaults = { items : 3 , loop : ! 1 , center : ! 1 , rewind : ! 1 , mouseDrag : ! 0 , touchDrag : ! 0 , pullDrag : ! 0 , freeDrag : ! 1 , margin : 0 , stagePadding : 0 , merge : ! 1 , mergeFit : ! 0 , autoWidth : ! 1 , startPosition : 0 , rtl : ! 1 , smartSpeed : 250 , fluidSpeed : ! 1 , dragEndSpeed : ! 1 , responsive : { } , responsiveRefreshRate : 200 , responsiveBaseElement : b , fallbackEasing : "swing" , info : ! 1 , nestedItemSelector : ! 1 , itemElement : "div" , stageElement : "div" , refreshClass : "owl-refresh" , loadedClass : "owl-loaded" , loadingClass : "owl-loading" , rtlClass : "owl-rtl" , responsiveClass : "owl-responsive" , dragClass : "owl-drag" , itemClass : "owl-item" , stageClass : "owl-stage" , stageOuterClass : "owl-stage-outer" , grabClass : "owl-grab" } , e . Width = { Default : "default" , Inner : "inner" , Outer : "outer" } , e . Type = { Event : "event" , State : "state" } , e . Plugins = { } , e . Workers = [ { filter : [ "width" , "settings" ] , run : function ( ) { this . _width = this . $element . width ( ) } } , { filter : [ "width" , "items" , "settings" ] , run : function ( a ) { a . current = this . _items && this . _items [ this . relative ( this . _current ) ] } } , { filter : [ "items" , "settings" ] , run : function ( ) { this . $stage . children ( ".cloned" ) . remove ( ) } } , { filter : [ "width" , "items" , "settings" ] , run : function ( a ) { var b = this . settings . margin || "" , c = ! this . settings . autoWidth , d = this . settings . rtl , e = { width : "auto" , "margin-left" : d ? b : "" , "margin-right" : d ? "" : b } ; ! c && this . $stage . children ( ) . css ( e ) , a . css = e } } , { filter : [ "width" , "items" , "settings" ] , run : function ( a ) { var b = ( this . width ( ) / this . settings . items ) . toFixed ( 3 ) - this . settings . margin , c = null , d = this . _items . length , e = ! this . settings . autoWidth , f = [ ] ; for ( a . items = { merge : ! 1 , width : b } ; d -- ; ) c = this . _mergers [ d ] , c = this . settings . mergeFit && Math . min ( c , this . settings . items ) || c , a . items . merge = c > 1 || a . items . merge , f [ d ] = e ? b * c : this . _items [ d ] . width ( ) ; this . _widths = f } } , { filter : [ "items" , "settings" ] , run : function ( ) { var b = [ ] , c = this . _items , d = this . settings , e = Math . max ( 2 * d . items , 4 ) , f = 2 * Math . ceil ( c . length / 2 ) , g = d . loop && c . length ? d . rewind ? e : Math . max ( e , f ) : 0 , h = "" , i = "" ; for ( g /= 2 ; g -- ; ) b . push ( this . normalize ( b . length / 2 , ! 0 ) ) , h += c [ b [ b . length - 1 ] ] [ 0 ] . outerHTML , b . push ( this . normalize ( c . length - 1 - ( b . length - 1 ) / 2 , ! 0 ) ) , i = c [ b [ b . length - 1 ] ] [ 0 ] . outerHTML + i ; this . _clones = b , a ( h ) . addClass ( "cloned" ) . appendTo ( this . $stage ) , a ( i ) . addClass ( "cloned" ) . prependTo ( this . $stage ) } } , { filter : [ "width" , "items" , "settings" ] , run : function ( ) { for ( var a = this . settings . rtl ? 1 : - 1 , b = this . _clones . length + this . _items . length , c = - 1 , d = 0 , e = 0 , f = [ ] ; ++ c < b ; ) d = f [ c - 1 ] || 0 , e = this . _widths [ this . relative ( c ) ] + this . settings . margin , f . push ( d + e * a ) ; this . _coordinates = f } } , { filter : [ "width" , "items" , "settings" ] , run : function ( ) { var a = this . settings . stagePadding , b = this . _coordinates , c = { width : Math . ceil ( Math . abs ( b [ b . length - 1 ] ) ) + 2 * a , "padding-left" : a || "" , "padding-right" : a || "" } ; this . $stage . css ( c ) } } , { filter : [ "width" , "items" , "settings" ] , run : function ( a ) { var b = this . _coordinates . length , c = ! this . settings . autoWidth , d = this . $stage . children ( ) ; if ( c && a . items . merge ) for ( ; b -- ; ) a . css . width = this . _widths [ this . relative ( b ) ] , d . eq ( b ) . css ( a . css ) ; else c && ( a . css . width = a . items . width , d . css ( a . css ) ) } } , { filter : [ "items" ] , run : function ( ) { this . _coordinates . length < 1 && this . $stage . removeAttr ( "style" ) } } , { filter : [ "width" , "items" , "settings" ] , run : function ( a ) { a . current = a . current ? this . $stage . children ( ) . index ( a . current ) : 0 , a . current = Math . max ( this . minimum ( ) , Math . min ( this . maximum ( ) , a . current ) ) , this . reset ( a . current ) } } , { fil
} , a . fn . owlCarousel . Constructor . Plugins . Animate = e } ( window . Zepto || window . jQuery , window , document ) , function ( a , b , c , d ) { var e = function ( b ) { this . _core = b , this . _timeout = null , this . _paused = ! 1 , this . _handlers = { "changed.owl.carousel" : a . proxy ( function ( a ) { a . namespace && "settings" === a . property . name ? this . _core . settings . autoplay ? this . play ( ) : this . stop ( ) : a . namespace && "position" === a . property . name && this . _core . settings . autoplay && this . _setAutoPlayInterval ( ) } , this ) , "initialized.owl.carousel" : a . proxy ( function ( a ) { a . namespace && this . _core . settings . autoplay && this . play ( ) } , this ) , "play.owl.autoplay" : a . proxy ( function ( a , b , c ) { a . namespace && this . play ( b , c ) } , this ) , "stop.owl.autoplay" : a . proxy ( function ( a ) { a . namespace && this . stop ( ) } , this ) , "mouseover.owl.autoplay" : a . proxy ( function ( ) { this . _core . settings . autoplayHoverPause && this . _core . is ( "rotating" ) && this . pause ( ) } , this ) , "mouseleave.owl.autoplay" : a . proxy ( function ( ) { this . _core . settings . autoplayHoverPause && this . _core . is ( "rotating" ) && this . play ( ) } , this ) , "touchstart.owl.core" : a . proxy ( function ( ) { this . _core . settings . autoplayHoverPause && this . _core . is ( "rotating" ) && this . pause ( ) } , this ) , "touchend.owl.core" : a . proxy ( function ( ) { this . _core . settings . autoplayHoverPause && this . play ( ) } , this ) } , this . _core . $element . on ( this . _handlers ) , this . _core . options = a . extend ( { } , e . Defaults , this . _core . options ) } ; e . Defaults = { autoplay : ! 1 , autoplayTimeout : 5e3 , autoplayHoverPause : ! 1 , autoplaySpeed : ! 1 } , e . prototype . play = function ( a , b ) { this . _paused = ! 1 , this . _core . is ( "rotating" ) || ( this . _core . enter ( "rotating" ) , this . _setAutoPlayInterval ( ) ) } , e . prototype . _getNextTimeout = function ( d , e ) { return this . _timeout && b . clearTimeout ( this . _timeout ) , b . setTimeout ( a . proxy ( function ( ) { this . _paused || this . _core . is ( "busy" ) || this . _core . is ( "interacting" ) || c . hidden || this . _core . next ( e || this . _core . settings . autoplaySpeed ) } , this ) , d || this . _core . settings . autoplayTimeout ) } , e . prototype . _setAutoPlayInterval = function ( ) { this . _timeout = this . _getNextTimeout ( ) } , e . prototype . stop = function ( ) { this . _core . is ( "rotating" ) && ( b . clearTimeout ( this . _timeout ) , this . _core . leave ( "rotating" ) ) } , e . prototype . pause = function ( ) { this . _core . is ( "rotating" ) && ( this . _paused = ! 0 ) } , e . prototype . destroy = function ( ) { var a , b ; this . stop ( ) ; for ( a in this . _handlers ) this . _core . $element . off ( a , this . _handlers [ a ] ) ; for ( b in Object . getOwnPropertyNames ( this ) ) "function" != typeof this [ b ] && ( this [ b ] = null ) } , a . fn . owlCarousel . Constructor . Plugins . autoplay = e } ( window . Zepto || window . jQuery , window , document ) , function ( a , b , c , d ) { "use strict" ; var e = function ( b ) { this . _core = b , this . _initialized = ! 1 , this . _pages = [ ] , this . _controls = { } , this . _templates = [ ] , this . $element = this . _core . $element , this . _overrides = { next : this . _core . next , prev : this . _core . prev , to : this . _core . to } , this . _handlers = { "prepared.owl.carousel" : a . proxy ( function ( b ) { b . namespace && this . _core . settings . dotsData && this . _templates . push ( '<div class="' + this . _core . settings . dotClass + '">' + a ( b . content ) . find ( "[data-dot]" ) . addBack ( "[data-dot]" ) . attr ( "data-dot" ) + "</div>" ) } , this ) , "added.owl.carousel" : a . proxy ( function ( a ) { a . namespace && this . _core . settings . dotsData && this . _templates . splice ( a . position , 0 , this . _templates . pop ( ) ) } , this ) , "remove.owl.carousel" : a . proxy ( function ( a ) { a . namespace && this . _core . settings . dotsData && this . _templates . splice ( a . position , 1 ) } , this ) , "changed.owl.carousel" : a . proxy ( function ( a ) { a . namespace && "position" == a . property . name && this . draw ( ) } , this ) , "initialized.owl.carousel" : a . proxy ( function ( a ) { a . namespace && ! this . _initialized && ( this . _core . trigger ( "initialize" , null , "navigation" ) , this . initialize ( ) , this . update ( ) , this . draw ( ) , this . _initialized = ! 0 , this . _core . trigger ( "initialized" , null , "navigation" ) ) } , this ) , "refreshed.owl.carousel" : a . proxy ( function ( a ) { a . namespace && this . _initialized && ( this . _core . trigger ( "refresh" , null , "navigation" ) , this . update ( ) , this . draw ( ) , this . _core . trigger ( "refreshed" , null , "navigation" ) ) } , this ) } , this . _core . options = a . extend ( { } , e . Defaults , this . _core . options ) , this . $element . on ( this . _handlers ) } ; e . Defaults = { nav : ! 1 , navText : [ "prev" , "next" ] , navSpeed : ! 1 , navElement : "div" , navContainer : ! 1 , navContainerClass : "owl-nav" , navClass : [ "owl-prev" , "owl-next" ] , slideBy : 1 , dotClass : "owl-dot" , dotsClass : "owl-dots" , dots : ! 0 , dotsEach : ! 1 , dotsData : ! 1 , dotsSpeed : ! 1 , dotsCont
2016-12-29 08:41:30 +00:00
/*! tether 1.4.0 */
2016-06-23 09:21:57 +00:00
( function ( root , factory ) {
if ( typeof define === 'function' && define . amd ) {
define ( factory ) ;
} else if ( typeof exports === 'object' ) {
module . exports = factory ( require , exports , module ) ;
} else {
root . Tether = factory ( ) ;
}
} ( this , function ( require , exports , module ) {
'use strict' ;
var _createClass = ( function ( ) { function defineProperties ( target , props ) { for ( var i = 0 ; i < props . length ; i ++ ) { var descriptor = props [ i ] ; descriptor . enumerable = descriptor . enumerable || false ; descriptor . configurable = true ; if ( 'value' in descriptor ) descriptor . writable = true ; Object . defineProperty ( target , descriptor . key , descriptor ) ; } } return function ( Constructor , protoProps , staticProps ) { if ( protoProps ) defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) defineProperties ( Constructor , staticProps ) ; return Constructor ; } ; } ) ( ) ;
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( 'Cannot call a class as a function' ) ; } }
var TetherBase = undefined ;
if ( typeof TetherBase === 'undefined' ) {
TetherBase = { modules : [ ] } ;
}
var zeroElement = null ;
2016-08-01 06:37:05 +00:00
// Same as native getBoundingClientRect, except it takes into account parent <frame> offsets
// if the element lies within a nested document (<frame> or <iframe>-like).
function getActualBoundingClientRect ( node ) {
var boundingRect = node . getBoundingClientRect ( ) ;
// The original object returned by getBoundingClientRect is immutable, so we clone it
// We can't use extend because the properties are not considered part of the object by hasOwnProperty in IE9
var rect = { } ;
for ( var k in boundingRect ) {
rect [ k ] = boundingRect [ k ] ;
}
if ( node . ownerDocument !== document ) {
var _frameElement = node . ownerDocument . defaultView . frameElement ;
if ( _frameElement ) {
var frameRect = getActualBoundingClientRect ( _frameElement ) ;
rect . top += frameRect . top ;
rect . bottom += frameRect . top ;
rect . left += frameRect . left ;
rect . right += frameRect . left ;
}
}
return rect ;
}
2016-06-23 09:21:57 +00:00
function getScrollParents ( el ) {
// In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;
// https://bugzilla.mozilla.org/show_bug.cgi?id=548397
var computedStyle = getComputedStyle ( el ) || { } ;
var position = computedStyle . position ;
var parents = [ ] ;
if ( position === 'fixed' ) {
return [ el ] ;
}
var parent = el ;
while ( ( parent = parent . parentNode ) && parent && parent . nodeType === 1 ) {
var style = undefined ;
try {
style = getComputedStyle ( parent ) ;
} catch ( err ) { }
if ( typeof style === 'undefined' || style === null ) {
parents . push ( parent ) ;
return parents ;
}
var _style = style ;
var overflow = _style . overflow ;
var overflowX = _style . overflowX ;
var overflowY = _style . overflowY ;
if ( /(auto|scroll)/ . test ( overflow + overflowY + overflowX ) ) {
if ( position !== 'absolute' || [ 'relative' , 'absolute' , 'fixed' ] . indexOf ( style . position ) >= 0 ) {
parents . push ( parent ) ;
}
}
}
2016-08-01 06:37:05 +00:00
parents . push ( el . ownerDocument . body ) ;
// If the node is within a frame, account for the parent window scroll
if ( el . ownerDocument !== document ) {
parents . push ( el . ownerDocument . defaultView ) ;
}
2016-06-23 09:21:57 +00:00
return parents ;
}
var uniqueId = ( function ( ) {
var id = 0 ;
return function ( ) {
return ++ id ;
} ;
} ) ( ) ;
var zeroPosCache = { } ;
var getOrigin = function getOrigin ( ) {
// getBoundingClientRect is unfortunately too accurate. It introduces a pixel or two of
// jitter as the user scrolls that messes with our ability to detect if two positions
// are equivilant or not. We place an element at the top left of the page that will
// get the same jitter, so we can cancel the two out.
var node = zeroElement ;
2016-12-29 08:41:30 +00:00
if ( ! node || ! document . body . contains ( node ) ) {
2016-06-23 09:21:57 +00:00
node = document . createElement ( 'div' ) ;
node . setAttribute ( 'data-tether-id' , uniqueId ( ) ) ;
extend ( node . style , {
top : 0 ,
left : 0 ,
position : 'absolute'
} ) ;
document . body . appendChild ( node ) ;
zeroElement = node ;
}
var id = node . getAttribute ( 'data-tether-id' ) ;
if ( typeof zeroPosCache [ id ] === 'undefined' ) {
2016-08-01 06:37:05 +00:00
zeroPosCache [ id ] = getActualBoundingClientRect ( node ) ;
2016-06-23 09:21:57 +00:00
// Clear the cache when this position call is done
defer ( function ( ) {
delete zeroPosCache [ id ] ;
} ) ;
}
return zeroPosCache [ id ] ;
} ;
function removeUtilElements ( ) {
if ( zeroElement ) {
document . body . removeChild ( zeroElement ) ;
}
zeroElement = null ;
} ;
function getBounds ( el ) {
var doc = undefined ;
if ( el === document ) {
doc = document ;
el = document . documentElement ;
} else {
doc = el . ownerDocument ;
}
var docEl = doc . documentElement ;
2016-08-01 06:37:05 +00:00
var box = getActualBoundingClientRect ( el ) ;
2016-06-23 09:21:57 +00:00
var origin = getOrigin ( ) ;
box . top -= origin . top ;
box . left -= origin . left ;
if ( typeof box . width === 'undefined' ) {
box . width = document . body . scrollWidth - box . left - box . right ;
}
if ( typeof box . height === 'undefined' ) {
box . height = document . body . scrollHeight - box . top - box . bottom ;
}
box . top = box . top - docEl . clientTop ;
box . left = box . left - docEl . clientLeft ;
box . right = doc . body . clientWidth - box . width - box . left ;
box . bottom = doc . body . clientHeight - box . height - box . top ;
return box ;
}
function getOffsetParent ( el ) {
return el . offsetParent || document . documentElement ;
}
2016-09-13 13:58:35 +00:00
var _scrollBarSize = null ;
2016-06-23 09:21:57 +00:00
function getScrollBarSize ( ) {
2016-09-13 13:58:35 +00:00
if ( _scrollBarSize ) {
return _scrollBarSize ;
}
2016-06-23 09:21:57 +00:00
var inner = document . createElement ( 'div' ) ;
inner . style . width = '100%' ;
inner . style . height = '200px' ;
var outer = document . createElement ( 'div' ) ;
extend ( outer . style , {
position : 'absolute' ,
top : 0 ,
left : 0 ,
pointerEvents : 'none' ,
visibility : 'hidden' ,
width : '200px' ,
height : '150px' ,
overflow : 'hidden'
} ) ;
outer . appendChild ( inner ) ;
document . body . appendChild ( outer ) ;
var widthContained = inner . offsetWidth ;
outer . style . overflow = 'scroll' ;
var widthScroll = inner . offsetWidth ;
if ( widthContained === widthScroll ) {
widthScroll = outer . clientWidth ;
}
document . body . removeChild ( outer ) ;
var width = widthContained - widthScroll ;
2016-09-13 13:58:35 +00:00
_scrollBarSize = { width : width , height : width } ;
return _scrollBarSize ;
2016-06-23 09:21:57 +00:00
}
function extend ( ) {
var out = arguments . length <= 0 || arguments [ 0 ] === undefined ? { } : arguments [ 0 ] ;
var args = [ ] ;
Array . prototype . push . apply ( args , arguments ) ;
args . slice ( 1 ) . forEach ( function ( obj ) {
if ( obj ) {
for ( var key in obj ) {
if ( ( { } ) . hasOwnProperty . call ( obj , key ) ) {
out [ key ] = obj [ key ] ;
}
}
}
} ) ;
return out ;
}
function removeClass ( el , name ) {
if ( typeof el . classList !== 'undefined' ) {
name . split ( ' ' ) . forEach ( function ( cls ) {
if ( cls . trim ( ) ) {
el . classList . remove ( cls ) ;
}
} ) ;
} else {
var regex = new RegExp ( '(^| )' + name . split ( ' ' ) . join ( '|' ) + '( |$)' , 'gi' ) ;
var className = getClassName ( el ) . replace ( regex , ' ' ) ;
setClassName ( el , className ) ;
}
}
function addClass ( el , name ) {
if ( typeof el . classList !== 'undefined' ) {
name . split ( ' ' ) . forEach ( function ( cls ) {
if ( cls . trim ( ) ) {
el . classList . add ( cls ) ;
}
} ) ;
} else {
removeClass ( el , name ) ;
var cls = getClassName ( el ) + ( ' ' + name ) ;
setClassName ( el , cls ) ;
}
}
function hasClass ( el , name ) {
if ( typeof el . classList !== 'undefined' ) {
return el . classList . contains ( name ) ;
}
var className = getClassName ( el ) ;
return new RegExp ( '(^| )' + name + '( |$)' , 'gi' ) . test ( className ) ;
}
function getClassName ( el ) {
2016-08-01 06:37:05 +00:00
// Can't use just SVGAnimatedString here since nodes within a Frame in IE have
// completely separately SVGAnimatedString base classes
if ( el . className instanceof el . ownerDocument . defaultView . SVGAnimatedString ) {
2016-06-23 09:21:57 +00:00
return el . className . baseVal ;
}
return el . className ;
}
function setClassName ( el , className ) {
el . setAttribute ( 'class' , className ) ;
}
function updateClasses ( el , add , all ) {
// Of the set of 'all' classes, we need the 'add' classes, and only the
// 'add' classes to be set.
all . forEach ( function ( cls ) {
if ( add . indexOf ( cls ) === - 1 && hasClass ( el , cls ) ) {
removeClass ( el , cls ) ;
}
} ) ;
add . forEach ( function ( cls ) {
if ( ! hasClass ( el , cls ) ) {
addClass ( el , cls ) ;
}
} ) ;
}
var deferred = [ ] ;
var defer = function defer ( fn ) {
deferred . push ( fn ) ;
} ;
var flush = function flush ( ) {
var fn = undefined ;
while ( fn = deferred . pop ( ) ) {
fn ( ) ;
}
} ;
var Evented = ( function ( ) {
function Evented ( ) {
_classCallCheck ( this , Evented ) ;
}
_createClass ( Evented , [ {
key : 'on' ,
value : function on ( event , handler , ctx ) {
var once = arguments . length <= 3 || arguments [ 3 ] === undefined ? false : arguments [ 3 ] ;
if ( typeof this . bindings === 'undefined' ) {
this . bindings = { } ;
}
if ( typeof this . bindings [ event ] === 'undefined' ) {
this . bindings [ event ] = [ ] ;
}
this . bindings [ event ] . push ( { handler : handler , ctx : ctx , once : once } ) ;
}
} , {
key : 'once' ,
value : function once ( event , handler , ctx ) {
this . on ( event , handler , ctx , true ) ;
}
} , {
key : 'off' ,
value : function off ( event , handler ) {
2016-08-01 06:37:05 +00:00
if ( typeof this . bindings === 'undefined' || typeof this . bindings [ event ] === 'undefined' ) {
2016-06-23 09:21:57 +00:00
return ;
}
if ( typeof handler === 'undefined' ) {
delete this . bindings [ event ] ;
} else {
var i = 0 ;
while ( i < this . bindings [ event ] . length ) {
if ( this . bindings [ event ] [ i ] . handler === handler ) {
this . bindings [ event ] . splice ( i , 1 ) ;
} else {
++ i ;
}
}
}
}
} , {
key : 'trigger' ,
value : function trigger ( event ) {
if ( typeof this . bindings !== 'undefined' && this . bindings [ event ] ) {
var i = 0 ;
for ( var _len = arguments . length , args = Array ( _len > 1 ? _len - 1 : 0 ) , _key = 1 ; _key < _len ; _key ++ ) {
args [ _key - 1 ] = arguments [ _key ] ;
}
while ( i < this . bindings [ event ] . length ) {
var _bindings$event$i = this . bindings [ event ] [ i ] ;
var handler = _bindings$event$i . handler ;
var ctx = _bindings$event$i . ctx ;
var once = _bindings$event$i . once ;
var context = ctx ;
if ( typeof context === 'undefined' ) {
context = this ;
}
handler . apply ( context , args ) ;
if ( once ) {
this . bindings [ event ] . splice ( i , 1 ) ;
} else {
++ i ;
}
}
}
}
} ] ) ;
return Evented ;
} ) ( ) ;
TetherBase . Utils = {
2016-08-01 06:37:05 +00:00
getActualBoundingClientRect : getActualBoundingClientRect ,
2016-06-23 09:21:57 +00:00
getScrollParents : getScrollParents ,
getBounds : getBounds ,
getOffsetParent : getOffsetParent ,
extend : extend ,
addClass : addClass ,
removeClass : removeClass ,
hasClass : hasClass ,
updateClasses : updateClasses ,
defer : defer ,
flush : flush ,
uniqueId : uniqueId ,
Evented : Evented ,
getScrollBarSize : getScrollBarSize ,
removeUtilElements : removeUtilElements
} ;
/* globals TetherBase, performance */
'use strict' ;
var _slicedToArray = ( function ( ) { function sliceIterator ( arr , i ) { var _arr = [ ] ; var _n = true ; var _d = false ; var _e = undefined ; try { for ( var _i = arr [ Symbol . iterator ] ( ) , _s ; ! ( _n = ( _s = _i . next ( ) ) . done ) ; _n = true ) { _arr . push ( _s . value ) ; if ( i && _arr . length === i ) break ; } } catch ( err ) { _d = true ; _e = err ; } finally { try { if ( ! _n && _i [ 'return' ] ) _i [ 'return' ] ( ) ; } finally { if ( _d ) throw _e ; } } return _arr ; } return function ( arr , i ) { if ( Array . isArray ( arr ) ) { return arr ; } else if ( Symbol . iterator in Object ( arr ) ) { return sliceIterator ( arr , i ) ; } else { throw new TypeError ( 'Invalid attempt to destructure non-iterable instance' ) ; } } ; } ) ( ) ;
var _createClass = ( function ( ) { function defineProperties ( target , props ) { for ( var i = 0 ; i < props . length ; i ++ ) { var descriptor = props [ i ] ; descriptor . enumerable = descriptor . enumerable || false ; descriptor . configurable = true ; if ( 'value' in descriptor ) descriptor . writable = true ; Object . defineProperty ( target , descriptor . key , descriptor ) ; } } return function ( Constructor , protoProps , staticProps ) { if ( protoProps ) defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) defineProperties ( Constructor , staticProps ) ; return Constructor ; } ; } ) ( ) ;
var _get = function get ( _x6 , _x7 , _x8 ) { var _again = true ; _function : while ( _again ) { var object = _x6 , property = _x7 , receiver = _x8 ; _again = false ; if ( object === null ) object = Function . prototype ; var desc = Object . getOwnPropertyDescriptor ( object , property ) ; if ( desc === undefined ) { var parent = Object . getPrototypeOf ( object ) ; if ( parent === null ) { return undefined ; } else { _x6 = parent ; _x7 = property ; _x8 = receiver ; _again = true ; desc = parent = undefined ; continue _function ; } } else if ( 'value' in desc ) { return desc . value ; } else { var getter = desc . get ; if ( getter === undefined ) { return undefined ; } return getter . call ( receiver ) ; } } } ;
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( 'Cannot call a class as a function' ) ; } }
function _inherits ( subClass , superClass ) { if ( typeof superClass !== 'function' && superClass !== null ) { throw new TypeError ( 'Super expression must either be null or a function, not ' + typeof superClass ) ; } subClass . prototype = Object . create ( superClass && superClass . prototype , { constructor : { value : subClass , enumerable : false , writable : true , configurable : true } } ) ; if ( superClass ) Object . setPrototypeOf ? Object . setPrototypeOf ( subClass , superClass ) : subClass . _ _proto _ _ = superClass ; }
if ( typeof TetherBase === 'undefined' ) {
throw new Error ( 'You must include the utils.js file before tether.js' ) ;
}
var _TetherBase$Utils = TetherBase . Utils ;
var getScrollParents = _TetherBase$Utils . getScrollParents ;
var getBounds = _TetherBase$Utils . getBounds ;
var getOffsetParent = _TetherBase$Utils . getOffsetParent ;
var extend = _TetherBase$Utils . extend ;
var addClass = _TetherBase$Utils . addClass ;
var removeClass = _TetherBase$Utils . removeClass ;
var updateClasses = _TetherBase$Utils . updateClasses ;
var defer = _TetherBase$Utils . defer ;
var flush = _TetherBase$Utils . flush ;
var getScrollBarSize = _TetherBase$Utils . getScrollBarSize ;
var removeUtilElements = _TetherBase$Utils . removeUtilElements ;
function within ( a , b ) {
var diff = arguments . length <= 2 || arguments [ 2 ] === undefined ? 1 : arguments [ 2 ] ;
return a + diff >= b && b >= a - diff ;
}
var transformKey = ( function ( ) {
if ( typeof document === 'undefined' ) {
return '' ;
}
var el = document . createElement ( 'div' ) ;
2016-08-01 06:37:05 +00:00
var transforms = [ 'transform' , 'WebkitTransform' , 'OTransform' , 'MozTransform' , 'msTransform' ] ;
2016-06-23 09:21:57 +00:00
for ( var i = 0 ; i < transforms . length ; ++ i ) {
var key = transforms [ i ] ;
if ( el . style [ key ] !== undefined ) {
return key ;
}
}
} ) ( ) ;
var tethers = [ ] ;
var position = function position ( ) {
tethers . forEach ( function ( tether ) {
tether . position ( false ) ;
} ) ;
flush ( ) ;
} ;
function now ( ) {
if ( typeof performance !== 'undefined' && typeof performance . now !== 'undefined' ) {
return performance . now ( ) ;
}
return + new Date ( ) ;
}
( function ( ) {
var lastCall = null ;
var lastDuration = null ;
var pendingTimeout = null ;
var tick = function tick ( ) {
if ( typeof lastDuration !== 'undefined' && lastDuration > 16 ) {
// We voluntarily throttle ourselves if we can't manage 60fps
lastDuration = Math . min ( lastDuration - 16 , 250 ) ;
// Just in case this is the last event, remember to position just once more
pendingTimeout = setTimeout ( tick , 250 ) ;
return ;
}
if ( typeof lastCall !== 'undefined' && now ( ) - lastCall < 10 ) {
// Some browsers call events a little too frequently, refuse to run more than is reasonable
return ;
}
if ( pendingTimeout != null ) {
clearTimeout ( pendingTimeout ) ;
pendingTimeout = null ;
}
lastCall = now ( ) ;
position ( ) ;
lastDuration = now ( ) - lastCall ;
} ;
if ( typeof window !== 'undefined' && typeof window . addEventListener !== 'undefined' ) {
[ 'resize' , 'scroll' , 'touchmove' ] . forEach ( function ( event ) {
window . addEventListener ( event , tick ) ;
} ) ;
}
} ) ( ) ;
var MIRROR _LR = {
center : 'center' ,
left : 'right' ,
right : 'left'
} ;
var MIRROR _TB = {
middle : 'middle' ,
top : 'bottom' ,
bottom : 'top'
} ;
var OFFSET _MAP = {
top : 0 ,
left : 0 ,
middle : '50%' ,
center : '50%' ,
bottom : '100%' ,
right : '100%'
} ;
var autoToFixedAttachment = function autoToFixedAttachment ( attachment , relativeToAttachment ) {
var left = attachment . left ;
var top = attachment . top ;
if ( left === 'auto' ) {
left = MIRROR _LR [ relativeToAttachment . left ] ;
}
if ( top === 'auto' ) {
top = MIRROR _TB [ relativeToAttachment . top ] ;
}
return { left : left , top : top } ;
} ;
var attachmentToOffset = function attachmentToOffset ( attachment ) {
var left = attachment . left ;
var top = attachment . top ;
if ( typeof OFFSET _MAP [ attachment . left ] !== 'undefined' ) {
left = OFFSET _MAP [ attachment . left ] ;
}
if ( typeof OFFSET _MAP [ attachment . top ] !== 'undefined' ) {
top = OFFSET _MAP [ attachment . top ] ;
}
return { left : left , top : top } ;
} ;
function addOffset ( ) {
var out = { top : 0 , left : 0 } ;
for ( var _len = arguments . length , offsets = Array ( _len ) , _key = 0 ; _key < _len ; _key ++ ) {
offsets [ _key ] = arguments [ _key ] ;
}
offsets . forEach ( function ( _ref ) {
var top = _ref . top ;
var left = _ref . left ;
if ( typeof top === 'string' ) {
top = parseFloat ( top , 10 ) ;
}
if ( typeof left === 'string' ) {
left = parseFloat ( left , 10 ) ;
}
out . top += top ;
out . left += left ;
} ) ;
return out ;
}
function offsetToPx ( offset , size ) {
if ( typeof offset . left === 'string' && offset . left . indexOf ( '%' ) !== - 1 ) {
offset . left = parseFloat ( offset . left , 10 ) / 100 * size . width ;
}
if ( typeof offset . top === 'string' && offset . top . indexOf ( '%' ) !== - 1 ) {
offset . top = parseFloat ( offset . top , 10 ) / 100 * size . height ;
}
return offset ;
}
var parseOffset = function parseOffset ( value ) {
var _value$split = value . split ( ' ' ) ;
var _value$split2 = _slicedToArray ( _value$split , 2 ) ;
var top = _value$split2 [ 0 ] ;
var left = _value$split2 [ 1 ] ;
return { top : top , left : left } ;
} ;
var parseAttachment = parseOffset ;
var TetherClass = ( function ( _Evented ) {
_inherits ( TetherClass , _Evented ) ;
function TetherClass ( options ) {
var _this = this ;
_classCallCheck ( this , TetherClass ) ;
_get ( Object . getPrototypeOf ( TetherClass . prototype ) , 'constructor' , this ) . call ( this ) ;
this . position = this . position . bind ( this ) ;
tethers . push ( this ) ;
this . history = [ ] ;
this . setOptions ( options , false ) ;
TetherBase . modules . forEach ( function ( module ) {
if ( typeof module . initialize !== 'undefined' ) {
module . initialize . call ( _this ) ;
}
} ) ;
this . position ( ) ;
}
_createClass ( TetherClass , [ {
key : 'getClass' ,
value : function getClass ( ) {
var key = arguments . length <= 0 || arguments [ 0 ] === undefined ? '' : arguments [ 0 ] ;
var classes = this . options . classes ;
if ( typeof classes !== 'undefined' && classes [ key ] ) {
return this . options . classes [ key ] ;
} else if ( this . options . classPrefix ) {
return this . options . classPrefix + '-' + key ;
} else {
return key ;
}
}
} , {
key : 'setOptions' ,
value : function setOptions ( options ) {
var _this2 = this ;
var pos = arguments . length <= 1 || arguments [ 1 ] === undefined ? true : arguments [ 1 ] ;
var defaults = {
offset : '0 0' ,
targetOffset : '0 0' ,
targetAttachment : 'auto auto' ,
classPrefix : 'tether'
} ;
this . options = extend ( defaults , options ) ;
var _options = this . options ;
var element = _options . element ;
var target = _options . target ;
var targetModifier = _options . targetModifier ;
this . element = element ;
this . target = target ;
this . targetModifier = targetModifier ;
if ( this . target === 'viewport' ) {
this . target = document . body ;
this . targetModifier = 'visible' ;
} else if ( this . target === 'scroll-handle' ) {
this . target = document . body ;
this . targetModifier = 'scroll-handle' ;
}
[ 'element' , 'target' ] . forEach ( function ( key ) {
if ( typeof _this2 [ key ] === 'undefined' ) {
throw new Error ( 'Tether Error: Both element and target must be defined' ) ;
}
if ( typeof _this2 [ key ] . jquery !== 'undefined' ) {
_this2 [ key ] = _this2 [ key ] [ 0 ] ;
} else if ( typeof _this2 [ key ] === 'string' ) {
_this2 [ key ] = document . querySelector ( _this2 [ key ] ) ;
}
} ) ;
addClass ( this . element , this . getClass ( 'element' ) ) ;
if ( ! ( this . options . addTargetClasses === false ) ) {
addClass ( this . target , this . getClass ( 'target' ) ) ;
}
if ( ! this . options . attachment ) {
throw new Error ( 'Tether Error: You must provide an attachment' ) ;
}
this . targetAttachment = parseAttachment ( this . options . targetAttachment ) ;
this . attachment = parseAttachment ( this . options . attachment ) ;
this . offset = parseOffset ( this . options . offset ) ;
this . targetOffset = parseOffset ( this . options . targetOffset ) ;
if ( typeof this . scrollParents !== 'undefined' ) {
this . disable ( ) ;
}
if ( this . targetModifier === 'scroll-handle' ) {
this . scrollParents = [ this . target ] ;
} else {
this . scrollParents = getScrollParents ( this . target ) ;
}
if ( ! ( this . options . enabled === false ) ) {
this . enable ( pos ) ;
}
}
} , {
key : 'getTargetBounds' ,
value : function getTargetBounds ( ) {
if ( typeof this . targetModifier !== 'undefined' ) {
if ( this . targetModifier === 'visible' ) {
if ( this . target === document . body ) {
return { top : pageYOffset , left : pageXOffset , height : innerHeight , width : innerWidth } ;
} else {
var bounds = getBounds ( this . target ) ;
var out = {
height : bounds . height ,
width : bounds . width ,
top : bounds . top ,
left : bounds . left
} ;
out . height = Math . min ( out . height , bounds . height - ( pageYOffset - bounds . top ) ) ;
out . height = Math . min ( out . height , bounds . height - ( bounds . top + bounds . height - ( pageYOffset + innerHeight ) ) ) ;
out . height = Math . min ( innerHeight , out . height ) ;
out . height -= 2 ;
out . width = Math . min ( out . width , bounds . width - ( pageXOffset - bounds . left ) ) ;
out . width = Math . min ( out . width , bounds . width - ( bounds . left + bounds . width - ( pageXOffset + innerWidth ) ) ) ;
out . width = Math . min ( innerWidth , out . width ) ;
out . width -= 2 ;
if ( out . top < pageYOffset ) {
out . top = pageYOffset ;
}
if ( out . left < pageXOffset ) {
out . left = pageXOffset ;
}
return out ;
}
} else if ( this . targetModifier === 'scroll-handle' ) {
var bounds = undefined ;
var target = this . target ;
if ( target === document . body ) {
target = document . documentElement ;
bounds = {
left : pageXOffset ,
top : pageYOffset ,
height : innerHeight ,
width : innerWidth
} ;
} else {
bounds = getBounds ( target ) ;
}
var style = getComputedStyle ( target ) ;
var hasBottomScroll = target . scrollWidth > target . clientWidth || [ style . overflow , style . overflowX ] . indexOf ( 'scroll' ) >= 0 || this . target !== document . body ;
var scrollBottom = 0 ;
if ( hasBottomScroll ) {
scrollBottom = 15 ;
}
var height = bounds . height - parseFloat ( style . borderTopWidth ) - parseFloat ( style . borderBottomWidth ) - scrollBottom ;
var out = {
width : 15 ,
height : height * 0.975 * ( height / target . scrollHeight ) ,
left : bounds . left + bounds . width - parseFloat ( style . borderLeftWidth ) - 15
} ;
var fitAdj = 0 ;
if ( height < 408 && this . target === document . body ) {
fitAdj = - 0.00011 * Math . pow ( height , 2 ) - 0.00727 * height + 22.58 ;
}
if ( this . target !== document . body ) {
out . height = Math . max ( out . height , 24 ) ;
}
var scrollPercentage = this . target . scrollTop / ( target . scrollHeight - height ) ;
out . top = scrollPercentage * ( height - out . height - fitAdj ) + bounds . top + parseFloat ( style . borderTopWidth ) ;
if ( this . target === document . body ) {
out . height = Math . max ( out . height , 24 ) ;
}
return out ;
}
} else {
return getBounds ( this . target ) ;
}
}
} , {
key : 'clearCache' ,
value : function clearCache ( ) {
this . _cache = { } ;
}
} , {
key : 'cache' ,
value : function cache ( k , getter ) {
// More than one module will often need the same DOM info, so
// we keep a cache which is cleared on each position call
if ( typeof this . _cache === 'undefined' ) {
this . _cache = { } ;
}
if ( typeof this . _cache [ k ] === 'undefined' ) {
this . _cache [ k ] = getter . call ( this ) ;
}
return this . _cache [ k ] ;
}
} , {
key : 'enable' ,
value : function enable ( ) {
var _this3 = this ;
var pos = arguments . length <= 0 || arguments [ 0 ] === undefined ? true : arguments [ 0 ] ;
if ( ! ( this . options . addTargetClasses === false ) ) {
addClass ( this . target , this . getClass ( 'enabled' ) ) ;
}
addClass ( this . element , this . getClass ( 'enabled' ) ) ;
this . enabled = true ;
this . scrollParents . forEach ( function ( parent ) {
2016-08-01 06:37:05 +00:00
if ( parent !== _this3 . target . ownerDocument ) {
2016-06-23 09:21:57 +00:00
parent . addEventListener ( 'scroll' , _this3 . position ) ;
}
} ) ;
if ( pos ) {
this . position ( ) ;
}
}
} , {
key : 'disable' ,
value : function disable ( ) {
var _this4 = this ;
removeClass ( this . target , this . getClass ( 'enabled' ) ) ;
removeClass ( this . element , this . getClass ( 'enabled' ) ) ;
this . enabled = false ;
if ( typeof this . scrollParents !== 'undefined' ) {
this . scrollParents . forEach ( function ( parent ) {
parent . removeEventListener ( 'scroll' , _this4 . position ) ;
} ) ;
}
}
} , {
key : 'destroy' ,
value : function destroy ( ) {
var _this5 = this ;
this . disable ( ) ;
tethers . forEach ( function ( tether , i ) {
if ( tether === _this5 ) {
tethers . splice ( i , 1 ) ;
}
} ) ;
// Remove any elements we were using for convenience from the DOM
if ( tethers . length === 0 ) {
removeUtilElements ( ) ;
}
}
} , {
key : 'updateAttachClasses' ,
value : function updateAttachClasses ( elementAttach , targetAttach ) {
var _this6 = this ;
elementAttach = elementAttach || this . attachment ;
targetAttach = targetAttach || this . targetAttachment ;
var sides = [ 'left' , 'top' , 'bottom' , 'right' , 'middle' , 'center' ] ;
if ( typeof this . _addAttachClasses !== 'undefined' && this . _addAttachClasses . length ) {
// updateAttachClasses can be called more than once in a position call, so
// we need to clean up after ourselves such that when the last defer gets
// ran it doesn't add any extra classes from previous calls.
this . _addAttachClasses . splice ( 0 , this . _addAttachClasses . length ) ;
}
if ( typeof this . _addAttachClasses === 'undefined' ) {
this . _addAttachClasses = [ ] ;
}
var add = this . _addAttachClasses ;
if ( elementAttach . top ) {
add . push ( this . getClass ( 'element-attached' ) + '-' + elementAttach . top ) ;
}
if ( elementAttach . left ) {
add . push ( this . getClass ( 'element-attached' ) + '-' + elementAttach . left ) ;
}
if ( targetAttach . top ) {
add . push ( this . getClass ( 'target-attached' ) + '-' + targetAttach . top ) ;
}
if ( targetAttach . left ) {
add . push ( this . getClass ( 'target-attached' ) + '-' + targetAttach . left ) ;
}
var all = [ ] ;
sides . forEach ( function ( side ) {
all . push ( _this6 . getClass ( 'element-attached' ) + '-' + side ) ;
all . push ( _this6 . getClass ( 'target-attached' ) + '-' + side ) ;
} ) ;
defer ( function ( ) {
if ( ! ( typeof _this6 . _addAttachClasses !== 'undefined' ) ) {
return ;
}
updateClasses ( _this6 . element , _this6 . _addAttachClasses , all ) ;
if ( ! ( _this6 . options . addTargetClasses === false ) ) {
updateClasses ( _this6 . target , _this6 . _addAttachClasses , all ) ;
}
delete _this6 . _addAttachClasses ;
} ) ;
}
} , {
key : 'position' ,
value : function position ( ) {
var _this7 = this ;
var flushChanges = arguments . length <= 0 || arguments [ 0 ] === undefined ? true : arguments [ 0 ] ;
// flushChanges commits the changes immediately, leave true unless you are positioning multiple
// tethers (in which case call Tether.Utils.flush yourself when you're done)
if ( ! this . enabled ) {
return ;
}
this . clearCache ( ) ;
// Turn 'auto' attachments into the appropriate corner or edge
var targetAttachment = autoToFixedAttachment ( this . targetAttachment , this . attachment ) ;
this . updateAttachClasses ( this . attachment , targetAttachment ) ;
var elementPos = this . cache ( 'element-bounds' , function ( ) {
return getBounds ( _this7 . element ) ;
} ) ;
var width = elementPos . width ;
var height = elementPos . height ;
if ( width === 0 && height === 0 && typeof this . lastSize !== 'undefined' ) {
var _lastSize = this . lastSize ;
// We cache the height and width to make it possible to position elements that are
// getting hidden.
width = _lastSize . width ;
height = _lastSize . height ;
} else {
this . lastSize = { width : width , height : height } ;
}
var targetPos = this . cache ( 'target-bounds' , function ( ) {
return _this7 . getTargetBounds ( ) ;
} ) ;
var targetSize = targetPos ;
// Get an actual px offset from the attachment
var offset = offsetToPx ( attachmentToOffset ( this . attachment ) , { width : width , height : height } ) ;
var targetOffset = offsetToPx ( attachmentToOffset ( targetAttachment ) , targetSize ) ;
var manualOffset = offsetToPx ( this . offset , { width : width , height : height } ) ;
var manualTargetOffset = offsetToPx ( this . targetOffset , targetSize ) ;
// Add the manually provided offset
offset = addOffset ( offset , manualOffset ) ;
targetOffset = addOffset ( targetOffset , manualTargetOffset ) ;
// It's now our goal to make (element position + offset) == (target position + target offset)
var left = targetPos . left + targetOffset . left - offset . left ;
var top = targetPos . top + targetOffset . top - offset . top ;
for ( var i = 0 ; i < TetherBase . modules . length ; ++ i ) {
var _module2 = TetherBase . modules [ i ] ;
var ret = _module2 . position . call ( this , {
left : left ,
top : top ,
targetAttachment : targetAttachment ,
targetPos : targetPos ,
elementPos : elementPos ,
offset : offset ,
targetOffset : targetOffset ,
manualOffset : manualOffset ,
manualTargetOffset : manualTargetOffset ,
scrollbarSize : scrollbarSize ,
attachment : this . attachment
} ) ;
if ( ret === false ) {
return false ;
} else if ( typeof ret === 'undefined' || typeof ret !== 'object' ) {
continue ;
} else {
top = ret . top ;
left = ret . left ;
}
}
// We describe the position three different ways to give the optimizer
// a chance to decide the best possible way to position the element
// with the fewest repaints.
var next = {
// It's position relative to the page (absolute positioning when
// the element is a child of the body)
page : {
top : top ,
left : left
} ,
// It's position relative to the viewport (fixed positioning)
viewport : {
top : top - pageYOffset ,
bottom : pageYOffset - top - height + innerHeight ,
left : left - pageXOffset ,
right : pageXOffset - left - width + innerWidth
}
} ;
2016-08-01 06:37:05 +00:00
var doc = this . target . ownerDocument ;
var win = doc . defaultView ;
2016-06-23 09:21:57 +00:00
var scrollbarSize = undefined ;
2016-09-13 13:58:35 +00:00
if ( win . innerHeight > doc . documentElement . clientHeight ) {
2016-06-23 09:21:57 +00:00
scrollbarSize = this . cache ( 'scrollbar-size' , getScrollBarSize ) ;
next . viewport . bottom -= scrollbarSize . height ;
}
2016-09-13 13:58:35 +00:00
if ( win . innerWidth > doc . documentElement . clientWidth ) {
2016-06-23 09:21:57 +00:00
scrollbarSize = this . cache ( 'scrollbar-size' , getScrollBarSize ) ;
next . viewport . right -= scrollbarSize . width ;
}
2016-08-01 06:37:05 +00:00
if ( [ '' , 'static' ] . indexOf ( doc . body . style . position ) === - 1 || [ '' , 'static' ] . indexOf ( doc . body . parentElement . style . position ) === - 1 ) {
2016-06-23 09:21:57 +00:00
// Absolute positioning in the body will be relative to the page, not the 'initial containing block'
2016-08-01 06:37:05 +00:00
next . page . bottom = doc . body . scrollHeight - top - height ;
next . page . right = doc . body . scrollWidth - left - width ;
2016-06-23 09:21:57 +00:00
}
if ( typeof this . options . optimizations !== 'undefined' && this . options . optimizations . moveElement !== false && ! ( typeof this . targetModifier !== 'undefined' ) ) {
( function ( ) {
var offsetParent = _this7 . cache ( 'target-offsetparent' , function ( ) {
return getOffsetParent ( _this7 . target ) ;
} ) ;
var offsetPosition = _this7 . cache ( 'target-offsetparent-bounds' , function ( ) {
return getBounds ( offsetParent ) ;
} ) ;
var offsetParentStyle = getComputedStyle ( offsetParent ) ;
var offsetParentSize = offsetPosition ;
var offsetBorder = { } ;
[ 'Top' , 'Left' , 'Bottom' , 'Right' ] . forEach ( function ( side ) {
offsetBorder [ side . toLowerCase ( ) ] = parseFloat ( offsetParentStyle [ 'border' + side + 'Width' ] ) ;
} ) ;
2016-08-01 06:37:05 +00:00
offsetPosition . right = doc . body . scrollWidth - offsetPosition . left - offsetParentSize . width + offsetBorder . right ;
offsetPosition . bottom = doc . body . scrollHeight - offsetPosition . top - offsetParentSize . height + offsetBorder . bottom ;
2016-06-23 09:21:57 +00:00
if ( next . page . top >= offsetPosition . top + offsetBorder . top && next . page . bottom >= offsetPosition . bottom ) {
if ( next . page . left >= offsetPosition . left + offsetBorder . left && next . page . right >= offsetPosition . right ) {
// We're within the visible part of the target's scroll parent
var scrollTop = offsetParent . scrollTop ;
var scrollLeft = offsetParent . scrollLeft ;
// It's position relative to the target's offset parent (absolute positioning when
// the element is moved to be a child of the target's offset parent).
next . offset = {
top : next . page . top - offsetPosition . top + scrollTop - offsetBorder . top ,
left : next . page . left - offsetPosition . left + scrollLeft - offsetBorder . left
} ;
}
}
} ) ( ) ;
}
// We could also travel up the DOM and try each containing context, rather than only
// looking at the body, but we're gonna get diminishing returns.
this . move ( next ) ;
this . history . unshift ( next ) ;
if ( this . history . length > 3 ) {
this . history . pop ( ) ;
}
if ( flushChanges ) {
flush ( ) ;
}
return true ;
}
// THE ISSUE
} , {
key : 'move' ,
value : function move ( pos ) {
var _this8 = this ;
if ( ! ( typeof this . element . parentNode !== 'undefined' ) ) {
return ;
}
var same = { } ;
for ( var type in pos ) {
same [ type ] = { } ;
for ( var key in pos [ type ] ) {
var found = false ;
for ( var i = 0 ; i < this . history . length ; ++ i ) {
var point = this . history [ i ] ;
if ( typeof point [ type ] !== 'undefined' && ! within ( point [ type ] [ key ] , pos [ type ] [ key ] ) ) {
found = true ;
break ;
}
}
if ( ! found ) {
same [ type ] [ key ] = true ;
}
}
}
var css = { top : '' , left : '' , right : '' , bottom : '' } ;
var transcribe = function transcribe ( _same , _pos ) {
var hasOptimizations = typeof _this8 . options . optimizations !== 'undefined' ;
var gpu = hasOptimizations ? _this8 . options . optimizations . gpu : null ;
if ( gpu !== false ) {
var yPos = undefined ,
xPos = undefined ;
if ( _same . top ) {
css . top = 0 ;
yPos = _pos . top ;
} else {
css . bottom = 0 ;
yPos = - _pos . bottom ;
}
if ( _same . left ) {
css . left = 0 ;
xPos = _pos . left ;
} else {
css . right = 0 ;
xPos = - _pos . right ;
}
2016-09-13 13:58:35 +00:00
if ( window . matchMedia ) {
// HubSpot/tether#207
var retina = window . matchMedia ( 'only screen and (min-resolution: 1.3dppx)' ) . matches || window . matchMedia ( 'only screen and (-webkit-min-device-pixel-ratio: 1.3)' ) . matches ;
if ( ! retina ) {
xPos = Math . round ( xPos ) ;
yPos = Math . round ( yPos ) ;
}
}
css [ transformKey ] = 'translateX(' + xPos + 'px) translateY(' + yPos + 'px)' ;
2016-06-23 09:21:57 +00:00
if ( transformKey !== 'msTransform' ) {
// The Z transform will keep this in the GPU (faster, and prevents artifacts),
// but IE9 doesn't support 3d transforms and will choke.
css [ transformKey ] += " translateZ(0)" ;
}
} else {
if ( _same . top ) {
css . top = _pos . top + 'px' ;
} else {
css . bottom = _pos . bottom + 'px' ;
}
if ( _same . left ) {
css . left = _pos . left + 'px' ;
} else {
css . right = _pos . right + 'px' ;
}
}
} ;
var moved = false ;
if ( ( same . page . top || same . page . bottom ) && ( same . page . left || same . page . right ) ) {
css . position = 'absolute' ;
transcribe ( same . page , pos . page ) ;
} else if ( ( same . viewport . top || same . viewport . bottom ) && ( same . viewport . left || same . viewport . right ) ) {
css . position = 'fixed' ;
transcribe ( same . viewport , pos . viewport ) ;
} else if ( typeof same . offset !== 'undefined' && same . offset . top && same . offset . left ) {
( function ( ) {
css . position = 'absolute' ;
var offsetParent = _this8 . cache ( 'target-offsetparent' , function ( ) {
return getOffsetParent ( _this8 . target ) ;
} ) ;
if ( getOffsetParent ( _this8 . element ) !== offsetParent ) {
defer ( function ( ) {
_this8 . element . parentNode . removeChild ( _this8 . element ) ;
offsetParent . appendChild ( _this8 . element ) ;
} ) ;
}
transcribe ( same . offset , pos . offset ) ;
moved = true ;
} ) ( ) ;
} else {
css . position = 'absolute' ;
transcribe ( { top : true , left : true } , pos . page ) ;
}
if ( ! moved ) {
2016-12-29 08:41:30 +00:00
if ( this . options . bodyElement ) {
this . options . bodyElement . appendChild ( this . element ) ;
} else {
var offsetParentIsBody = true ;
var currentNode = this . element . parentNode ;
while ( currentNode && currentNode . nodeType === 1 && currentNode . tagName !== 'BODY' ) {
if ( getComputedStyle ( currentNode ) . position !== 'static' ) {
offsetParentIsBody = false ;
break ;
}
2016-06-23 09:21:57 +00:00
2016-12-29 08:41:30 +00:00
currentNode = currentNode . parentNode ;
}
2016-12-28 10:33:00 +00:00
2016-12-29 08:41:30 +00:00
if ( ! offsetParentIsBody ) {
this . element . parentNode . removeChild ( this . element ) ;
this . element . ownerDocument . body . appendChild ( this . element ) ;
}
2016-06-23 09:21:57 +00:00
}
}
// Any css change will trigger a repaint, so let's avoid one if nothing changed
var writeCSS = { } ;
var write = false ;
for ( var key in css ) {
var val = css [ key ] ;
var elVal = this . element . style [ key ] ;
if ( elVal !== val ) {
write = true ;
writeCSS [ key ] = val ;
}
}
if ( write ) {
defer ( function ( ) {
extend ( _this8 . element . style , writeCSS ) ;
2016-09-13 13:58:35 +00:00
_this8 . trigger ( 'repositioned' ) ;
2016-06-23 09:21:57 +00:00
} ) ;
}
}
} ] ) ;
return TetherClass ;
} ) ( Evented ) ;
TetherClass . modules = [ ] ;
TetherBase . position = position ;
var Tether = extend ( TetherClass , TetherBase ) ;
/* globals TetherBase */
'use strict' ;
var _slicedToArray = ( function ( ) { function sliceIterator ( arr , i ) { var _arr = [ ] ; var _n = true ; var _d = false ; var _e = undefined ; try { for ( var _i = arr [ Symbol . iterator ] ( ) , _s ; ! ( _n = ( _s = _i . next ( ) ) . done ) ; _n = true ) { _arr . push ( _s . value ) ; if ( i && _arr . length === i ) break ; } } catch ( err ) { _d = true ; _e = err ; } finally { try { if ( ! _n && _i [ 'return' ] ) _i [ 'return' ] ( ) ; } finally { if ( _d ) throw _e ; } } return _arr ; } return function ( arr , i ) { if ( Array . isArray ( arr ) ) { return arr ; } else if ( Symbol . iterator in Object ( arr ) ) { return sliceIterator ( arr , i ) ; } else { throw new TypeError ( 'Invalid attempt to destructure non-iterable instance' ) ; } } ; } ) ( ) ;
var _TetherBase$Utils = TetherBase . Utils ;
var getBounds = _TetherBase$Utils . getBounds ;
var extend = _TetherBase$Utils . extend ;
var updateClasses = _TetherBase$Utils . updateClasses ;
var defer = _TetherBase$Utils . defer ;
var BOUNDS _FORMAT = [ 'left' , 'top' , 'right' , 'bottom' ] ;
function getBoundingRect ( tether , to ) {
if ( to === 'scrollParent' ) {
to = tether . scrollParents [ 0 ] ;
} else if ( to === 'window' ) {
to = [ pageXOffset , pageYOffset , innerWidth + pageXOffset , innerHeight + pageYOffset ] ;
}
if ( to === document ) {
to = to . documentElement ;
}
if ( typeof to . nodeType !== 'undefined' ) {
( function ( ) {
2016-08-01 06:37:05 +00:00
var node = to ;
2016-06-23 09:21:57 +00:00
var size = getBounds ( to ) ;
var pos = size ;
var style = getComputedStyle ( to ) ;
to = [ pos . left , pos . top , size . width + pos . left , size . height + pos . top ] ;
2016-08-01 06:37:05 +00:00
// Account any parent Frames scroll offset
if ( node . ownerDocument !== document ) {
var win = node . ownerDocument . defaultView ;
to [ 0 ] += win . pageXOffset ;
to [ 1 ] += win . pageYOffset ;
to [ 2 ] += win . pageXOffset ;
to [ 3 ] += win . pageYOffset ;
}
2016-06-23 09:21:57 +00:00
BOUNDS _FORMAT . forEach ( function ( side , i ) {
side = side [ 0 ] . toUpperCase ( ) + side . substr ( 1 ) ;
if ( side === 'Top' || side === 'Left' ) {
to [ i ] += parseFloat ( style [ 'border' + side + 'Width' ] ) ;
} else {
to [ i ] -= parseFloat ( style [ 'border' + side + 'Width' ] ) ;
}
} ) ;
} ) ( ) ;
}
return to ;
}
TetherBase . modules . push ( {
position : function position ( _ref ) {
var _this = this ;
var top = _ref . top ;
var left = _ref . left ;
var targetAttachment = _ref . targetAttachment ;
if ( ! this . options . constraints ) {
return true ;
}
var _cache = this . cache ( 'element-bounds' , function ( ) {
return getBounds ( _this . element ) ;
} ) ;
var height = _cache . height ;
var width = _cache . width ;
if ( width === 0 && height === 0 && typeof this . lastSize !== 'undefined' ) {
var _lastSize = this . lastSize ;
// Handle the item getting hidden as a result of our positioning without glitching
// the classes in and out
width = _lastSize . width ;
height = _lastSize . height ;
}
var targetSize = this . cache ( 'target-bounds' , function ( ) {
return _this . getTargetBounds ( ) ;
} ) ;
var targetHeight = targetSize . height ;
var targetWidth = targetSize . width ;
var allClasses = [ this . getClass ( 'pinned' ) , this . getClass ( 'out-of-bounds' ) ] ;
this . options . constraints . forEach ( function ( constraint ) {
var outOfBoundsClass = constraint . outOfBoundsClass ;
var pinnedClass = constraint . pinnedClass ;
if ( outOfBoundsClass ) {
allClasses . push ( outOfBoundsClass ) ;
}
if ( pinnedClass ) {
allClasses . push ( pinnedClass ) ;
}
} ) ;
allClasses . forEach ( function ( cls ) {
[ 'left' , 'top' , 'right' , 'bottom' ] . forEach ( function ( side ) {
allClasses . push ( cls + '-' + side ) ;
} ) ;
} ) ;
var addClasses = [ ] ;
var tAttachment = extend ( { } , targetAttachment ) ;
var eAttachment = extend ( { } , this . attachment ) ;
this . options . constraints . forEach ( function ( constraint ) {
var to = constraint . to ;
var attachment = constraint . attachment ;
var pin = constraint . pin ;
if ( typeof attachment === 'undefined' ) {
attachment = '' ;
}
var changeAttachX = undefined ,
changeAttachY = undefined ;
if ( attachment . indexOf ( ' ' ) >= 0 ) {
var _attachment$split = attachment . split ( ' ' ) ;
var _attachment$split2 = _slicedToArray ( _attachment$split , 2 ) ;
changeAttachY = _attachment$split2 [ 0 ] ;
changeAttachX = _attachment$split2 [ 1 ] ;
} else {
changeAttachX = changeAttachY = attachment ;
}
var bounds = getBoundingRect ( _this , to ) ;
if ( changeAttachY === 'target' || changeAttachY === 'both' ) {
if ( top < bounds [ 1 ] && tAttachment . top === 'top' ) {
top += targetHeight ;
tAttachment . top = 'bottom' ;
}
if ( top + height > bounds [ 3 ] && tAttachment . top === 'bottom' ) {
top -= targetHeight ;
tAttachment . top = 'top' ;
}
}
if ( changeAttachY === 'together' ) {
if ( tAttachment . top === 'top' ) {
if ( eAttachment . top === 'bottom' && top < bounds [ 1 ] ) {
top += targetHeight ;
tAttachment . top = 'bottom' ;
top += height ;
eAttachment . top = 'top' ;
} else if ( eAttachment . top === 'top' && top + height > bounds [ 3 ] && top - ( height - targetHeight ) >= bounds [ 1 ] ) {
top -= height - targetHeight ;
tAttachment . top = 'bottom' ;
eAttachment . top = 'bottom' ;
}
}
if ( tAttachment . top === 'bottom' ) {
if ( eAttachment . top === 'top' && top + height > bounds [ 3 ] ) {
top -= targetHeight ;
tAttachment . top = 'top' ;
top -= height ;
eAttachment . top = 'bottom' ;
} else if ( eAttachment . top === 'bottom' && top < bounds [ 1 ] && top + ( height * 2 - targetHeight ) <= bounds [ 3 ] ) {
top += height - targetHeight ;
tAttachment . top = 'top' ;
eAttachment . top = 'top' ;
}
}
if ( tAttachment . top === 'middle' ) {
if ( top + height > bounds [ 3 ] && eAttachment . top === 'top' ) {
top -= height ;
eAttachment . top = 'bottom' ;
} else if ( top < bounds [ 1 ] && eAttachment . top === 'bottom' ) {
top += height ;
eAttachment . top = 'top' ;
}
}
}
if ( changeAttachX === 'target' || changeAttachX === 'both' ) {
if ( left < bounds [ 0 ] && tAttachment . left === 'left' ) {
left += targetWidth ;
tAttachment . left = 'right' ;
}
if ( left + width > bounds [ 2 ] && tAttachment . left === 'right' ) {
left -= targetWidth ;
tAttachment . left = 'left' ;
}
}
if ( changeAttachX === 'together' ) {
if ( left < bounds [ 0 ] && tAttachment . left === 'left' ) {
if ( eAttachment . left === 'right' ) {
left += targetWidth ;
tAttachment . left = 'right' ;
left += width ;
eAttachment . left = 'left' ;
} else if ( eAttachment . left === 'left' ) {
left += targetWidth ;
tAttachment . left = 'right' ;
left -= width ;
eAttachment . left = 'right' ;
}
} else if ( left + width > bounds [ 2 ] && tAttachment . left === 'right' ) {
if ( eAttachment . left === 'left' ) {
left -= targetWidth ;
tAttachment . left = 'left' ;
left -= width ;
eAttachment . left = 'right' ;
} else if ( eAttachment . left === 'right' ) {
left -= targetWidth ;
tAttachment . left = 'left' ;
left += width ;
eAttachment . left = 'left' ;
}
} else if ( tAttachment . left === 'center' ) {
if ( left + width > bounds [ 2 ] && eAttachment . left === 'left' ) {
left -= width ;
eAttachment . left = 'right' ;
} else if ( left < bounds [ 0 ] && eAttachment . left === 'right' ) {
left += width ;
eAttachment . left = 'left' ;
}
}
}
if ( changeAttachY === 'element' || changeAttachY === 'both' ) {
if ( top < bounds [ 1 ] && eAttachment . top === 'bottom' ) {
top += height ;
eAttachment . top = 'top' ;
}
if ( top + height > bounds [ 3 ] && eAttachment . top === 'top' ) {
top -= height ;
eAttachment . top = 'bottom' ;
}
}
if ( changeAttachX === 'element' || changeAttachX === 'both' ) {
if ( left < bounds [ 0 ] ) {
if ( eAttachment . left === 'right' ) {
left += width ;
eAttachment . left = 'left' ;
} else if ( eAttachment . left === 'center' ) {
left += width / 2 ;
eAttachment . left = 'left' ;
}
}
if ( left + width > bounds [ 2 ] ) {
if ( eAttachment . left === 'left' ) {
left -= width ;
eAttachment . left = 'right' ;
} else if ( eAttachment . left === 'center' ) {
left -= width / 2 ;
eAttachment . left = 'right' ;
}
}
}
if ( typeof pin === 'string' ) {
pin = pin . split ( ',' ) . map ( function ( p ) {
return p . trim ( ) ;
} ) ;
} else if ( pin === true ) {
pin = [ 'top' , 'left' , 'right' , 'bottom' ] ;
}
pin = pin || [ ] ;
var pinned = [ ] ;
var oob = [ ] ;
if ( top < bounds [ 1 ] ) {
if ( pin . indexOf ( 'top' ) >= 0 ) {
top = bounds [ 1 ] ;
pinned . push ( 'top' ) ;
} else {
oob . push ( 'top' ) ;
}
}
if ( top + height > bounds [ 3 ] ) {
if ( pin . indexOf ( 'bottom' ) >= 0 ) {
top = bounds [ 3 ] - height ;
pinned . push ( 'bottom' ) ;
} else {
oob . push ( 'bottom' ) ;
}
}
if ( left < bounds [ 0 ] ) {
if ( pin . indexOf ( 'left' ) >= 0 ) {
left = bounds [ 0 ] ;
pinned . push ( 'left' ) ;
} else {
oob . push ( 'left' ) ;
}
}
if ( left + width > bounds [ 2 ] ) {
if ( pin . indexOf ( 'right' ) >= 0 ) {
left = bounds [ 2 ] - width ;
pinned . push ( 'right' ) ;
} else {
oob . push ( 'right' ) ;
}
}
if ( pinned . length ) {
( function ( ) {
var pinnedClass = undefined ;
if ( typeof _this . options . pinnedClass !== 'undefined' ) {
pinnedClass = _this . options . pinnedClass ;
} else {
pinnedClass = _this . getClass ( 'pinned' ) ;
}
addClasses . push ( pinnedClass ) ;
pinned . forEach ( function ( side ) {
addClasses . push ( pinnedClass + '-' + side ) ;
} ) ;
} ) ( ) ;
}
if ( oob . length ) {
( function ( ) {
var oobClass = undefined ;
if ( typeof _this . options . outOfBoundsClass !== 'undefined' ) {
oobClass = _this . options . outOfBoundsClass ;
} else {
oobClass = _this . getClass ( 'out-of-bounds' ) ;
}
addClasses . push ( oobClass ) ;
oob . forEach ( function ( side ) {
addClasses . push ( oobClass + '-' + side ) ;
} ) ;
} ) ( ) ;
}
if ( pinned . indexOf ( 'left' ) >= 0 || pinned . indexOf ( 'right' ) >= 0 ) {
eAttachment . left = tAttachment . left = false ;
}
if ( pinned . indexOf ( 'top' ) >= 0 || pinned . indexOf ( 'bottom' ) >= 0 ) {
eAttachment . top = tAttachment . top = false ;
}
if ( tAttachment . top !== targetAttachment . top || tAttachment . left !== targetAttachment . left || eAttachment . top !== _this . attachment . top || eAttachment . left !== _this . attachment . left ) {
_this . updateAttachClasses ( eAttachment , tAttachment ) ;
_this . trigger ( 'update' , {
attachment : eAttachment ,
targetAttachment : tAttachment
} ) ;
}
} ) ;
defer ( function ( ) {
if ( ! ( _this . options . addTargetClasses === false ) ) {
updateClasses ( _this . target , addClasses , allClasses ) ;
}
updateClasses ( _this . element , addClasses , allClasses ) ;
} ) ;
return { top : top , left : left } ;
}
} ) ;
/* globals TetherBase */
'use strict' ;
var _TetherBase$Utils = TetherBase . Utils ;
var getBounds = _TetherBase$Utils . getBounds ;
var updateClasses = _TetherBase$Utils . updateClasses ;
var defer = _TetherBase$Utils . defer ;
TetherBase . modules . push ( {
position : function position ( _ref ) {
var _this = this ;
var top = _ref . top ;
var left = _ref . left ;
var _cache = this . cache ( 'element-bounds' , function ( ) {
return getBounds ( _this . element ) ;
} ) ;
var height = _cache . height ;
var width = _cache . width ;
var targetPos = this . getTargetBounds ( ) ;
var bottom = top + height ;
var right = left + width ;
var abutted = [ ] ;
if ( top <= targetPos . bottom && bottom >= targetPos . top ) {
[ 'left' , 'right' ] . forEach ( function ( side ) {
var targetPosSide = targetPos [ side ] ;
if ( targetPosSide === left || targetPosSide === right ) {
abutted . push ( side ) ;
}
} ) ;
}
if ( left <= targetPos . right && right >= targetPos . left ) {
[ 'top' , 'bottom' ] . forEach ( function ( side ) {
var targetPosSide = targetPos [ side ] ;
if ( targetPosSide === top || targetPosSide === bottom ) {
abutted . push ( side ) ;
}
} ) ;
}
var allClasses = [ ] ;
var addClasses = [ ] ;
var sides = [ 'left' , 'top' , 'right' , 'bottom' ] ;
allClasses . push ( this . getClass ( 'abutted' ) ) ;
sides . forEach ( function ( side ) {
allClasses . push ( _this . getClass ( 'abutted' ) + '-' + side ) ;
} ) ;
if ( abutted . length ) {
addClasses . push ( this . getClass ( 'abutted' ) ) ;
}
abutted . forEach ( function ( side ) {
addClasses . push ( _this . getClass ( 'abutted' ) + '-' + side ) ;
} ) ;
defer ( function ( ) {
if ( ! ( _this . options . addTargetClasses === false ) ) {
updateClasses ( _this . target , addClasses , allClasses ) ;
}
updateClasses ( _this . element , addClasses , allClasses ) ;
} ) ;
return true ;
}
} ) ;
/* globals TetherBase */
'use strict' ;
var _slicedToArray = ( function ( ) { function sliceIterator ( arr , i ) { var _arr = [ ] ; var _n = true ; var _d = false ; var _e = undefined ; try { for ( var _i = arr [ Symbol . iterator ] ( ) , _s ; ! ( _n = ( _s = _i . next ( ) ) . done ) ; _n = true ) { _arr . push ( _s . value ) ; if ( i && _arr . length === i ) break ; } } catch ( err ) { _d = true ; _e = err ; } finally { try { if ( ! _n && _i [ 'return' ] ) _i [ 'return' ] ( ) ; } finally { if ( _d ) throw _e ; } } return _arr ; } return function ( arr , i ) { if ( Array . isArray ( arr ) ) { return arr ; } else if ( Symbol . iterator in Object ( arr ) ) { return sliceIterator ( arr , i ) ; } else { throw new TypeError ( 'Invalid attempt to destructure non-iterable instance' ) ; } } ; } ) ( ) ;
TetherBase . modules . push ( {
position : function position ( _ref ) {
var top = _ref . top ;
var left = _ref . left ;
if ( ! this . options . shift ) {
return ;
}
var shift = this . options . shift ;
if ( typeof this . options . shift === 'function' ) {
shift = this . options . shift . call ( this , { top : top , left : left } ) ;
}
var shiftTop = undefined ,
shiftLeft = undefined ;
if ( typeof shift === 'string' ) {
shift = shift . split ( ' ' ) ;
shift [ 1 ] = shift [ 1 ] || shift [ 0 ] ;
var _shift = shift ;
var _shift2 = _slicedToArray ( _shift , 2 ) ;
shiftTop = _shift2 [ 0 ] ;
shiftLeft = _shift2 [ 1 ] ;
shiftTop = parseFloat ( shiftTop , 10 ) ;
shiftLeft = parseFloat ( shiftLeft , 10 ) ;
} else {
shiftTop = shift . top ;
shiftLeft = shift . left ;
}
top += shiftTop ;
left += shiftLeft ;
return { top : top , left : left } ;
}
} ) ;
return Tether ;
} ) ) ;
/ * !
2016-10-20 13:30:35 +00:00
* Bootstrap v4 . 0.0 - alpha . 5 ( https : //getbootstrap.com)
2016-08-01 06:37:05 +00:00
* Copyright 2011 - 2016 The Bootstrap Authors ( https : //github.com/twbs/bootstrap/graphs/contributors)
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* /
if ( typeof jQuery === 'undefined' ) {
throw new Error ( 'Bootstrap\'s JavaScript requires jQuery' )
}
+ function ( $ ) {
var version = $ . fn . jquery . split ( ' ' ) [ 0 ] . split ( '.' )
2016-08-01 06:37:05 +00:00
if ( ( version [ 0 ] < 2 && version [ 1 ] < 9 ) || ( version [ 0 ] == 1 && version [ 1 ] == 9 && version [ 2 ] < 1 ) || ( version [ 0 ] >= 4 ) ) {
throw new Error ( 'Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0' )
2016-06-23 09:21:57 +00:00
}
} ( jQuery ) ;
2016-10-20 13:30:35 +00:00
+ function ( ) {
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var _typeof = typeof Symbol === "function" && typeof Symbol . iterator === "symbol" ? function ( obj ) { return typeof obj ; } : function ( obj ) { return obj && typeof Symbol === "function" && obj . constructor === Symbol && obj !== Symbol . prototype ? "symbol" : typeof obj ; } ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var _createClass = function ( ) { function defineProperties ( target , props ) { for ( var i = 0 ; i < props . length ; i ++ ) { var descriptor = props [ i ] ; descriptor . enumerable = descriptor . enumerable || false ; descriptor . configurable = true ; if ( "value" in descriptor ) descriptor . writable = true ; Object . defineProperty ( target , descriptor . key , descriptor ) ; } } return function ( Constructor , protoProps , staticProps ) { if ( protoProps ) defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) defineProperties ( Constructor , staticProps ) ; return Constructor ; } ; } ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
function _possibleConstructorReturn ( self , call ) { if ( ! self ) { throw new ReferenceError ( "this hasn't been initialised - super() hasn't been called" ) ; } return call && ( typeof call === "object" || typeof call === "function" ) ? call : self ; }
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
function _inherits ( subClass , superClass ) { if ( typeof superClass !== "function" && superClass !== null ) { throw new TypeError ( "Super expression must either be null or a function, not " + typeof superClass ) ; } subClass . prototype = Object . create ( superClass && superClass . prototype , { constructor : { value : subClass , enumerable : false , writable : true , configurable : true } } ) ; if ( superClass ) Object . setPrototypeOf ? Object . setPrototypeOf ( subClass , superClass ) : subClass . _ _proto _ _ = superClass ; }
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : util . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var Util = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Private TransitionEnd Helpers
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var transition = false ;
2016-08-01 06:37:05 +00:00
var MAX _UID = 1000000 ;
2016-06-23 09:21:57 +00:00
var TransitionEndEvent = {
WebkitTransition : 'webkitTransitionEnd' ,
MozTransition : 'transitionend' ,
OTransition : 'oTransitionEnd otransitionend' ,
transition : 'transitionend'
} ;
// shoutout AngusCroll (https://goo.gl/pxwQGp)
function toType ( obj ) {
2016-10-20 13:30:35 +00:00
return { } . toString . call ( obj ) . match ( /\s([a-zA-Z]+)/ ) [ 1 ] . toLowerCase ( ) ;
2016-06-23 09:21:57 +00:00
}
function isElement ( obj ) {
return ( obj [ 0 ] || obj ) . nodeType ;
}
function getSpecialTransitionEndEvent ( ) {
return {
bindType : transition . end ,
delegateType : transition . end ,
handle : function handle ( event ) {
if ( $ ( event . target ) . is ( this ) ) {
2016-08-01 06:37:05 +00:00
return event . handleObj . handler . apply ( this , arguments ) ; // eslint-disable-line prefer-rest-params
2016-06-23 09:21:57 +00:00
}
2016-08-01 06:37:05 +00:00
return undefined ;
2016-06-23 09:21:57 +00:00
}
} ;
}
function transitionEndTest ( ) {
if ( window . QUnit ) {
return false ;
}
var el = document . createElement ( 'bootstrap' ) ;
2016-10-20 13:30:35 +00:00
for ( var name in TransitionEndEvent ) {
if ( el . style [ name ] !== undefined ) {
return { end : TransitionEndEvent [ name ] } ;
2016-06-23 09:21:57 +00:00
}
}
return false ;
}
function transitionEndEmulator ( duration ) {
var _this = this ;
var called = false ;
$ ( this ) . one ( Util . TRANSITION _END , function ( ) {
called = true ;
} ) ;
setTimeout ( function ( ) {
if ( ! called ) {
Util . triggerTransitionEnd ( _this ) ;
}
} , duration ) ;
return this ;
}
function setTransitionEndSupport ( ) {
transition = transitionEndTest ( ) ;
$ . fn . emulateTransitionEnd = transitionEndEmulator ;
if ( Util . supportsTransitionEnd ( ) ) {
$ . event . special [ Util . TRANSITION _END ] = getSpecialTransitionEndEvent ( ) ;
}
}
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Public Util Api
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var Util = {
TRANSITION _END : 'bsTransitionEnd' ,
getUID : function getUID ( prefix ) {
do {
2016-08-01 06:37:05 +00:00
/* eslint-disable no-bitwise */
2016-10-20 13:30:35 +00:00
prefix += ~ ~ ( Math . random ( ) * MAX _UID ) ; // "~~" acts like a faster Math.floor() here
2016-08-01 06:37:05 +00:00
/* eslint-enable no-bitwise */
2016-06-23 09:21:57 +00:00
} while ( document . getElementById ( prefix ) ) ;
return prefix ;
} ,
getSelectorFromElement : function getSelectorFromElement ( element ) {
var selector = element . getAttribute ( 'data-target' ) ;
if ( ! selector ) {
selector = element . getAttribute ( 'href' ) || '' ;
selector = /^#[a-z]/i . test ( selector ) ? selector : null ;
}
return selector ;
} ,
reflow : function reflow ( element ) {
new Function ( 'bs' , 'return bs' ) ( element . offsetHeight ) ;
} ,
triggerTransitionEnd : function triggerTransitionEnd ( element ) {
$ ( element ) . trigger ( transition . end ) ;
} ,
supportsTransitionEnd : function supportsTransitionEnd ( ) {
return Boolean ( transition ) ;
} ,
typeCheckConfig : function typeCheckConfig ( componentName , config , configTypes ) {
for ( var property in configTypes ) {
if ( configTypes . hasOwnProperty ( property ) ) {
var expectedTypes = configTypes [ property ] ;
var value = config [ property ] ;
2016-10-20 13:30:35 +00:00
var valueType = void 0 ;
2016-06-23 09:21:57 +00:00
if ( value && isElement ( value ) ) {
valueType = 'element' ;
} else {
valueType = toType ( value ) ;
}
if ( ! new RegExp ( expectedTypes ) . test ( valueType ) ) {
throw new Error ( componentName . toUpperCase ( ) + ': ' + ( 'Option "' + property + '" provided type "' + valueType + '" ' ) + ( 'but expected type "' + expectedTypes + '".' ) ) ;
}
}
}
}
} ;
setTransitionEndSupport ( ) ;
return Util ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : alert . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Alert = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'alert' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.alert' ;
var EVENT _KEY = '.' + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var TRANSITION _DURATION = 150 ;
var Selector = {
DISMISS : '[data-dismiss="alert"]'
} ;
var Event = {
CLOSE : 'close' + EVENT _KEY ,
CLOSED : 'closed' + EVENT _KEY ,
CLICK _DATA _API : 'click' + EVENT _KEY + DATA _API _KEY
} ;
var ClassName = {
ALERT : 'alert' ,
FADE : 'fade' ,
IN : 'in'
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Alert = function ( ) {
2016-06-23 09:21:57 +00:00
function Alert ( element ) {
_classCallCheck ( this , Alert ) ;
this . _element = element ;
}
// getters
2016-10-20 13:30:35 +00:00
// public
Alert . prototype . close = function close ( element ) {
element = element || this . _element ;
var rootElement = this . _getRootElement ( element ) ;
var customEvent = this . _triggerCloseEvent ( rootElement ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( customEvent . isDefaultPrevented ( ) ) {
return ;
}
this . _removeElement ( rootElement ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Alert . prototype . dispose = function dispose ( ) {
$ . removeData ( this . _element , DATA _KEY ) ;
this . _element = null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// private
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Alert . prototype . _getRootElement = function _getRootElement ( element ) {
var selector = Util . getSelectorFromElement ( element ) ;
var parent = false ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( selector ) {
parent = $ ( selector ) [ 0 ] ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( ! parent ) {
parent = $ ( element ) . closest ( '.' + ClassName . ALERT ) [ 0 ] ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
return parent ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Alert . prototype . _triggerCloseEvent = function _triggerCloseEvent ( element ) {
var closeEvent = $ . Event ( Event . CLOSE ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( element ) . trigger ( closeEvent ) ;
return closeEvent ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Alert . prototype . _removeElement = function _removeElement ( element ) {
$ ( element ) . removeClass ( ClassName . IN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! Util . supportsTransitionEnd ( ) || ! $ ( element ) . hasClass ( ClassName . FADE ) ) {
this . _destroyElement ( element ) ;
return ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
$ ( element ) . one ( Util . TRANSITION _END , $ . proxy ( this . _destroyElement , this , element ) ) . emulateTransitionEnd ( TRANSITION _DURATION ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Alert . prototype . _destroyElement = function _destroyElement ( element ) {
$ ( element ) . detach ( ) . trigger ( Event . CLOSED ) . remove ( ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Alert . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data ) {
data = new Alert ( this ) ;
$element . data ( DATA _KEY , data ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( config === 'close' ) {
data [ config ] ( this ) ;
}
} ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Alert . _handleDismiss = function _handleDismiss ( alertInstance ) {
return function ( event ) {
if ( event ) {
event . preventDefault ( ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
alertInstance . close ( this ) ;
} ;
} ;
_createClass ( Alert , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
get : function get ( ) {
return VERSION ;
}
} ] ) ;
return Alert ;
2016-10-20 13:30:35 +00:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
$ ( document ) . on ( Event . CLICK _DATA _API , Selector . DISMISS , Alert . _handleDismiss ( new Alert ( ) ) ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ NAME ] = Alert . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Alert ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Alert . _jQueryInterface ;
} ;
return Alert ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : button . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Button = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'button' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.button' ;
var EVENT _KEY = '.' + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var ClassName = {
ACTIVE : 'active' ,
BUTTON : 'btn' ,
FOCUS : 'focus'
} ;
var Selector = {
DATA _TOGGLE _CARROT : '[data-toggle^="button"]' ,
DATA _TOGGLE : '[data-toggle="buttons"]' ,
INPUT : 'input' ,
ACTIVE : '.active' ,
BUTTON : '.btn'
} ;
var Event = {
CLICK _DATA _API : 'click' + EVENT _KEY + DATA _API _KEY ,
FOCUS _BLUR _DATA _API : 'focus' + EVENT _KEY + DATA _API _KEY + ' ' + ( 'blur' + EVENT _KEY + DATA _API _KEY )
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Button = function ( ) {
2016-06-23 09:21:57 +00:00
function Button ( element ) {
_classCallCheck ( this , Button ) ;
this . _element = element ;
}
// getters
2016-10-20 13:30:35 +00:00
// public
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Button . prototype . toggle = function toggle ( ) {
var triggerChangeEvent = true ;
var rootElement = $ ( this . _element ) . closest ( Selector . DATA _TOGGLE ) [ 0 ] ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( rootElement ) {
var input = $ ( this . _element ) . find ( Selector . INPUT ) [ 0 ] ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( input ) {
if ( input . type === 'radio' ) {
if ( input . checked && $ ( this . _element ) . hasClass ( ClassName . ACTIVE ) ) {
triggerChangeEvent = false ;
} else {
var activeElement = $ ( rootElement ) . find ( Selector . ACTIVE ) [ 0 ] ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( activeElement ) {
$ ( activeElement ) . removeClass ( ClassName . ACTIVE ) ;
2016-06-23 09:21:57 +00:00
}
}
2016-10-20 13:30:35 +00:00
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( triggerChangeEvent ) {
input . checked = ! $ ( this . _element ) . hasClass ( ClassName . ACTIVE ) ;
$ ( this . _element ) . trigger ( 'change' ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
input . focus ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} else {
this . _element . setAttribute ( 'aria-pressed' , ! $ ( this . _element ) . hasClass ( ClassName . ACTIVE ) ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( triggerChangeEvent ) {
$ ( this . _element ) . toggleClass ( ClassName . ACTIVE ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
Button . prototype . dispose = function dispose ( ) {
$ . removeData ( this . _element , DATA _KEY ) ;
this . _element = null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Button . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data ) {
data = new Button ( this ) ;
$ ( this ) . data ( DATA _KEY , data ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( config === 'toggle' ) {
data [ config ] ( ) ;
}
} ) ;
} ;
_createClass ( Button , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
get : function get ( ) {
return VERSION ;
}
} ] ) ;
return Button ;
2016-10-20 13:30:35 +00:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
$ ( document ) . on ( Event . CLICK _DATA _API , Selector . DATA _TOGGLE _CARROT , function ( event ) {
event . preventDefault ( ) ;
var button = event . target ;
if ( ! $ ( button ) . hasClass ( ClassName . BUTTON ) ) {
button = $ ( button ) . closest ( Selector . BUTTON ) ;
}
Button . _jQueryInterface . call ( $ ( button ) , 'toggle' ) ;
} ) . on ( Event . FOCUS _BLUR _DATA _API , Selector . DATA _TOGGLE _CARROT , function ( event ) {
var button = $ ( event . target ) . closest ( Selector . BUTTON ) [ 0 ] ;
$ ( button ) . toggleClass ( ClassName . FOCUS , /^focus(in)?$/ . test ( event . type ) ) ;
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ NAME ] = Button . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Button ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Button . _jQueryInterface ;
} ;
return Button ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : carousel . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Carousel = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'carousel' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.carousel' ;
var EVENT _KEY = '.' + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var TRANSITION _DURATION = 600 ;
2016-08-01 06:37:05 +00:00
var ARROW _LEFT _KEYCODE = 37 ; // KeyboardEvent.which value for left arrow key
var ARROW _RIGHT _KEYCODE = 39 ; // KeyboardEvent.which value for right arrow key
2016-06-23 09:21:57 +00:00
var Default = {
interval : 5000 ,
keyboard : true ,
slide : false ,
pause : 'hover' ,
wrap : true
} ;
var DefaultType = {
interval : '(number|boolean)' ,
keyboard : 'boolean' ,
slide : '(boolean|string)' ,
pause : '(string|boolean)' ,
wrap : 'boolean'
} ;
var Direction = {
NEXT : 'next' ,
PREVIOUS : 'prev'
} ;
var Event = {
SLIDE : 'slide' + EVENT _KEY ,
SLID : 'slid' + EVENT _KEY ,
KEYDOWN : 'keydown' + EVENT _KEY ,
MOUSEENTER : 'mouseenter' + EVENT _KEY ,
MOUSELEAVE : 'mouseleave' + EVENT _KEY ,
LOAD _DATA _API : 'load' + EVENT _KEY + DATA _API _KEY ,
CLICK _DATA _API : 'click' + EVENT _KEY + DATA _API _KEY
} ;
var ClassName = {
CAROUSEL : 'carousel' ,
ACTIVE : 'active' ,
SLIDE : 'slide' ,
RIGHT : 'right' ,
LEFT : 'left' ,
ITEM : 'carousel-item'
} ;
var Selector = {
ACTIVE : '.active' ,
ACTIVE _ITEM : '.active.carousel-item' ,
ITEM : '.carousel-item' ,
NEXT _PREV : '.next, .prev' ,
INDICATORS : '.carousel-indicators' ,
DATA _SLIDE : '[data-slide], [data-slide-to]' ,
DATA _RIDE : '[data-ride="carousel"]'
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Carousel = function ( ) {
2016-06-23 09:21:57 +00:00
function Carousel ( element , config ) {
_classCallCheck ( this , Carousel ) ;
this . _items = null ;
this . _interval = null ;
this . _activeElement = null ;
this . _isPaused = false ;
this . _isSliding = false ;
this . _config = this . _getConfig ( config ) ;
this . _element = $ ( element ) [ 0 ] ;
this . _indicatorsElement = $ ( this . _element ) . find ( Selector . INDICATORS ) [ 0 ] ;
this . _addEventListeners ( ) ;
}
// getters
2016-10-20 13:30:35 +00:00
// public
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . prototype . next = function next ( ) {
if ( ! this . _isSliding ) {
this . _slide ( Direction . NEXT ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . prototype . nextWhenVisible = function nextWhenVisible ( ) {
// Don't call next when the page isn't visible
if ( ! document . hidden ) {
this . next ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
Carousel . prototype . prev = function prev ( ) {
if ( ! this . _isSliding ) {
this . _slide ( Direction . PREVIOUS ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
Carousel . prototype . pause = function pause ( event ) {
if ( ! event ) {
this . _isPaused = true ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( $ ( this . _element ) . find ( Selector . NEXT _PREV ) [ 0 ] && Util . supportsTransitionEnd ( ) ) {
Util . triggerTransitionEnd ( this . _element ) ;
this . cycle ( true ) ;
}
clearInterval ( this . _interval ) ;
this . _interval = null ;
} ;
Carousel . prototype . cycle = function cycle ( event ) {
if ( ! event ) {
this . _isPaused = false ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . _interval ) {
2016-06-23 09:21:57 +00:00
clearInterval ( this . _interval ) ;
this . _interval = null ;
}
2016-10-20 13:30:35 +00:00
if ( this . _config . interval && ! this . _isPaused ) {
this . _interval = setInterval ( $ . proxy ( document . visibilityState ? this . nextWhenVisible : this . next , this ) , this . _config . interval ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . prototype . to = function to ( index ) {
var _this2 = this ;
this . _activeElement = $ ( this . _element ) . find ( Selector . ACTIVE _ITEM ) [ 0 ] ;
var activeIndex = this . _getItemIndex ( this . _activeElement ) ;
if ( index > this . _items . length - 1 || index < 0 ) {
return ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( this . _isSliding ) {
$ ( this . _element ) . one ( Event . SLID , function ( ) {
return _this2 . to ( index ) ;
} ) ;
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( activeIndex === index ) {
this . pause ( ) ;
this . cycle ( ) ;
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var direction = index > activeIndex ? Direction . NEXT : Direction . PREVIOUS ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _slide ( direction , this . _items [ index ] ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . prototype . dispose = function dispose ( ) {
$ ( this . _element ) . off ( EVENT _KEY ) ;
$ . removeData ( this . _element , DATA _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _items = null ;
this . _config = null ;
this . _element = null ;
this . _interval = null ;
this . _isPaused = null ;
this . _isSliding = null ;
this . _activeElement = null ;
this . _indicatorsElement = null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// private
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . prototype . _getConfig = function _getConfig ( config ) {
config = $ . extend ( { } , Default , config ) ;
Util . typeCheckConfig ( NAME , config , DefaultType ) ;
return config ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . prototype . _addEventListeners = function _addEventListeners ( ) {
if ( this . _config . keyboard ) {
$ ( this . _element ) . on ( Event . KEYDOWN , $ . proxy ( this . _keydown , this ) ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( this . _config . pause === 'hover' && ! ( 'ontouchstart' in document . documentElement ) ) {
$ ( this . _element ) . on ( Event . MOUSEENTER , $ . proxy ( this . pause , this ) ) . on ( Event . MOUSELEAVE , $ . proxy ( this . cycle , this ) ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . prototype . _keydown = function _keydown ( event ) {
event . preventDefault ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( /input|textarea/i . test ( event . target . tagName ) ) {
return ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
switch ( event . which ) {
case ARROW _LEFT _KEYCODE :
this . prev ( ) ;
break ;
case ARROW _RIGHT _KEYCODE :
this . next ( ) ;
break ;
default :
return ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . prototype . _getItemIndex = function _getItemIndex ( element ) {
this . _items = $ . makeArray ( $ ( element ) . parent ( ) . find ( Selector . ITEM ) ) ;
return this . _items . indexOf ( element ) ;
} ;
Carousel . prototype . _getItemByDirection = function _getItemByDirection ( direction , activeElement ) {
var isNextDirection = direction === Direction . NEXT ;
var isPrevDirection = direction === Direction . PREVIOUS ;
var activeIndex = this . _getItemIndex ( activeElement ) ;
var lastItemIndex = this . _items . length - 1 ;
var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( isGoingToWrap && ! this . _config . wrap ) {
return activeElement ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
var delta = direction === Direction . PREVIOUS ? - 1 : 1 ;
var itemIndex = ( activeIndex + delta ) % this . _items . length ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
return itemIndex === - 1 ? this . _items [ this . _items . length - 1 ] : this . _items [ itemIndex ] ;
} ;
Carousel . prototype . _triggerSlideEvent = function _triggerSlideEvent ( relatedTarget , directionalClassname ) {
var slideEvent = $ . Event ( Event . SLIDE , {
relatedTarget : relatedTarget ,
direction : directionalClassname
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . trigger ( slideEvent ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
return slideEvent ;
} ;
Carousel . prototype . _setActiveIndicatorElement = function _setActiveIndicatorElement ( element ) {
if ( this . _indicatorsElement ) {
$ ( this . _indicatorsElement ) . find ( Selector . ACTIVE ) . removeClass ( ClassName . ACTIVE ) ;
var nextIndicator = this . _indicatorsElement . children [ this . _getItemIndex ( element ) ] ;
if ( nextIndicator ) {
$ ( nextIndicator ) . addClass ( ClassName . ACTIVE ) ;
2016-06-23 09:21:57 +00:00
}
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . prototype . _slide = function _slide ( direction , element ) {
var _this3 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var activeElement = $ ( this . _element ) . find ( Selector . ACTIVE _ITEM ) [ 0 ] ;
var nextElement = element || activeElement && this . _getItemByDirection ( direction , activeElement ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var isCycling = Boolean ( this . _interval ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var directionalClassName = direction === Direction . NEXT ? ClassName . LEFT : ClassName . RIGHT ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( nextElement && $ ( nextElement ) . hasClass ( ClassName . ACTIVE ) ) {
this . _isSliding = false ;
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var slideEvent = this . _triggerSlideEvent ( nextElement , directionalClassName ) ;
if ( slideEvent . isDefaultPrevented ( ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! activeElement || ! nextElement ) {
// some weirdness is happening, so we bail
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _isSliding = true ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( isCycling ) {
this . pause ( ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _setActiveIndicatorElement ( nextElement ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var slidEvent = $ . Event ( Event . SLID , {
relatedTarget : nextElement ,
direction : directionalClassName
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( Util . supportsTransitionEnd ( ) && $ ( this . _element ) . hasClass ( ClassName . SLIDE ) ) {
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( nextElement ) . addClass ( direction ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Util . reflow ( nextElement ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( activeElement ) . addClass ( directionalClassName ) ;
$ ( nextElement ) . addClass ( directionalClassName ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( activeElement ) . one ( Util . TRANSITION _END , function ( ) {
$ ( nextElement ) . removeClass ( directionalClassName ) . removeClass ( direction ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( nextElement ) . addClass ( ClassName . ACTIVE ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( activeElement ) . removeClass ( ClassName . ACTIVE ) . removeClass ( direction ) . removeClass ( directionalClassName ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
_this3 . _isSliding = false ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
setTimeout ( function ( ) {
return $ ( _this3 . _element ) . trigger ( slidEvent ) ;
} , 0 ) ;
} ) . emulateTransitionEnd ( TRANSITION _DURATION ) ;
} else {
$ ( activeElement ) . removeClass ( ClassName . ACTIVE ) ;
$ ( nextElement ) . addClass ( ClassName . ACTIVE ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _isSliding = false ;
$ ( this . _element ) . trigger ( slidEvent ) ;
}
if ( isCycling ) {
this . cycle ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA _KEY ) ;
var _config = $ . extend ( { } , Default , $ ( this ) . data ( ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ( typeof config === 'undefined' ? 'undefined' : _typeof ( config ) ) === 'object' ) {
$ . extend ( _config , config ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var action = typeof config === 'string' ? config : _config . slide ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data ) {
data = new Carousel ( this , _config ) ;
$ ( this ) . data ( DATA _KEY , data ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( typeof config === 'number' ) {
data . to ( config ) ;
} else if ( typeof action === 'string' ) {
if ( data [ action ] === undefined ) {
throw new Error ( 'No method named "' + action + '"' ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
data [ action ] ( ) ;
} else if ( _config . interval ) {
data . pause ( ) ;
data . cycle ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . _dataApiClickHandler = function _dataApiClickHandler ( event ) {
var selector = Util . getSelectorFromElement ( this ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! selector ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var target = $ ( selector ) [ 0 ] ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! target || ! $ ( target ) . hasClass ( ClassName . CAROUSEL ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var config = $ . extend ( { } , $ ( target ) . data ( ) , $ ( this ) . data ( ) ) ;
var slideIndex = this . getAttribute ( 'data-slide-to' ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( slideIndex ) {
config . interval = false ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Carousel . _jQueryInterface . call ( $ ( target ) , config ) ;
if ( slideIndex ) {
$ ( target ) . data ( DATA _KEY ) . to ( slideIndex ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
event . preventDefault ( ) ;
} ;
_createClass ( Carousel , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
get : function get ( ) {
return VERSION ;
}
} , {
key : 'Default' ,
get : function get ( ) {
return Default ;
}
} ] ) ;
return Carousel ;
2016-10-20 13:30:35 +00:00
} ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ ( document ) . on ( Event . CLICK _DATA _API , Selector . DATA _SLIDE , Carousel . _dataApiClickHandler ) ;
2016-06-23 09:21:57 +00:00
$ ( window ) . on ( Event . LOAD _DATA _API , function ( ) {
$ ( Selector . DATA _RIDE ) . each ( function ( ) {
var $carousel = $ ( this ) ;
Carousel . _jQueryInterface . call ( $carousel , $carousel . data ( ) ) ;
} ) ;
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ NAME ] = Carousel . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Carousel ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Carousel . _jQueryInterface ;
} ;
return Carousel ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : collapse . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Collapse = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'collapse' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.collapse' ;
var EVENT _KEY = '.' + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var TRANSITION _DURATION = 600 ;
var Default = {
toggle : true ,
parent : ''
} ;
var DefaultType = {
toggle : 'boolean' ,
parent : 'string'
} ;
var Event = {
SHOW : 'show' + EVENT _KEY ,
SHOWN : 'shown' + EVENT _KEY ,
HIDE : 'hide' + EVENT _KEY ,
HIDDEN : 'hidden' + EVENT _KEY ,
CLICK _DATA _API : 'click' + EVENT _KEY + DATA _API _KEY
} ;
var ClassName = {
IN : 'in' ,
COLLAPSE : 'collapse' ,
COLLAPSING : 'collapsing' ,
COLLAPSED : 'collapsed'
} ;
var Dimension = {
WIDTH : 'width' ,
HEIGHT : 'height'
} ;
var Selector = {
2016-10-20 13:30:35 +00:00
ACTIVES : '.card > .in, .card > .collapsing' ,
2016-06-23 09:21:57 +00:00
DATA _TOGGLE : '[data-toggle="collapse"]'
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Collapse = function ( ) {
2016-06-23 09:21:57 +00:00
function Collapse ( element , config ) {
_classCallCheck ( this , Collapse ) ;
this . _isTransitioning = false ;
this . _element = element ;
this . _config = this . _getConfig ( config ) ;
this . _triggerArray = $ . makeArray ( $ ( '[data-toggle="collapse"][href="#' + element . id + '"],' + ( '[data-toggle="collapse"][data-target="#' + element . id + '"]' ) ) ) ;
this . _parent = this . _config . parent ? this . _getParent ( ) : null ;
if ( ! this . _config . parent ) {
this . _addAriaAndCollapsedClass ( this . _element , this . _triggerArray ) ;
}
if ( this . _config . toggle ) {
this . toggle ( ) ;
}
}
// getters
2016-10-20 13:30:35 +00:00
// public
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . prototype . toggle = function toggle ( ) {
if ( $ ( this . _element ) . hasClass ( ClassName . IN ) ) {
this . hide ( ) ;
} else {
this . show ( ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . prototype . show = function show ( ) {
var _this4 = this ;
if ( this . _isTransitioning || $ ( this . _element ) . hasClass ( ClassName . IN ) ) {
return ;
}
var actives = void 0 ;
var activesData = void 0 ;
if ( this . _parent ) {
actives = $ . makeArray ( $ ( Selector . ACTIVES ) ) ;
if ( ! actives . length ) {
actives = null ;
2016-06-23 09:21:57 +00:00
}
}
2016-10-20 13:30:35 +00:00
if ( actives ) {
activesData = $ ( actives ) . data ( DATA _KEY ) ;
if ( activesData && activesData . _isTransitioning ) {
2016-06-23 09:21:57 +00:00
return ;
}
2016-10-20 13:30:35 +00:00
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var startEvent = $ . Event ( Event . SHOW ) ;
$ ( this . _element ) . trigger ( startEvent ) ;
if ( startEvent . isDefaultPrevented ( ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( actives ) {
Collapse . _jQueryInterface . call ( $ ( actives ) , 'hide' ) ;
if ( ! activesData ) {
$ ( actives ) . data ( DATA _KEY , null ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var dimension = this . _getDimension ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . removeClass ( ClassName . COLLAPSE ) . addClass ( ClassName . COLLAPSING ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _element . style [ dimension ] = 0 ;
this . _element . setAttribute ( 'aria-expanded' , true ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . _triggerArray . length ) {
$ ( this . _triggerArray ) . removeClass ( ClassName . COLLAPSED ) . attr ( 'aria-expanded' , true ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . setTransitioning ( true ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var complete = function complete ( ) {
$ ( _this4 . _element ) . removeClass ( ClassName . COLLAPSING ) . addClass ( ClassName . COLLAPSE ) . addClass ( ClassName . IN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
_this4 . _element . style [ dimension ] = '' ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
_this4 . setTransitioning ( false ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( _this4 . _element ) . trigger ( Event . SHOWN ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! Util . supportsTransitionEnd ( ) ) {
complete ( ) ;
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var capitalizedDimension = dimension [ 0 ] . toUpperCase ( ) + dimension . slice ( 1 ) ;
var scrollSize = 'scroll' + capitalizedDimension ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . one ( Util . TRANSITION _END , complete ) . emulateTransitionEnd ( TRANSITION _DURATION ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _element . style [ dimension ] = this . _element [ scrollSize ] + 'px' ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . prototype . hide = function hide ( ) {
var _this5 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . _isTransitioning || ! $ ( this . _element ) . hasClass ( ClassName . IN ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var startEvent = $ . Event ( Event . HIDE ) ;
$ ( this . _element ) . trigger ( startEvent ) ;
if ( startEvent . isDefaultPrevented ( ) ) {
return ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
var dimension = this . _getDimension ( ) ;
var offsetDimension = dimension === Dimension . WIDTH ? 'offsetWidth' : 'offsetHeight' ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _element . style [ dimension ] = this . _element [ offsetDimension ] + 'px' ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Util . reflow ( this . _element ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . addClass ( ClassName . COLLAPSING ) . removeClass ( ClassName . COLLAPSE ) . removeClass ( ClassName . IN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _element . setAttribute ( 'aria-expanded' , false ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . _triggerArray . length ) {
$ ( this . _triggerArray ) . addClass ( ClassName . COLLAPSED ) . attr ( 'aria-expanded' , false ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . setTransitioning ( true ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var complete = function complete ( ) {
_this5 . setTransitioning ( false ) ;
$ ( _this5 . _element ) . removeClass ( ClassName . COLLAPSING ) . addClass ( ClassName . COLLAPSE ) . trigger ( Event . HIDDEN ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _element . style [ dimension ] = '' ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! Util . supportsTransitionEnd ( ) ) {
complete ( ) ;
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . one ( Util . TRANSITION _END , complete ) . emulateTransitionEnd ( TRANSITION _DURATION ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . prototype . setTransitioning = function setTransitioning ( isTransitioning ) {
this . _isTransitioning = isTransitioning ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . prototype . dispose = function dispose ( ) {
$ . removeData ( this . _element , DATA _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _config = null ;
this . _parent = null ;
this . _element = null ;
this . _triggerArray = null ;
this . _isTransitioning = null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// private
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . prototype . _getConfig = function _getConfig ( config ) {
config = $ . extend ( { } , Default , config ) ;
config . toggle = Boolean ( config . toggle ) ; // coerce string values
Util . typeCheckConfig ( NAME , config , DefaultType ) ;
return config ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . prototype . _getDimension = function _getDimension ( ) {
var hasWidth = $ ( this . _element ) . hasClass ( Dimension . WIDTH ) ;
return hasWidth ? Dimension . WIDTH : Dimension . HEIGHT ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . prototype . _getParent = function _getParent ( ) {
var _this6 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var parent = $ ( this . _config . parent ) [ 0 ] ;
var selector = '[data-toggle="collapse"][data-parent="' + this . _config . parent + '"]' ;
$ ( parent ) . find ( selector ) . each ( function ( i , element ) {
_this6 . _addAriaAndCollapsedClass ( Collapse . _getTargetFromElement ( element ) , [ element ] ) ;
} ) ;
return parent ;
} ;
Collapse . prototype . _addAriaAndCollapsedClass = function _addAriaAndCollapsedClass ( element , triggerArray ) {
if ( element ) {
var isOpen = $ ( element ) . hasClass ( ClassName . IN ) ;
element . setAttribute ( 'aria-expanded' , isOpen ) ;
if ( triggerArray . length ) {
$ ( triggerArray ) . toggleClass ( ClassName . COLLAPSED , ! isOpen ) . attr ( 'aria-expanded' , isOpen ) ;
2016-06-23 09:21:57 +00:00
}
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . _getTargetFromElement = function _getTargetFromElement ( element ) {
var selector = Util . getSelectorFromElement ( element ) ;
return selector ? $ ( selector ) [ 0 ] : null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Collapse . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $this = $ ( this ) ;
var data = $this . data ( DATA _KEY ) ;
var _config = $ . extend ( { } , Default , $this . data ( ) , ( typeof config === 'undefined' ? 'undefined' : _typeof ( config ) ) === 'object' && config ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data && _config . toggle && /show|hide/ . test ( config ) ) {
_config . toggle = false ;
}
if ( ! data ) {
data = new Collapse ( this , _config ) ;
$this . data ( DATA _KEY , data ) ;
}
if ( typeof config === 'string' ) {
if ( data [ config ] === undefined ) {
throw new Error ( 'No method named "' + config + '"' ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
data [ config ] ( ) ;
}
} ) ;
} ;
_createClass ( Collapse , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
get : function get ( ) {
return VERSION ;
}
} , {
key : 'Default' ,
get : function get ( ) {
return Default ;
}
} ] ) ;
return Collapse ;
2016-10-20 13:30:35 +00:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
$ ( document ) . on ( Event . CLICK _DATA _API , Selector . DATA _TOGGLE , function ( event ) {
event . preventDefault ( ) ;
var target = Collapse . _getTargetFromElement ( this ) ;
var data = $ ( target ) . data ( DATA _KEY ) ;
var config = data ? 'toggle' : $ ( this ) . data ( ) ;
Collapse . _jQueryInterface . call ( $ ( target ) , config ) ;
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ NAME ] = Collapse . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Collapse ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Collapse . _jQueryInterface ;
} ;
return Collapse ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : dropdown . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Dropdown = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'dropdown' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.dropdown' ;
var EVENT _KEY = '.' + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
2016-08-01 06:37:05 +00:00
var ESCAPE _KEYCODE = 27 ; // KeyboardEvent.which value for Escape (Esc) key
var ARROW _UP _KEYCODE = 38 ; // KeyboardEvent.which value for up arrow key
var ARROW _DOWN _KEYCODE = 40 ; // KeyboardEvent.which value for down arrow key
var RIGHT _MOUSE _BUTTON _WHICH = 3 ; // MouseEvent.which value for the right button (assuming a right-handed mouse)
2016-06-23 09:21:57 +00:00
var Event = {
HIDE : 'hide' + EVENT _KEY ,
HIDDEN : 'hidden' + EVENT _KEY ,
SHOW : 'show' + EVENT _KEY ,
SHOWN : 'shown' + EVENT _KEY ,
CLICK : 'click' + EVENT _KEY ,
CLICK _DATA _API : 'click' + EVENT _KEY + DATA _API _KEY ,
KEYDOWN _DATA _API : 'keydown' + EVENT _KEY + DATA _API _KEY
} ;
var ClassName = {
BACKDROP : 'dropdown-backdrop' ,
DISABLED : 'disabled' ,
OPEN : 'open'
} ;
var Selector = {
BACKDROP : '.dropdown-backdrop' ,
DATA _TOGGLE : '[data-toggle="dropdown"]' ,
FORM _CHILD : '.dropdown form' ,
ROLE _MENU : '[role="menu"]' ,
ROLE _LISTBOX : '[role="listbox"]' ,
NAVBAR _NAV : '.navbar-nav' ,
VISIBLE _ITEMS : '[role="menu"] li:not(.disabled) a, ' + '[role="listbox"] li:not(.disabled) a'
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Dropdown = function ( ) {
2016-06-23 09:21:57 +00:00
function Dropdown ( element ) {
_classCallCheck ( this , Dropdown ) ;
this . _element = element ;
this . _addEventListeners ( ) ;
}
// getters
2016-10-20 13:30:35 +00:00
// public
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Dropdown . prototype . toggle = function toggle ( ) {
if ( this . disabled || $ ( this ) . hasClass ( ClassName . DISABLED ) ) {
return false ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var parent = Dropdown . _getParentFromElement ( this ) ;
var isActive = $ ( parent ) . hasClass ( ClassName . OPEN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Dropdown . _clearMenus ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( isActive ) {
return false ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( 'ontouchstart' in document . documentElement && ! $ ( parent ) . closest ( Selector . NAVBAR _NAV ) . length ) {
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// if mobile we use a backdrop because click events don't delegate
var dropdown = document . createElement ( 'div' ) ;
dropdown . className = ClassName . BACKDROP ;
$ ( dropdown ) . insertBefore ( this ) ;
$ ( dropdown ) . on ( 'click' , Dropdown . _clearMenus ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var relatedTarget = { relatedTarget : this } ;
var showEvent = $ . Event ( Event . SHOW , relatedTarget ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( parent ) . trigger ( showEvent ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( showEvent . isDefaultPrevented ( ) ) {
return false ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . focus ( ) ;
this . setAttribute ( 'aria-expanded' , 'true' ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( parent ) . toggleClass ( ClassName . OPEN ) ;
$ ( parent ) . trigger ( $ . Event ( Event . SHOWN , relatedTarget ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
return false ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Dropdown . prototype . dispose = function dispose ( ) {
$ . removeData ( this . _element , DATA _KEY ) ;
$ ( this . _element ) . off ( EVENT _KEY ) ;
this . _element = null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// private
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Dropdown . prototype . _addEventListeners = function _addEventListeners ( ) {
$ ( this . _element ) . on ( Event . CLICK , this . toggle ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Dropdown . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data ) {
$ ( this ) . data ( DATA _KEY , data = new Dropdown ( this ) ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( typeof config === 'string' ) {
if ( data [ config ] === undefined ) {
throw new Error ( 'No method named "' + config + '"' ) ;
}
data [ config ] . call ( this ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Dropdown . _clearMenus = function _clearMenus ( event ) {
if ( event && event . which === RIGHT _MOUSE _BUTTON _WHICH ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var backdrop = $ ( Selector . BACKDROP ) [ 0 ] ;
if ( backdrop ) {
backdrop . parentNode . removeChild ( backdrop ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var toggles = $ . makeArray ( $ ( Selector . DATA _TOGGLE ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
for ( var i = 0 ; i < toggles . length ; i ++ ) {
var parent = Dropdown . _getParentFromElement ( toggles [ i ] ) ;
var relatedTarget = { relatedTarget : toggles [ i ] } ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! $ ( parent ) . hasClass ( ClassName . OPEN ) ) {
continue ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( event && event . type === 'click' && /input|textarea/i . test ( event . target . tagName ) && $ . contains ( parent , event . target ) ) {
continue ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var hideEvent = $ . Event ( Event . HIDE , relatedTarget ) ;
$ ( parent ) . trigger ( hideEvent ) ;
if ( hideEvent . isDefaultPrevented ( ) ) {
continue ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
toggles [ i ] . setAttribute ( 'aria-expanded' , 'false' ) ;
$ ( parent ) . removeClass ( ClassName . OPEN ) . trigger ( $ . Event ( Event . HIDDEN , relatedTarget ) ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Dropdown . _getParentFromElement = function _getParentFromElement ( element ) {
var parent = void 0 ;
var selector = Util . getSelectorFromElement ( element ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( selector ) {
parent = $ ( selector ) [ 0 ] ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
return parent || element . parentNode ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Dropdown . _dataApiKeydownHandler = function _dataApiKeydownHandler ( event ) {
if ( ! /(38|40|27|32)/ . test ( event . which ) || /input|textarea/i . test ( event . target . tagName ) ) {
return ;
}
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . disabled || $ ( this ) . hasClass ( ClassName . DISABLED ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var parent = Dropdown . _getParentFromElement ( this ) ;
var isActive = $ ( parent ) . hasClass ( ClassName . OPEN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! isActive && event . which !== ESCAPE _KEYCODE || isActive && event . which === ESCAPE _KEYCODE ) {
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( event . which === ESCAPE _KEYCODE ) {
var toggle = $ ( parent ) . find ( Selector . DATA _TOGGLE ) [ 0 ] ;
$ ( toggle ) . trigger ( 'focus' ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
$ ( this ) . trigger ( 'click' ) ;
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var items = $ . makeArray ( $ ( Selector . VISIBLE _ITEMS ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
items = items . filter ( function ( item ) {
return item . offsetWidth || item . offsetHeight ;
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! items . length ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var index = items . indexOf ( event . target ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( event . which === ARROW _UP _KEYCODE && index > 0 ) {
// up
index -- ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( event . which === ARROW _DOWN _KEYCODE && index < items . length - 1 ) {
// down
index ++ ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( index < 0 ) {
index = 0 ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
items [ index ] . focus ( ) ;
} ;
_createClass ( Dropdown , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
get : function get ( ) {
return VERSION ;
}
} ] ) ;
return Dropdown ;
2016-10-20 13:30:35 +00:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
$ ( document ) . on ( Event . KEYDOWN _DATA _API , Selector . DATA _TOGGLE , Dropdown . _dataApiKeydownHandler ) . on ( Event . KEYDOWN _DATA _API , Selector . ROLE _MENU , Dropdown . _dataApiKeydownHandler ) . on ( Event . KEYDOWN _DATA _API , Selector . ROLE _LISTBOX , Dropdown . _dataApiKeydownHandler ) . on ( Event . CLICK _DATA _API , Dropdown . _clearMenus ) . on ( Event . CLICK _DATA _API , Selector . DATA _TOGGLE , Dropdown . prototype . toggle ) . on ( Event . CLICK _DATA _API , Selector . FORM _CHILD , function ( e ) {
e . stopPropagation ( ) ;
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ NAME ] = Dropdown . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Dropdown ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Dropdown . _jQueryInterface ;
} ;
return Dropdown ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : modal . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Modal = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'modal' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.modal' ;
var EVENT _KEY = '.' + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var TRANSITION _DURATION = 300 ;
var BACKDROP _TRANSITION _DURATION = 150 ;
2016-08-01 06:37:05 +00:00
var ESCAPE _KEYCODE = 27 ; // KeyboardEvent.which value for Escape (Esc) key
2016-06-23 09:21:57 +00:00
var Default = {
backdrop : true ,
keyboard : true ,
focus : true ,
show : true
} ;
var DefaultType = {
backdrop : '(boolean|string)' ,
keyboard : 'boolean' ,
focus : 'boolean' ,
show : 'boolean'
} ;
var Event = {
HIDE : 'hide' + EVENT _KEY ,
HIDDEN : 'hidden' + EVENT _KEY ,
SHOW : 'show' + EVENT _KEY ,
SHOWN : 'shown' + EVENT _KEY ,
FOCUSIN : 'focusin' + EVENT _KEY ,
RESIZE : 'resize' + EVENT _KEY ,
CLICK _DISMISS : 'click.dismiss' + EVENT _KEY ,
KEYDOWN _DISMISS : 'keydown.dismiss' + EVENT _KEY ,
MOUSEUP _DISMISS : 'mouseup.dismiss' + EVENT _KEY ,
MOUSEDOWN _DISMISS : 'mousedown.dismiss' + EVENT _KEY ,
CLICK _DATA _API : 'click' + EVENT _KEY + DATA _API _KEY
} ;
var ClassName = {
SCROLLBAR _MEASURER : 'modal-scrollbar-measure' ,
BACKDROP : 'modal-backdrop' ,
OPEN : 'modal-open' ,
FADE : 'fade' ,
IN : 'in'
} ;
var Selector = {
DIALOG : '.modal-dialog' ,
DATA _TOGGLE : '[data-toggle="modal"]' ,
DATA _DISMISS : '[data-dismiss="modal"]' ,
FIXED _CONTENT : '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed'
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Modal = function ( ) {
2016-06-23 09:21:57 +00:00
function Modal ( element , config ) {
_classCallCheck ( this , Modal ) ;
this . _config = this . _getConfig ( config ) ;
this . _element = element ;
this . _dialog = $ ( element ) . find ( Selector . DIALOG ) [ 0 ] ;
this . _backdrop = null ;
this . _isShown = false ;
this . _isBodyOverflowing = false ;
this . _ignoreBackdropClick = false ;
this . _originalBodyPadding = 0 ;
this . _scrollbarWidth = 0 ;
}
// getters
2016-10-20 13:30:35 +00:00
// public
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Modal . prototype . toggle = function toggle ( relatedTarget ) {
return this . _isShown ? this . hide ( ) : this . show ( relatedTarget ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Modal . prototype . show = function show ( relatedTarget ) {
var _this7 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var showEvent = $ . Event ( Event . SHOW , {
relatedTarget : relatedTarget
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . trigger ( showEvent ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . _isShown || showEvent . isDefaultPrevented ( ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _isShown = true ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _checkScrollbar ( ) ;
this . _setScrollbar ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( document . body ) . addClass ( ClassName . OPEN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _setEscapeEvent ( ) ;
this . _setResizeEvent ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . on ( Event . CLICK _DISMISS , Selector . DATA _DISMISS , $ . proxy ( this . hide , this ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _dialog ) . on ( Event . MOUSEDOWN _DISMISS , function ( ) {
$ ( _this7 . _element ) . one ( Event . MOUSEUP _DISMISS , function ( event ) {
if ( $ ( event . target ) . is ( _this7 . _element ) ) {
_this7 . _ignoreBackdropClick = true ;
}
2016-06-23 09:21:57 +00:00
} ) ;
2016-10-20 13:30:35 +00:00
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _showBackdrop ( $ . proxy ( this . _showElement , this , relatedTarget ) ) ;
} ;
Modal . prototype . hide = function hide ( event ) {
if ( event ) {
event . preventDefault ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
var hideEvent = $ . Event ( Event . HIDE ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . trigger ( hideEvent ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! this . _isShown || hideEvent . isDefaultPrevented ( ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _isShown = false ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _setEscapeEvent ( ) ;
this . _setResizeEvent ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( document ) . off ( Event . FOCUSIN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . removeClass ( ClassName . IN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . off ( Event . CLICK _DISMISS ) ;
$ ( this . _dialog ) . off ( Event . MOUSEDOWN _DISMISS ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( Util . supportsTransitionEnd ( ) && $ ( this . _element ) . hasClass ( ClassName . FADE ) ) {
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . one ( Util . TRANSITION _END , $ . proxy ( this . _hideModal , this ) ) . emulateTransitionEnd ( TRANSITION _DURATION ) ;
} else {
this . _hideModal ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Modal . prototype . dispose = function dispose ( ) {
$ . removeData ( this . _element , DATA _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( window ) . off ( EVENT _KEY ) ;
$ ( document ) . off ( EVENT _KEY ) ;
$ ( this . _element ) . off ( EVENT _KEY ) ;
$ ( this . _backdrop ) . off ( EVENT _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _config = null ;
this . _element = null ;
this . _dialog = null ;
this . _backdrop = null ;
this . _isShown = null ;
this . _isBodyOverflowing = null ;
this . _ignoreBackdropClick = null ;
this . _originalBodyPadding = null ;
this . _scrollbarWidth = null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// private
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Modal . prototype . _getConfig = function _getConfig ( config ) {
config = $ . extend ( { } , Default , config ) ;
Util . typeCheckConfig ( NAME , config , DefaultType ) ;
return config ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Modal . prototype . _showElement = function _showElement ( relatedTarget ) {
var _this8 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var transition = Util . supportsTransitionEnd ( ) && $ ( this . _element ) . hasClass ( ClassName . FADE ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! this . _element . parentNode || this . _element . parentNode . nodeType !== Node . ELEMENT _NODE ) {
// don't move modals dom position
document . body . appendChild ( this . _element ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _element . style . display = 'block' ;
this . _element . removeAttribute ( 'aria-hidden' ) ;
this . _element . scrollTop = 0 ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( transition ) {
Util . reflow ( this . _element ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . addClass ( ClassName . IN ) ;
if ( this . _config . focus ) {
this . _enforceFocus ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
var shownEvent = $ . Event ( Event . SHOWN , {
relatedTarget : relatedTarget
} ) ;
var transitionComplete = function transitionComplete ( ) {
if ( _this8 . _config . focus ) {
_this8 . _element . focus ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
$ ( _this8 . _element ) . trigger ( shownEvent ) ;
} ;
if ( transition ) {
$ ( this . _dialog ) . one ( Util . TRANSITION _END , transitionComplete ) . emulateTransitionEnd ( TRANSITION _DURATION ) ;
} else {
transitionComplete ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
Modal . prototype . _enforceFocus = function _enforceFocus ( ) {
var _this9 = this ;
$ ( document ) . off ( Event . FOCUSIN ) // guard against infinite focus loop
. on ( Event . FOCUSIN , function ( event ) {
if ( document !== event . target && _this9 . _element !== event . target && ! $ ( _this9 . _element ) . has ( event . target ) . length ) {
_this9 . _element . focus ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ) ;
} ;
Modal . prototype . _setEscapeEvent = function _setEscapeEvent ( ) {
var _this10 = this ;
if ( this . _isShown && this . _config . keyboard ) {
$ ( this . _element ) . on ( Event . KEYDOWN _DISMISS , function ( event ) {
if ( event . which === ESCAPE _KEYCODE ) {
_this10 . hide ( ) ;
}
2016-06-23 09:21:57 +00:00
} ) ;
2016-10-20 13:30:35 +00:00
} else if ( ! this . _isShown ) {
$ ( this . _element ) . off ( Event . KEYDOWN _DISMISS ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
Modal . prototype . _setResizeEvent = function _setResizeEvent ( ) {
if ( this . _isShown ) {
$ ( window ) . on ( Event . RESIZE , $ . proxy ( this . _handleUpdate , this ) ) ;
} else {
$ ( window ) . off ( Event . RESIZE ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Modal . prototype . _hideModal = function _hideModal ( ) {
var _this11 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _element . style . display = 'none' ;
this . _element . setAttribute ( 'aria-hidden' , 'true' ) ;
this . _showBackdrop ( function ( ) {
$ ( document . body ) . removeClass ( ClassName . OPEN ) ;
_this11 . _resetAdjustments ( ) ;
_this11 . _resetScrollbar ( ) ;
$ ( _this11 . _element ) . trigger ( Event . HIDDEN ) ;
} ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Modal . prototype . _removeBackdrop = function _removeBackdrop ( ) {
if ( this . _backdrop ) {
$ ( this . _backdrop ) . remove ( ) ;
this . _backdrop = null ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Modal . prototype . _showBackdrop = function _showBackdrop ( callback ) {
var _this12 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var animate = $ ( this . _element ) . hasClass ( ClassName . FADE ) ? ClassName . FADE : '' ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . _isShown && this . _config . backdrop ) {
var doAnimate = Util . supportsTransitionEnd ( ) && animate ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _backdrop = document . createElement ( 'div' ) ;
this . _backdrop . className = ClassName . BACKDROP ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( animate ) {
$ ( this . _backdrop ) . addClass ( animate ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _backdrop ) . appendTo ( document . body ) ;
$ ( this . _element ) . on ( Event . CLICK _DISMISS , function ( event ) {
if ( _this12 . _ignoreBackdropClick ) {
_this12 . _ignoreBackdropClick = false ;
2016-06-23 09:21:57 +00:00
return ;
}
2016-10-20 13:30:35 +00:00
if ( event . target !== event . currentTarget ) {
2016-06-23 09:21:57 +00:00
return ;
}
2016-10-20 13:30:35 +00:00
if ( _this12 . _config . backdrop === 'static' ) {
_this12 . _element . focus ( ) ;
} else {
_this12 . hide ( ) ;
}
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( doAnimate ) {
Util . reflow ( this . _backdrop ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _backdrop ) . addClass ( ClassName . IN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! callback ) {
return ;
}
if ( ! doAnimate ) {
2016-06-23 09:21:57 +00:00
callback ( ) ;
2016-10-20 13:30:35 +00:00
return ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
$ ( this . _backdrop ) . one ( Util . TRANSITION _END , callback ) . emulateTransitionEnd ( BACKDROP _TRANSITION _DURATION ) ;
} else if ( ! this . _isShown && this . _backdrop ) {
$ ( this . _backdrop ) . removeClass ( ClassName . IN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var callbackRemove = function callbackRemove ( ) {
_this12 . _removeBackdrop ( ) ;
if ( callback ) {
callback ( ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( Util . supportsTransitionEnd ( ) && $ ( this . _element ) . hasClass ( ClassName . FADE ) ) {
$ ( this . _backdrop ) . one ( Util . TRANSITION _END , callbackRemove ) . emulateTransitionEnd ( BACKDROP _TRANSITION _DURATION ) ;
} else {
callbackRemove ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} else if ( callback ) {
callback ( ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// ----------------------------------------------------------------------
// the following methods are used to handle overflowing modals
// todo (fat): these should probably be refactored out of modal.js
// ----------------------------------------------------------------------
Modal . prototype . _handleUpdate = function _handleUpdate ( ) {
this . _adjustDialog ( ) ;
} ;
Modal . prototype . _adjustDialog = function _adjustDialog ( ) {
var isModalOverflowing = this . _element . scrollHeight > document . documentElement . clientHeight ;
if ( ! this . _isBodyOverflowing && isModalOverflowing ) {
this . _element . style . paddingLeft = this . _scrollbarWidth + 'px' ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( this . _isBodyOverflowing && ! isModalOverflowing ) {
this . _element . style . paddingRight = this . _scrollbarWidth + 'px' ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
Modal . prototype . _resetAdjustments = function _resetAdjustments ( ) {
this . _element . style . paddingLeft = '' ;
this . _element . style . paddingRight = '' ;
} ;
Modal . prototype . _checkScrollbar = function _checkScrollbar ( ) {
this . _isBodyOverflowing = document . body . clientWidth < window . innerWidth ;
this . _scrollbarWidth = this . _getScrollbarWidth ( ) ;
} ;
Modal . prototype . _setScrollbar = function _setScrollbar ( ) {
var bodyPadding = parseInt ( $ ( Selector . FIXED _CONTENT ) . css ( 'padding-right' ) || 0 , 10 ) ;
this . _originalBodyPadding = document . body . style . paddingRight || '' ;
if ( this . _isBodyOverflowing ) {
document . body . style . paddingRight = bodyPadding + this . _scrollbarWidth + 'px' ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
Modal . prototype . _resetScrollbar = function _resetScrollbar ( ) {
document . body . style . paddingRight = this . _originalBodyPadding ;
} ;
Modal . prototype . _getScrollbarWidth = function _getScrollbarWidth ( ) {
// thx d.walsh
var scrollDiv = document . createElement ( 'div' ) ;
scrollDiv . className = ClassName . SCROLLBAR _MEASURER ;
document . body . appendChild ( scrollDiv ) ;
var scrollbarWidth = scrollDiv . offsetWidth - scrollDiv . clientWidth ;
document . body . removeChild ( scrollDiv ) ;
return scrollbarWidth ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Modal . _jQueryInterface = function _jQueryInterface ( config , relatedTarget ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA _KEY ) ;
var _config = $ . extend ( { } , Modal . Default , $ ( this ) . data ( ) , ( typeof config === 'undefined' ? 'undefined' : _typeof ( config ) ) === 'object' && config ) ;
if ( ! data ) {
data = new Modal ( this , _config ) ;
$ ( this ) . data ( DATA _KEY , data ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( typeof config === 'string' ) {
if ( data [ config ] === undefined ) {
throw new Error ( 'No method named "' + config + '"' ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
data [ config ] ( relatedTarget ) ;
} else if ( _config . show ) {
data . show ( relatedTarget ) ;
}
} ) ;
} ;
_createClass ( Modal , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
get : function get ( ) {
return VERSION ;
}
} , {
key : 'Default' ,
get : function get ( ) {
return Default ;
}
} ] ) ;
return Modal ;
2016-10-20 13:30:35 +00:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
$ ( document ) . on ( Event . CLICK _DATA _API , Selector . DATA _TOGGLE , function ( event ) {
var _this13 = this ;
2016-10-20 13:30:35 +00:00
var target = void 0 ;
2016-06-23 09:21:57 +00:00
var selector = Util . getSelectorFromElement ( this ) ;
if ( selector ) {
target = $ ( selector ) [ 0 ] ;
}
var config = $ ( target ) . data ( DATA _KEY ) ? 'toggle' : $ . extend ( { } , $ ( target ) . data ( ) , $ ( this ) . data ( ) ) ;
if ( this . tagName === 'A' ) {
event . preventDefault ( ) ;
}
var $target = $ ( target ) . one ( Event . SHOW , function ( showEvent ) {
if ( showEvent . isDefaultPrevented ( ) ) {
// only register focus restorer if modal will actually get shown
return ;
}
$target . one ( Event . HIDDEN , function ( ) {
if ( $ ( _this13 ) . is ( ':visible' ) ) {
_this13 . focus ( ) ;
}
} ) ;
} ) ;
Modal . _jQueryInterface . call ( $ ( target ) , config , this ) ;
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ NAME ] = Modal . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Modal ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Modal . _jQueryInterface ;
} ;
return Modal ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : scrollspy . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var ScrollSpy = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'scrollspy' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.scrollspy' ;
var EVENT _KEY = '.' + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var Default = {
offset : 10 ,
method : 'auto' ,
target : ''
} ;
var DefaultType = {
offset : 'number' ,
method : 'string' ,
target : '(string|element)'
} ;
var Event = {
ACTIVATE : 'activate' + EVENT _KEY ,
SCROLL : 'scroll' + EVENT _KEY ,
LOAD _DATA _API : 'load' + EVENT _KEY + DATA _API _KEY
} ;
var ClassName = {
DROPDOWN _ITEM : 'dropdown-item' ,
DROPDOWN _MENU : 'dropdown-menu' ,
NAV _LINK : 'nav-link' ,
NAV : 'nav' ,
ACTIVE : 'active'
} ;
var Selector = {
DATA _SPY : '[data-spy="scroll"]' ,
ACTIVE : '.active' ,
LIST _ITEM : '.list-item' ,
LI : 'li' ,
LI _DROPDOWN : 'li.dropdown' ,
NAV _LINKS : '.nav-link' ,
DROPDOWN : '.dropdown' ,
DROPDOWN _ITEMS : '.dropdown-item' ,
DROPDOWN _TOGGLE : '.dropdown-toggle'
} ;
var OffsetMethod = {
OFFSET : 'offset' ,
POSITION : 'position'
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var ScrollSpy = function ( ) {
2016-06-23 09:21:57 +00:00
function ScrollSpy ( element , config ) {
_classCallCheck ( this , ScrollSpy ) ;
this . _element = element ;
this . _scrollElement = element . tagName === 'BODY' ? window : element ;
this . _config = this . _getConfig ( config ) ;
this . _selector = this . _config . target + ' ' + Selector . NAV _LINKS + ',' + ( this . _config . target + ' ' + Selector . DROPDOWN _ITEMS ) ;
this . _offsets = [ ] ;
this . _targets = [ ] ;
this . _activeTarget = null ;
this . _scrollHeight = 0 ;
$ ( this . _scrollElement ) . on ( Event . SCROLL , $ . proxy ( this . _process , this ) ) ;
this . refresh ( ) ;
this . _process ( ) ;
}
// getters
2016-10-20 13:30:35 +00:00
// public
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
ScrollSpy . prototype . refresh = function refresh ( ) {
var _this14 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var autoMethod = this . _scrollElement !== this . _scrollElement . window ? OffsetMethod . POSITION : OffsetMethod . OFFSET ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var offsetMethod = this . _config . method === 'auto' ? autoMethod : this . _config . method ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var offsetBase = offsetMethod === OffsetMethod . POSITION ? this . _getScrollTop ( ) : 0 ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _offsets = [ ] ;
this . _targets = [ ] ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _scrollHeight = this . _getScrollHeight ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var targets = $ . makeArray ( $ ( this . _selector ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
targets . map ( function ( element ) {
var target = void 0 ;
var targetSelector = Util . getSelectorFromElement ( element ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( targetSelector ) {
target = $ ( targetSelector ) [ 0 ] ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( target && ( target . offsetWidth || target . offsetHeight ) ) {
// todo (fat): remove sketch reliance on jQuery position/offset
return [ $ ( target ) [ offsetMethod ] ( ) . top + offsetBase , targetSelector ] ;
}
return null ;
} ) . filter ( function ( item ) {
return item ;
} ) . sort ( function ( a , b ) {
return a [ 0 ] - b [ 0 ] ;
} ) . forEach ( function ( item ) {
_this14 . _offsets . push ( item [ 0 ] ) ;
_this14 . _targets . push ( item [ 1 ] ) ;
} ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
ScrollSpy . prototype . dispose = function dispose ( ) {
$ . removeData ( this . _element , DATA _KEY ) ;
$ ( this . _scrollElement ) . off ( EVENT _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _element = null ;
this . _scrollElement = null ;
this . _config = null ;
this . _selector = null ;
this . _offsets = null ;
this . _targets = null ;
this . _activeTarget = null ;
this . _scrollHeight = null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// private
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
ScrollSpy . prototype . _getConfig = function _getConfig ( config ) {
config = $ . extend ( { } , Default , config ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( typeof config . target !== 'string' ) {
var id = $ ( config . target ) . attr ( 'id' ) ;
if ( ! id ) {
id = Util . getUID ( NAME ) ;
$ ( config . target ) . attr ( 'id' , id ) ;
}
config . target = '#' + id ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
Util . typeCheckConfig ( NAME , config , DefaultType ) ;
return config ;
} ;
ScrollSpy . prototype . _getScrollTop = function _getScrollTop ( ) {
return this . _scrollElement === window ? this . _scrollElement . scrollY : this . _scrollElement . scrollTop ;
} ;
ScrollSpy . prototype . _getScrollHeight = function _getScrollHeight ( ) {
return this . _scrollElement . scrollHeight || Math . max ( document . body . scrollHeight , document . documentElement . scrollHeight ) ;
} ;
ScrollSpy . prototype . _process = function _process ( ) {
var scrollTop = this . _getScrollTop ( ) + this . _config . offset ;
var scrollHeight = this . _getScrollHeight ( ) ;
var maxScroll = this . _config . offset + scrollHeight - this . _scrollElement . offsetHeight ;
if ( this . _scrollHeight !== scrollHeight ) {
this . refresh ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( scrollTop >= maxScroll ) {
var target = this . _targets [ this . _targets . length - 1 ] ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . _activeTarget !== target ) {
this . _activate ( target ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . _activeTarget && scrollTop < this . _offsets [ 0 ] ) {
this . _activeTarget = null ;
this . _clear ( ) ;
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
for ( var i = this . _offsets . length ; i -- ; ) {
var isActiveTarget = this . _activeTarget !== this . _targets [ i ] && scrollTop >= this . _offsets [ i ] && ( this . _offsets [ i + 1 ] === undefined || scrollTop < this . _offsets [ i + 1 ] ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( isActiveTarget ) {
this . _activate ( this . _targets [ i ] ) ;
2016-06-23 09:21:57 +00:00
}
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
ScrollSpy . prototype . _activate = function _activate ( target ) {
this . _activeTarget = target ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _clear ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var queries = this . _selector . split ( ',' ) ;
queries = queries . map ( function ( selector ) {
return selector + '[data-target="' + target + '"],' + ( selector + '[href="' + target + '"]' ) ;
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var $link = $ ( queries . join ( ',' ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( $link . hasClass ( ClassName . DROPDOWN _ITEM ) ) {
$link . closest ( Selector . DROPDOWN ) . find ( Selector . DROPDOWN _TOGGLE ) . addClass ( ClassName . ACTIVE ) ;
$link . addClass ( ClassName . ACTIVE ) ;
} else {
// todo (fat) this is kinda sus...
// recursively add actives to tested nav-links
$link . parents ( Selector . LI ) . find ( Selector . NAV _LINKS ) . addClass ( ClassName . ACTIVE ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
$ ( this . _scrollElement ) . trigger ( Event . ACTIVATE , {
relatedTarget : target
} ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
ScrollSpy . prototype . _clear = function _clear ( ) {
$ ( this . _selector ) . filter ( Selector . ACTIVE ) . removeClass ( ClassName . ACTIVE ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
ScrollSpy . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA _KEY ) ;
var _config = ( typeof config === 'undefined' ? 'undefined' : _typeof ( config ) ) === 'object' && config || null ;
if ( ! data ) {
data = new ScrollSpy ( this , _config ) ;
$ ( this ) . data ( DATA _KEY , data ) ;
}
if ( typeof config === 'string' ) {
if ( data [ config ] === undefined ) {
throw new Error ( 'No method named "' + config + '"' ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
data [ config ] ( ) ;
}
} ) ;
} ;
_createClass ( ScrollSpy , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
get : function get ( ) {
return VERSION ;
}
} , {
key : 'Default' ,
get : function get ( ) {
return Default ;
}
} ] ) ;
return ScrollSpy ;
2016-10-20 13:30:35 +00:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
$ ( window ) . on ( Event . LOAD _DATA _API , function ( ) {
var scrollSpys = $ . makeArray ( $ ( Selector . DATA _SPY ) ) ;
for ( var i = scrollSpys . length ; i -- ; ) {
var $spy = $ ( scrollSpys [ i ] ) ;
ScrollSpy . _jQueryInterface . call ( $spy , $spy . data ( ) ) ;
}
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ NAME ] = ScrollSpy . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = ScrollSpy ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return ScrollSpy . _jQueryInterface ;
} ;
return ScrollSpy ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : tab . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Tab = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'tab' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.tab' ;
var EVENT _KEY = '.' + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var TRANSITION _DURATION = 150 ;
var Event = {
HIDE : 'hide' + EVENT _KEY ,
HIDDEN : 'hidden' + EVENT _KEY ,
SHOW : 'show' + EVENT _KEY ,
SHOWN : 'shown' + EVENT _KEY ,
CLICK _DATA _API : 'click' + EVENT _KEY + DATA _API _KEY
} ;
var ClassName = {
DROPDOWN _MENU : 'dropdown-menu' ,
ACTIVE : 'active' ,
FADE : 'fade' ,
IN : 'in'
} ;
var Selector = {
A : 'a' ,
LI : 'li' ,
DROPDOWN : '.dropdown' ,
UL : 'ul:not(.dropdown-menu)' ,
FADE _CHILD : '> .nav-item .fade, > .fade' ,
ACTIVE : '.active' ,
ACTIVE _CHILD : '> .nav-item > .active, > .active' ,
DATA _TOGGLE : '[data-toggle="tab"], [data-toggle="pill"]' ,
DROPDOWN _TOGGLE : '.dropdown-toggle' ,
DROPDOWN _ACTIVE _CHILD : '> .dropdown-menu .active'
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Tab = function ( ) {
2016-06-23 09:21:57 +00:00
function Tab ( element ) {
_classCallCheck ( this , Tab ) ;
this . _element = element ;
}
// getters
2016-10-20 13:30:35 +00:00
// public
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tab . prototype . show = function show ( ) {
var _this15 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . _element . parentNode && this . _element . parentNode . nodeType === Node . ELEMENT _NODE && $ ( this . _element ) . hasClass ( ClassName . ACTIVE ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var target = void 0 ;
var previous = void 0 ;
var ulElement = $ ( this . _element ) . closest ( Selector . UL ) [ 0 ] ;
var selector = Util . getSelectorFromElement ( this . _element ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ulElement ) {
previous = $ . makeArray ( $ ( ulElement ) . find ( Selector . ACTIVE ) ) ;
previous = previous [ previous . length - 1 ] ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var hideEvent = $ . Event ( Event . HIDE , {
relatedTarget : this . _element
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var showEvent = $ . Event ( Event . SHOW , {
relatedTarget : previous
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( previous ) {
$ ( previous ) . trigger ( hideEvent ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . _element ) . trigger ( showEvent ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( showEvent . isDefaultPrevented ( ) || hideEvent . isDefaultPrevented ( ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( selector ) {
target = $ ( selector ) [ 0 ] ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _activate ( this . _element , ulElement ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var complete = function complete ( ) {
var hiddenEvent = $ . Event ( Event . HIDDEN , {
relatedTarget : _this15 . _element
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var shownEvent = $ . Event ( Event . SHOWN , {
relatedTarget : previous
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( previous ) . trigger ( hiddenEvent ) ;
$ ( _this15 . _element ) . trigger ( shownEvent ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( target ) {
this . _activate ( target , target . parentNode , complete ) ;
} else {
complete ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tab . prototype . dispose = function dispose ( ) {
$ . removeClass ( this . _element , DATA _KEY ) ;
this . _element = null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// private
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tab . prototype . _activate = function _activate ( element , container , callback ) {
var active = $ ( container ) . find ( Selector . ACTIVE _CHILD ) [ 0 ] ;
var isTransitioning = callback && Util . supportsTransitionEnd ( ) && ( active && $ ( active ) . hasClass ( ClassName . FADE ) || Boolean ( $ ( container ) . find ( Selector . FADE _CHILD ) [ 0 ] ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var complete = $ . proxy ( this . _transitionComplete , this , element , active , isTransitioning , callback ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( active && isTransitioning ) {
$ ( active ) . one ( Util . TRANSITION _END , complete ) . emulateTransitionEnd ( TRANSITION _DURATION ) ;
} else {
complete ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( active ) {
$ ( active ) . removeClass ( ClassName . IN ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tab . prototype . _transitionComplete = function _transitionComplete ( element , active , isTransitioning , callback ) {
if ( active ) {
$ ( active ) . removeClass ( ClassName . ACTIVE ) ;
var dropdownChild = $ ( active ) . find ( Selector . DROPDOWN _ACTIVE _CHILD ) [ 0 ] ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( dropdownChild ) {
$ ( dropdownChild ) . removeClass ( ClassName . ACTIVE ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
active . setAttribute ( 'aria-expanded' , false ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( element ) . addClass ( ClassName . ACTIVE ) ;
element . setAttribute ( 'aria-expanded' , true ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( isTransitioning ) {
Util . reflow ( element ) ;
$ ( element ) . addClass ( ClassName . IN ) ;
} else {
$ ( element ) . removeClass ( ClassName . FADE ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( element . parentNode && $ ( element . parentNode ) . hasClass ( ClassName . DROPDOWN _MENU ) ) {
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var dropdownElement = $ ( element ) . closest ( Selector . DROPDOWN ) [ 0 ] ;
if ( dropdownElement ) {
$ ( dropdownElement ) . find ( Selector . DROPDOWN _TOGGLE ) . addClass ( ClassName . ACTIVE ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
element . setAttribute ( 'aria-expanded' , true ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
if ( callback ) {
callback ( ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tab . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $this = $ ( this ) ;
var data = $this . data ( DATA _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data ) {
data = data = new Tab ( this ) ;
$this . data ( DATA _KEY , data ) ;
}
if ( typeof config === 'string' ) {
if ( data [ config ] === undefined ) {
throw new Error ( 'No method named "' + config + '"' ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
data [ config ] ( ) ;
}
} ) ;
} ;
_createClass ( Tab , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
get : function get ( ) {
return VERSION ;
}
} ] ) ;
return Tab ;
2016-10-20 13:30:35 +00:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
$ ( document ) . on ( Event . CLICK _DATA _API , Selector . DATA _TOGGLE , function ( event ) {
event . preventDefault ( ) ;
Tab . _jQueryInterface . call ( $ ( this ) , 'show' ) ;
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ NAME ] = Tab . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Tab ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Tab . _jQueryInterface ;
} ;
return Tab ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/* global Tether */
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : tooltip . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Tooltip = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* Check for Tether dependency
2016-10-20 13:30:35 +00:00
* Tether - http : //tether.io/
2016-06-23 09:21:57 +00:00
* /
if ( window . Tether === undefined ) {
2016-10-20 13:30:35 +00:00
throw new Error ( 'Bootstrap tooltips require Tether (http://tether.io/)' ) ;
2016-06-23 09:21:57 +00:00
}
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'tooltip' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.tooltip' ;
var EVENT _KEY = '.' + DATA _KEY ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var TRANSITION _DURATION = 150 ;
var CLASS _PREFIX = 'bs-tether' ;
var Default = {
animation : true ,
2016-10-20 13:30:35 +00:00
template : '<div class="tooltip" role="tooltip">' + '<div class="tooltip-inner"></div></div>' ,
2016-06-23 09:21:57 +00:00
trigger : 'hover focus' ,
title : '' ,
delay : 0 ,
html : false ,
selector : false ,
placement : 'top' ,
offset : '0 0' ,
constraints : [ ]
} ;
var DefaultType = {
animation : 'boolean' ,
template : 'string' ,
title : '(string|element|function)' ,
trigger : 'string' ,
delay : '(number|object)' ,
html : 'boolean' ,
selector : '(string|boolean)' ,
placement : '(string|function)' ,
offset : 'string' ,
constraints : 'array'
} ;
var AttachmentMap = {
TOP : 'bottom center' ,
RIGHT : 'middle left' ,
BOTTOM : 'top center' ,
LEFT : 'middle right'
} ;
var HoverState = {
IN : 'in' ,
OUT : 'out'
} ;
var Event = {
HIDE : 'hide' + EVENT _KEY ,
HIDDEN : 'hidden' + EVENT _KEY ,
SHOW : 'show' + EVENT _KEY ,
SHOWN : 'shown' + EVENT _KEY ,
INSERTED : 'inserted' + EVENT _KEY ,
CLICK : 'click' + EVENT _KEY ,
FOCUSIN : 'focusin' + EVENT _KEY ,
FOCUSOUT : 'focusout' + EVENT _KEY ,
MOUSEENTER : 'mouseenter' + EVENT _KEY ,
MOUSELEAVE : 'mouseleave' + EVENT _KEY
} ;
var ClassName = {
FADE : 'fade' ,
IN : 'in'
} ;
var Selector = {
TOOLTIP : '.tooltip' ,
TOOLTIP _INNER : '.tooltip-inner'
} ;
var TetherClass = {
element : false ,
enabled : false
} ;
var Trigger = {
HOVER : 'hover' ,
FOCUS : 'focus' ,
CLICK : 'click' ,
MANUAL : 'manual'
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Tooltip = function ( ) {
2016-06-23 09:21:57 +00:00
function Tooltip ( element , config ) {
_classCallCheck ( this , Tooltip ) ;
// private
this . _isEnabled = true ;
this . _timeout = 0 ;
this . _hoverState = '' ;
this . _activeTrigger = { } ;
this . _tether = null ;
// protected
this . element = element ;
this . config = this . _getConfig ( config ) ;
this . tip = null ;
this . _setListeners ( ) ;
}
// getters
2016-10-20 13:30:35 +00:00
// public
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . enable = function enable ( ) {
this . _isEnabled = true ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . disable = function disable ( ) {
this . _isEnabled = false ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . toggleEnabled = function toggleEnabled ( ) {
this . _isEnabled = ! this . _isEnabled ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . toggle = function toggle ( event ) {
if ( event ) {
var dataKey = this . constructor . DATA _KEY ;
var context = $ ( event . currentTarget ) . data ( dataKey ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! context ) {
context = new this . constructor ( event . currentTarget , this . _getDelegateConfig ( ) ) ;
$ ( event . currentTarget ) . data ( dataKey , context ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
context . _activeTrigger . click = ! context . _activeTrigger . click ;
if ( context . _isWithActiveTrigger ( ) ) {
context . _enter ( null , context ) ;
} else {
context . _leave ( null , context ) ;
}
} else {
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( $ ( this . getTipElement ( ) ) . hasClass ( ClassName . IN ) ) {
this . _leave ( null , this ) ;
return ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
this . _enter ( null , this ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . dispose = function dispose ( ) {
clearTimeout ( this . _timeout ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . cleanupTether ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ . removeData ( this . element , this . constructor . DATA _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . element ) . off ( this . constructor . EVENT _KEY ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . tip ) {
$ ( this . tip ) . remove ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
this . _isEnabled = null ;
this . _timeout = null ;
this . _hoverState = null ;
this . _activeTrigger = null ;
this . _tether = null ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . element = null ;
this . config = null ;
this . tip = null ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . show = function show ( ) {
var _this16 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var showEvent = $ . Event ( this . constructor . Event . SHOW ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . isWithContent ( ) && this . _isEnabled ) {
$ ( this . element ) . trigger ( showEvent ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var isInTheDom = $ . contains ( this . element . ownerDocument . documentElement , this . element ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( showEvent . isDefaultPrevented ( ) || ! isInTheDom ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var tip = this . getTipElement ( ) ;
var tipId = Util . getUID ( this . constructor . NAME ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
tip . setAttribute ( 'id' , tipId ) ;
this . element . setAttribute ( 'aria-describedby' , tipId ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . setContent ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( this . config . animation ) {
$ ( tip ) . addClass ( ClassName . FADE ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var placement = typeof this . config . placement === 'function' ? this . config . placement . call ( this , tip , this . element ) : this . config . placement ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var attachment = this . _getAttachment ( placement ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( tip ) . data ( this . constructor . DATA _KEY , this ) . appendTo ( document . body ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . element ) . trigger ( this . constructor . Event . INSERTED ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . _tether = new Tether ( {
attachment : attachment ,
element : tip ,
target : this . element ,
classes : TetherClass ,
classPrefix : CLASS _PREFIX ,
offset : this . config . offset ,
constraints : this . config . constraints ,
addTargetClasses : false
} ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Util . reflow ( tip ) ;
this . _tether . position ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( tip ) . addClass ( ClassName . IN ) ;
2016-06-23 09:21:57 +00:00
var complete = function complete ( ) {
2016-10-20 13:30:35 +00:00
var prevHoverState = _this16 . _hoverState ;
_this16 . _hoverState = null ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( _this16 . element ) . trigger ( _this16 . constructor . Event . SHOWN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( prevHoverState === HoverState . OUT ) {
_this16 . _leave ( null , _this16 ) ;
2016-06-23 09:21:57 +00:00
}
} ;
2016-10-20 13:30:35 +00:00
if ( Util . supportsTransitionEnd ( ) && $ ( this . tip ) . hasClass ( ClassName . FADE ) ) {
$ ( this . tip ) . one ( Util . TRANSITION _END , complete ) . emulateTransitionEnd ( Tooltip . _TRANSITION _DURATION ) ;
2016-06-23 09:21:57 +00:00
return ;
}
2016-10-20 13:30:35 +00:00
complete ( ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . hide = function hide ( callback ) {
var _this17 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var tip = this . getTipElement ( ) ;
var hideEvent = $ . Event ( this . constructor . Event . HIDE ) ;
var complete = function complete ( ) {
if ( _this17 . _hoverState !== HoverState . IN && tip . parentNode ) {
tip . parentNode . removeChild ( tip ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
_this17 . element . removeAttribute ( 'aria-describedby' ) ;
$ ( _this17 . element ) . trigger ( _this17 . constructor . Event . HIDDEN ) ;
_this17 . cleanupTether ( ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( callback ) {
callback ( ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( this . element ) . trigger ( hideEvent ) ;
if ( hideEvent . isDefaultPrevented ( ) ) {
return ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
$ ( tip ) . removeClass ( ClassName . IN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( Util . supportsTransitionEnd ( ) && $ ( this . tip ) . hasClass ( ClassName . FADE ) ) {
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$ ( tip ) . one ( Util . TRANSITION _END , complete ) . emulateTransitionEnd ( TRANSITION _DURATION ) ;
} else {
complete ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
this . _hoverState = '' ;
} ;
// protected
Tooltip . prototype . isWithContent = function isWithContent ( ) {
return Boolean ( this . getTitle ( ) ) ;
} ;
Tooltip . prototype . getTipElement = function getTipElement ( ) {
return this . tip = this . tip || $ ( this . config . template ) [ 0 ] ;
} ;
Tooltip . prototype . setContent = function setContent ( ) {
var $tip = $ ( this . getTipElement ( ) ) ;
this . setElementContent ( $tip . find ( Selector . TOOLTIP _INNER ) , this . getTitle ( ) ) ;
$tip . removeClass ( ClassName . FADE ) . removeClass ( ClassName . IN ) ;
this . cleanupTether ( ) ;
} ;
Tooltip . prototype . setElementContent = function setElementContent ( $element , content ) {
var html = this . config . html ;
if ( ( typeof content === 'undefined' ? 'undefined' : _typeof ( content ) ) === 'object' && ( content . nodeType || content . jquery ) ) {
// content is a DOM node or a jQuery
if ( html ) {
if ( ! $ ( content ) . parent ( ) . is ( $element ) ) {
$element . empty ( ) . append ( content ) ;
2016-06-23 09:21:57 +00:00
}
} else {
2016-10-20 13:30:35 +00:00
$element . text ( $ ( content ) . text ( ) ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} else {
$element [ html ? 'html' : 'text' ] ( content ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . getTitle = function getTitle ( ) {
var title = this . element . getAttribute ( 'data-original-title' ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! title ) {
title = typeof this . config . title === 'function' ? this . config . title . call ( this . element ) : this . config . title ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
return title ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . cleanupTether = function cleanupTether ( ) {
if ( this . _tether ) {
this . _tether . destroy ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// private
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . _getAttachment = function _getAttachment ( placement ) {
return AttachmentMap [ placement . toUpperCase ( ) ] ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . _setListeners = function _setListeners ( ) {
var _this18 = this ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
var triggers = this . config . trigger . split ( ' ' ) ;
triggers . forEach ( function ( trigger ) {
if ( trigger === 'click' ) {
$ ( _this18 . element ) . on ( _this18 . constructor . Event . CLICK , _this18 . config . selector , $ . proxy ( _this18 . toggle , _this18 ) ) ;
} else if ( trigger !== Trigger . MANUAL ) {
var eventIn = trigger === Trigger . HOVER ? _this18 . constructor . Event . MOUSEENTER : _this18 . constructor . Event . FOCUSIN ;
var eventOut = trigger === Trigger . HOVER ? _this18 . constructor . Event . MOUSELEAVE : _this18 . constructor . Event . FOCUSOUT ;
$ ( _this18 . element ) . on ( eventIn , _this18 . config . selector , $ . proxy ( _this18 . _enter , _this18 ) ) . on ( eventOut , _this18 . config . selector , $ . proxy ( _this18 . _leave , _this18 ) ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ) ;
if ( this . config . selector ) {
this . config = $ . extend ( { } , this . config , {
trigger : 'manual' ,
selector : ''
} ) ;
} else {
this . _fixTitle ( ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . _fixTitle = function _fixTitle ( ) {
var titleType = _typeof ( this . element . getAttribute ( 'data-original-title' ) ) ;
if ( this . element . getAttribute ( 'title' ) || titleType !== 'string' ) {
this . element . setAttribute ( 'data-original-title' , this . element . getAttribute ( 'title' ) || '' ) ;
this . element . setAttribute ( 'title' , '' ) ;
}
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . _enter = function _enter ( event , context ) {
var dataKey = this . constructor . DATA _KEY ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
context = context || $ ( event . currentTarget ) . data ( dataKey ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! context ) {
context = new this . constructor ( event . currentTarget , this . _getDelegateConfig ( ) ) ;
$ ( event . currentTarget ) . data ( dataKey , context ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( event ) {
context . _activeTrigger [ event . type === 'focusin' ? Trigger . FOCUS : Trigger . HOVER ] = true ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( $ ( context . getTipElement ( ) ) . hasClass ( ClassName . IN ) || context . _hoverState === HoverState . IN ) {
2016-06-23 09:21:57 +00:00
context . _hoverState = HoverState . IN ;
2016-10-20 13:30:35 +00:00
return ;
}
clearTimeout ( context . _timeout ) ;
context . _hoverState = HoverState . IN ;
if ( ! context . config . delay || ! context . config . delay . show ) {
context . show ( ) ;
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
context . _timeout = setTimeout ( function ( ) {
if ( context . _hoverState === HoverState . IN ) {
2016-06-23 09:21:57 +00:00
context . show ( ) ;
}
2016-10-20 13:30:35 +00:00
} , context . config . delay . show ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . _leave = function _leave ( event , context ) {
var dataKey = this . constructor . DATA _KEY ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
context = context || $ ( event . currentTarget ) . data ( dataKey ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! context ) {
context = new this . constructor ( event . currentTarget , this . _getDelegateConfig ( ) ) ;
$ ( event . currentTarget ) . data ( dataKey , context ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( event ) {
context . _activeTrigger [ event . type === 'focusout' ? Trigger . FOCUS : Trigger . HOVER ] = false ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( context . _isWithActiveTrigger ( ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
clearTimeout ( context . _timeout ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
context . _hoverState = HoverState . OUT ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! context . config . delay || ! context . config . delay . hide ) {
context . hide ( ) ;
return ;
}
context . _timeout = setTimeout ( function ( ) {
if ( context . _hoverState === HoverState . OUT ) {
2016-06-23 09:21:57 +00:00
context . hide ( ) ;
}
2016-10-20 13:30:35 +00:00
} , context . config . delay . hide ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . prototype . _isWithActiveTrigger = function _isWithActiveTrigger ( ) {
for ( var trigger in this . _activeTrigger ) {
if ( this . _activeTrigger [ trigger ] ) {
return true ;
2016-06-23 09:21:57 +00:00
}
}
2016-10-20 13:30:35 +00:00
return false ;
} ;
Tooltip . prototype . _getConfig = function _getConfig ( config ) {
config = $ . extend ( { } , this . constructor . Default , $ ( this . element ) . data ( ) , config ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( config . delay && typeof config . delay === 'number' ) {
config . delay = {
show : config . delay ,
hide : config . delay
} ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
Util . typeCheckConfig ( NAME , config , this . constructor . DefaultType ) ;
return config ;
} ;
Tooltip . prototype . _getDelegateConfig = function _getDelegateConfig ( ) {
var config = { } ;
if ( this . config ) {
for ( var key in this . config ) {
if ( this . constructor . Default [ key ] !== this . config [ key ] ) {
config [ key ] = this . config [ key ] ;
2016-06-23 09:21:57 +00:00
}
}
}
2016-10-20 13:30:35 +00:00
return config ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Tooltip . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA _KEY ) ;
var _config = ( typeof config === 'undefined' ? 'undefined' : _typeof ( config ) ) === 'object' ? config : null ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data && /dispose|hide/ . test ( config ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data ) {
data = new Tooltip ( this , _config ) ;
$ ( this ) . data ( DATA _KEY , data ) ;
}
if ( typeof config === 'string' ) {
if ( data [ config ] === undefined ) {
throw new Error ( 'No method named "' + config + '"' ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
data [ config ] ( ) ;
}
} ) ;
} ;
_createClass ( Tooltip , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
get : function get ( ) {
return VERSION ;
}
} , {
key : 'Default' ,
get : function get ( ) {
return Default ;
}
} , {
key : 'NAME' ,
get : function get ( ) {
return NAME ;
}
} , {
key : 'DATA_KEY' ,
get : function get ( ) {
return DATA _KEY ;
}
} , {
key : 'Event' ,
get : function get ( ) {
return Event ;
}
} , {
key : 'EVENT_KEY' ,
get : function get ( ) {
return EVENT _KEY ;
}
} , {
key : 'DefaultType' ,
get : function get ( ) {
return DefaultType ;
}
} ] ) ;
return Tooltip ;
2016-10-20 13:30:35 +00:00
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
$ . fn [ NAME ] = Tooltip . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Tooltip ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Tooltip . _jQueryInterface ;
} ;
return Tooltip ;
2016-10-20 13:30:35 +00:00
} ( jQuery ) ;
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2016-10-20 13:30:35 +00:00
* Bootstrap ( v4 . 0.0 - alpha . 5 ) : popover . js
2016-06-23 09:21:57 +00:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Popover = function ( $ ) {
2016-06-23 09:21:57 +00:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'popover' ;
2016-10-20 13:30:35 +00:00
var VERSION = '4.0.0-alpha.5' ;
2016-06-23 09:21:57 +00:00
var DATA _KEY = 'bs.popover' ;
var EVENT _KEY = '.' + DATA _KEY ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var Default = $ . extend ( { } , Tooltip . Default , {
placement : 'right' ,
trigger : 'click' ,
content : '' ,
2016-10-20 13:30:35 +00:00
template : '<div class="popover" role="tooltip">' + '<h3 class="popover-title"></h3>' + '<div class="popover-content"></div></div>'
2016-06-23 09:21:57 +00:00
} ) ;
var DefaultType = $ . extend ( { } , Tooltip . DefaultType , {
content : '(string|element|function)'
} ) ;
var ClassName = {
FADE : 'fade' ,
IN : 'in'
} ;
var Selector = {
TITLE : '.popover-title' ,
2016-10-20 13:30:35 +00:00
CONTENT : '.popover-content'
2016-06-23 09:21:57 +00:00
} ;
var Event = {
HIDE : 'hide' + EVENT _KEY ,
HIDDEN : 'hidden' + EVENT _KEY ,
SHOW : 'show' + EVENT _KEY ,
SHOWN : 'shown' + EVENT _KEY ,
INSERTED : 'inserted' + EVENT _KEY ,
CLICK : 'click' + EVENT _KEY ,
FOCUSIN : 'focusin' + EVENT _KEY ,
FOCUSOUT : 'focusout' + EVENT _KEY ,
MOUSEENTER : 'mouseenter' + EVENT _KEY ,
MOUSELEAVE : 'mouseleave' + EVENT _KEY
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-10-20 13:30:35 +00:00
var Popover = function ( _Tooltip ) {
2016-06-23 09:21:57 +00:00
_inherits ( Popover , _Tooltip ) ;
function Popover ( ) {
_classCallCheck ( this , Popover ) ;
2016-10-20 13:30:35 +00:00
return _possibleConstructorReturn ( this , _Tooltip . apply ( this , arguments ) ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
// overrides
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Popover . prototype . isWithContent = function isWithContent ( ) {
return this . getTitle ( ) || this . _getContent ( ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Popover . prototype . getTipElement = function getTipElement ( ) {
return this . tip = this . tip || $ ( this . config . template ) [ 0 ] ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Popover . prototype . setContent = function setContent ( ) {
var $tip = $ ( this . getTipElement ( ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// we use append for html objects to maintain js events
this . setElementContent ( $tip . find ( Selector . TITLE ) , this . getTitle ( ) ) ;
this . setElementContent ( $tip . find ( Selector . CONTENT ) , this . _getContent ( ) ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
$tip . removeClass ( ClassName . FADE ) . removeClass ( ClassName . IN ) ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
this . cleanupTether ( ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// private
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Popover . prototype . _getContent = function _getContent ( ) {
return this . element . getAttribute ( 'data-content' ) || ( typeof this . config . content === 'function' ? this . config . content . call ( this . element ) : this . config . content ) ;
} ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
// static
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
Popover . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA _KEY ) ;
var _config = ( typeof config === 'undefined' ? 'undefined' : _typeof ( config ) ) === 'object' ? config : null ;
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data && /destroy|hide/ . test ( config ) ) {
return ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( ! data ) {
data = new Popover ( this , _config ) ;
$ ( this ) . data ( DATA _KEY , data ) ;
}
2016-06-23 09:21:57 +00:00
2016-10-20 13:30:35 +00:00
if ( typeof config === 'string' ) {
if ( data [ config ] === undefined ) {
throw new Error ( 'No method named "' + config + '"' ) ;
2016-06-23 09:21:57 +00:00
}
2016-10-20 13:30:35 +00:00
data [ config ] ( ) ;
}
} ) ;
} ;
_createClass ( Popover , null , [ {
2016-06-23 09:21:57 +00:00
key : 'VERSION' ,
2016-10-20 13:30:35 +00:00
2016-06-23 09:21:57 +00:00
// getters
get : function get ( ) {
return VERSION ;
}
} , {
key : 'Default' ,
get : function get ( ) {
return Default ;
}
} , {
key : 'NAME' ,
get : function get ( ) {
return NAME ;
}
} , {
key : 'DATA_KEY' ,
get : function get ( ) {
return DATA _KEY ;
}
} , {
key : 'Event' ,
get : function get ( ) {
return Event ;
}
} , {
key : 'EVENT_KEY' ,
get : function get ( ) {
return EVENT _KEY ;
}
} , {
key : 'DefaultType' ,
get : function get ( ) {
return DefaultType ;
}
} ] ) ;
return Popover ;
2016-10-20 13:30:35 +00:00
} ( Tooltip ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2016-06-23 09:21:57 +00:00
$ . fn [ NAME ] = Popover . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Popover ;
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Popover . _jQueryInterface ;
} ;
return Popover ;
} ( jQuery ) ;
2016-10-20 13:30:35 +00:00
} ( ) ;
2016-11-24 10:58:11 +00:00
/ * *
* File skip - link - focus - fix . js .
*
* Helps with accessibility for keyboard only users .
*
* Learn more : https : //git.io/vWdr2
* /
( function ( ) {
var isWebkit = navigator . userAgent . toLowerCase ( ) . indexOf ( 'webkit' ) > - 1 ,
isOpera = navigator . userAgent . toLowerCase ( ) . indexOf ( 'opera' ) > - 1 ,
isIe = navigator . userAgent . toLowerCase ( ) . indexOf ( 'msie' ) > - 1 ;
if ( ( isWebkit || isOpera || isIe ) && document . getElementById && window . addEventListener ) {
window . addEventListener ( 'hashchange' , function ( ) {
var id = location . hash . substring ( 1 ) ,
element ;
if ( ! ( /^[A-z0-9_-]+$/ . test ( id ) ) ) {
return ;
}
element = document . getElementById ( id ) ;
if ( element ) {
if ( ! ( /^(?:a|select|input|button|textarea)$/i . test ( element . tagName ) ) ) {
element . tabIndex = - 1 ;
}
element . focus ( ) ;
}
} , false ) ;
}
} ) ( ) ;