vendor: 9,938 bytes, lines 1-337
1/* ======================================================================== 2 * Bootstrap: modal.js v3.3.5 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.5' 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 (this.$element[0] !== e.target && !this.$element.has(e.target).length) { 144 this.$element.trigger('focus') 145 } 146 }, this)) 147 } 148 149 Modal.prototype.escape = function () { 150 if (this.isShown && this.options.keyboard) { 151 this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { 152 e.which == 27 && this.hide() 153 }, this)) 154 } else if (!this.isShown) { 155 this.$element.off('keydown.dismiss.bs.modal') 156 } 157 } 158 159 Modal.prototype.resize = function () { 160 if (this.isShown) { 161 $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) 162 } else { 163 $(window).off('resize.bs.modal') 164 } 165 } 166 167 Modal.prototype.hideModal = function () { 168 var that = this 169 this.$element.hide() 170 this.backdrop(function () { 171 that.$body.removeClass('modal-open') 172 that.resetAdjustments() 173 that.resetScrollbar() 174 that.$element.trigger('hidden.bs.modal') 175 }) 176 } 177 178 Modal.prototype.removeBackdrop = function () { 179 this.$backdrop && this.$backdrop.remove() 180 this.$backdrop = null 181 } 182 183 Modal.prototype.backdrop = function (callback) { 184 var that = this 185 var animate = this.$element.hasClass('fade') ? 'fade' : '' 186 187 if (this.isShown && this.options.backdrop) { 188 var doAnimate = $.support.transition && animate 189 190 this.$backdrop = $(document.createElement('div')) 191 .addClass('modal-backdrop ' + animate) 192 .appendTo(this.$body) 193 194 this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { 195 if (this.ignoreBackdropClick) { 196 this.ignoreBackdropClick = false 197 return 198 } 199 if (e.target !== e.currentTarget) return 200 this.options.backdrop == 'static' 201 ? this.$element[0].focus() 202 : this.hide() 203 }, this)) 204 205 if (doAnimate) this.$backdrop[0].offsetWidth // force reflow 206 207 this.$backdrop.addClass('in') 208 209 if (!callback) return 210 211 doAnimate ? 212 this.$backdrop 213 .one('bsTransitionEnd', callback) 214 .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : 215 callback() 216 217 } else if (!this.isShown && this.$backdrop) { 218 this.$backdrop.removeClass('in') 219 220 var callbackRemove = function () { 221 that.removeBackdrop() 222 callback && callback() 223 } 224 $.support.transition && this.$element.hasClass('fade') ? 225 this.$backdrop 226 .one('bsTransitionEnd', callbackRemove) 227 .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : 228 callbackRemove() 229 230 } else if (callback) { 231 callback() 232 } 233 } 234 235 // these following methods are used to handle overflowing modals 236 237 Modal.prototype.handleUpdate = function () { 238 this.adjustDialog() 239 } 240 241 Modal.prototype.adjustDialog = function () { 242 var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight 243 244 this.$element.css({ 245 paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', 246 paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' 247 }) 248 } 249 250 Modal.prototype.resetAdjustments = function () { 251 this.$element.css({ 252 paddingLeft: '', 253 paddingRight: '' 254 }) 255 } 256 257 Modal.prototype.checkScrollbar = function () { 258 var fullWindowWidth = window.innerWidth 259 if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 260 var documentElementRect = document.documentElement.getBoundingClientRect() 261 fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) 262 } 263 this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth 264 this.scrollbarWidth = this.measureScrollbar() 265 } 266 267 Modal.prototype.setScrollbar = function () { 268 var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) 269 this.originalBodyPad = document.body.style.paddingRight || '' 270 if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) 271 } 272 273 Modal.prototype.resetScrollbar = function () { 274 this.$body.css('padding-right', this.originalBodyPad) 275 } 276 277 Modal.prototype.measureScrollbar = function () { // thx walsh 278 var scrollDiv = document.createElement('div') 279 scrollDiv.className = 'modal-scrollbar-measure' 280 this.$body.append(scrollDiv) 281 var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth 282 this.$body[0].removeChild(scrollDiv) 283 return scrollbarWidth 284 } 285 286 287 // MODAL PLUGIN DEFINITION 288 // ======================= 289 290 function Plugin(option, _relatedTarget) { 291 return this.each(function () { 292 var $this = $(this) 293 var data = $this.data('bs.modal') 294 var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) 295 296 if (!data) $this.data('bs.modal', (data = new Modal(this, options))) 297 if (typeof option == 'string') data[option](_relatedTarget) 298 else if (options.show) data.show(_relatedTarget) 299 }) 300 } 301 302 var old = $.fn.modal 303 304 $.fn.modal = Plugin 305 $.fn.modal.Constructor = Modal 306 307 308 // MODAL NO CONFLICT 309 // ================= 310 311 $.fn.modal.noConflict = function () { 312 $.fn.modal = old 313 return this 314 } 315 316 317 // MODAL DATA-API 318 // ============== 319 320 $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { 321 var $this = $(this) 322 var href = $this.attr('href') 323 var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 324 var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) 325 326 if ($this.is('a')) e.preventDefault() 327 328 $target.one('show.bs.modal', function (showEvent) { 329 if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown 330 $target.one('hidden.bs.modal', function () { 331 $this.is(':visible') && $this.trigger('focus') 332 }) 333 }) 334 Plugin.call($target, option, this) 335 }) 336 337}(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.