unignore bower_components
[bootswatch] / 2 / bower_components / bootstrap / docs / assets / js / bootstrap-tab.js
1 /* ========================================================
2  * bootstrap-tab.js v2.3.2
3  * http://twbs.github.com/bootstrap/javascript.html#tabs
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 ($) {
22
23   "use strict"; // jshint ;_;
24
25
26  /* TAB CLASS DEFINITION
27   * ==================== */
28
29   var Tab = function (element) {
30     this.element = $(element)
31   }
32
33   Tab.prototype = {
34
35     constructor: Tab
36
37   , show: function () {
38       var $this = this.element
39         , $ul = $this.closest('ul:not(.dropdown-menu)')
40         , selector = $this.attr('data-target')
41         , previous
42         , $target
43         , e
44
45       if (!selector) {
46         selector = $this.attr('href')
47         selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
48       }
49
50       if ( $this.parent('li').hasClass('active') ) return
51
52       previous = $ul.find('.active:last a')[0]
53
54       e = $.Event('show', {
55         relatedTarget: previous
56       })
57
58       $this.trigger(e)
59
60       if (e.isDefaultPrevented()) return
61
62       $target = $(selector)
63
64       this.activate($this.parent('li'), $ul)
65       this.activate($target, $target.parent(), function () {
66         $this.trigger({
67           type: 'shown'
68         , relatedTarget: previous
69         })
70       })
71     }
72
73   , activate: function ( element, container, callback) {
74       var $active = container.find('> .active')
75         , transition = callback
76             && $.support.transition
77             && $active.hasClass('fade')
78
79       function next() {
80         $active
81           .removeClass('active')
82           .find('> .dropdown-menu > .active')
83           .removeClass('active')
84
85         element.addClass('active')
86
87         if (transition) {
88           element[0].offsetWidth // reflow for transition
89           element.addClass('in')
90         } else {
91           element.removeClass('fade')
92         }
93
94         if ( element.parent('.dropdown-menu') ) {
95           element.closest('li.dropdown').addClass('active')
96         }
97
98         callback && callback()
99       }
100
101       transition ?
102         $active.one($.support.transition.end, next) :
103         next()
104
105       $active.removeClass('in')
106     }
107   }
108
109
110  /* TAB PLUGIN DEFINITION
111   * ===================== */
112
113   var old = $.fn.tab
114
115   $.fn.tab = function ( option ) {
116     return this.each(function () {
117       var $this = $(this)
118         , data = $this.data('tab')
119       if (!data) $this.data('tab', (data = new Tab(this)))
120       if (typeof option == 'string') data[option]()
121     })
122   }
123
124   $.fn.tab.Constructor = Tab
125
126
127  /* TAB NO CONFLICT
128   * =============== */
129
130   $.fn.tab.noConflict = function () {
131     $.fn.tab = old
132     return this
133   }
134
135
136  /* TAB DATA-API
137   * ============ */
138
139   $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
140     e.preventDefault()
141     $(this).tab('show')
142   })
143
144 }(window.jQuery);