diff --git a/src/main/twirl/gitbucket/core/helper/account.scala.html b/src/main/twirl/gitbucket/core/helper/account.scala.html index 0e14ced..80ab8ba 100644 --- a/src/main/twirl/gitbucket/core/helper/account.scala.html +++ b/src/main/twirl/gitbucket/core/helper/account.scala.html @@ -17,6 +17,12 @@ function (data) { return process(data.options); }); + }, + displayText: function(item) { + return item.label; + }, + afterSelect: function(item) { + $('#@id').val(item.value); } }); }); diff --git a/src/main/webapp/assets/vendors/bootstrap3-typeahead/bootstrap3-typeahead.js b/src/main/webapp/assets/vendors/bootstrap3-typeahead/bootstrap3-typeahead.js index a85dfe8..982ee28 100644 --- a/src/main/webapp/assets/vendors/bootstrap3-typeahead/bootstrap3-typeahead.js +++ b/src/main/webapp/assets/vendors/bootstrap3-typeahead/bootstrap3-typeahead.js @@ -22,656 +22,656 @@ (function (root, factory) { - 'use strict'; + 'use strict'; - // CommonJS module is defined - if (typeof module !== 'undefined' && module.exports) { - module.exports = factory(require('jquery')); - } - // AMD module is defined - else if (typeof define === 'function' && define.amd) { - define(['jquery'], function ($) { - return factory ($); - }); - } else { - factory(root.jQuery); - } + // CommonJS module is defined + if (typeof module !== 'undefined' && module.exports) { + module.exports = factory(require('jquery')); + } + // AMD module is defined + else if (typeof define === 'function' && define.amd) { + define(['jquery'], function ($) { + return factory ($); + }); + } else { + factory(root.jQuery); + } - }(this, function ($) { +}(this, function ($) { - 'use strict'; - // jshint laxcomma: true + 'use strict'; + // jshint laxcomma: true - /* TYPEAHEAD PUBLIC CLASS DEFINITION - * ================================= */ + /* TYPEAHEAD PUBLIC CLASS DEFINITION + * ================================= */ - var Typeahead = function (element, options) { - this.$element = $(element); - this.options = $.extend({}, Typeahead.defaults, options); - this.matcher = this.options.matcher || this.matcher; - this.sorter = this.options.sorter || this.sorter; - this.select = this.options.select || this.select; - this.autoSelect = typeof this.options.autoSelect == 'boolean' ? this.options.autoSelect : true; - this.highlighter = this.options.highlighter || this.highlighter; - this.render = this.options.render || this.render; - this.updater = this.options.updater || this.updater; - this.displayText = this.options.displayText || this.displayText; - this.itemLink = this.options.itemLink || this.itemLink; - this.followLinkOnSelect = this.options.followLinkOnSelect || this.followLinkOnSelect; - this.source = this.options.source; - this.delay = this.options.delay; - this.$menu = $(this.options.menu); - this.$appendTo = this.options.appendTo ? $(this.options.appendTo) : null; - this.fitToElement = typeof this.options.fitToElement == 'boolean' ? this.options.fitToElement : false; - this.shown = false; - this.listen(); - this.showHintOnFocus = typeof this.options.showHintOnFocus == 'boolean' || this.options.showHintOnFocus === "all" ? this.options.showHintOnFocus : false; - this.afterSelect = this.options.afterSelect; - this.afterEmptySelect = this.options.afterEmptySelect; - this.addItem = false; - this.value = this.$element.val() || this.$element.text(); - this.keyPressed = false; - this.focused = this.$element.is( ":focus" ); - }; + var Typeahead = function (element, options) { + this.$element = $(element); + this.options = $.extend({}, Typeahead.defaults, options); + this.matcher = this.options.matcher || this.matcher; + this.sorter = this.options.sorter || this.sorter; + this.select = this.options.select || this.select; + this.autoSelect = typeof this.options.autoSelect == 'boolean' ? this.options.autoSelect : true; + this.highlighter = this.options.highlighter || this.highlighter; + this.render = this.options.render || this.render; + this.updater = this.options.updater || this.updater; + this.displayText = this.options.displayText || this.displayText; + this.itemLink = this.options.itemLink || this.itemLink; + this.followLinkOnSelect = this.options.followLinkOnSelect || this.followLinkOnSelect; + this.source = this.options.source; + this.delay = this.options.delay; + this.$menu = $(this.options.menu); + this.$appendTo = this.options.appendTo ? $(this.options.appendTo) : null; + this.fitToElement = typeof this.options.fitToElement == 'boolean' ? this.options.fitToElement : false; + this.shown = false; + this.listen(); + this.showHintOnFocus = typeof this.options.showHintOnFocus == 'boolean' || this.options.showHintOnFocus === "all" ? this.options.showHintOnFocus : false; + this.afterSelect = this.options.afterSelect; + this.afterEmptySelect = this.options.afterEmptySelect; + this.addItem = false; + this.value = this.$element.val() || this.$element.text(); + this.keyPressed = false; + this.focused = this.$element.is( ":focus" ); + }; - Typeahead.prototype = { + Typeahead.prototype = { - constructor: Typeahead, + constructor: Typeahead, - setDefault: function (val) { - // var val = this.$menu.find('.active').data('value'); + setDefault: function (val) { + // var val = this.$menu.find('.active').data('value'); + this.$element.data('active', val); + if (this.autoSelect || val) { + var newVal = this.updater(val); + // Updater can be set to any random functions via "options" parameter in constructor above. + // Add null check for cases when updater returns void or undefined. + if (!newVal) { + newVal = ''; + } + this.$element + .val(this.displayText(newVal) || newVal) + .text(this.displayText(newVal) || newVal) + .change(); + this.afterSelect(newVal); + } + return this.hide(); + }, + + select: function () { + var val = this.$menu.find('.active').data('value'); + this.$element.data('active', val); if (this.autoSelect || val) { - var newVal = this.updater(val); - // Updater can be set to any random functions via "options" parameter in constructor above. - // Add null check for cases when updater returns void or undefined. - if (!newVal) { - newVal = ''; - } - this.$element - .val(this.displayText(newVal) || newVal) - .text(this.displayText(newVal) || newVal) - .change(); - this.afterSelect(newVal); - } - return this.hide(); - }, - - select: function () { - var val = this.$menu.find('.active').data('value'); - - this.$element.data('active', val); - if (this.autoSelect || val) { - var newVal = this.updater(val); - // Updater can be set to any random functions via "options" parameter in constructor above. - // Add null check for cases when updater returns void or undefined. - if (!newVal) { - newVal = ''; - } - this.$element - .val(this.displayText(newVal) || newVal) - .text(this.displayText(newVal) || newVal) - .change(); - this.afterSelect(newVal); - if(this.followLinkOnSelect && this.itemLink(val)) { - document.location = this.itemLink(val); - this.afterSelect(newVal); - } else if(this.followLinkOnSelect && !this.itemLink(val)) { - this.afterEmptySelect(newVal); - } else { - this.afterSelect(newVal); - } - } else { - this.afterEmptySelect(newVal); - } - - return this.hide(); - }, - - updater: function (item) { - return item; - }, - - setSource: function (source) { - this.source = source; - }, - - show: function () { - var pos = $.extend({}, this.$element.position(), { - height: this.$element[0].offsetHeight - }); - - var scrollHeight = typeof this.options.scrollHeight == 'function' ? - this.options.scrollHeight.call() : - this.options.scrollHeight; - - var element; - if (this.shown) { - element = this.$menu; - } else if (this.$appendTo) { - element = this.$menu.appendTo(this.$appendTo); - this.hasSameParent = this.$appendTo.is(this.$element.parent()); - } else { - element = this.$menu.insertAfter(this.$element); - this.hasSameParent = true; - } - - if (!this.hasSameParent) { - // We cannot rely on the element position, need to position relative to the window - element.css("position", "fixed"); - var offset = this.$element.offset(); - pos.top = offset.top; - pos.left = offset.left; - } - // The rules for bootstrap are: 'dropup' in the parent and 'dropdown-menu-right' in the element. - // Note that to get right alignment, you'll need to specify `menu` in the options to be: - // '' - var dropup = $(element).parent().hasClass('dropup'); - var newTop = dropup ? 'auto' : (pos.top + pos.height + scrollHeight); - var right = $(element).hasClass('dropdown-menu-right'); - var newLeft = right ? 'auto' : pos.left; - // it seems like setting the css is a bad idea (just let Bootstrap do it), but I'll keep the old - // logic in place except for the dropup/right-align cases. - element.css({ top: newTop, left: newLeft }).show(); - - if (this.options.fitToElement === true) { - element.css("width", this.$element.outerWidth() + "px"); - } - - this.shown = true; - return this; - }, - - hide: function () { - this.$menu.hide(); - this.shown = false; - return this; - }, - - lookup: function (query) { - var items; - if (typeof(query) != 'undefined' && query !== null) { - this.query = query; - } else { - this.query = this.$element.val(); - } - - if (this.query.length < this.options.minLength && !this.options.showHintOnFocus) { - return this.shown ? this.hide() : this; - } - - var worker = $.proxy(function () { - - // Bloodhound (since 0.11) needs three arguments. - // Two of them are callback functions (sync and async) for local and remote data processing - // see https://github.com/twitter/typeahead.js/blob/master/src/bloodhound/bloodhound.js#L132 - if ($.isFunction(this.source) && this.source.length === 3) { - this.source(this.query, $.proxy(this.process, this), $.proxy(this.process, this)); - } else if ($.isFunction(this.source)) { - this.source(this.query, $.proxy(this.process, this)); - } else if (this.source) { - this.process(this.source); - } - }, this); - - clearTimeout(this.lookupWorker); - this.lookupWorker = setTimeout(worker, this.delay); - }, - - process: function (items) { - var that = this; - - items = $.grep(items, function (item) { - return that.matcher(item); - }); - - items = this.sorter(items); - - if (!items.length && !this.options.addItem) { - return this.shown ? this.hide() : this; - } - - if (items.length > 0) { - this.$element.data('active', items[0]); - } else { - this.$element.data('active', null); - } - - if (this.options.items != 'all') { - items = items.slice(0, this.options.items); - } - - // Add item - if (this.options.addItem){ - items.push(this.options.addItem); - } - - return this.render(items).show(); - }, - - matcher: function (item) { - var it = this.displayText(item); - return ~it.toLowerCase().indexOf(this.query.toLowerCase()); - }, - - sorter: function (items) { - var beginswith = []; - var caseSensitive = []; - var caseInsensitive = []; - var item; - - while ((item = items.shift())) { - var it = this.displayText(item); - if (!it.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item); - else if (~it.indexOf(this.query)) caseSensitive.push(item); - else caseInsensitive.push(item); - } - - return beginswith.concat(caseSensitive, caseInsensitive); - }, - - highlighter: function (item) { - var text = this.query; - if(text===""){ - return item; - } - var matches = item.match(/(>)([^<]*)(<)/g); - var first = []; - var second = []; - var i; - if(matches && matches.length){ - //html - for (i = 0; i < matches.length; ++i) { - if (matches[i].length > 2) {//escape '><' - first.push(matches[i]); + var newVal = this.updater(val); + // Updater can be set to any random functions via "options" parameter in constructor above. + // Add null check for cases when updater returns void or undefined. + if (!newVal) { + newVal = ''; } - } - }else{ - //text - first = []; - first.push(item); - } - text = text.replace((/[\(\)\/\.\*\+\?\[\]]/g), function(mat) { - return '\\' + mat; - }); - var reg = new RegExp(text, "g"); - var m; - for (i = 0; i < first.length; ++i) { - m = first[i].match(reg); - if(m && m.length>0){//find all text nodes matches - second.push(first[i]); - } - } - for (i = 0; i < second.length; ++i) { - item = item.replace(second[i],second[i].replace(reg, '$&')); - } - return item; - }, - - render: function (items) { - var that = this; - var self = this; - var activeFound = false; - var data = []; - var _category = that.options.separator; - - $.each(items, function (key,value) { - // inject separator - if (key > 0 && value[_category] !== items[key - 1][_category]){ - data.push({ - __type: 'divider' - }); - } - - // inject category header - if (value[_category] && (key === 0 || value[_category] !== items[key - 1][_category])){ - data.push({ - __type: 'category', - name: value[_category] - }); - } - data.push(value); - }); - - items = $(data).map(function (i, item) { - if ((item.__type || false) == 'category'){ - return $(that.options.headerHtml).text(item.name)[0]; - } - - if ((item.__type || false) == 'divider'){ - return $(that.options.headerDivider)[0]; - } - - var text = self.displayText(item); - i = $(that.options.item).data('value', item); - i.find('a').html(that.highlighter(text, item)); - if(this.followLinkOnSelect) { - i.find('a').attr('href', self.itemLink(item)); - } - if (text == self.$element.val()) { - i.addClass('active'); - self.$element.data('active', item); - activeFound = true; - } - return i[0]; - }); - - if (this.autoSelect && !activeFound) { - items.filter(':not(.dropdown-header)').first().addClass('active'); - this.$element.data('active', items.first().data('value')); - } - this.$menu.html(items); - return this; - }, - - displayText: function (item) { - return typeof item !== 'undefined' && typeof item.name != 'undefined' ? item.name : item; - }, - - itemLink: function (item) { - return null; - }, - - next: function (event) { - var active = this.$menu.find('.active').removeClass('active'); - var next = active.next(); - - if (!next.length) { - next = $(this.$menu.find('li')[0]); - } - - next.addClass('active'); - // added for screen reader - var newVal = this.updater(next.data('value')); - this.$element.val(this.displayText(newVal) || newVal); - }, - - prev: function (event) { - var active = this.$menu.find('.active').removeClass('active'); - var prev = active.prev(); - - if (!prev.length) { - prev = this.$menu.find('li').last(); - } - - prev.addClass('active'); - // added for screen reader - var newVal = this.updater(next.data('value')); - this.$element.val(this.displayText(newVal) || newVal); - }, - - listen: function () { - this.$element - .on('focus', $.proxy(this.focus, this)) - .on('blur', $.proxy(this.blur, this)) - .on('keypress', $.proxy(this.keypress, this)) - .on('propertychange input', $.proxy(this.input, this)) - .on('keyup', $.proxy(this.keyup, this)); - - if (this.eventSupported('keydown')) { - this.$element.on('keydown', $.proxy(this.keydown, this)); - } - - if ('ontouchstart' in document.documentElement) { - this.$menu - .on('touchstart', 'li', $.proxy(this.touchstart, this)) - .on('touchend', 'li', $.proxy(this.click, this)); - } else { - this.$menu - .on('click', $.proxy(this.click, this)) - .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) - .on('mouseleave', 'li', $.proxy(this.mouseleave, this)) - .on('mousedown', $.proxy(this.mousedown,this)); - } - }, - - destroy : function () { - this.$element.data('typeahead',null); - this.$element.data('active',null); - this.$element - .off('focus') - .off('blur') - .off('keypress') - .off('propertychange input') - .off('keyup'); - - if (this.eventSupported('keydown')) { - this.$element.off('keydown'); - } - - this.$menu.remove(); - this.destroyed = true; - }, - - eventSupported: function (eventName) { - var isSupported = eventName in this.$element; - if (!isSupported) { - this.$element.setAttribute(eventName, 'return;'); - isSupported = typeof this.$element[eventName] === 'function'; - } - return isSupported; - }, - - move: function (e) { - if (!this.shown) return; - - switch (e.keyCode) { - case 9: // tab - case 13: // enter - case 27: // escape - e.preventDefault(); - break; - - case 38: // up arrow - // with the shiftKey (this is actually the left parenthesis) - if (e.shiftKey) return; - e.preventDefault(); - this.prev(); - break; - - case 40: // down arrow - // with the shiftKey (this is actually the right parenthesis) - if (e.shiftKey) return; - e.preventDefault(); - this.next(); - break; - } - }, - - keydown: function (e) { - this.keyPressed = true; - this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]); - if (!this.shown && e.keyCode == 40) { - this.lookup(); - } else { - this.move(e); - } - }, - - keypress: function (e) { - if (this.suppressKeyPressRepeat) return; - this.move(e); - }, - - input: function (e) { - // This is a fixed for IE10/11 that fires the input event when a placehoder is changed - // (https://connect.microsoft.com/IE/feedback/details/810538/ie-11-fires-input-event-on-focus) - var currentValue = this.$element.val() || this.$element.text(); - if (this.value !== currentValue) { - this.value = currentValue; - this.lookup(); - } - }, - - keyup: function (e) { - if (this.destroyed) { - return; - } - switch (e.keyCode) { - case 40: // down arrow - case 38: // up arrow - case 16: // shift - case 17: // ctrl - case 18: // alt - break; - - case 9: // tab - if (!this.shown || (this.showHintOnFocus && !this.keyPressed)) return; - this.select(); - break; - case 13: // enter - if (!this.shown) return; - this.select(); - break; - - case 27: // escape - if (!this.shown) return; - this.hide(); - break; - } - - }, - - focus: function (e) { - if (!this.focused) { - this.focused = true; - this.keyPressed = false; - if (this.options.showHintOnFocus && this.skipShowHintOnFocus !== true) { - if(this.options.showHintOnFocus === "all") { - this.lookup(""); + this.$element + .val(this.displayText(newVal) || newVal) + .text(this.displayText(newVal) || newVal) + .change(); + this.afterSelect(newVal); + if(this.followLinkOnSelect && this.itemLink(val)) { + document.location = this.itemLink(val); + this.afterSelect(newVal); + } else if(this.followLinkOnSelect && !this.itemLink(val)) { + this.afterEmptySelect(newVal); } else { - this.lookup(); + this.afterSelect(newVal); } - } + } else { + this.afterEmptySelect(newVal); } - if (this.skipShowHintOnFocus) { - this.skipShowHintOnFocus = false; - } - }, - blur: function (e) { - if (!this.mousedover && !this.mouseddown && this.shown) { - this.select(); - this.hide(); - this.focused = false; - this.keyPressed = false; - } else if (this.mouseddown) { - // This is for IE that blurs the input when user clicks on scroll. - // We set the focus back on the input and prevent the lookup to occur again - this.skipShowHintOnFocus = true; - this.$element.focus(); - this.mouseddown = false; - } - }, + return this.hide(); + }, - click: function (e) { - e.preventDefault(); - this.skipShowHintOnFocus = true; - this.select(); - this.$element.focus(); - this.hide(); - }, + updater: function (item) { + return item; + }, - mouseenter: function (e) { - this.mousedover = true; - this.$menu.find('.active').removeClass('active'); - $(e.currentTarget).addClass('active'); - }, + setSource: function (source) { + this.source = source; + }, - mouseleave: function (e) { - this.mousedover = false; - if (!this.focused && this.shown) this.hide(); - }, - - /** - * We track the mousedown for IE. When clicking on the menu scrollbar, IE makes the input blur thus hiding the menu. - */ - mousedown: function (e) { - this.mouseddown = true; - this.$menu.one("mouseup", function(e){ - // IE won't fire this, but FF and Chrome will so we reset our flag for them here - this.mouseddown = false; - }.bind(this)); - }, - - touchstart: function (e) { - e.preventDefault(); - this.$menu.find('.active').removeClass('active'); - $(e.currentTarget).addClass('active'); - }, - - touchend: function (e) { - e.preventDefault(); - this.select(); - this.$element.focus(); - } - - }; - - - /* TYPEAHEAD PLUGIN DEFINITION - * =========================== */ - - var old = $.fn.typeahead; - - $.fn.typeahead = function (option) { - var arg = arguments; - if (typeof option == 'string' && option == 'getActive') { - return this.data('active'); - } - return this.each(function () { - var $this = $(this); - var data = $this.data('typeahead'); - var options = typeof option == 'object' && option; - if (!data) $this.data('typeahead', (data = new Typeahead(this, options))); - if (typeof option == 'string' && data[option]) { - if (arg.length > 1) { - data[option].apply(data, Array.prototype.slice.call(arg, 1)); - } else { - data[option](); - } - } + show: function () { + var pos = $.extend({}, this.$element.position(), { + height: this.$element[0].offsetHeight }); - }; - Typeahead.defaults = { - source: [], - items: 8, - menu: '', - item: '
  • ', - minLength: 1, - scrollHeight: 0, - autoSelect: true, - afterSelect: $.noop, - afterEmptySelect: $.noop, - addItem: false, - followLinkOnSelect: false, - delay: 0, - separator: 'category', - headerHtml: '', - headerDivider: '' - }; + var scrollHeight = typeof this.options.scrollHeight == 'function' ? + this.options.scrollHeight.call() : + this.options.scrollHeight; - $.fn.typeahead.Constructor = Typeahead; + var element; + if (this.shown) { + element = this.$menu; + } else if (this.$appendTo) { + element = this.$menu.appendTo(this.$appendTo); + this.hasSameParent = this.$appendTo.is(this.$element.parent()); + } else { + element = this.$menu.insertAfter(this.$element); + this.hasSameParent = true; + } + + if (!this.hasSameParent) { + // We cannot rely on the element position, need to position relative to the window + element.css("position", "fixed"); + var offset = this.$element.offset(); + pos.top = offset.top; + pos.left = offset.left; + } + // The rules for bootstrap are: 'dropup' in the parent and 'dropdown-menu-right' in the element. + // Note that to get right alignment, you'll need to specify `menu` in the options to be: + // '' + var dropup = $(element).parent().hasClass('dropup'); + var newTop = dropup ? 'auto' : (pos.top + pos.height + scrollHeight); + var right = $(element).hasClass('dropdown-menu-right'); + var newLeft = right ? 'auto' : pos.left; + // it seems like setting the css is a bad idea (just let Bootstrap do it), but I'll keep the old + // logic in place except for the dropup/right-align cases. + element.css({ top: newTop, left: newLeft }).show(); - /* TYPEAHEAD NO CONFLICT - * =================== */ - - $.fn.typeahead.noConflict = function () { - $.fn.typeahead = old; + if (this.options.fitToElement === true) { + element.css("width", this.$element.outerWidth() + "px"); + } + + this.shown = true; return this; - }; + }, + + hide: function () { + this.$menu.hide(); + this.shown = false; + return this; + }, + + lookup: function (query) { + var items; + if (typeof(query) != 'undefined' && query !== null) { + this.query = query; + } else { + this.query = this.$element.val(); + } + + if (this.query.length < this.options.minLength && !this.options.showHintOnFocus) { + return this.shown ? this.hide() : this; + } + + var worker = $.proxy(function () { + + // Bloodhound (since 0.11) needs three arguments. + // Two of them are callback functions (sync and async) for local and remote data processing + // see https://github.com/twitter/typeahead.js/blob/master/src/bloodhound/bloodhound.js#L132 + if ($.isFunction(this.source) && this.source.length === 3) { + this.source(this.query, $.proxy(this.process, this), $.proxy(this.process, this)); + } else if ($.isFunction(this.source)) { + this.source(this.query, $.proxy(this.process, this)); + } else if (this.source) { + this.process(this.source); + } + }, this); + + clearTimeout(this.lookupWorker); + this.lookupWorker = setTimeout(worker, this.delay); + }, + + process: function (items) { + var that = this; + + items = $.grep(items, function (item) { + return that.matcher(item); + }); + + items = this.sorter(items); + + if (!items.length && !this.options.addItem) { + return this.shown ? this.hide() : this; + } + + if (items.length > 0) { + this.$element.data('active', items[0]); + } else { + this.$element.data('active', null); + } + + if (this.options.items != 'all') { + items = items.slice(0, this.options.items); + } + + // Add item + if (this.options.addItem){ + items.push(this.options.addItem); + } + + return this.render(items).show(); + }, + + matcher: function (item) { + var it = this.displayText(item); + return ~it.toLowerCase().indexOf(this.query.toLowerCase()); + }, + + sorter: function (items) { + var beginswith = []; + var caseSensitive = []; + var caseInsensitive = []; + var item; + + while ((item = items.shift())) { + var it = this.displayText(item); + if (!it.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item); + else if (~it.indexOf(this.query)) caseSensitive.push(item); + else caseInsensitive.push(item); + } + + return beginswith.concat(caseSensitive, caseInsensitive); + }, + + highlighter: function (item) { + var text = this.query; + if(text===""){ + return item; + } + var matches = item.match(/(>)([^<]*)(<)/g); + var first = []; + var second = []; + var i; + if(matches && matches.length){ + //html + for (i = 0; i < matches.length; ++i) { + if (matches[i].length > 2) {//escape '><' + first.push(matches[i]); + } + } + }else{ + //text + first = []; + first.push(item); + } + text = text.replace((/[\(\)\/\.\*\+\?\[\]]/g), function(mat) { + return '\\' + mat; + }); + var reg = new RegExp(text, "g"); + var m; + for (i = 0; i < first.length; ++i) { + m = first[i].match(reg); + if(m && m.length>0){//find all text nodes matches + second.push(first[i]); + } + } + for (i = 0; i < second.length; ++i) { + item = item.replace(second[i],second[i].replace(reg, '$&')); + } + return item; + }, + + render: function (items) { + var that = this; + var self = this; + var activeFound = false; + var data = []; + var _category = that.options.separator; + + $.each(items, function (key,value) { + // inject separator + if (key > 0 && value[_category] !== items[key - 1][_category]){ + data.push({ + __type: 'divider' + }); + } + + // inject category header + if (value[_category] && (key === 0 || value[_category] !== items[key - 1][_category])){ + data.push({ + __type: 'category', + name: value[_category] + }); + } + data.push(value); + }); + + items = $(data).map(function (i, item) { + if ((item.__type || false) == 'category'){ + return $(that.options.headerHtml).text(item.name)[0]; + } + + if ((item.__type || false) == 'divider'){ + return $(that.options.headerDivider)[0]; + } + + var text = self.displayText(item); + i = $(that.options.item).data('value', item); + i.find('a').html(that.highlighter(text, item)); + if(this.followLinkOnSelect) { + i.find('a').attr('href', self.itemLink(item)); + } + if (text == self.$element.val()) { + i.addClass('active'); + self.$element.data('active', item); + activeFound = true; + } + return i[0]; + }); + + if (this.autoSelect && !activeFound) { + items.filter(':not(.dropdown-header)').first().addClass('active'); + this.$element.data('active', items.first().data('value')); + } + this.$menu.html(items); + return this; + }, + + displayText: function (item) { + return typeof item !== 'undefined' && typeof item.name != 'undefined' ? item.name : item; + }, + + itemLink: function (item) { + return null; + }, + + next: function (event) { + var active = this.$menu.find('.active').removeClass('active'); + var next = active.next(); + + if (!next.length) { + next = $(this.$menu.find('li')[0]); + } + + next.addClass('active'); + // added for screen reader + var newVal = this.updater(next.data('value')); + this.$element.val(this.displayText(newVal) || newVal); + }, + + prev: function (event) { + var active = this.$menu.find('.active').removeClass('active'); + var prev = active.prev(); + + if (!prev.length) { + prev = this.$menu.find('li').last(); + } + + prev.addClass('active'); + // added for screen reader + var newVal = this.updater(prev.data('value')); + this.$element.val(this.displayText(newVal) || newVal); + }, + + listen: function () { + this.$element + .on('focus', $.proxy(this.focus, this)) + .on('blur', $.proxy(this.blur, this)) + .on('keypress', $.proxy(this.keypress, this)) + .on('propertychange input', $.proxy(this.input, this)) + .on('keyup', $.proxy(this.keyup, this)); + + if (this.eventSupported('keydown')) { + this.$element.on('keydown', $.proxy(this.keydown, this)); + } + + if ('ontouchstart' in document.documentElement) { + this.$menu + .on('touchstart', 'li', $.proxy(this.touchstart, this)) + .on('touchend', 'li', $.proxy(this.click, this)); + } else { + this.$menu + .on('click', $.proxy(this.click, this)) + .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) + .on('mouseleave', 'li', $.proxy(this.mouseleave, this)) + .on('mousedown', $.proxy(this.mousedown,this)); + } + }, + + destroy : function () { + this.$element.data('typeahead',null); + this.$element.data('active',null); + this.$element + .off('focus') + .off('blur') + .off('keypress') + .off('propertychange input') + .off('keyup'); + + if (this.eventSupported('keydown')) { + this.$element.off('keydown'); + } + + this.$menu.remove(); + this.destroyed = true; + }, + + eventSupported: function (eventName) { + var isSupported = eventName in this.$element; + if (!isSupported) { + this.$element.setAttribute(eventName, 'return;'); + isSupported = typeof this.$element[eventName] === 'function'; + } + return isSupported; + }, + + move: function (e) { + if (!this.shown) return; + + switch (e.keyCode) { + case 9: // tab + case 13: // enter + case 27: // escape + e.preventDefault(); + break; + + case 38: // up arrow + // with the shiftKey (this is actually the left parenthesis) + if (e.shiftKey) return; + e.preventDefault(); + this.prev(); + break; + + case 40: // down arrow + // with the shiftKey (this is actually the right parenthesis) + if (e.shiftKey) return; + e.preventDefault(); + this.next(); + break; + } + }, + + keydown: function (e) { + this.keyPressed = true; + this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]); + if (!this.shown && e.keyCode == 40) { + this.lookup(); + } else { + this.move(e); + } + }, + + keypress: function (e) { + if (this.suppressKeyPressRepeat) return; + this.move(e); + }, + + input: function (e) { + // This is a fixed for IE10/11 that fires the input event when a placehoder is changed + // (https://connect.microsoft.com/IE/feedback/details/810538/ie-11-fires-input-event-on-focus) + var currentValue = this.$element.val() || this.$element.text(); + if (this.value !== currentValue) { + this.value = currentValue; + this.lookup(); + } + }, + + keyup: function (e) { + if (this.destroyed) { + return; + } + switch (e.keyCode) { + case 40: // down arrow + case 38: // up arrow + case 16: // shift + case 17: // ctrl + case 18: // alt + break; + + case 9: // tab + if (!this.shown || (this.showHintOnFocus && !this.keyPressed)) return; + this.select(); + break; + case 13: // enter + if (!this.shown) return; + this.select(); + break; + + case 27: // escape + if (!this.shown) return; + this.hide(); + break; + } + + }, + + focus: function (e) { + if (!this.focused) { + this.focused = true; + this.keyPressed = false; + if (this.options.showHintOnFocus && this.skipShowHintOnFocus !== true) { + if(this.options.showHintOnFocus === "all") { + this.lookup(""); + } else { + this.lookup(); + } + } + } + if (this.skipShowHintOnFocus) { + this.skipShowHintOnFocus = false; + } + }, + + blur: function (e) { + if (!this.mousedover && !this.mouseddown && this.shown) { + this.select(); + this.hide(); + this.focused = false; + this.keyPressed = false; + } else if (this.mouseddown) { + // This is for IE that blurs the input when user clicks on scroll. + // We set the focus back on the input and prevent the lookup to occur again + this.skipShowHintOnFocus = true; + this.$element.focus(); + this.mouseddown = false; + } + }, + + click: function (e) { + e.preventDefault(); + this.skipShowHintOnFocus = true; + this.select(); + this.$element.focus(); + this.hide(); + }, + + mouseenter: function (e) { + this.mousedover = true; + this.$menu.find('.active').removeClass('active'); + $(e.currentTarget).addClass('active'); + }, + + mouseleave: function (e) { + this.mousedover = false; + if (!this.focused && this.shown) this.hide(); + }, + + /** + * We track the mousedown for IE. When clicking on the menu scrollbar, IE makes the input blur thus hiding the menu. + */ + mousedown: function (e) { + this.mouseddown = true; + this.$menu.one("mouseup", function(e){ + // IE won't fire this, but FF and Chrome will so we reset our flag for them here + this.mouseddown = false; + }.bind(this)); + }, + + touchstart: function (e) { + e.preventDefault(); + this.$menu.find('.active').removeClass('active'); + $(e.currentTarget).addClass('active'); + }, + + touchend: function (e) { + e.preventDefault(); + this.select(); + this.$element.focus(); + } + + }; - /* TYPEAHEAD DATA-API - * ================== */ + /* TYPEAHEAD PLUGIN DEFINITION + * =========================== */ - $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { + var old = $.fn.typeahead; + + $.fn.typeahead = function (option) { + var arg = arguments; + if (typeof option == 'string' && option == 'getActive') { + return this.data('active'); + } + return this.each(function () { var $this = $(this); - if ($this.data('typeahead')) return; - $this.typeahead($this.data()); + var data = $this.data('typeahead'); + var options = typeof option == 'object' && option; + if (!data) $this.data('typeahead', (data = new Typeahead(this, options))); + if (typeof option == 'string' && data[option]) { + if (arg.length > 1) { + data[option].apply(data, Array.prototype.slice.call(arg, 1)); + } else { + data[option](); + } + } }); + }; - })); + Typeahead.defaults = { + source: [], + items: 8, + menu: '', + item: '
  • ', + minLength: 1, + scrollHeight: 0, + autoSelect: true, + afterSelect: $.noop, + afterEmptySelect: $.noop, + addItem: false, + followLinkOnSelect: false, + delay: 0, + separator: 'category', + headerHtml: '', + headerDivider: '' + }; + + $.fn.typeahead.Constructor = Typeahead; + + /* TYPEAHEAD NO CONFLICT + * =================== */ + + $.fn.typeahead.noConflict = function () { + $.fn.typeahead = old; + return this; + }; + + + /* TYPEAHEAD DATA-API + * ================== */ + + $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { + var $this = $(this); + if ($this.data('typeahead')) return; + $this.typeahead($this.data()); + }); + +})); diff --git a/src/main/webapp/assets/vendors/bootstrap3-typeahead/bootstrap3-typeahead.min.js b/src/main/webapp/assets/vendors/bootstrap3-typeahead/bootstrap3-typeahead.min.js index 8e5f560..3847850 100644 --- a/src/main/webapp/assets/vendors/bootstrap3-typeahead/bootstrap3-typeahead.min.js +++ b/src/main/webapp/assets/vendors/bootstrap3-typeahead/bootstrap3-typeahead.min.js @@ -1 +1 @@ -!function(a,b){"use strict";"undefined"!=typeof module&&module.exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):b(a.jQuery)}(this,function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.defaults,d),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.select=this.options.select||this.select,this.autoSelect="boolean"!=typeof this.options.autoSelect||this.options.autoSelect,this.highlighter=this.options.highlighter||this.highlighter,this.render=this.options.render||this.render,this.updater=this.options.updater||this.updater,this.displayText=this.options.displayText||this.displayText,this.source=this.options.source,this.delay=this.options.delay,this.$menu=a(this.options.menu),this.$appendTo=this.options.appendTo?a(this.options.appendTo):null,this.fitToElement="boolean"==typeof this.options.fitToElement&&this.options.fitToElement,this.shown=!1,this.listen(),this.showHintOnFocus=("boolean"==typeof this.options.showHintOnFocus||"all"===this.options.showHintOnFocus)&&this.options.showHintOnFocus,this.afterSelect=this.options.afterSelect,this.addItem=!1,this.value=this.$element.val()||this.$element.text(),this.keyPressed=!1};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").data("value");if(this.$element.data("active",a),this.autoSelect||a){var b=this.updater(a);b||(b=""),this.$element.val(this.displayText(b)||b).text(this.displayText(b)||b).change(),this.afterSelect(b)}return this.hide()},updater:function(a){return a},setSource:function(a){this.source=a},show:function(){var b,c=a.extend({},this.$element.position(),{height:this.$element[0].offsetHeight}),d="function"==typeof this.options.scrollHeight?this.options.scrollHeight.call():this.options.scrollHeight;if(this.shown?b=this.$menu:this.$appendTo?(b=this.$menu.appendTo(this.$appendTo),this.hasSameParent=this.$appendTo.is(this.$element.parent())):(b=this.$menu.insertAfter(this.$element),this.hasSameParent=!0),!this.hasSameParent){b.css("position","fixed");var e=this.$element.offset();c.top=e.top,c.left=e.left}var f=a(b).parent().hasClass("dropup"),g=f?"auto":c.top+c.height+d,h=a(b).hasClass("dropdown-menu-right"),i=h?"auto":c.left;return b.css({top:g,left:i}).show(),!0===this.options.fitToElement&&b.css("width",this.$element.outerWidth()+"px"),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){if(this.query=void 0!==b&&null!==b?b:this.$element.val()||this.$element.text()||"",this.query.length0?this.$element.data("active",b[0]):this.$element.data("active",null),"all"!=this.options.items&&(b=b.slice(0,this.options.items)),this.options.addItem&&b.push(this.options.addItem),this.render(b).show()):this.shown?this.hide():this},matcher:function(a){return~this.displayText(a).toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){for(var b,c=[],d=[],e=[];b=a.shift();){var f=this.displayText(b);f.toLowerCase().indexOf(this.query.toLowerCase())?~f.indexOf(this.query)?d.push(b):e.push(b):c.push(b)}return c.concat(d,e)},highlighter:function(a){var b=this.query;if(""===b)return a;var c,d=a.match(/(>)([^<]*)(<)/g),e=[],f=[];if(d&&d.length)for(c=0;c2&&e.push(d[c]);else e=[],e.push(a);b=b.replace(/[\(\)\/\.\*\+\?\[\]]/g,function(a){return"\\"+a});var g,h=new RegExp(b,"g");for(c=0;c0&&f.push(e[c]);for(c=0;c$&"));return a},render:function(b){var c=this,d=this,e=!1,f=[],g=c.options.separator;return a.each(b,function(a,c){a>0&&c[g]!==b[a-1][g]&&f.push({__type:"divider"}),!c[g]||0!==a&&c[g]===b[a-1][g]||f.push({__type:"category",name:c[g]}),f.push(c)}),b=a(f).map(function(b,f){if("category"==(f.__type||!1))return a(c.options.headerHtml).text(f.name)[0];if("divider"==(f.__type||!1))return a(c.options.headerDivider)[0];var g=d.displayText(f);return b=a(c.options.item).data("value",f),b.find("a").html(c.highlighter(g,f)),g==d.$element.val()&&(b.addClass("active"),d.$element.data("active",f),e=!0),b[0]}),this.autoSelect&&!e&&(b.filter(":not(.dropdown-header)").first().addClass("active"),this.$element.data("active",b.first().data("value"))),this.$menu.html(b),this},displayText:function(a){return void 0!==a&&void 0!==a.name?a.name:a},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active"),this.$element.val(d.text())},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active"),this.$element.val(c.text())},listen:function(){this.$element.on("focus",a.proxy(this.focus,this)).on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("propertychange input",a.proxy(this.input,this)).on("keyup",a.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",a.proxy(this.keydown,this)),"ontouchstart"in document.documentElement?this.$menu.on("touchstart","li",a.proxy(this.touchstart,this)).on("touchend","li",a.proxy(this.click,this)):this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this)).on("mouseleave","li",a.proxy(this.mouseleave,this)).on("mousedown",a.proxy(this.mousedown,this))},destroy:function(){this.$element.data("typeahead",null),this.$element.data("active",null),this.$element.off("focus").off("blur").off("keypress").off("propertychange input").off("keyup"),this.eventSupported("keydown")&&this.$element.off("keydown"),this.$menu.remove(),this.destroyed=!0},eventSupported:function(a){var b=a in this.$element;return b||(this.$element.setAttribute(a,"return;"),b="function"==typeof this.$element[a]),b},move:function(a){if(this.shown)switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:if(a.shiftKey)return;a.preventDefault(),this.prev();break;case 40:if(a.shiftKey)return;a.preventDefault(),this.next()}},keydown:function(b){this.keyPressed=!0,this.suppressKeyPressRepeat=~a.inArray(b.keyCode,[40,38,9,13,27]),this.shown||40!=b.keyCode?this.move(b):this.lookup()},keypress:function(a){this.suppressKeyPressRepeat||this.move(a)},input:function(a){var b=this.$element.val()||this.$element.text();this.value!==b&&(this.value=b,this.lookup())},keyup:function(a){if(!this.destroyed)switch(a.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:if(!this.shown||this.showHintOnFocus&&!this.keyPressed)return;this.select();break;case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide()}},focus:function(a){this.focused||(this.focused=!0,this.keyPressed=!1,this.options.showHintOnFocus&&!0!==this.skipShowHintOnFocus&&("all"===this.options.showHintOnFocus?this.lookup(""):this.lookup())),this.skipShowHintOnFocus&&(this.skipShowHintOnFocus=!1)},blur:function(a){this.mousedover||this.mouseddown||!this.shown?this.mouseddown&&(this.skipShowHintOnFocus=!0,this.$element.focus(),this.mouseddown=!1):(this.hide(),this.focused=!1,this.keyPressed=!1)},click:function(a){a.preventDefault(),this.skipShowHintOnFocus=!0,this.select(),this.$element.focus(),this.hide()},mouseenter:function(b){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")},mouseleave:function(a){this.mousedover=!1,!this.focused&&this.shown&&this.hide()},mousedown:function(a){this.mouseddown=!0,this.$menu.one("mouseup",function(a){this.mouseddown=!1}.bind(this))},touchstart:function(b){b.preventDefault(),this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")},touchend:function(a){a.preventDefault(),this.select(),this.$element.focus()}};var c=a.fn.typeahead;a.fn.typeahead=function(c){var d=arguments;return"string"==typeof c&&"getActive"==c?this.data("active"):this.each(function(){var e=a(this),f=e.data("typeahead"),g="object"==typeof c&&c;f||e.data("typeahead",f=new b(this,g)),"string"==typeof c&&f[c]&&(d.length>1?f[c].apply(f,Array.prototype.slice.call(d,1)):f[c]())})},b.defaults={source:[],items:8,menu:'',item:'
  • ',minLength:1,scrollHeight:0,autoSelect:!0,afterSelect:a.noop,addItem:!1,delay:0,separator:"category",headerHtml:'',headerDivider:''},a.fn.typeahead.Constructor=b,a.fn.typeahead.noConflict=function(){return a.fn.typeahead=c,this},a(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);c.data("typeahead")||c.typeahead(c.data())})}); \ No newline at end of file +!function(a,b){"use strict";"undefined"!=typeof module&&module.exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):b(a.jQuery)}(this,function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.defaults,d),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.select=this.options.select||this.select,this.autoSelect="boolean"!=typeof this.options.autoSelect||this.options.autoSelect,this.highlighter=this.options.highlighter||this.highlighter,this.render=this.options.render||this.render,this.updater=this.options.updater||this.updater,this.displayText=this.options.displayText||this.displayText,this.itemLink=this.options.itemLink||this.itemLink,this.followLinkOnSelect=this.options.followLinkOnSelect||this.followLinkOnSelect,this.source=this.options.source,this.delay=this.options.delay,this.$menu=a(this.options.menu),this.$appendTo=this.options.appendTo?a(this.options.appendTo):null,this.fitToElement="boolean"==typeof this.options.fitToElement&&this.options.fitToElement,this.shown=!1,this.listen(),this.showHintOnFocus=("boolean"==typeof this.options.showHintOnFocus||"all"===this.options.showHintOnFocus)&&this.options.showHintOnFocus,this.afterSelect=this.options.afterSelect,this.afterEmptySelect=this.options.afterEmptySelect,this.addItem=!1,this.value=this.$element.val()||this.$element.text(),this.keyPressed=!1,this.focused=this.$element.is(":focus")};b.prototype={constructor:b,setDefault:function(a){if(this.$element.data("active",a),this.autoSelect||a){var b=this.updater(a);b||(b=""),this.$element.val(this.displayText(b)||b).text(this.displayText(b)||b).change(),this.afterSelect(b)}return this.hide()},select:function(){var a=this.$menu.find(".active").data("value");if(this.$element.data("active",a),this.autoSelect||a){var b=this.updater(a);b||(b=""),this.$element.val(this.displayText(b)||b).text(this.displayText(b)||b).change(),this.afterSelect(b),this.followLinkOnSelect&&this.itemLink(a)?(document.location=this.itemLink(a),this.afterSelect(b)):this.followLinkOnSelect&&!this.itemLink(a)?this.afterEmptySelect(b):this.afterSelect(b)}else this.afterEmptySelect(b);return this.hide()},updater:function(a){return a},setSource:function(a){this.source=a},show:function(){var b,c=a.extend({},this.$element.position(),{height:this.$element[0].offsetHeight}),d="function"==typeof this.options.scrollHeight?this.options.scrollHeight.call():this.options.scrollHeight;if(this.shown?b=this.$menu:this.$appendTo?(b=this.$menu.appendTo(this.$appendTo),this.hasSameParent=this.$appendTo.is(this.$element.parent())):(b=this.$menu.insertAfter(this.$element),this.hasSameParent=!0),!this.hasSameParent){b.css("position","fixed");var e=this.$element.offset();c.top=e.top,c.left=e.left}var f=a(b).parent().hasClass("dropup"),g=f?"auto":c.top+c.height+d,h=a(b).hasClass("dropdown-menu-right"),i=h?"auto":c.left;return b.css({top:g,left:i}).show(),!0===this.options.fitToElement&&b.css("width",this.$element.outerWidth()+"px"),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){if(this.query=void 0!==b&&null!==b?b:this.$element.val(),this.query.length0?this.$element.data("active",b[0]):this.$element.data("active",null),"all"!=this.options.items&&(b=b.slice(0,this.options.items)),this.options.addItem&&b.push(this.options.addItem),this.render(b).show()):this.shown?this.hide():this},matcher:function(a){return~this.displayText(a).toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){for(var b,c=[],d=[],e=[];b=a.shift();){var f=this.displayText(b);f.toLowerCase().indexOf(this.query.toLowerCase())?~f.indexOf(this.query)?d.push(b):e.push(b):c.push(b)}return c.concat(d,e)},highlighter:function(a){var b=this.query;if(""===b)return a;var c,d=a.match(/(>)([^<]*)(<)/g),e=[],f=[];if(d&&d.length)for(c=0;c2&&e.push(d[c]);else e=[],e.push(a);b=b.replace(/[\(\)\/\.\*\+\?\[\]]/g,function(a){return"\\"+a});var g,h=new RegExp(b,"g");for(c=0;c0&&f.push(e[c]);for(c=0;c$&"));return a},render:function(b){var c=this,d=this,e=!1,f=[],g=c.options.separator;return a.each(b,function(a,c){a>0&&c[g]!==b[a-1][g]&&f.push({__type:"divider"}),!c[g]||0!==a&&c[g]===b[a-1][g]||f.push({__type:"category",name:c[g]}),f.push(c)}),b=a(f).map(function(b,f){if("category"==(f.__type||!1))return a(c.options.headerHtml).text(f.name)[0];if("divider"==(f.__type||!1))return a(c.options.headerDivider)[0];var g=d.displayText(f);return b=a(c.options.item).data("value",f),b.find("a").html(c.highlighter(g,f)),this.followLinkOnSelect&&b.find("a").attr("href",d.itemLink(f)),g==d.$element.val()&&(b.addClass("active"),d.$element.data("active",f),e=!0),b[0]}),this.autoSelect&&!e&&(b.filter(":not(.dropdown-header)").first().addClass("active"),this.$element.data("active",b.first().data("value"))),this.$menu.html(b),this},displayText:function(a){return void 0!==a&&void 0!==a.name?a.name:a},itemLink:function(a){return null},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active");var e=this.updater(d.data("value"));this.$element.val(this.displayText(e)||e)},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active");var d=this.updater(c.data("value"));this.$element.val(this.displayText(d)||d)},listen:function(){this.$element.on("focus",a.proxy(this.focus,this)).on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("propertychange input",a.proxy(this.input,this)).on("keyup",a.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",a.proxy(this.keydown,this)),"ontouchstart"in document.documentElement?this.$menu.on("touchstart","li",a.proxy(this.touchstart,this)).on("touchend","li",a.proxy(this.click,this)):this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this)).on("mouseleave","li",a.proxy(this.mouseleave,this)).on("mousedown",a.proxy(this.mousedown,this))},destroy:function(){this.$element.data("typeahead",null),this.$element.data("active",null),this.$element.off("focus").off("blur").off("keypress").off("propertychange input").off("keyup"),this.eventSupported("keydown")&&this.$element.off("keydown"),this.$menu.remove(),this.destroyed=!0},eventSupported:function(a){var b=a in this.$element;return b||(this.$element.setAttribute(a,"return;"),b="function"==typeof this.$element[a]),b},move:function(a){if(this.shown)switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:if(a.shiftKey)return;a.preventDefault(),this.prev();break;case 40:if(a.shiftKey)return;a.preventDefault(),this.next()}},keydown:function(b){this.keyPressed=!0,this.suppressKeyPressRepeat=~a.inArray(b.keyCode,[40,38,9,13,27]),this.shown||40!=b.keyCode?this.move(b):this.lookup()},keypress:function(a){this.suppressKeyPressRepeat||this.move(a)},input:function(a){var b=this.$element.val()||this.$element.text();this.value!==b&&(this.value=b,this.lookup())},keyup:function(a){if(!this.destroyed)switch(a.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:if(!this.shown||this.showHintOnFocus&&!this.keyPressed)return;this.select();break;case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide()}},focus:function(a){this.focused||(this.focused=!0,this.keyPressed=!1,this.options.showHintOnFocus&&!0!==this.skipShowHintOnFocus&&("all"===this.options.showHintOnFocus?this.lookup(""):this.lookup())),this.skipShowHintOnFocus&&(this.skipShowHintOnFocus=!1)},blur:function(a){this.mousedover||this.mouseddown||!this.shown?this.mouseddown&&(this.skipShowHintOnFocus=!0,this.$element.focus(),this.mouseddown=!1):(this.select(),this.hide(),this.focused=!1,this.keyPressed=!1)},click:function(a){a.preventDefault(),this.skipShowHintOnFocus=!0,this.select(),this.$element.focus(),this.hide()},mouseenter:function(b){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")},mouseleave:function(a){this.mousedover=!1,!this.focused&&this.shown&&this.hide()},mousedown:function(a){this.mouseddown=!0,this.$menu.one("mouseup",function(a){this.mouseddown=!1}.bind(this))},touchstart:function(b){b.preventDefault(),this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")},touchend:function(a){a.preventDefault(),this.select(),this.$element.focus()}};var c=a.fn.typeahead;a.fn.typeahead=function(c){var d=arguments;return"string"==typeof c&&"getActive"==c?this.data("active"):this.each(function(){var e=a(this),f=e.data("typeahead"),g="object"==typeof c&&c;f||e.data("typeahead",f=new b(this,g)),"string"==typeof c&&f[c]&&(d.length>1?f[c].apply(f,Array.prototype.slice.call(d,1)):f[c]())})},b.defaults={source:[],items:8,menu:'',item:'
  • ',minLength:1,scrollHeight:0,autoSelect:!0,afterSelect:a.noop,afterEmptySelect:a.noop,addItem:!1,followLinkOnSelect:!1,delay:0,separator:"category",headerHtml:'',headerDivider:''},a.fn.typeahead.Constructor=b,a.fn.typeahead.noConflict=function(){return a.fn.typeahead=c,this},a(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);c.data("typeahead")||c.typeahead(c.data())})}); \ No newline at end of file