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