Policy 1707 commit to LF
[policy/engine.git] / POLICY-SDK-APP / src / main / webapp / app / policyApp / CSS / bootstrap / js / modal.js
1 /* ========================================================================
2  * Bootstrap: modal.js v3.3.4
3  * http://getbootstrap.com/javascript/#modals
4  * ========================================================================
5  * Copyright 2011-2015 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.4'
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
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 ?
102         that.$dialog // wait for modal to slide in
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')
131       .off('mouseup.dismiss.bs.modal')
132
133     this.$dialog.off('mousedown.dismiss.bs.modal')
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 + '" />')
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);