bootstrap-modal.js 3.51 KB
Newer Older
Jacob Thornton's avatar
Jacob Thornton committed
1
2
3
4
5
(function( $ ){

  /* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
   * ======================================================= */

Jacob Thornton's avatar
Jacob Thornton committed
6
  $.support.transition = (function () {
Jacob Thornton's avatar
Jacob Thornton committed
7
8
    var thisBody = document.body || document.documentElement
      , thisStyle = thisBody.style
9
10
11
      , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined
    return support
  })()
Jacob Thornton's avatar
Jacob Thornton committed
12
13
14
15
16
17
18
19
20


 /* SHARED VARS
  * =========== */

  var $window = $(window)
    , transitionEnd

  // set CSS transition event type
Jacob Thornton's avatar
Jacob Thornton committed
21
  if ( $.support.transition ) {
Jacob Thornton's avatar
Jacob Thornton committed
22
    transitionEnd = "TransitionEnd"
Jacob Thornton's avatar
Jacob Thornton committed
23
    if ( $.browser.webkit ) {
Jacob Thornton's avatar
Jacob Thornton committed
24
    	transitionEnd = "webkitTransitionEnd"
Jacob Thornton's avatar
Jacob Thornton committed
25
    } else if ( $.browser.mozilla ) {
Jacob Thornton's avatar
Jacob Thornton committed
26
    	transitionEnd = "transitionend"
Jacob Thornton's avatar
Jacob Thornton committed
27
    } else if ( $.browser.opera ) {
Jacob Thornton's avatar
Jacob Thornton committed
28
29
30
31
32
33
34
35
    	transitionEnd = "oTransitionEnd"
    }
  }


 /* MODAL PUBLIC CLASS DEFINITION
  * ============================= */

Jacob Thornton's avatar
Jacob Thornton committed
36
  var Modal = function ( options ) {
37
    this.settings = $.extend({}, $.fn.modal.defaults)
Jacob Thornton's avatar
Jacob Thornton committed
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

    if ( typeof options == 'string' ) {
      this.settings.content = options
    } else if ( options ) {
      $.extend( this.settings, options )
    }

    return this
  }

  Modal.prototype = {

    toggle: function () {
      return this[!this.isOpen ? 'open' : 'close']()
    }

  , open: function () {
      var that = this
      this.isOpen = true

58
59
      _.escape.call(this)
      _.backdrop.call(this)
Jacob Thornton's avatar
Jacob Thornton committed
60
61
62
63

      this.$element = $(this.settings.content)
        .delegate('.close', 'click', function (e) { e.preventDefault(); that.close() })
        .appendTo(document.body)
Jacob Thornton's avatar
Jacob Thornton committed
64
        .show()
Jacob Thornton's avatar
Jacob Thornton committed
65
66

      setTimeout(function () {
67
68
        that.$element.addClass('show')
        that.$backdrop && that.$backdrop.addClass('show')
Jacob Thornton's avatar
Jacob Thornton committed
69
70
71
72
73
74
75
76
77
78
      }, 1)

      return this
    }

  , close: function () {
      var that = this

      this.isOpen = false

79
80
      _.escape.call(this)
      _.backdrop.call(this)
Jacob Thornton's avatar
Jacob Thornton committed
81

82
      this.$element.removeClass('show')
Jacob Thornton's avatar
Jacob Thornton committed
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

      function removeElement () {
        that.$element.remove()
        that.$element = null
      }

      $.support.transition ?
        this.$element.bind(transitionEnd, removeElement) :
        removeElement()

      return this
    }

  }


 /* MODAL PRIVATE METHODS
  * ===================== */

102
  var _ = {
Jacob Thornton's avatar
Jacob Thornton committed
103
104
105

    backdrop: function () {
      var that = this
Jacob Thornton's avatar
Jacob Thornton committed
106
      if ( this.isOpen && this.settings.backdrop ) {
Jacob Thornton's avatar
Jacob Thornton committed
107
108
109
        this.$backdrop = $('<div class="modal-backdrop" />')
          .click(function () { that.close() })
          .appendTo(document.body)
Jacob Thornton's avatar
Jacob Thornton committed
110
      } else if ( !this.isOpen && this.$backdrop ) {
111
        this.$backdrop.removeClass('show')
Jacob Thornton's avatar
Jacob Thornton committed
112
113
114
115
116
117
118
119
120
121
122
123

        function removeElement() {
          that.$backdrop.remove()
          that.$backdrop = null
        }

        $.support.transition ?
          this.$backdrop.bind(transitionEnd, removeElement) :
          removeElement()
      }
    }

Jacob Thornton's avatar
Jacob Thornton committed
124
  , escape: function () {
Jacob Thornton's avatar
Jacob Thornton committed
125
      var that = this
Jacob Thornton's avatar
Jacob Thornton committed
126
127
      if ( this.isOpen && this.settings.closeOnEscape ) {
        $window.bind('keyup.modal.escape', function ( e ) {
Jacob Thornton's avatar
Jacob Thornton committed
128
129
130
131
          if ( e.which == 27 ) {
            that.close()
          }
        })
Jacob Thornton's avatar
Jacob Thornton committed
132
      } else if ( !this.isOpen ) {
Jacob Thornton's avatar
Jacob Thornton committed
133
134
135
136
137
138
139
140
141
142
        $window.unbind('keyup.modal.escape')
      }
    }

  }


 /* MODAL PLUGIN DEFINITION
  * ======================= */

Jacob Thornton's avatar
Jacob Thornton committed
143
  $.fn.modal = function ( options ) {
Jacob Thornton's avatar
Jacob Thornton committed
144
145
146
147
148
    options = options || {}
    options.content = this
    return new Modal(options)
  }

149
150
151
152
153
154
  $.fn.modal.defaults = {
    backdrop: false
  , closeOnEscape: false
  , content: false
  }

Jacob Thornton's avatar
Jacob Thornton committed
155
})( jQuery || ender )