in wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js [86:253]
function initialize(){
var isShowing = false;
// Remove the autocompletion menu if still present from
// a previous call. This is required to properly register
// the mouse event handler again
var choiceDiv = document.getElementById(getMenuId());
if (choiceDiv !== null) {
isShowing = choiceDiv.showingAutocomplete;
choiceDiv.parentNode.parentNode.removeChild(choiceDiv.parentNode);
}
var obj = Wicket.$(ajaxAttributes.c);
initialElement = obj;
Wicket.Event.add(obj, 'blur', function (jqEvent) {
var menuId=getMenuId();
//workaround for IE. Clicks on scrollbar trigger
//'blur' event on input field. (See https://issues.apache.org/jira/browse/WICKET-5882)
if (menuId !== document.activeElement.id && (menuId + "-container") !== document.activeElement.id) {
hideAutoCompleteTimer = window.setTimeout(function() {
hideAutoComplete();
isTriggeredChange = false;
triggerChangeOnHide = false;
}, 500);
} else {
jQuery(this).trigger("focus");
}
});
Wicket.Event.add(obj, 'focus', function (jqEvent) {
var input = jqEvent.target;
if (!ignoreOneFocusGain && (cfg.showListOnFocusGain || (cfg.showListOnEmptyInput && (!input.value))) && visible === 0) {
getAutocompleteMenu().showingAutocomplete = true;
if (cfg.showCompleteListOnFocusGain) {
updateChoices(true);
} else {
updateChoices();
}
}
ignoreOneFocusGain = false;
});
Wicket.Event.add(obj, 'keydown', function (jqEvent) {
var keyCode = Wicket.Event.keyCode(jqEvent);
switch (keyCode) {
case KEY_UP:
if (elementCount > 0) {
if (selected>-1) {
setSelected(selected-1);
}
var searchTerm = Wicket.$(ajaxAttributes.c).value;
if(selected === -1 && searchTerm) {
// select the last element
setSelected(elementCount-1);
showAutoComplete();
}
render(true, false);
jqEvent.preventDefault();
}
break;
case KEY_DOWN:
if (elementCount > 0) {
if (selected < elementCount-1) {
setSelected(selected+1);
} else if (selected === elementCount-1) {
// select the first element
setSelected(0);
}
if (visible === 0) {
updateChoices();
} else {
render(true, false);
showAutoComplete();
}
jqEvent.preventDefault();
}
break;
case KEY_ESC:
if (visible === 1) {
hideAutoComplete();
return jqEvent.stopPropagation();
}
break;
case KEY_TAB:
case KEY_ENTER:
ignoreKeyEnter = false;
if (selected > -1) {
var value = getSelectedValue();
value = handleSelection(value);
if (value) {
obj.value = value;
triggerChangeOnHide = true;
}
hideAutoComplete();
if (cfg.keyTabBehavior === 'selectFocusAutocompleteInput' && keyCode === KEY_TAB) {
// prevent moving focus to the next component if an item in the dropdown is selected
// using the Tab key
jqEvent.preventDefault();
}
ignoreKeyEnter = true;
} else if (Wicket.AutoCompleteSettings.enterHidesWithNoSelection) {
hideAutoComplete();
ignoreKeyEnter = true;
}
return true;
default:
}
});
Wicket.Event.add(obj, 'change', function (jqEvent) {
if (visible === 1) {
// don't let any other change handler get this
jqEvent.stopImmediatePropagation();
triggerChangeOnHide = true;
}
});
Wicket.Event.add(obj, 'input change', function (jqEvent) {
var kc = Wicket.Event.keyCode(jqEvent);
switch(kc) {
case KEY_TAB:
case KEY_ENTER:
return jqEvent.stopImmediatePropagation();
case KEY_UP:
case KEY_DOWN:
case KEY_ESC:
case KEY_RIGHT:
case KEY_LEFT:
case KEY_SHIFT:
case KEY_ALT:
case KEY_CTRL:
break;
default:
updateChoices();
}
});
Wicket.Event.add(obj, 'keypress', function (jqEvent) {
if(Wicket.Event.keyCode(jqEvent) === KEY_ENTER && ignoreKeyEnter){
jqEvent.stopImmediatePropagation();
return false;
}
});
if (Wicket.Focus.getFocusedElement() === obj && isShowing === true)
{
// element already has focus, we should show list
if (cfg.showListOnFocusGain) {
if (cfg.showCompleteListOnFocusGain) {
updateChoices(true);
} else {
updateChoices();
}
}
}
}