1 /* ============================================================
 
   2  * bootstrap-dropdown.js v2.3.2
 
   3  * http://getbootstrap.com/2.3.2/javascript.html#dropdowns
 
   4  * ============================================================
 
   5  * Copyright 2013 Twitter, Inc.
 
   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
 
  11  * http://www.apache.org/licenses/LICENSE-2.0
 
  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  * ============================================================ */
 
  23   "use strict"; // jshint ;_;
 
  26  /* DROPDOWN CLASS DEFINITION
 
  27   * ========================= */
 
  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')
 
  37   Dropdown.prototype = {
 
  41   , toggle: function (e) {
 
  46       if ($this.is('.disabled, :disabled')) return
 
  48       $parent = getParent($this)
 
  50       isActive = $parent.hasClass('open')
 
  55         if ('ontouchstart' in document.documentElement) {
 
  56           // if mobile we we use a backdrop because click events don't delegate
 
  57           $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus)
 
  59         $parent.toggleClass('open')
 
  67   , keydown: function (e) {
 
  75       if (!/(38|40|27)/.test(e.keyCode)) return
 
  82       if ($this.is('.disabled, :disabled')) return
 
  84       $parent = getParent($this)
 
  86       isActive = $parent.hasClass('open')
 
  88       if (!isActive || (isActive && e.keyCode == 27)) {
 
  89         if (e.which == 27) $parent.find(toggle).focus()
 
  93       $items = $('[role=menu] li:not(.divider):visible a', $parent)
 
  95       if (!$items.length) return
 
  97       index = $items.index($items.filter(':focus'))
 
  99       if (e.keyCode == 38 && index > 0) index--                                        // up
 
 100       if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
 
 101       if (!~index) index = 0
 
 110   function clearMenus() {
 
 111     $('.dropdown-backdrop').remove()
 
 112     $(toggle).each(function () {
 
 113       getParent($(this)).removeClass('open')
 
 117   function getParent($this) {
 
 118     var selector = $this.attr('data-target')
 
 122       selector = $this.attr('href')
 
 123       selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
 
 126     $parent = selector && $(selector)
 
 128     if (!$parent || !$parent.length) $parent = $this.parent()
 
 134   /* DROPDOWN PLUGIN DEFINITION
 
 135    * ========================== */
 
 137   var old = $.fn.dropdown
 
 139   $.fn.dropdown = function (option) {
 
 140     return this.each(function () {
 
 142         , data = $this.data('dropdown')
 
 143       if (!data) $this.data('dropdown', (data = new Dropdown(this)))
 
 144       if (typeof option == 'string') data[option].call($this)
 
 148   $.fn.dropdown.Constructor = Dropdown
 
 151  /* DROPDOWN NO CONFLICT
 
 152   * ==================== */
 
 154   $.fn.dropdown.noConflict = function () {
 
 160   /* APPLY TO STANDARD DROPDOWN ELEMENTS
 
 161    * =================================== */
 
 164     .on('click.dropdown.data-api', clearMenus)
 
 165     .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
 
 166     .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
 
 167     .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)