1 /* ========================================================================
2 * Bootstrap: tab.js v3.3.7
3 * http://getbootstrap.com/javascript/#tabs
4 * ========================================================================
5 * Copyright 2011-2016 Twitter, Inc.
6 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 * ======================================================================== */
13 // TAB CLASS DEFINITION
14 // ====================
16 var Tab = function (element) {
17 // jscs:disable requireDollarBeforejQueryAssignment
18 this.element = $(element)
19 // jscs:enable requireDollarBeforejQueryAssignment
24 Tab.TRANSITION_DURATION = 150
26 Tab.prototype.show = function () {
27 var $this = this.element
28 var $ul = $this.closest('ul:not(.dropdown-menu)')
29 var selector = $this.data('target')
32 selector = $this.attr('href')
33 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
36 if ($this.parent('li').hasClass('active')) return
38 var $previous = $ul.find('.active:last a')
39 var hideEvent = $.Event('hide.bs.tab', {
40 relatedTarget: $this[0]
42 var showEvent = $.Event('show.bs.tab', {
43 relatedTarget: $previous[0]
46 $previous.trigger(hideEvent)
47 $this.trigger(showEvent)
49 if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
51 var $target = $(selector)
53 this.activate($this.closest('li'), $ul)
54 this.activate($target, $target.parent(), function () {
56 type: 'hidden.bs.tab',
57 relatedTarget: $this[0]
61 relatedTarget: $previous[0]
66 Tab.prototype.activate = function (element, container, callback) {
67 var $active = container.find('> .active')
68 var transition = callback
69 && $.support.transition
70 && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
74 .removeClass('active')
75 .find('> .dropdown-menu > .active')
76 .removeClass('active')
78 .find('[data-toggle="tab"]')
79 .attr('aria-expanded', false)
83 .find('[data-toggle="tab"]')
84 .attr('aria-expanded', true)
87 element[0].offsetWidth // reflow for transition
88 element.addClass('in')
90 element.removeClass('fade')
93 if (element.parent('.dropdown-menu').length) {
95 .closest('li.dropdown')
98 .find('[data-toggle="tab"]')
99 .attr('aria-expanded', true)
102 callback && callback()
105 $active.length && transition ?
107 .one('bsTransitionEnd', next)
108 .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
111 $active.removeClass('in')
115 // TAB PLUGIN DEFINITION
116 // =====================
118 function Plugin(option) {
119 return this.each(function () {
121 var data = $this.data('bs.tab')
123 if (!data) $this.data('bs.tab', (data = new Tab(this)))
124 if (typeof option == 'string') data[option]()
131 $.fn.tab.Constructor = Tab
137 $.fn.tab.noConflict = function () {
146 var clickHandler = function (e) {
148 Plugin.call($(this), 'show')
152 .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
153 .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)