/** * PrimeUI autocomplete widget */ $(function() { $.widget("primeui.puiautocomplete", { options: { delay: 300, minQueryLength: 1, multiple: false, dropdown: false, scrollHeight: 200, forceSelection: false, effect:null, effectOptions: {}, effectSpeed: 'normal', content: null, caseSensitive: false }, _create: function() { this.element.puiinputtext(); this.panel = $('
').appendTo('body'); if(this.options.multiple) { this.element.wrap(' '); this.inputContainer = this.element.parent(); this.multiContainer = this.inputContainer.parent(); } else { if(this.options.dropdown) { this.dropdown = $('') .insertAfter(this.element); this.element.removeClass('ui-corner-all').addClass('ui-corner-left'); } } this._bindEvents(); }, _bindEvents: function() { var $this = this; this._bindKeyEvents(); if(this.options.dropdown) { this.dropdown.on('hover.puiautocomplete', function() { if(!$this.element.prop('disabled')) { $this.dropdown.toggleClass('ui-state-hover'); } }) .on('mousedown.puiautocomplete', function() { if(!$this.element.prop('disabled')) { $this.dropdown.addClass('ui-state-active'); } }) .on('mouseup.puiautocomplete', function() { if(!$this.element.prop('disabled')) { $this.dropdown.removeClass('ui-state-active'); $this.search(''); $this.element.focus(); } }) .on('focus.puiautocomplete', function() { $this.dropdown.addClass('ui-state-focus'); }) .on('blur.puiautocomplete', function() { $this.dropdown.removeClass('ui-state-focus'); }) .on('keydown.puiautocomplete', function(e) { var keyCode = $.ui.keyCode; if(e.which == keyCode.ENTER || e.which == keyCode.NUMPAD_ENTER) { $this.search(''); $this.input.focus(); e.preventDefault(); } }); } if(this.options.multiple) { this.multiContainer.on('hover.puiautocomplete', function() { $(this).toggleClass('ui-state-hover'); }) .on('click.puiautocomplete', function() { $this.element.trigger('focus'); }); this.element.on('focus.pui-autocomplete', function() { $this.multiContainer.addClass('ui-state-focus'); }) .on('blur.pui-autocomplete', function(e) { $this.multiContainer.removeClass('ui-state-focus'); }); } if(this.options.forceSelection) { this.cachedResults = [this.element.val()]; this.element.on('blur.puiautocomplete', function() { var value = $this.element.val(), valid = false; for(var i = 0; i < $this.cachedResults.length; i++) { if($this.cachedResults[i] == value) { valid = true; break; } } if(!valid) { $this.element.val(''); } }); } $(document.body).bind('mousedown.puiautocomplete', function (e) { if($this.panel.is(":hidden")) { return; } if(e.target === $this.element.get(0)) { return; } var offset = $this.panel.offset(); if (e.pageX < offset.left || e.pageX > offset.left + $this.panel.width() || e.pageY < offset.top || e.pageY > offset.top + $this.panel.height()) { $this.hide(); } }); $(window).bind('resize.' + this.element.id, function() { if($this.panel.is(':visible')) { $this._alignPanel(); } }); }, _bindKeyEvents: function() { var $this = this; this.element.on('keyup.puiautocomplete', function(e) { var keyCode = $.ui.keyCode, key = e.which, shouldSearch = true; if(key == keyCode.UP || key == keyCode.LEFT || key == keyCode.DOWN || key == keyCode.RIGHT || key == keyCode.TAB || key == keyCode.SHIFT || key == keyCode.ENTER || key == keyCode.NUMPAD_ENTER) { shouldSearch = false; } if(shouldSearch) { var value = $this.element.val(); if(!value.length) { $this.hide(); } if(value.length >= $this.options.minQueryLength) { if($this.timeout) { clearTimeout($this.timeout); } $this.timeout = setTimeout(function() { $this.search(value); }, $this.options.delay); } } }).on('keydown.puiautocomplete', function(e) { if($this.panel.is(':visible')) { var keyCode = $.ui.keyCode, highlightedItem = $this.items.filter('.ui-state-highlight'); switch(e.which) { case keyCode.UP: case keyCode.LEFT: var prev = highlightedItem.prev(); if(prev.length == 1) { highlightedItem.removeClass('ui-state-highlight'); prev.addClass('ui-state-highlight'); if($this.options.scrollHeight) { PUI.scrollInView($this.panel, prev); } } e.preventDefault(); break; case keyCode.DOWN: case keyCode.RIGHT: var next = highlightedItem.next(); if(next.length == 1) { highlightedItem.removeClass('ui-state-highlight'); next.addClass('ui-state-highlight'); if($this.options.scrollHeight) { PUI.scrollInView($this.panel, next); } } e.preventDefault(); break; case keyCode.ENTER: case keyCode.NUMPAD_ENTER: highlightedItem.trigger('click'); e.preventDefault(); break; case keyCode.ALT: case 224: break; case keyCode.TAB: highlightedItem.trigger('click'); $this.hide(); break; } } }); }, _bindDynamicEvents: function() { var $this = this; this.items.on('mouseover.puiautocomplete', function() { var item = $(this); if(!item.hasClass('ui-state-highlight')) { $this.items.filter('.ui-state-highlight').removeClass('ui-state-highlight'); item.addClass('ui-state-highlight'); } }) .on('click.puiautocomplete', function(event) { var item = $(this); if($this.options.multiple) { var tokenMarkup = '