comparison static/bootstrap/js/collapse.js @ 149:d29e2f337b00

Updated to Bootstrap 3.0.
author Ludovic Chabant <ludovic@chabant.com>
date Thu, 12 Dec 2013 21:54:04 -0800
parents
children
comparison
equal deleted inserted replaced
148:f02e049d6546 149:d29e2f337b00
1 /* ========================================================================
2 * Bootstrap: collapse.js v3.0.3
3 * http://getbootstrap.com/javascript/#collapse
4 * ========================================================================
5 * Copyright 2013 Twitter, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ======================================================================== */
19
20
21 +function ($) { "use strict";
22
23 // COLLAPSE PUBLIC CLASS DEFINITION
24 // ================================
25
26 var Collapse = function (element, options) {
27 this.$element = $(element)
28 this.options = $.extend({}, Collapse.DEFAULTS, options)
29 this.transitioning = null
30
31 if (this.options.parent) this.$parent = $(this.options.parent)
32 if (this.options.toggle) this.toggle()
33 }
34
35 Collapse.DEFAULTS = {
36 toggle: true
37 }
38
39 Collapse.prototype.dimension = function () {
40 var hasWidth = this.$element.hasClass('width')
41 return hasWidth ? 'width' : 'height'
42 }
43
44 Collapse.prototype.show = function () {
45 if (this.transitioning || this.$element.hasClass('in')) return
46
47 var startEvent = $.Event('show.bs.collapse')
48 this.$element.trigger(startEvent)
49 if (startEvent.isDefaultPrevented()) return
50
51 var actives = this.$parent && this.$parent.find('> .panel > .in')
52
53 if (actives && actives.length) {
54 var hasData = actives.data('bs.collapse')
55 if (hasData && hasData.transitioning) return
56 actives.collapse('hide')
57 hasData || actives.data('bs.collapse', null)
58 }
59
60 var dimension = this.dimension()
61
62 this.$element
63 .removeClass('collapse')
64 .addClass('collapsing')
65 [dimension](0)
66
67 this.transitioning = 1
68
69 var complete = function () {
70 this.$element
71 .removeClass('collapsing')
72 .addClass('in')
73 [dimension]('auto')
74 this.transitioning = 0
75 this.$element.trigger('shown.bs.collapse')
76 }
77
78 if (!$.support.transition) return complete.call(this)
79
80 var scrollSize = $.camelCase(['scroll', dimension].join('-'))
81
82 this.$element
83 .one($.support.transition.end, $.proxy(complete, this))
84 .emulateTransitionEnd(350)
85 [dimension](this.$element[0][scrollSize])
86 }
87
88 Collapse.prototype.hide = function () {
89 if (this.transitioning || !this.$element.hasClass('in')) return
90
91 var startEvent = $.Event('hide.bs.collapse')
92 this.$element.trigger(startEvent)
93 if (startEvent.isDefaultPrevented()) return
94
95 var dimension = this.dimension()
96
97 this.$element
98 [dimension](this.$element[dimension]())
99 [0].offsetHeight
100
101 this.$element
102 .addClass('collapsing')
103 .removeClass('collapse')
104 .removeClass('in')
105
106 this.transitioning = 1
107
108 var complete = function () {
109 this.transitioning = 0
110 this.$element
111 .trigger('hidden.bs.collapse')
112 .removeClass('collapsing')
113 .addClass('collapse')
114 }
115
116 if (!$.support.transition) return complete.call(this)
117
118 this.$element
119 [dimension](0)
120 .one($.support.transition.end, $.proxy(complete, this))
121 .emulateTransitionEnd(350)
122 }
123
124 Collapse.prototype.toggle = function () {
125 this[this.$element.hasClass('in') ? 'hide' : 'show']()
126 }
127
128
129 // COLLAPSE PLUGIN DEFINITION
130 // ==========================
131
132 var old = $.fn.collapse
133
134 $.fn.collapse = function (option) {
135 return this.each(function () {
136 var $this = $(this)
137 var data = $this.data('bs.collapse')
138 var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
139
140 if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
141 if (typeof option == 'string') data[option]()
142 })
143 }
144
145 $.fn.collapse.Constructor = Collapse
146
147
148 // COLLAPSE NO CONFLICT
149 // ====================
150
151 $.fn.collapse.noConflict = function () {
152 $.fn.collapse = old
153 return this
154 }
155
156
157 // COLLAPSE DATA-API
158 // =================
159
160 $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
161 var $this = $(this), href
162 var target = $this.attr('data-target')
163 || e.preventDefault()
164 || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
165 var $target = $(target)
166 var data = $target.data('bs.collapse')
167 var option = data ? 'toggle' : $this.data()
168 var parent = $this.attr('data-parent')
169 var $parent = parent && $(parent)
170
171 if (!data || !data.transitioning) {
172 if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
173 $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
174 }
175
176 $target.collapse(option)
177 })
178
179 }(jQuery);