1/*! 2 * Bootstrap-submenu v2.0.4 (https://vsn4ik.github.io/bootstrap-submenu/) 3 * Copyright 2014-2016 Vasily A. (https://github.com/vsn4ik) 4 * Licensed under the MIT license 5 */ 6 7/** 8 * $.inArray: friends with IE8. Use Array.prototype.indexOf in future. 9 * $.proxy: friends with IE8. Use Function.prototype.bind in future. 10 */ 11 12'use strict'; 13 14(function(factory) { 15 if (typeof define == 'function' && define.amd) { 16 // AMD. Register as an anonymous module 17 define(['jquery'], factory); 18 } 19 else if (typeof exports == 'object') { 20 // Node/CommonJS 21 module.exports = factory(require('jquery')); 22 } 23 else { 24 // Browser globals 25 factory(jQuery); 26 } 27})(function($) { 28 function Item(element) { 29 this.$element = $(element); 30 this.$menu = this.$element.closest('.dropdown-menu'); 31 this.$main = this.$menu.parent(); 32 this.$items = this.$menu.children('.dropdown-submenu'); 33 34 this.init(); 35 } 36 37 Item.prototype = { 38 init: function() { 39 this.$element.on('keydown', $.proxy(this, 'keydown')); 40 }, 41 close: function() { 42 this.$main.removeClass('open'); 43 this.$items.trigger('hide.bs.submenu'); 44 }, 45 keydown: function(event) { 46 // 27: Esc 47 48 if (event.keyCode == 27) { 49 event.stopPropagation(); 50 51 this.close(); 52 this.$main.children('a, button').trigger('focus'); 53 } 54 } 55 }; 56 57 function SubmenuItem(element) { 58 this.$element = $(element); 59 this.$main = this.$element.parent(); 60 this.$menu = this.$main.children('.dropdown-menu'); 61 this.$subs = this.$main.siblings('.dropdown-submenu'); 62 this.$items = this.$menu.children('.dropdown-submenu'); 63 64 this.init(); 65 } 66 67 $.extend(SubmenuItem.prototype, Item.prototype, { 68 init: function() { 69 this.$element.on({ 70 click: $.proxy(this, 'click'), 71 keydown: $.proxy(this, 'keydown') 72 }); 73 74 this.$main.on('hide.bs.submenu', $.proxy(this, 'hide')); 75 }, 76 click: function(event) { 77 // Fix a[href="#"]. For community 78 event.preventDefault(); 79 80 event.stopPropagation(); 81 82 this.toggle(); 83 }, 84 hide: function(event) { 85 // Stop event bubbling 86 event.stopPropagation(); 87 88 this.close(); 89 }, 90 open: function() { 91 this.$main.addClass('open'); 92 this.$subs.trigger('hide.bs.submenu'); 93 }, 94 toggle: function() { 95 if (this.$main.hasClass('open')) { 96 this.close(); 97 } 98 else { 99 this.open(); 100 } 101 }, 102 keydown: function(event) { 103 // 13: Return, 32: Spacebar 104 105 if (event.keyCode == 32) { 106 // Off vertical scrolling 107 event.preventDefault(); 108 } 109 110 if ($.inArray(event.keyCode, [13, 32]) != -1) { 111 this.toggle(); 112 } 113 } 114 }); 115 116 function Submenupicker(element) { 117 this.$element = $(element); 118 this.$main = this.$element.parent(); 119 this.$menu = this.$main.children('.dropdown-menu'); 120 this.$items = this.$menu.children('.dropdown-submenu'); 121 122 this.init(); 123 } 124 125 Submenupicker.prototype = { 126 init: function() { 127 this.$menu.off('keydown.bs.dropdown.data-api'); 128 this.$menu.on('keydown', $.proxy(this, 'itemKeydown')); 129 130 this.$menu.find('li > a').each(function() { 131 new Item(this); 132 }); 133 134 this.$menu.find('.dropdown-submenu > a').each(function() { 135 new SubmenuItem(this); 136 }); 137 138 this.$main.on('hidden.bs.dropdown', $.proxy(this, 'hidden')); 139 }, 140 hidden: function() { 141 this.$items.trigger('hide.bs.submenu'); 142 }, 143 itemKeydown: function(event) { 144 // 38: Arrow up, 40: Arrow down 145 146 if ($.inArray(event.keyCode, [38, 40]) != -1) { 147 // Off vertical scrolling 148 event.preventDefault(); 149 150 event.stopPropagation(); 151 152 var $items = this.$menu.find('li:not(.disabled):visible > a'); 153 var index = $items.index(event.target); 154 155 if (event.keyCode == 38 && index !== 0) { 156 index--; 157 } 158 else if (event.keyCode == 40 && index !== $items.length - 1) { 159 index++; 160 } 161 else { 162 return; 163 } 164 165 $items.eq(index).trigger('focus'); 166 } 167 } 168 }; 169 170 var old = $.fn.submenupicker; 171 172 // For AMD/Node/CommonJS used elements (optional) 173 // http://learn.jquery.com/jquery-ui/environments/amd/ 174 $.fn.submenupicker = function(elements) { 175 var $elements = this instanceof $ ? this : $(elements); 176 177 return $elements.each(function() { 178 var data = $.data(this, 'bs.submenu'); 179 180 if (!data) { 181 data = new Submenupicker(this); 182 183 $.data(this, 'bs.submenu', data); 184 } 185 }); 186 }; 187 188 $.fn.submenupicker.Constructor = Submenupicker; 189 $.fn.submenupicker.noConflict = function() { 190 $.fn.submenupicker = old; 191 return this; 192 }; 193 194 return $.fn.submenupicker; 195});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.