root / cloudcms / static / cloudcms / js / jquery.dropkick-1.0.0.js @ 485caba3
History | View | Annotate | Download (10.6 kB)
1 | c6fdba44 | Olga Brani | /**
|
---|---|---|---|
2 | c6fdba44 | Olga Brani | * DropKick
|
3 | c6fdba44 | Olga Brani | *
|
4 | c6fdba44 | Olga Brani | * Highly customizable <select> lists
|
5 | c6fdba44 | Olga Brani | * https://github.com/JamieLottering/DropKick
|
6 | c6fdba44 | Olga Brani | *
|
7 | c6fdba44 | Olga Brani | * © 2011 Jamie Lottering <http://github.com/JamieLottering>
|
8 | c6fdba44 | Olga Brani | * <http://twitter.com/JamieLottering>
|
9 | c6fdba44 | Olga Brani | *
|
10 | c6fdba44 | Olga Brani | */
|
11 | c6fdba44 | Olga Brani | (function ($, window, document) { |
12 | c6fdba44 | Olga Brani | |
13 | c6fdba44 | Olga Brani | var ie6 = false; |
14 | c6fdba44 | Olga Brani | |
15 | c6fdba44 | Olga Brani | // Help prevent flashes of unstyled content
|
16 | c6fdba44 | Olga Brani | if ($.browser.msie && $.browser.version.substr(0, 1) < 7) { |
17 | c6fdba44 | Olga Brani | ie6 = true;
|
18 | c6fdba44 | Olga Brani | } else {
|
19 | c6fdba44 | Olga Brani | document.documentElement.className = document.documentElement.className + ' dk_fouc';
|
20 | c6fdba44 | Olga Brani | } |
21 | c6fdba44 | Olga Brani | |
22 | c6fdba44 | Olga Brani | var
|
23 | c6fdba44 | Olga Brani | // Public methods exposed to $.fn.dropkick()
|
24 | c6fdba44 | Olga Brani | methods = {}, |
25 | c6fdba44 | Olga Brani | |
26 | c6fdba44 | Olga Brani | // Cache every <select> element that gets dropkicked
|
27 | c6fdba44 | Olga Brani | lists = [], |
28 | c6fdba44 | Olga Brani | |
29 | c6fdba44 | Olga Brani | // Convenience keys for keyboard navigation
|
30 | c6fdba44 | Olga Brani | keyMap = { |
31 | c6fdba44 | Olga Brani | 'left' : 37, |
32 | c6fdba44 | Olga Brani | 'up' : 38, |
33 | c6fdba44 | Olga Brani | 'right' : 39, |
34 | c6fdba44 | Olga Brani | 'down' : 40, |
35 | c6fdba44 | Olga Brani | 'enter' : 13 |
36 | c6fdba44 | Olga Brani | }, |
37 | c6fdba44 | Olga Brani | |
38 | c6fdba44 | Olga Brani | // HTML template for the dropdowns
|
39 | c6fdba44 | Olga Brani | dropdownTemplate = [ |
40 | c6fdba44 | Olga Brani | '<div class="dk_container" id="dk_container_{{ id }}" tabindex="{{ tabindex }}">',
|
41 | c6fdba44 | Olga Brani | '<a class="dk_toggle">',
|
42 | c6fdba44 | Olga Brani | '<span class="dk_label">{{ label }}</span>',
|
43 | c6fdba44 | Olga Brani | '</a>',
|
44 | c6fdba44 | Olga Brani | '<div class="dk_options">',
|
45 | c6fdba44 | Olga Brani | '<ul class="dk_options_inner">',
|
46 | c6fdba44 | Olga Brani | '</ul>',
|
47 | c6fdba44 | Olga Brani | '</div>',
|
48 | c6fdba44 | Olga Brani | '</div>'
|
49 | c6fdba44 | Olga Brani | ].join(''),
|
50 | c6fdba44 | Olga Brani | |
51 | c6fdba44 | Olga Brani | // HTML template for dropdown options
|
52 | c6fdba44 | Olga Brani | optionTemplate = '<li class="{{ current }}"><a data-dk-dropdown-value="{{ value }}">{{ text }}</a></li>',
|
53 | c6fdba44 | Olga Brani | |
54 | c6fdba44 | Olga Brani | // Some nice default values
|
55 | c6fdba44 | Olga Brani | defaults = { |
56 | c6fdba44 | Olga Brani | startSpeed : 1000, // I recommend a high value here, I feel it makes the changes less noticeable to the user |
57 | c6fdba44 | Olga Brani | theme : false, |
58 | c6fdba44 | Olga Brani | change : false |
59 | c6fdba44 | Olga Brani | }, |
60 | c6fdba44 | Olga Brani | |
61 | c6fdba44 | Olga Brani | // Make sure we only bind keydown on the document once
|
62 | c6fdba44 | Olga Brani | keysBound = false
|
63 | c6fdba44 | Olga Brani | ; |
64 | c6fdba44 | Olga Brani | |
65 | c6fdba44 | Olga Brani | // Called by using $('foo').dropkick();
|
66 | c6fdba44 | Olga Brani | methods.init = function (settings) { |
67 | c6fdba44 | Olga Brani | settings = $.extend({}, defaults, settings);
|
68 | c6fdba44 | Olga Brani | |
69 | c6fdba44 | Olga Brani | return this.each(function () { |
70 | c6fdba44 | Olga Brani | var
|
71 | c6fdba44 | Olga Brani | // The current <select> element
|
72 | c6fdba44 | Olga Brani | $select = $(this), |
73 | c6fdba44 | Olga Brani | |
74 | c6fdba44 | Olga Brani | // Store a reference to the originally selected <option> element
|
75 | c6fdba44 | Olga Brani | $original = $select.find(':selected').first(), |
76 | c6fdba44 | Olga Brani | |
77 | c6fdba44 | Olga Brani | // Save all of the <option> elements
|
78 | c6fdba44 | Olga Brani | $options = $select.find('option'), |
79 | c6fdba44 | Olga Brani | |
80 | c6fdba44 | Olga Brani | // We store lots of great stuff using jQuery data
|
81 | c6fdba44 | Olga Brani | data = $select.data('dropkick') || {}, |
82 | c6fdba44 | Olga Brani | |
83 | c6fdba44 | Olga Brani | // This gets applied to the 'dk_container' element
|
84 | c6fdba44 | Olga Brani | id = $select.attr('id') || $select.attr('name'), |
85 | c6fdba44 | Olga Brani | |
86 | c6fdba44 | Olga Brani | // This gets updated to be equal to the longest <option> element
|
87 | c6fdba44 | Olga Brani | width = settings.width || $select.outerWidth(),
|
88 | c6fdba44 | Olga Brani | |
89 | c6fdba44 | Olga Brani | // Check if we have a tabindex set or not
|
90 | c6fdba44 | Olga Brani | tabindex = $select.attr('tabindex') ? $select.attr('tabindex') : '', |
91 | c6fdba44 | Olga Brani | |
92 | c6fdba44 | Olga Brani | // The completed dk_container element
|
93 | c6fdba44 | Olga Brani | $dk = false, |
94 | c6fdba44 | Olga Brani | |
95 | c6fdba44 | Olga Brani | theme |
96 | c6fdba44 | Olga Brani | ; |
97 | c6fdba44 | Olga Brani | |
98 | c6fdba44 | Olga Brani | // Dont do anything if we've already setup dropkick on this element
|
99 | c6fdba44 | Olga Brani | if (data.id) {
|
100 | c6fdba44 | Olga Brani | return $select; |
101 | c6fdba44 | Olga Brani | } else {
|
102 | c6fdba44 | Olga Brani | data.settings = settings; |
103 | c6fdba44 | Olga Brani | data.tabindex = tabindex; |
104 | c6fdba44 | Olga Brani | data.id = id; |
105 | c6fdba44 | Olga Brani | data.$original = $original; |
106 | c6fdba44 | Olga Brani | data.$select = $select; |
107 | c6fdba44 | Olga Brani | data.value = _notBlank($select.val()) || _notBlank($original.attr('value')); |
108 | c6fdba44 | Olga Brani | data.label = $original.text();
|
109 | c6fdba44 | Olga Brani | data.options = $options;
|
110 | c6fdba44 | Olga Brani | } |
111 | c6fdba44 | Olga Brani | |
112 | c6fdba44 | Olga Brani | // Build the dropdown HTML
|
113 | c6fdba44 | Olga Brani | $dk = _build(dropdownTemplate, data);
|
114 | c6fdba44 | Olga Brani | |
115 | c6fdba44 | Olga Brani | // Make the dropdown fixed width if desired
|
116 | c6fdba44 | Olga Brani | $dk.find('.dk_toggle').css({ |
117 | c6fdba44 | Olga Brani | 'width' : width + 'px' |
118 | c6fdba44 | Olga Brani | }); |
119 | c6fdba44 | Olga Brani | |
120 | c6fdba44 | Olga Brani | // Hide the <select> list and place our new one in front of it
|
121 | c6fdba44 | Olga Brani | $select.before($dk); |
122 | c6fdba44 | Olga Brani | |
123 | c6fdba44 | Olga Brani | // Update the reference to $dk
|
124 | c6fdba44 | Olga Brani | $dk = $('#dk_container_' + id).fadeIn(settings.startSpeed); |
125 | c6fdba44 | Olga Brani | |
126 | c6fdba44 | Olga Brani | // Save the current theme
|
127 | c6fdba44 | Olga Brani | theme = settings.theme ? settings.theme : 'default';
|
128 | c6fdba44 | Olga Brani | $dk.addClass('dk_theme_' + theme); |
129 | c6fdba44 | Olga Brani | data.theme = theme; |
130 | c6fdba44 | Olga Brani | |
131 | c6fdba44 | Olga Brani | // Save the updated $dk reference into our data object
|
132 | c6fdba44 | Olga Brani | data.$dk = $dk; |
133 | c6fdba44 | Olga Brani | |
134 | c6fdba44 | Olga Brani | // Save the dropkick data onto the <select> element
|
135 | c6fdba44 | Olga Brani | $select.data('dropkick', data); |
136 | c6fdba44 | Olga Brani | |
137 | c6fdba44 | Olga Brani | // Do the same for the dropdown, but add a few helpers
|
138 | c6fdba44 | Olga Brani | $dk.data('dropkick', data); |
139 | c6fdba44 | Olga Brani | |
140 | c6fdba44 | Olga Brani | lists[lists.length] = $select;
|
141 | c6fdba44 | Olga Brani | |
142 | c6fdba44 | Olga Brani | // Focus events
|
143 | c6fdba44 | Olga Brani | $dk.bind('focus.dropkick', function (e) { |
144 | c6fdba44 | Olga Brani | $dk.addClass('dk_focus'); |
145 | c6fdba44 | Olga Brani | }).bind('blur.dropkick', function (e) { |
146 | c6fdba44 | Olga Brani | $dk.removeClass('dk_open dk_focus'); |
147 | c6fdba44 | Olga Brani | }); |
148 | c6fdba44 | Olga Brani | |
149 | c6fdba44 | Olga Brani | setTimeout(function () {
|
150 | c6fdba44 | Olga Brani | $select.hide();
|
151 | c6fdba44 | Olga Brani | }, 0);
|
152 | c6fdba44 | Olga Brani | }); |
153 | c6fdba44 | Olga Brani | }; |
154 | c6fdba44 | Olga Brani | |
155 | c6fdba44 | Olga Brani | // Allows dynamic theme changes
|
156 | c6fdba44 | Olga Brani | methods.theme = function (newTheme) { |
157 | c6fdba44 | Olga Brani | var
|
158 | c6fdba44 | Olga Brani | $select = $(this), |
159 | c6fdba44 | Olga Brani | list = $select.data('dropkick'), |
160 | c6fdba44 | Olga Brani | $dk = list.$dk, |
161 | c6fdba44 | Olga Brani | oldtheme = 'dk_theme_' + list.theme
|
162 | c6fdba44 | Olga Brani | ; |
163 | c6fdba44 | Olga Brani | |
164 | c6fdba44 | Olga Brani | $dk.removeClass(oldtheme).addClass('dk_theme_' + newTheme); |
165 | c6fdba44 | Olga Brani | |
166 | c6fdba44 | Olga Brani | list.theme = newTheme; |
167 | c6fdba44 | Olga Brani | }; |
168 | c6fdba44 | Olga Brani | |
169 | c6fdba44 | Olga Brani | // Reset all <selects and dropdowns in our lists array
|
170 | c6fdba44 | Olga Brani | methods.reset = function () { |
171 | c6fdba44 | Olga Brani | for (var i = 0, l = lists.length; i < l; i++) { |
172 | c6fdba44 | Olga Brani | var
|
173 | c6fdba44 | Olga Brani | listData = lists[i].data('dropkick'),
|
174 | c6fdba44 | Olga Brani | $dk = listData.$dk, |
175 | c6fdba44 | Olga Brani | $current = $dk.find('li').first() |
176 | c6fdba44 | Olga Brani | ; |
177 | c6fdba44 | Olga Brani | |
178 | c6fdba44 | Olga Brani | $dk.find('.dk_label').text(listData.label); |
179 | c6fdba44 | Olga Brani | $dk.find('.dk_options_inner').animate({ scrollTop: 0 }, 0); |
180 | c6fdba44 | Olga Brani | |
181 | c6fdba44 | Olga Brani | _setCurrent($current, $dk); |
182 | c6fdba44 | Olga Brani | _updateFields($current, $dk, true); |
183 | c6fdba44 | Olga Brani | } |
184 | c6fdba44 | Olga Brani | }; |
185 | c6fdba44 | Olga Brani | |
186 | c6fdba44 | Olga Brani | // Expose the plugin
|
187 | c6fdba44 | Olga Brani | $.fn.dropkick = function (method) { |
188 | c6fdba44 | Olga Brani | if (!ie6) {
|
189 | c6fdba44 | Olga Brani | if (methods[method]) {
|
190 | c6fdba44 | Olga Brani | return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); |
191 | c6fdba44 | Olga Brani | } else if (typeof method === 'object' || ! method) { |
192 | c6fdba44 | Olga Brani | return methods.init.apply(this, arguments); |
193 | c6fdba44 | Olga Brani | } |
194 | c6fdba44 | Olga Brani | } |
195 | c6fdba44 | Olga Brani | }; |
196 | c6fdba44 | Olga Brani | |
197 | c6fdba44 | Olga Brani | // private
|
198 | c6fdba44 | Olga Brani | function _handleKeyBoardNav(e, $dk) { |
199 | c6fdba44 | Olga Brani | var
|
200 | c6fdba44 | Olga Brani | code = e.keyCode, |
201 | c6fdba44 | Olga Brani | data = $dk.data('dropkick'), |
202 | c6fdba44 | Olga Brani | options = $dk.find('.dk_options'), |
203 | c6fdba44 | Olga Brani | open = $dk.hasClass('dk_open'), |
204 | c6fdba44 | Olga Brani | current = $dk.find('.dk_option_current'), |
205 | c6fdba44 | Olga Brani | first = options.find('li').first(),
|
206 | c6fdba44 | Olga Brani | last = options.find('li').last(),
|
207 | c6fdba44 | Olga Brani | next, |
208 | c6fdba44 | Olga Brani | prev |
209 | c6fdba44 | Olga Brani | ; |
210 | c6fdba44 | Olga Brani | |
211 | c6fdba44 | Olga Brani | switch (code) {
|
212 | c6fdba44 | Olga Brani | case keyMap.enter:
|
213 | c6fdba44 | Olga Brani | if (open) {
|
214 | c6fdba44 | Olga Brani | _updateFields(current.find('a'), $dk); |
215 | c6fdba44 | Olga Brani | _closeDropdown($dk);
|
216 | c6fdba44 | Olga Brani | } else {
|
217 | c6fdba44 | Olga Brani | _openDropdown($dk);
|
218 | c6fdba44 | Olga Brani | } |
219 | c6fdba44 | Olga Brani | e.preventDefault(); |
220 | c6fdba44 | Olga Brani | break;
|
221 | c6fdba44 | Olga Brani | |
222 | c6fdba44 | Olga Brani | case keyMap.up:
|
223 | c6fdba44 | Olga Brani | prev = current.prev('li');
|
224 | c6fdba44 | Olga Brani | if (open) {
|
225 | c6fdba44 | Olga Brani | if (prev.length) {
|
226 | c6fdba44 | Olga Brani | _setCurrent(prev, $dk);
|
227 | c6fdba44 | Olga Brani | } else {
|
228 | c6fdba44 | Olga Brani | _setCurrent(last, $dk);
|
229 | c6fdba44 | Olga Brani | } |
230 | c6fdba44 | Olga Brani | } else {
|
231 | c6fdba44 | Olga Brani | _openDropdown($dk);
|
232 | c6fdba44 | Olga Brani | } |
233 | c6fdba44 | Olga Brani | e.preventDefault(); |
234 | c6fdba44 | Olga Brani | break;
|
235 | c6fdba44 | Olga Brani | |
236 | c6fdba44 | Olga Brani | case keyMap.down:
|
237 | c6fdba44 | Olga Brani | if (open) {
|
238 | c6fdba44 | Olga Brani | next = current.next('li').first();
|
239 | c6fdba44 | Olga Brani | if (next.length) {
|
240 | c6fdba44 | Olga Brani | _setCurrent(next, $dk);
|
241 | c6fdba44 | Olga Brani | } else {
|
242 | c6fdba44 | Olga Brani | _setCurrent(first, $dk);
|
243 | c6fdba44 | Olga Brani | } |
244 | c6fdba44 | Olga Brani | } else {
|
245 | c6fdba44 | Olga Brani | _openDropdown($dk);
|
246 | c6fdba44 | Olga Brani | } |
247 | c6fdba44 | Olga Brani | e.preventDefault(); |
248 | c6fdba44 | Olga Brani | break;
|
249 | c6fdba44 | Olga Brani | |
250 | c6fdba44 | Olga Brani | default:
|
251 | c6fdba44 | Olga Brani | break;
|
252 | c6fdba44 | Olga Brani | } |
253 | c6fdba44 | Olga Brani | } |
254 | c6fdba44 | Olga Brani | |
255 | c6fdba44 | Olga Brani | // Update the <select> value, and the dropdown label
|
256 | c6fdba44 | Olga Brani | function _updateFields(option, $dk, reset) { |
257 | c6fdba44 | Olga Brani | var value, label, data;
|
258 | c6fdba44 | Olga Brani | |
259 | c6fdba44 | Olga Brani | value = option.attr('data-dk-dropdown-value');
|
260 | c6fdba44 | Olga Brani | label = option.text(); |
261 | c6fdba44 | Olga Brani | data = $dk.data('dropkick'); |
262 | c6fdba44 | Olga Brani | |
263 | c6fdba44 | Olga Brani | $select = data.$select; |
264 | c6fdba44 | Olga Brani | $select.val(value);
|
265 | c6fdba44 | Olga Brani | |
266 | c6fdba44 | Olga Brani | $dk.find('.dk_label').text(label); |
267 | c6fdba44 | Olga Brani | |
268 | c6fdba44 | Olga Brani | reset = reset || false;
|
269 | c6fdba44 | Olga Brani | |
270 | c6fdba44 | Olga Brani | if (data.settings.change && !reset) {
|
271 | c6fdba44 | Olga Brani | data.settings.change.call($select, value, label);
|
272 | c6fdba44 | Olga Brani | } |
273 | c6fdba44 | Olga Brani | } |
274 | c6fdba44 | Olga Brani | |
275 | c6fdba44 | Olga Brani | // Set the currently selected option
|
276 | c6fdba44 | Olga Brani | function _setCurrent($current, $dk) { |
277 | c6fdba44 | Olga Brani | $dk.find('.dk_option_current').removeClass('dk_option_current'); |
278 | c6fdba44 | Olga Brani | $current.addClass('dk_option_current'); |
279 | c6fdba44 | Olga Brani | |
280 | c6fdba44 | Olga Brani | _setScrollPos($dk, $current); |
281 | c6fdba44 | Olga Brani | } |
282 | c6fdba44 | Olga Brani | |
283 | c6fdba44 | Olga Brani | function _setScrollPos($dk, anchor) { |
284 | c6fdba44 | Olga Brani | var height = anchor.prevAll('li').outerHeight() * anchor.prevAll('li').length; |
285 | c6fdba44 | Olga Brani | $dk.find('.dk_options_inner').animate({ scrollTop: height + 'px' }, 0); |
286 | c6fdba44 | Olga Brani | } |
287 | c6fdba44 | Olga Brani | |
288 | c6fdba44 | Olga Brani | // Close a dropdown
|
289 | c6fdba44 | Olga Brani | function _closeDropdown($dk) { |
290 | c6fdba44 | Olga Brani | $dk.removeClass('dk_open'); |
291 | c6fdba44 | Olga Brani | } |
292 | c6fdba44 | Olga Brani | |
293 | c6fdba44 | Olga Brani | // Open a dropdown
|
294 | c6fdba44 | Olga Brani | function _openDropdown($dk) { |
295 | c6fdba44 | Olga Brani | var data = $dk.data('dropkick'); |
296 | c6fdba44 | Olga Brani | $dk.find('.dk_options').css({ top : $dk.find('.dk_toggle').outerHeight() - 1 }); |
297 | c6fdba44 | Olga Brani | $dk.toggleClass('dk_open'); |
298 | c6fdba44 | Olga Brani | |
299 | c6fdba44 | Olga Brani | } |
300 | c6fdba44 | Olga Brani | |
301 | c6fdba44 | Olga Brani | /**
|
302 | c6fdba44 | Olga Brani | * Turn the dropdownTemplate into a jQuery object and fill in the variables.
|
303 | c6fdba44 | Olga Brani | */
|
304 | c6fdba44 | Olga Brani | function _build (tpl, view) { |
305 | c6fdba44 | Olga Brani | var
|
306 | c6fdba44 | Olga Brani | // Template for the dropdown
|
307 | c6fdba44 | Olga Brani | template = tpl, |
308 | c6fdba44 | Olga Brani | // Holder of the dropdowns options
|
309 | c6fdba44 | Olga Brani | options = [], |
310 | c6fdba44 | Olga Brani | $dk
|
311 | c6fdba44 | Olga Brani | ; |
312 | c6fdba44 | Olga Brani | |
313 | c6fdba44 | Olga Brani | template = template.replace('{{ id }}', view.id);
|
314 | c6fdba44 | Olga Brani | template = template.replace('{{ label }}', view.label);
|
315 | c6fdba44 | Olga Brani | template = template.replace('{{ tabindex }}', view.tabindex);
|
316 | c6fdba44 | Olga Brani | |
317 | c6fdba44 | Olga Brani | if (view.options && view.options.length) {
|
318 | c6fdba44 | Olga Brani | for (var i = 0, l = view.options.length; i < l; i++) { |
319 | c6fdba44 | Olga Brani | var
|
320 | c6fdba44 | Olga Brani | $option = $(view.options[i]), |
321 | c6fdba44 | Olga Brani | current = 'dk_option_current',
|
322 | c6fdba44 | Olga Brani | oTemplate = optionTemplate |
323 | c6fdba44 | Olga Brani | ; |
324 | c6fdba44 | Olga Brani | |
325 | c6fdba44 | Olga Brani | oTemplate = oTemplate.replace('{{ value }}', $option.val()); |
326 | c6fdba44 | Olga Brani | oTemplate = oTemplate.replace('{{ current }}', (_notBlank($option.val()) === view.value) ? current : ''); |
327 | c6fdba44 | Olga Brani | oTemplate = oTemplate.replace('{{ text }}', $option.text()); |
328 | c6fdba44 | Olga Brani | |
329 | c6fdba44 | Olga Brani | options[options.length] = oTemplate; |
330 | c6fdba44 | Olga Brani | } |
331 | c6fdba44 | Olga Brani | } |
332 | c6fdba44 | Olga Brani | |
333 | c6fdba44 | Olga Brani | $dk = $(template); |
334 | c6fdba44 | Olga Brani | $dk.find('.dk_options_inner').html(options.join('')); |
335 | c6fdba44 | Olga Brani | |
336 | c6fdba44 | Olga Brani | return $dk; |
337 | c6fdba44 | Olga Brani | } |
338 | c6fdba44 | Olga Brani | |
339 | c6fdba44 | Olga Brani | function _notBlank(text) { |
340 | c6fdba44 | Olga Brani | return ($.trim(text).length > 0) ? text : false; |
341 | c6fdba44 | Olga Brani | } |
342 | c6fdba44 | Olga Brani | |
343 | c6fdba44 | Olga Brani | $(function () { |
344 | c6fdba44 | Olga Brani | |
345 | c6fdba44 | Olga Brani | // Handle click events on the dropdown toggler
|
346 | c6fdba44 | Olga Brani | $('.dk_toggle').live('click', function (e) { |
347 | c6fdba44 | Olga Brani | var $dk = $(this).parents('.dk_container').first(); |
348 | c6fdba44 | Olga Brani | |
349 | c6fdba44 | Olga Brani | _openDropdown($dk);
|
350 | c6fdba44 | Olga Brani | |
351 | c6fdba44 | Olga Brani | if ("ontouchstart" in window) { |
352 | c6fdba44 | Olga Brani | $dk.addClass('dk_touch'); |
353 | c6fdba44 | Olga Brani | $dk.find('.dk_options_inner').addClass('scrollable vertical'); |
354 | c6fdba44 | Olga Brani | } |
355 | c6fdba44 | Olga Brani | |
356 | c6fdba44 | Olga Brani | e.preventDefault(); |
357 | c6fdba44 | Olga Brani | return false; |
358 | c6fdba44 | Olga Brani | }); |
359 | c6fdba44 | Olga Brani | |
360 | c6fdba44 | Olga Brani | // Handle click events on individual dropdown options
|
361 | c6fdba44 | Olga Brani | $('.dk_options a').live(($.browser.msie ? 'mousedown' : 'click'), function (e) { |
362 | c6fdba44 | Olga Brani | var
|
363 | c6fdba44 | Olga Brani | $option = $(this), |
364 | c6fdba44 | Olga Brani | $dk = $option.parents('.dk_container').first(), |
365 | c6fdba44 | Olga Brani | data = $dk.data('dropkick') |
366 | c6fdba44 | Olga Brani | ; |
367 | c6fdba44 | Olga Brani | |
368 | c6fdba44 | Olga Brani | _closeDropdown($dk);
|
369 | c6fdba44 | Olga Brani | _updateFields($option, $dk); |
370 | c6fdba44 | Olga Brani | _setCurrent($option.parent(), $dk); |
371 | c6fdba44 | Olga Brani | |
372 | c6fdba44 | Olga Brani | e.preventDefault(); |
373 | c6fdba44 | Olga Brani | return false; |
374 | c6fdba44 | Olga Brani | }); |
375 | c6fdba44 | Olga Brani | |
376 | c6fdba44 | Olga Brani | // Setup keyboard nav
|
377 | c6fdba44 | Olga Brani | $(document).bind('keydown.dk_nav', function (e) { |
378 | c6fdba44 | Olga Brani | var
|
379 | c6fdba44 | Olga Brani | // Look for an open dropdown...
|
380 | c6fdba44 | Olga Brani | $open = $('.dk_container.dk_open'), |
381 | c6fdba44 | Olga Brani | |
382 | c6fdba44 | Olga Brani | // Look for a focused dropdown
|
383 | c6fdba44 | Olga Brani | $focused = $('.dk_container.dk_focus'), |
384 | c6fdba44 | Olga Brani | |
385 | c6fdba44 | Olga Brani | // Will be either $open, $focused, or null
|
386 | c6fdba44 | Olga Brani | $dk = null |
387 | c6fdba44 | Olga Brani | ; |
388 | c6fdba44 | Olga Brani | |
389 | c6fdba44 | Olga Brani | // If we have an open dropdown, key events should get sent to that one
|
390 | c6fdba44 | Olga Brani | if ($open.length) { |
391 | c6fdba44 | Olga Brani | $dk = $open; |
392 | c6fdba44 | Olga Brani | } else if ($focused.length && !$open.length) { |
393 | c6fdba44 | Olga Brani | // But if we have no open dropdowns, use the focused dropdown instead
|
394 | c6fdba44 | Olga Brani | $dk = $focused; |
395 | c6fdba44 | Olga Brani | } |
396 | c6fdba44 | Olga Brani | |
397 | c6fdba44 | Olga Brani | if ($dk) { |
398 | c6fdba44 | Olga Brani | _handleKeyBoardNav(e, $dk);
|
399 | c6fdba44 | Olga Brani | } |
400 | c6fdba44 | Olga Brani | }); |
401 | c6fdba44 | Olga Brani | }); |
402 | c6fdba44 | Olga Brani | })(jQuery, window, document); |