bootstrap-modals.js 3.56 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 ) {
Jacob Thornton's avatar
Jacob Thornton committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
    this.settings = {
      backdrop: false
    , closeOnEscape: false
    , content: false
    }

    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

      _private.onEscape.call(this)
      _private.backdrop.call(this)

      this.$element = $(this.settings.content)
        .delegate('.close', 'click', function (e) { e.preventDefault(); that.close() })
        .appendTo(document.body)

      setTimeout(function () {
        that.$element.addClass('open')
        that.$backdrop && that.$backdrop.addClass('open')
      }, 1)

      return this
    }

  , close: function () {
      var that = this

      this.isOpen = false

      _private.onEscape.call(this)
      _private.backdrop.call(this)

      this.$element.removeClass('open')

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

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

      return this
    }

  }


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

  var _private = {

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

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

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

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

  }


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

Jacob Thornton's avatar
Jacob Thornton committed
146
  $.modal = function ( options ) {
Jacob Thornton's avatar
Jacob Thornton committed
147
148
149
    return new Modal(options)
  }

Jacob Thornton's avatar
Jacob Thornton committed
150
  $.fn.modal = function ( options ) {
Jacob Thornton's avatar
Jacob Thornton committed
151
152
153
154
155
156
    options = options || {}
    options.content = this
    return new Modal(options)
  }

})( jQuery || ender )