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