1
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
2
// use this file except in compliance with the License. You may obtain a copy
5
// http://www.apache.org/licenses/LICENSE-2.0
7
// Unless required by applicable law or agreed to in writing, software
8
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
// License for the specific language governing permissions and limitations under
15
suggest = function(elem, options) {
19
var input = $(elem).attr("autocomplete", "off");
20
var offset = input.offset();
21
var dropdown = $('<ul style="z-index: 10000"></ul>')
22
.addClass(options.dropdownClass).appendTo("body").css({
23
top: (offset.top + elem.offsetHeight) + "px",
24
left: offset.left + "px",
25
minWidth: input.css("width")
30
setTimeout(function() { dropdown.hide() }, 200);
32
.keydown(function(e) {
33
if (timer) clearTimeout(timer);
34
if ($.inArray(e.keyCode, [38, 40]) != -1 ||
35
(dropdown.is(":visible") && (e.keyCode == 27 ||
36
($.inArray(e.keyCode, [9, 13]) != -1 && getSelection())))) {
37
e.preventDefault(); e.stopPropagation();
55
timer = setTimeout(function() { suggest() }, options.delay);
59
function suggest(force) {
60
var newVal = $.trim(input.val());
61
if (force || newVal != prevVal) {
62
if (force || newVal.length >= options.minChars) {
63
options.callback($.trim(input.val()), function(items) {
73
function show(items) {
75
if (!items.length) { dropdown.hide(); return; }
77
for (var i = 0; i < items.length; i++) {
78
html.push('<li>' + items[i] + '</li>');
80
dropdown.html(html.join("")).slideDown("fast");
81
dropdown.children('li').click(function(e) {
82
$(this).addClass("selected");
88
var sel = getSelection();
94
if (timer) clearTimeout(timer)
97
function getSelection() {
98
if (!dropdown.is(":visible")) return null;
99
var sel = dropdown.children("li.selected");
100
return sel.length ? sel : null;
103
function moveDown() {
104
if (!dropdown.is(":visible")) suggest(true);
105
var sel = getSelection();
106
if (sel) sel.removeClass("selected").next().addClass("selected");
107
else dropdown.children("li:first-child").addClass("selected");
111
if (!dropdown.is(":visible")) suggest(true);
112
var sel = getSelection();
113
if (sel) sel.removeClass("selected").prev().addClass("selected");
114
else dropdown.children("li:last-child").addClass("selected");
118
$.fn.suggest = function(callback, options) {
119
options = options || {};
120
options.callback = callback;
121
options.delay = options.delay || 100;
122
options.dropdownClass = options.dropdownClass || "suggest-dropdown";
123
options.minChars = options.minChars || 1;
124
return this.each(function() {
125
suggest(this, options);