PageSourceSearch

https://www.icfj.org/themes/custom/icfj/assets/components/bootstra…/javascripts/bootstrap/modal.js?tluqcb

js icfj.org collected 2026-09-24 08:26:45 UTC 9,987 bytes, 339 lines download raw bytes

vendor: 9,987 bytes, lines 1-339
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);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.