private void OnKeyboardEvent(
            AutocompleteSrcType src, KeyboardEvent <HTMLInputElement> ev)
        {
            Logger.Debug(GetType(), "autocomplete input={0} key={1} src={2}", _input.Value, ev.KeyCode, src);

            if (!ev.IsUserGenerated())
            {
                return;
            }

            if (src == AutocompleteSrcType.KeyDown)
            {
                switch (ev.KeyCode)
                {
                case Magics.KeyCodeEnter:
                    var changed = false;

                    if (!_activeItemNo.HasValue)
                    {
                        if (_input.Value.Length <= 0)
                        {
                            _value  = default(DataT);
                            changed = true;
                        }
                        else if (_availOptions.Count == 1 && _isCompleteValue(_input.Value, _availOptions[0]))
                        {
                            _value  = _availOptions[0];
                            changed = true;
                        }
                    }
                    else
                    {
                        var act = _availOptions[_activeItemNo.Value];
                        if (_isCompleteValue(_input.Value, act))
                        {
                            _value  = act;
                            changed = true;
                        }
                    }

                    if (changed)
                    {
                        HideOptions();
                        Changed?.Invoke(Value, true);
                    }
                    break;

                case Magics.KeyCodeBackspace:
                    ScheduleAutocomplete();
                    break;

                case Magics.KeyCodeArrowUp:
                    if (!_activeItemNo.HasValue)
                    {
                        break;
                    }

                    DeactivateItem(_activeItemNo.Value);

                    _activeItemNo--;
                    if (_activeItemNo.Value < 0)
                    {
                        ChangeInputValueTo(_valueBeforeArrows);
                        _activeItemNo = null;
                        break;
                    }

                    if (_activeItemNo <= _options.ChildElementCount - 1)
                    {
                        ActivateItem(_activeItemNo.Value);
                        ChangeInputValueTo(_options.ChildNodes[_activeItemNo.Value].TextContent);
                    }
                    break;

                case Magics.KeyCodeArrowDown:
                    if (_activeItemNo.HasValue)
                    {
                        DeactivateItem(_activeItemNo.Value);
                    }

                    if (!_activeItemNo.HasValue)
                    {
                        if (_options.ChildElementCount < 0)
                        {
                            break;
                        }
                        _valueBeforeArrows = _input.Value;
                        _activeItemNo      = 0;
                    }
                    else if (_activeItemNo + 1 <= _options.ChildElementCount - 1)
                    {
                        _activeItemNo++;
                    }

                    ActivateItem(_activeItemNo.Value);
                    ChangeInputValueTo(_options.ChildNodes[_activeItemNo.Value].TextContent);
                    break;
                }
                return;
            }

            if (src == AutocompleteSrcType.KeyPressed)
            {
                ScheduleAutocomplete();
                return;
            }
        }