autocomplete-list-keys-debug.js revision 05a3f5401cb20821fe3ca469b01a9b58a3dc4ed1
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassYUI.add('autocomplete-list-keys', function(Y) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Mixes keyboard support into AutoCompleteList. By default, this module is not
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * loaded for iOS and Android devices.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @module autocomplete
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @submodule autocomplete-list-keys
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // keyCode constants.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassvar KEY_DOWN = 40,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass KEY_ENTER = 13,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass KEY_ESC = 27,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass KEY_TAB = 9,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass KEY_UP = 38;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassfunction ListKeys() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.before(this._unbindKeys, this, 'destructor');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.before(this._bindKeys, this, 'bindUI');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._initKeys();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassListKeys.prototype = {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // -- Lifecycle Methods ----------------------------------------------------
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Initializes keyboard command mappings.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _initKeys
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @for AutoCompleteList
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _initKeys: function () {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var keys = {},
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass keysVisible = {};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._keyEvents = [];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Register keyboard command handlers. _keys contains handlers that will
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // always be called; _keysVisible contains handlers that will only be
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // called when the list is visible.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass keys[KEY_DOWN] = this._keyDown;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass keysVisible[KEY_ENTER] = this._keyEnter;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass keysVisible[KEY_ESC] = this._keyEsc;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass keysVisible[KEY_TAB] = this._keyTab;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass keysVisible[KEY_UP] = this._keyUp;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._keys = keys;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._keysVisible = keysVisible;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Binds keyboard events.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _bindKeys
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _bindKeys: function () {
05a3f5401cb20821fe3ca469b01a9b58a3dc4ed1Ryan Grove this._keyEvents.push(this._inputNode.on('keydown', this._onInputKey,
05a3f5401cb20821fe3ca469b01a9b58a3dc4ed1Ryan Grove this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Unbinds keyboard events.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _unbindKeys
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _unbindKeys: function () {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass while (this._keyEvents.length) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._keyEvents.pop().detach();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // -- Protected Methods ----------------------------------------------------
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Called when the down arrow key is pressed.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _keyDown
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _keyDown: function () {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this.get('visible')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._activateNextItem();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.show();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Called when the enter key is pressed.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _keyEnter
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _keyEnter: function (e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var item = this.get('activeItem');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (item) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.selectItem(item, e);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // Don't prevent form submission when there's no active item.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Called when the escape key is pressed.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _keyEsc
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _keyEsc: function () {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.hide();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Called when the tab key is pressed.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _keyTab
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _keyTab: function (e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var item;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this.get('tabSelect')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass item = this.get('activeItem');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (item) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.selectItem(item, e);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return false;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Called when the up arrow key is pressed.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _keyUp
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _keyUp: function () {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._activatePrevItem();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // -- Protected Event Handlers ---------------------------------------------
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Handles <code>inputNode</code> key events.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onInputKey
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {EventTarget} e
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @protected
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onInputKey: function (e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var handler,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass keyCode = e.keyCode;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._lastInputKey = keyCode;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this.get('results').length) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass handler = this._keys[keyCode];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!handler && this.get('visible')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass handler = this._keysVisible[keyCode];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (handler) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // A handler may return false to indicate that it doesn't wish
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass // to prevent the default key behavior.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (handler.call(this, e) !== false) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.preventDefault();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassY.Base.mix(Y.AutoCompleteList, [ListKeys]);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass}, '@VERSION@' ,{requires:['autocomplete-list', 'base-build']});