(function (global, factory){
typeof exports==='object'&&typeof module!=='undefined' ? module.exports=factory(require('jquery'), require('./util.js')) :
typeof define==='function'&&define.amd ? define(['jquery', './util.js'], factory) :
(global=global||self, global.Modal=factory(global.jQuery, global.Util));
}(this, function ($, Util){ 'use strict';
$=$&&$.hasOwnProperty('default') ? $['default']:$;
Util=Util&&Util.hasOwnProperty('default') ? Util['default']:Util;
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);
}}
function _createClass(Constructor, protoProps, staticProps){
if(protoProps) _defineProperties(Constructor.prototype, protoProps);
if(staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value){
if(key in obj){
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
}else{
obj[key]=value;
}
return obj;
}
function _objectSpread(target){
for (var i=1; i < arguments.length; i++){
var source=arguments[i]!=null ? arguments[i]:{};
var ownKeys=Object.keys(source);
if(typeof Object.getOwnPropertySymbols==='function'){
ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym){
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key){
_defineProperty(target, key, source[key]);
});
}
return target;
}
var NAME='modal';
var VERSION='4.3.1';
var DATA_KEY='bs.modal';
var EVENT_KEY="." + DATA_KEY;
var DATA_API_KEY='.data-api';
var JQUERY_NO_CONFLICT=$.fn[NAME];
var ESCAPE_KEYCODE=27;
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={
SCROLLABLE: 'modal-dialog-scrollable',
SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
BACKDROP: 'modal-backdrop',
OPEN: 'modal-open',
FADE: 'fade',
SHOW: 'show'
};
var Selector={
DIALOG: '.modal-dialog',
MODAL_BODY: '.modal-body',
DATA_TOGGLE: '[data-toggle="modal"]',
DATA_DISMISS: '[data-dismiss="modal"]',
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
STICKY_CONTENT: '.sticky-top'
};
var Modal =
function (){
function Modal(element, config){
this._config=this._getConfig(config);
this._element=element;
this._dialog=element.querySelector(Selector.DIALOG);
this._backdrop=null;
this._isShown=false;
this._isBodyOverflowing=false;
this._ignoreBackdropClick=false;
this._isTransitioning=false;
this._scrollbarWidth=0;
}
var _proto=Modal.prototype;
_proto.toggle=function toggle(relatedTarget){
return this._isShown ? this.hide():this.show(relatedTarget);
};
_proto.show=function show(relatedTarget){
var _this=this;
if(this._isShown||this._isTransitioning){
return;
}
if($(this._element).hasClass(ClassName.FADE)){
this._isTransitioning=true;
}
var showEvent=$.Event(Event.SHOW, {
relatedTarget: relatedTarget
});
$(this._element).trigger(showEvent);
if(this._isShown||showEvent.isDefaultPrevented()){
return;
}
this._isShown=true;
this._checkScrollbar();
this._setScrollbar();
this._adjustDialog();
this._setEscapeEvent();
this._setResizeEvent();
$(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event){
return _this.hide(event);
});
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, function (){
$(_this._element).one(Event.MOUSEUP_DISMISS, function (event){
if($(event.target).is(_this._element)){
_this._ignoreBackdropClick=true;
}});
});
this._showBackdrop(function (){
return _this._showElement(relatedTarget);
});
};
_proto.hide=function hide(event){
var _this2=this;
if(event){
event.preventDefault();
}
if(!this._isShown||this._isTransitioning){
return;
}
var hideEvent=$.Event(Event.HIDE);
$(this._element).trigger(hideEvent);
if(!this._isShown||hideEvent.isDefaultPrevented()){
return;
}
this._isShown=false;
var transition=$(this._element).hasClass(ClassName.FADE);
if(transition){
this._isTransitioning=true;
}
this._setEscapeEvent();
this._setResizeEvent();
$(document).off(Event.FOCUSIN);
$(this._element).removeClass(ClassName.SHOW);
$(this._element).off(Event.CLICK_DISMISS);
$(this._dialog).off(Event.MOUSEDOWN_DISMISS);
if(transition){
var transitionDuration=Util.getTransitionDurationFromElement(this._element);
$(this._element).one(Util.TRANSITION_END, function (event){
return _this2._hideModal(event);
}).emulateTransitionEnd(transitionDuration);
}else{
this._hideModal();
}};
_proto.dispose=function dispose(){
[window, this._element, this._dialog].forEach(function (htmlElement){
return $(htmlElement).off(EVENT_KEY);
});
$(document).off(Event.FOCUSIN);
$.removeData(this._element, DATA_KEY);
this._config=null;
this._element=null;
this._dialog=null;
this._backdrop=null;
this._isShown=null;
this._isBodyOverflowing=null;
this._ignoreBackdropClick=null;
this._isTransitioning=null;
this._scrollbarWidth=null;
};
_proto.handleUpdate=function handleUpdate(){
this._adjustDialog();
}
;
_proto._getConfig=function _getConfig(config){
config=_objectSpread({}, Default, config);
Util.typeCheckConfig(NAME, config, DefaultType);
return config;
};
_proto._showElement=function _showElement(relatedTarget){
var _this3=this;
var transition=$(this._element).hasClass(ClassName.FADE);
if(!this._element.parentNode||this._element.parentNode.nodeType!==Node.ELEMENT_NODE){
document.body.appendChild(this._element);
}
this._element.style.display='block';
this._element.removeAttribute('aria-hidden');
this._element.setAttribute('aria-modal', true);
if($(this._dialog).hasClass(ClassName.SCROLLABLE)){
this._dialog.querySelector(Selector.MODAL_BODY).scrollTop=0;
}else{
this._element.scrollTop=0;
}
if(transition){
Util.reflow(this._element);
}
$(this._element).addClass(ClassName.SHOW);
if(this._config.focus){
this._enforceFocus();
}
var shownEvent=$.Event(Event.SHOWN, {
relatedTarget: relatedTarget
});
var transitionComplete=function transitionComplete(){
if(_this3._config.focus){
_this3._element.focus();
}
_this3._isTransitioning=false;
$(_this3._element).trigger(shownEvent);
};
if(transition){
var transitionDuration=Util.getTransitionDurationFromElement(this._dialog);
$(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
}else{
transitionComplete();
}};
_proto._enforceFocus=function _enforceFocus(){
var _this4=this;
$(document).off(Event.FOCUSIN)
.on(Event.FOCUSIN, function (event){
if(document!==event.target&&_this4._element!==event.target&&$(_this4._element).has(event.target).length===0){
_this4._element.focus();
}});
};
_proto._setEscapeEvent=function _setEscapeEvent(){
var _this5=this;
if(this._isShown&&this._config.keyboard){
$(this._element).on(Event.KEYDOWN_DISMISS, function (event){
if(event.which===ESCAPE_KEYCODE){
event.preventDefault();
_this5.hide();
}});
}else if(!this._isShown){
$(this._element).off(Event.KEYDOWN_DISMISS);
}};
_proto._setResizeEvent=function _setResizeEvent(){
var _this6=this;
if(this._isShown){
$(window).on(Event.RESIZE, function (event){
return _this6.handleUpdate(event);
});
}else{
$(window).off(Event.RESIZE);
}};
_proto._hideModal=function _hideModal(){
var _this7=this;
this._element.style.display='none';
this._element.setAttribute('aria-hidden', true);
this._element.removeAttribute('aria-modal');
this._isTransitioning=false;
this._showBackdrop(function (){
$(document.body).removeClass(ClassName.OPEN);
_this7._resetAdjustments();
_this7._resetScrollbar();
$(_this7._element).trigger(Event.HIDDEN);
});
};
_proto._removeBackdrop=function _removeBackdrop(){
if(this._backdrop){
$(this._backdrop).remove();
this._backdrop=null;
}};
_proto._showBackdrop=function _showBackdrop(callback){
var _this8=this;
var animate=$(this._element).hasClass(ClassName.FADE) ? ClassName.FADE:'';
if(this._isShown&&this._config.backdrop){
this._backdrop=document.createElement('div');
this._backdrop.className=ClassName.BACKDROP;
if(animate){
this._backdrop.classList.add(animate);
}
$(this._backdrop).appendTo(document.body);
$(this._element).on(Event.CLICK_DISMISS, function (event){
if(_this8._ignoreBackdropClick){
_this8._ignoreBackdropClick=false;
return;
}
if(event.target!==event.currentTarget){
return;
}
if(_this8._config.backdrop==='static'){
_this8._element.focus();
}else{
_this8.hide();
}});
if(animate){
Util.reflow(this._backdrop);
}
$(this._backdrop).addClass(ClassName.SHOW);
if(!callback){
return;
}
if(!animate){
callback();
return;
}
var backdropTransitionDuration=Util.getTransitionDurationFromElement(this._backdrop);
$(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
}else if(!this._isShown&&this._backdrop){
$(this._backdrop).removeClass(ClassName.SHOW);
var callbackRemove=function callbackRemove(){
_this8._removeBackdrop();
if(callback){
callback();
}};
if($(this._element).hasClass(ClassName.FADE)){
var _backdropTransitionDuration=Util.getTransitionDurationFromElement(this._backdrop);
$(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
}else{
callbackRemove();
}}else if(callback){
callback();
}}
;
_proto._adjustDialog=function _adjustDialog(){
var isModalOverflowing=this._element.scrollHeight > document.documentElement.clientHeight;
if(!this._isBodyOverflowing&&isModalOverflowing){
this._element.style.paddingLeft=this._scrollbarWidth + "px";
}
if(this._isBodyOverflowing&&!isModalOverflowing){
this._element.style.paddingRight=this._scrollbarWidth + "px";
}};
_proto._resetAdjustments=function _resetAdjustments(){
this._element.style.paddingLeft='';
this._element.style.paddingRight='';
};
_proto._checkScrollbar=function _checkScrollbar(){
var rect=document.body.getBoundingClientRect();
this._isBodyOverflowing=rect.left + rect.right < window.innerWidth;
this._scrollbarWidth=this._getScrollbarWidth();
};
_proto._setScrollbar=function _setScrollbar(){
var _this9=this;
if(this._isBodyOverflowing){
var fixedContent=[].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));
var stickyContent=[].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT));
$(fixedContent).each(function (index, element){
var actualPadding=element.style.paddingRight;
var calculatedPadding=$(element).css('padding-right');
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
});
$(stickyContent).each(function (index, element){
var actualMargin=element.style.marginRight;
var calculatedMargin=$(element).css('margin-right');
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
});
var actualPadding=document.body.style.paddingRight;
var calculatedPadding=$(document.body).css('padding-right');
$(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
}
$(document.body).addClass(ClassName.OPEN);
};
_proto._resetScrollbar=function _resetScrollbar(){
var fixedContent=[].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));
$(fixedContent).each(function (index, element){
var padding=$(element).data('padding-right');
$(element).removeData('padding-right');
element.style.paddingRight=padding ? padding:'';
});
var elements=[].slice.call(document.querySelectorAll("" + Selector.STICKY_CONTENT));
$(elements).each(function (index, element){
var margin=$(element).data('margin-right');
if(typeof margin!=='undefined'){
$(element).css('margin-right', margin).removeData('margin-right');
}});
var padding=$(document.body).data('padding-right');
$(document.body).removeData('padding-right');
document.body.style.paddingRight=padding ? padding:'';
};
_proto._getScrollbarWidth=function _getScrollbarWidth(){
var scrollDiv=document.createElement('div');
scrollDiv.className=ClassName.SCROLLBAR_MEASURER;
document.body.appendChild(scrollDiv);
var scrollbarWidth=scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
document.body.removeChild(scrollDiv);
return scrollbarWidth;
}
;
Modal._jQueryInterface=function _jQueryInterface(config, relatedTarget){
return this.each(function (){
var data=$(this).data(DATA_KEY);
var _config=_objectSpread({}, Default, $(this).data(), typeof config==='object'&&config ? config:{});
if(!data){
data=new Modal(this, _config);
$(this).data(DATA_KEY, data);
}
if(typeof config==='string'){
if(typeof data[config]==='undefined'){
throw new TypeError("No method named \"" + config + "\"");
}
data[config](relatedTarget);
}else if(_config.show){
data.show(relatedTarget);
}});
};
_createClass(Modal, null, [{
key: "VERSION",
get: function get(){
return VERSION;
}}, {
key: "Default",
get: function get(){
return Default;
}}]);
return Modal;
}();
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event){
var _this10=this;
var target;
var selector=Util.getSelectorFromElement(this);
if(selector){
target=document.querySelector(selector);
}
var config=$(target).data(DATA_KEY) ? 'toggle':_objectSpread({}, $(target).data(), $(this).data());
if(this.tagName==='A'||this.tagName==='AREA'){
event.preventDefault();
}
var $target=$(target).one(Event.SHOW, function (showEvent){
if(showEvent.isDefaultPrevented()){
return;
}
$target.one(Event.HIDDEN, function (){
if($(_this10).is(':visible')){
_this10.focus();
}});
});
Modal._jQueryInterface.call($(target), config, this);
});
$.fn[NAME]=Modal._jQueryInterface;
$.fn[NAME].Constructor=Modal;
$.fn[NAME].noConflict=function (){
$.fn[NAME]=JQUERY_NO_CONFLICT;
return Modal._jQueryInterface;
};
return Modal;
}));