0
- * @description Form autocomplete plugin using preloaded or Ajax JSON data source
0
+ * @description Form autocomplete plugin using preloaded or Ajax JSON data source
0
* @example $('input#user-name').autocomplete({list: ["quentin", "adam", "admin"]})
0
* @desc Simple autocomplete with basic JSON data source
0
* @desc Simple autocomplete with Ajax loaded JSON data source
0
$.ui = $.ui || {}; $.ui.autocomplete = $.ui.autocomplete || {}; var active;
0
$.fn.autocompleteMode = function(container, input, size, opt) {
0
var original = input.val(); var selected = -1; var self = this;
0
$.data(document.body, "autocompleteMode", true);
0
- $("body").one("cancel.autocomplete", function() {
0
- input.trigger("cancel.autocomplete"); $("body").trigger("off.autocomplete"); input.val(original);
0
+ $("body").one("cancel.autocomplete", function() {
0
+ input.trigger("cancel.autocomplete"); $("body").trigger("off.autocomplete"); input.val(original);
0
$("body").one("activate.autocomplete", function() {
0
- input.trigger("activate.autocomplete", [$.data(active[0], "originalObject")]); $("body").trigger("off.autocomplete");
0
+ // Try hitting return to activate autocomplete and then hitting it again on blank input
0
+ // to close it. w/o checking the active object first this input.trigger() will barf.
0
+ active && input.trigger("activate.autocomplete", [$.data(active[0], "originalObject")]);
0
+ $("body").trigger("off.autocomplete");
0
$("body").one("off.autocomplete", function(e, reset) {
0
$.data(document.body, "autocompleteMode", false);
0
input.unbind("keydown.autocomplete");
0
$("body").add(window).unbind("click.autocomplete").unbind("cancel.autocomplete").unbind("activate.autocomplete");
0
// If a click bubbles all the way up to the window, close the autocomplete
0
$(window).bind("click.autocomplete", function() { $("body").trigger("cancel.autocomplete"); });
0
var select = function() {
0
active = $("> *", container).removeClass("active").slice(selected, selected + 1).addClass("active");
0
- input.trigger("itemSelected.autocomplete", [$.data(active[0], "originalObject")]);
0
+ input.trigger("itemSelected.autocomplete", [$.data(active[0], "originalObject")]);
0
input.val(opt.insertText($.data(active[0], "originalObject")));
0
container.mouseover(function(e) {
0
// If you hover over the container, but not its children, return
0
if(e.target == container[0]) return;
0
// Set the selected item to the item hovered over and make it active
0
selected = $("> *", container).index($(e.target).is('li') ? $(e.target)[0] : $(e.target).parents('li')[0]); select();
0
}).bind("click.autocomplete", function(e) {
0
- $("body").trigger("activate.autocomplete"); $.data(document.body, "suppressKey", false);
0
+ $("body").trigger("activate.autocomplete"); $.data(document.body, "suppressKey", false);
0
.bind("keydown.autocomplete", function(e) {
0
- if(e.which == 27) { $("body").trigger("cancel.autocomplete"); }
0
- else if(e.which == 13) { $("body").trigger("activate.autocomplete"); }
0
- else if(e.which == 40 || e.which == 9 || e.which == 38) {
0
+ var k = e.which || e.keyCode; // in IE e.which is undefined
0
+ if(k == KEY.ESC) { $("body").trigger("cancel.autocomplete"); }
0
+ else if(k == KEY.RETURN) { $("body").trigger("activate.autocomplete"); }
0
+ else if(k == KEY.UP || k == KEY.TAB || k == KEY.DOWN) {
0
selected = selected >= size - 1 ? 0 : selected + 1; break;
0
selected = selected <= 0 ? size - 1 : selected - 1; break;
0
$.data(document.body, "suppressKey", true);
0
$.fn.autocomplete = function(opt) {
0
getList: function(input) { input.trigger("updateList", [opt.list]); },
0
return this.each(function() {
0
.keypress(function(e) {
0
var typingTimeout = $.data(this, "typingTimeout");
0
+ var k = e.keyCode || e.which; // keyCode == 0 in Gecko/FF on keypress
0
if(typingTimeout) window.clearInterval(typingTimeout);
0
if($.data(document.body, "suppressKey"))
0
return $.data(document.body, "suppressKey", false);
0
- else if($.data(document.body, "autocompleteMode") && e.charCode < 32 && e.keyCode != 8 && e.keyCode != 46) return false;
0
- $.data(this, "typingTimeout", window.setTimeout(function() {
0
- $(e.target).trigger("autocomplete");
0
+ else if($.data(document.body, "autocompleteMode") && k < 32 && k != KEY.BS && k != KEY.DEL) return false;
0
+ else if (k != KEY.TAB && k != KEY.ESC) { // don't start the meter running if we are tabbing out or escaping this nuthouse
0
+ $.data(this, "typingTimeout", window.setTimeout(function() {
0
+ $(e.target).trigger("autocomplete");
0
var node = $(opt.template(this))[0];
0
$.data(node, "originalObject", this);
0
$("body").trigger("off.autocomplete");
0
if(!list.length) return false;
0
var container = list.wrapAll(opt.wrapper).parents(":last").children();
0
var offset = self.offset();
0
opt.container = container
0
.css({top: offset.top + self.outerHeight(), left: offset.left, width: self.width()})
0
$("body").autocompleteMode(container, self, list.length, opt);