1 /* ========================================================================
2 * Bootstrap: collapse.js v3.2.0
3 * http://getbootstrap.com/javascript/#collapse
4 * ========================================================================
5 * Copyright 2011-2014 Twitter, Inc.
6 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 * ======================================================================== */
13 // COLLAPSE PUBLIC CLASS DEFINITION
14 // ================================
16 var Collapse = function (element, options) {
17 this.$element = $(element)
18 this.options = $.extend({}, Collapse.DEFAULTS, options)
19 this.transitioning = null
21 if (this.options.parent) this.$parent = $(this.options.parent)
22 if (this.options.toggle) this.toggle()
25 Collapse.VERSION = '3.2.0'
31 Collapse.prototype.dimension = function () {
32 var hasWidth = this.$element.hasClass('width')
33 return hasWidth ? 'width' : 'height'
36 Collapse.prototype.show = function () {
37 if (this.transitioning || this.$element.hasClass('in')) return
39 var startEvent = $.Event('show.bs.collapse')
40 this.$element.trigger(startEvent)
41 if (startEvent.isDefaultPrevented()) return
43 var actives = this.$parent && this.$parent.find('> .panel > .in')
45 if (actives && actives.length) {
46 var hasData = actives.data('bs.collapse')
47 if (hasData && hasData.transitioning) return
48 Plugin.call(actives, 'hide')
49 hasData || actives.data('bs.collapse', null)
52 var dimension = this.dimension()
55 .removeClass('collapse')
56 .addClass('collapsing')[dimension](0)
58 this.transitioning = 1
60 var complete = function () {
62 .removeClass('collapsing')
63 .addClass('collapse in')[dimension]('')
64 this.transitioning = 0
66 .trigger('shown.bs.collapse')
69 if (!$.support.transition) return complete.call(this)
71 var scrollSize = $.camelCase(['scroll', dimension].join('-'))
74 .one('bsTransitionEnd', $.proxy(complete, this))
75 .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
78 Collapse.prototype.hide = function () {
79 if (this.transitioning || !this.$element.hasClass('in')) return
81 var startEvent = $.Event('hide.bs.collapse')
82 this.$element.trigger(startEvent)
83 if (startEvent.isDefaultPrevented()) return
85 var dimension = this.dimension()
87 this.$element[dimension](this.$element[dimension]())[0].offsetHeight
90 .addClass('collapsing')
91 .removeClass('collapse')
94 this.transitioning = 1
96 var complete = function () {
97 this.transitioning = 0
99 .trigger('hidden.bs.collapse')
100 .removeClass('collapsing')
101 .addClass('collapse')
104 if (!$.support.transition) return complete.call(this)
108 .one('bsTransitionEnd', $.proxy(complete, this))
109 .emulateTransitionEnd(350)
112 Collapse.prototype.toggle = function () {
113 this[this.$element.hasClass('in') ? 'hide' : 'show']()
117 // COLLAPSE PLUGIN DEFINITION
118 // ==========================
120 function Plugin(option) {
121 return this.each(function () {
123 var data = $this.data('bs.collapse')
124 var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
126 if (!data && options.toggle && option == 'show') option = !option
127 if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
128 if (typeof option == 'string') data[option]()
132 var old = $.fn.collapse
134 $.fn.collapse = Plugin
135 $.fn.collapse.Constructor = Collapse
138 // COLLAPSE NO CONFLICT
139 // ====================
141 $.fn.collapse.noConflict = function () {
150 $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
153 var target = $this.attr('data-target')
154 || e.preventDefault()
155 || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
156 var $target = $(target)
157 var data = $target.data('bs.collapse')
158 var option = data ? 'toggle' : $this.data()
159 var parent = $this.attr('data-parent')
160 var $parent = parent && $(parent)
162 if (!data || !data.transitioning) {
163 if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed')
164 $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
167 Plugin.call($target, option)