1+ /* ============================================================
2+ * bootstrap-dropdown.js v2.3.1
3+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
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+ /* DROPDOWN CLASS DEFINITION
27+ * ========================= */
28+
29+ var toggle = '[data-toggle=dropdown]'
30+ , Dropdown = function ( element ) {
31+ var $el = $ ( element ) . on ( 'click.dropdown.data-api' , this . toggle )
32+ $ ( 'html' ) . on ( 'click.dropdown.data-api' , function ( ) {
33+ $el . parent ( ) . removeClass ( 'open' )
34+ } )
35+ }
36+
37+ Dropdown . prototype = {
38+
39+ constructor : Dropdown
40+
41+ , toggle : function ( e ) {
42+ var $this = $ ( this )
43+ , $parent
44+ , isActive
45+
46+ if ( $this . is ( '.disabled, :disabled' ) ) return
47+
48+ $parent = getParent ( $this )
49+
50+ isActive = $parent . hasClass ( 'open' )
51+
52+ clearMenus ( )
53+
54+ if ( ! isActive ) {
55+ $parent . toggleClass ( 'open' )
56+ }
57+
58+ $this . focus ( )
59+
60+ return false
61+ }
62+
63+ , keydown : function ( e ) {
64+ var $this
65+ , $items
66+ , $active
67+ , $parent
68+ , isActive
69+ , index
70+
71+ if ( ! / ( 3 8 | 4 0 | 2 7 ) / . test ( e . keyCode ) ) return
72+
73+ $this = $ ( this )
74+
75+ e . preventDefault ( )
76+ e . stopPropagation ( )
77+
78+ if ( $this . is ( '.disabled, :disabled' ) ) return
79+
80+ $parent = getParent ( $this )
81+
82+ isActive = $parent . hasClass ( 'open' )
83+
84+ if ( ! isActive || ( isActive && e . keyCode == 27 ) ) {
85+ if ( e . which == 27 ) $parent . find ( toggle ) . focus ( )
86+ return $this . click ( )
87+ }
88+
89+ $items = $ ( '[role=menu] li:not(.divider):visible a' , $parent )
90+
91+ if ( ! $items . length ) return
92+
93+ index = $items . index ( $items . filter ( ':focus' ) )
94+
95+ if ( e . keyCode == 38 && index > 0 ) index -- // up
96+ if ( e . keyCode == 40 && index < $items . length - 1 ) index ++ // down
97+ if ( ! ~ index ) index = 0
98+
99+ $items
100+ . eq ( index )
101+ . focus ( )
102+ }
103+
104+ }
105+
106+ function clearMenus ( ) {
107+ $ ( toggle ) . each ( function ( ) {
108+ getParent ( $ ( this ) ) . removeClass ( 'open' )
109+ } )
110+ }
111+
112+ function getParent ( $this ) {
113+ var selector = $this . attr ( 'data-target' )
114+ , $parent
115+
116+ if ( ! selector ) {
117+ selector = $this . attr ( 'href' )
118+ selector = selector && / # / . test ( selector ) && selector . replace ( / .* (? = # [ ^ \s ] * $ ) / , '' ) //strip for ie7
119+ }
120+
121+ $parent = selector && $ ( selector )
122+
123+ if ( ! $parent || ! $parent . length ) $parent = $this . parent ( )
124+
125+ return $parent
126+ }
127+
128+
129+ /* DROPDOWN PLUGIN DEFINITION
130+ * ========================== */
131+
132+ var old = $ . fn . dropdown
133+
134+ $ . fn . dropdown = function ( option ) {
135+ return this . each ( function ( ) {
136+ var $this = $ ( this )
137+ , data = $this . data ( 'dropdown' )
138+ if ( ! data ) $this . data ( 'dropdown' , ( data = new Dropdown ( this ) ) )
139+ if ( typeof option == 'string' ) data [ option ] . call ( $this )
140+ } )
141+ }
142+
143+ $ . fn . dropdown . Constructor = Dropdown
144+
145+
146+ /* DROPDOWN NO CONFLICT
147+ * ==================== */
148+
149+ $ . fn . dropdown . noConflict = function ( ) {
150+ $ . fn . dropdown = old
151+ return this
152+ }
153+
154+
155+ /* APPLY TO STANDARD DROPDOWN ELEMENTS
156+ * =================================== */
157+
158+ $ ( document )
159+ . on ( 'click.dropdown.data-api' , clearMenus )
160+ . on ( 'click.dropdown.data-api' , '.dropdown form' , function ( e ) { e . stopPropagation ( ) } )
161+ . on ( 'click.dropdown-menu' , function ( e ) { e . stopPropagation ( ) } )
162+ . on ( 'click.dropdown.data-api' , toggle , Dropdown . prototype . toggle )
163+ . on ( 'keydown.dropdown.data-api' , toggle + ', [role=menu]' , Dropdown . prototype . keydown )
164+
165+ } ( window . jQuery ) ;
0 commit comments