|
1 /* ============================================================= |
|
2 * bootstrap-collapse.js v2.3.1 |
|
3 * http://twitter.github.com/bootstrap/javascript.html#collapse |
|
4 * ============================================================= |
|
5 * Copyright 2012 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 ($) { |
|
22 |
|
23 "use strict"; // jshint ;_; |
|
24 |
|
25 |
|
26 /* COLLAPSE PUBLIC CLASS DEFINITION |
|
27 * ================================ */ |
|
28 |
|
29 var Collapse = function (element, options) { |
|
30 this.$element = $(element) |
|
31 this.options = $.extend({}, $.fn.collapse.defaults, options) |
|
32 |
|
33 if (this.options.parent) { |
|
34 this.$parent = $(this.options.parent) |
|
35 } |
|
36 |
|
37 this.options.toggle && this.toggle() |
|
38 } |
|
39 |
|
40 Collapse.prototype = { |
|
41 |
|
42 constructor: Collapse |
|
43 |
|
44 , dimension: function () { |
|
45 var hasWidth = this.$element.hasClass('width') |
|
46 return hasWidth ? 'width' : 'height' |
|
47 } |
|
48 |
|
49 , show: function () { |
|
50 var dimension |
|
51 , scroll |
|
52 , actives |
|
53 , hasData |
|
54 |
|
55 if (this.transitioning || this.$element.hasClass('in')) return |
|
56 |
|
57 dimension = this.dimension() |
|
58 scroll = $.camelCase(['scroll', dimension].join('-')) |
|
59 actives = this.$parent && this.$parent.find('> .accordion-group > .in') |
|
60 |
|
61 if (actives && actives.length) { |
|
62 hasData = actives.data('collapse') |
|
63 if (hasData && hasData.transitioning) return |
|
64 actives.collapse('hide') |
|
65 hasData || actives.data('collapse', null) |
|
66 } |
|
67 |
|
68 this.$element[dimension](0) |
|
69 this.transition('addClass', $.Event('show'), 'shown') |
|
70 $.support.transition && this.$element[dimension](this.$element[0][scroll]) |
|
71 } |
|
72 |
|
73 , hide: function () { |
|
74 var dimension |
|
75 if (this.transitioning || !this.$element.hasClass('in')) return |
|
76 dimension = this.dimension() |
|
77 this.reset(this.$element[dimension]()) |
|
78 this.transition('removeClass', $.Event('hide'), 'hidden') |
|
79 this.$element[dimension](0) |
|
80 } |
|
81 |
|
82 , reset: function (size) { |
|
83 var dimension = this.dimension() |
|
84 |
|
85 this.$element |
|
86 .removeClass('collapse') |
|
87 [dimension](size || 'auto') |
|
88 [0].offsetWidth |
|
89 |
|
90 this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') |
|
91 |
|
92 return this |
|
93 } |
|
94 |
|
95 , transition: function (method, startEvent, completeEvent) { |
|
96 var that = this |
|
97 , complete = function () { |
|
98 if (startEvent.type == 'show') that.reset() |
|
99 that.transitioning = 0 |
|
100 that.$element.trigger(completeEvent) |
|
101 } |
|
102 |
|
103 this.$element.trigger(startEvent) |
|
104 |
|
105 if (startEvent.isDefaultPrevented()) return |
|
106 |
|
107 this.transitioning = 1 |
|
108 |
|
109 this.$element[method]('in') |
|
110 |
|
111 $.support.transition && this.$element.hasClass('collapse') ? |
|
112 this.$element.one($.support.transition.end, complete) : |
|
113 complete() |
|
114 } |
|
115 |
|
116 , toggle: function () { |
|
117 this[this.$element.hasClass('in') ? 'hide' : 'show']() |
|
118 } |
|
119 |
|
120 } |
|
121 |
|
122 |
|
123 /* COLLAPSE PLUGIN DEFINITION |
|
124 * ========================== */ |
|
125 |
|
126 var old = $.fn.collapse |
|
127 |
|
128 $.fn.collapse = function (option) { |
|
129 return this.each(function () { |
|
130 var $this = $(this) |
|
131 , data = $this.data('collapse') |
|
132 , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) |
|
133 if (!data) $this.data('collapse', (data = new Collapse(this, options))) |
|
134 if (typeof option == 'string') data[option]() |
|
135 }) |
|
136 } |
|
137 |
|
138 $.fn.collapse.defaults = { |
|
139 toggle: true |
|
140 } |
|
141 |
|
142 $.fn.collapse.Constructor = Collapse |
|
143 |
|
144 |
|
145 /* COLLAPSE NO CONFLICT |
|
146 * ==================== */ |
|
147 |
|
148 $.fn.collapse.noConflict = function () { |
|
149 $.fn.collapse = old |
|
150 return this |
|
151 } |
|
152 |
|
153 |
|
154 /* COLLAPSE DATA-API |
|
155 * ================= */ |
|
156 |
|
157 $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { |
|
158 var $this = $(this), href |
|
159 , target = $this.attr('data-target') |
|
160 || e.preventDefault() |
|
161 || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 |
|
162 , option = $(target).data('collapse') ? 'toggle' : $this.data() |
|
163 $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') |
|
164 $(target).collapse(option) |
|
165 }) |
|
166 |
|
167 }(window.jQuery); |