Statistics
| Branch: | Tag: | Revision:

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
 * &copy; 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);