Update 10-bootstrap-modal.js
[plack-app-gruntmaster.git] / js / 10-bootstrap-modal.js
CommitLineData
e4d5bdf5 1/* ========================================================================
30c4e6d3 2 * Bootstrap: modal.js v3.3.4
e4d5bdf5
MG
3 * http://getbootstrap.com/javascript/#modals
4 * ========================================================================
2420da56 5 * Copyright 2011-2015 Twitter, Inc.
e4d5bdf5
MG
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) {
30c4e6d3
MG
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
e4d5bdf5
MG
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
30c4e6d3 36 Modal.VERSION = '3.3.4'
e4d5bdf5
MG
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
30c4e6d3
MG
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
e4d5bdf5
MG
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
e4d5bdf5
MG
87 that.adjustDialog()
88
89 if (transition) {
90 that.$element[0].offsetWidth // force reflow
91 }
92
93 that.$element
94 .addClass('in')
95 .attr('aria-hidden', false)
96
97 that.enforceFocus()
98
99 var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
100
101 transition ?
30c4e6d3 102 that.$dialog // wait for modal to slide in
e4d5bdf5
MG
103 .one('bsTransitionEnd', function () {
104 that.$element.trigger('focus').trigger(e)
105 })
106 .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
107 that.$element.trigger('focus').trigger(e)
108 })
109 }
110
111 Modal.prototype.hide = function (e) {
112 if (e) e.preventDefault()
113
114 e = $.Event('hide.bs.modal')
115
116 this.$element.trigger(e)
117
118 if (!this.isShown || e.isDefaultPrevented()) return
119
120 this.isShown = false
121
122 this.escape()
123 this.resize()
124
125 $(document).off('focusin.bs.modal')
126
127 this.$element
128 .removeClass('in')
129 .attr('aria-hidden', true)
130 .off('click.dismiss.bs.modal')
30c4e6d3
MG
131 .off('mouseup.dismiss.bs.modal')
132
133 this.$dialog.off('mousedown.dismiss.bs.modal')
e4d5bdf5
MG
134
135 $.support.transition && this.$element.hasClass('fade') ?
136 this.$element
137 .one('bsTransitionEnd', $.proxy(this.hideModal, this))
138 .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
139 this.hideModal()
140 }
141
142 Modal.prototype.enforceFocus = function () {
143 $(document)
144 .off('focusin.bs.modal') // guard against infinite focus loop
145 .on('focusin.bs.modal', $.proxy(function (e) {
146 if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
147 this.$element.trigger('focus')
148 }
149 }, this))
150 }
151
152 Modal.prototype.escape = function () {
153 if (this.isShown && this.options.keyboard) {
154 this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
155 e.which == 27 && this.hide()
156 }, this))
157 } else if (!this.isShown) {
158 this.$element.off('keydown.dismiss.bs.modal')
159 }
160 }
161
162 Modal.prototype.resize = function () {
163 if (this.isShown) {
164 $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
165 } else {
166 $(window).off('resize.bs.modal')
167 }
168 }
169
170 Modal.prototype.hideModal = function () {
171 var that = this
172 this.$element.hide()
173 this.backdrop(function () {
174 that.$body.removeClass('modal-open')
175 that.resetAdjustments()
176 that.resetScrollbar()
177 that.$element.trigger('hidden.bs.modal')
178 })
179 }
180
181 Modal.prototype.removeBackdrop = function () {
182 this.$backdrop && this.$backdrop.remove()
183 this.$backdrop = null
184 }
185
186 Modal.prototype.backdrop = function (callback) {
187 var that = this
188 var animate = this.$element.hasClass('fade') ? 'fade' : ''
189
190 if (this.isShown && this.options.backdrop) {
191 var doAnimate = $.support.transition && animate
192
193 this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
30c4e6d3
MG
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))
e4d5bdf5
MG
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 () {
e4d5bdf5
MG
240 this.adjustDialog()
241 }
242
e4d5bdf5
MG
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 () {
30c4e6d3
MG
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
e4d5bdf5
MG
266 this.scrollbarWidth = this.measureScrollbar()
267 }
268
269 Modal.prototype.setScrollbar = function () {
270 var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
30c4e6d3 271 this.originalBodyPad = document.body.style.paddingRight || ''
e4d5bdf5
MG
272 if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
273 }
274
275 Modal.prototype.resetScrollbar = function () {
30c4e6d3 276 this.$body.css('padding-right', this.originalBodyPad)
e4d5bdf5
MG
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
2420da56 339}(Zepto);
This page took 0.034608 seconds and 4 git commands to generate.