OSDN Git Service

f84142d81f80ccd04d2de5264f26da738a36cf9e
[bytom/vapor.git] / tools / side_chain_tool / web / node_modules / bootstrap / js / modal.js
1 /* ========================================================================
2  * Bootstrap: modal.js v3.3.7
3  * http://getbootstrap.com/javascript/#modals
4  * ========================================================================
5  * Copyright 2011-2016 Twitter, Inc.
6  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7  * ======================================================================== */
8
9
10 +function ($) {
11   'use strict';
12
13   // MODAL CLASS DEFINITION
14   // ======================
15
16   var Modal = function (element, options) {
17     this.options             = options
18     this.$body               = $(document.body)
19     this.$element            = $(element)
20     this.$dialog             = this.$element.find('.modal-dialog')
21     this.$backdrop           = null
22     this.isShown             = null
23     this.originalBodyPad     = null
24     this.scrollbarWidth      = 0
25     this.ignoreBackdropClick = false
26
27     if (this.options.remote) {
28       this.$element
29         .find('.modal-content')
30         .load(this.options.remote, $.proxy(function () {
31           this.$element.trigger('loaded.bs.modal')
32         }, this))
33     }
34   }
35
36   Modal.VERSION  = '3.3.7'
37
38   Modal.TRANSITION_DURATION = 300
39   Modal.BACKDROP_TRANSITION_DURATION = 150
40
41   Modal.DEFAULTS = {
42     backdrop: true,
43     keyboard: true,
44     show: true
45   }
46
47   Modal.prototype.toggle = function (_relatedTarget) {
48     return this.isShown ? this.hide() : this.show(_relatedTarget)
49   }
50
51   Modal.prototype.show = function (_relatedTarget) {
52     var that = this
53     var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
54
55     this.$element.trigger(e)
56
57     if (this.isShown || e.isDefaultPrevented()) return
58
59     this.isShown = true
60
61     this.checkScrollbar()
62     this.setScrollbar()
63     this.$body.addClass('modal-open')
64
65     this.escape()
66     this.resize()
67
68     this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
69
70     this.$dialog.on('mousedown.dismiss.bs.modal', function () {
71       that.$element.one('mouseup.dismiss.bs.modal', function (e) {
72         if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
73       })
74     })
75
76     this.backdrop(function () {
77       var transition = $.support.transition && that.$element.hasClass('fade')
78
79       if (!that.$element.parent().length) {
80         that.$element.appendTo(that.$body) // don't move modals dom position
81       }
82
83       that.$element
84         .show()
85         .scrollTop(0)
86
87       that.adjustDialog()
88
89       if (transition) {
90         that.$element[0].offsetWidth // force reflow
91       }
92
93       that.$element.addClass('in')
94
95       that.enforceFocus()
96
97       var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
98
99       transition ?
100         that.$dialog // wait for modal to slide in
101           .one('bsTransitionEnd', function () {
102             that.$element.trigger('focus').trigger(e)
103           })
104           .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
105         that.$element.trigger('focus').trigger(e)
106     })
107   }
108
109   Modal.prototype.hide = function (e) {
110     if (e) e.preventDefault()
111
112     e = $.Event('hide.bs.modal')
113
114     this.$element.trigger(e)
115
116     if (!this.isShown || e.isDefaultPrevented()) return
117
118     this.isShown = false
119
120     this.escape()
121     this.resize()
122
123     $(document).off('focusin.bs.modal')
124
125     this.$element
126       .removeClass('in')
127       .off('click.dismiss.bs.modal')
128       .off('mouseup.dismiss.bs.modal')
129
130     this.$dialog.off('mousedown.dismiss.bs.modal')
131
132     $.support.transition && this.$element.hasClass('fade') ?
133       this.$element
134         .one('bsTransitionEnd', $.proxy(this.hideModal, this))
135         .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
136       this.hideModal()
137   }
138
139   Modal.prototype.enforceFocus = function () {
140     $(document)
141       .off('focusin.bs.modal') // guard against infinite focus loop
142       .on('focusin.bs.modal', $.proxy(function (e) {
143         if (document !== e.target &&
144             this.$element[0] !== e.target &&
145             !this.$element.has(e.target).length) {
146           this.$element.trigger('focus')
147         }
148       }, this))
149   }
150
151   Modal.prototype.escape = function () {
152     if (this.isShown && this.options.keyboard) {
153       this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
154         e.which == 27 && this.hide()
155       }, this))
156     } else if (!this.isShown) {
157       this.$element.off('keydown.dismiss.bs.modal')
158     }
159   }
160
161   Modal.prototype.resize = function () {
162     if (this.isShown) {
163       $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
164     } else {
165       $(window).off('resize.bs.modal')
166     }
167   }
168
169   Modal.prototype.hideModal = function () {
170     var that = this
171     this.$element.hide()
172     this.backdrop(function () {
173       that.$body.removeClass('modal-open')
174       that.resetAdjustments()
175       that.resetScrollbar()
176       that.$element.trigger('hidden.bs.modal')
177     })
178   }
179
180   Modal.prototype.removeBackdrop = function () {
181     this.$backdrop && this.$backdrop.remove()
182     this.$backdrop = null
183   }
184
185   Modal.prototype.backdrop = function (callback) {
186     var that = this
187     var animate = this.$element.hasClass('fade') ? 'fade' : ''
188
189     if (this.isShown && this.options.backdrop) {
190       var doAnimate = $.support.transition && animate
191
192       this.$backdrop = $(document.createElement('div'))
193         .addClass('modal-backdrop ' + animate)
194         .appendTo(this.$body)
195
196       this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
197         if (this.ignoreBackdropClick) {
198           this.ignoreBackdropClick = false
199           return
200         }
201         if (e.target !== e.currentTarget) return
202         this.options.backdrop == 'static'
203           ? this.$element[0].focus()
204           : this.hide()
205       }, this))
206
207       if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
208
209       this.$backdrop.addClass('in')
210
211       if (!callback) return
212
213       doAnimate ?
214         this.$backdrop
215           .one('bsTransitionEnd', callback)
216           .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
217         callback()
218
219     } else if (!this.isShown && this.$backdrop) {
220       this.$backdrop.removeClass('in')
221
222       var callbackRemove = function () {
223         that.removeBackdrop()
224         callback && callback()
225       }
226       $.support.transition && this.$element.hasClass('fade') ?
227         this.$backdrop
228           .one('bsTransitionEnd', callbackRemove)
229           .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
230         callbackRemove()
231
232     } else if (callback) {
233       callback()
234     }
235   }
236
237   // these following methods are used to handle overflowing modals
238
239   Modal.prototype.handleUpdate = function () {
240     this.adjustDialog()
241   }
242
243   Modal.prototype.adjustDialog = function () {
244     var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
245
246     this.$element.css({
247       paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
248       paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
249     })
250   }
251
252   Modal.prototype.resetAdjustments = function () {
253     this.$element.css({
254       paddingLeft: '',
255       paddingRight: ''
256     })
257   }
258
259   Modal.prototype.checkScrollbar = function () {
260     var fullWindowWidth = window.innerWidth
261     if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
262       var documentElementRect = document.documentElement.getBoundingClientRect()
263       fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
264     }
265     this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
266     this.scrollbarWidth = this.measureScrollbar()
267   }
268
269   Modal.prototype.setScrollbar = function () {
270     var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
271     this.originalBodyPad = document.body.style.paddingRight || ''
272     if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
273   }
274
275   Modal.prototype.resetScrollbar = function () {
276     this.$body.css('padding-right', this.originalBodyPad)
277   }
278
279   Modal.prototype.measureScrollbar = function () { // thx walsh
280     var scrollDiv = document.createElement('div')
281     scrollDiv.className = 'modal-scrollbar-measure'
282     this.$body.append(scrollDiv)
283     var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
284     this.$body[0].removeChild(scrollDiv)
285     return scrollbarWidth
286   }
287
288
289   // MODAL PLUGIN DEFINITION
290   // =======================
291
292   function Plugin(option, _relatedTarget) {
293     return this.each(function () {
294       var $this   = $(this)
295       var data    = $this.data('bs.modal')
296       var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
297
298       if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
299       if (typeof option == 'string') data[option](_relatedTarget)
300       else if (options.show) data.show(_relatedTarget)
301     })
302   }
303
304   var old = $.fn.modal
305
306   $.fn.modal             = Plugin
307   $.fn.modal.Constructor = Modal
308
309
310   // MODAL NO CONFLICT
311   // =================
312
313   $.fn.modal.noConflict = function () {
314     $.fn.modal = old
315     return this
316   }
317
318
319   // MODAL DATA-API
320   // ==============
321
322   $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
323     var $this   = $(this)
324     var href    = $this.attr('href')
325     var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
326     var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
327
328     if ($this.is('a')) e.preventDefault()
329
330     $target.one('show.bs.modal', function (showEvent) {
331       if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
332       $target.one('hidden.bs.modal', function () {
333         $this.is(':visible') && $this.trigger('focus')
334       })
335     })
336     Plugin.call($target, option, this)
337   })
338
339 }(jQuery);