define(['dom', 'focusManager'], function (dom, focusManager) {
    'use strict';

    var inputDisplayElement;
    var currentDisplayText = '';
    var currentDisplayTextContainer;

    function onKeyDown(e) {

        if (e.ctrlKey) {
            return;
        }
        if (e.shiftKey) {
            return;
        }
        if (e.altKey) {
            return;
        }

        var key = e.key;
        var chr = key ? alphanumeric(key) : null;

        if (chr) {

            chr = chr.toString().toUpperCase();

            if (chr.length === 1) {
                currentDisplayTextContainer = this.options.itemsContainer;
                onAlphanumericKeyPress(e, chr);
            }
        }
    }

    function alphanumeric(value) {
        var letterNumber = /^[0-9a-zA-Z]+$/;
        return value.match(letterNumber);
    }

    function ensureInputDisplayElement() {
        if (!inputDisplayElement) {
            inputDisplayElement = document.createElement('div');
            inputDisplayElement.classList.add('alphanumeric-shortcut');
            inputDisplayElement.classList.add('hide');

            document.body.appendChild(inputDisplayElement);
        }
    }

    var alpanumericShortcutTimeout;
    function clearAlphaNumericShortcutTimeout() {
        if (alpanumericShortcutTimeout) {
            clearTimeout(alpanumericShortcutTimeout);
            alpanumericShortcutTimeout = null;
        }
    }
    function resetAlphaNumericShortcutTimeout() {
        clearAlphaNumericShortcutTimeout();
        alpanumericShortcutTimeout = setTimeout(onAlphanumericShortcutTimeout, 2000);
    }

    function onAlphanumericKeyPress(e, chr) {
        if (currentDisplayText.length >= 3) {
            return;
        }
        ensureInputDisplayElement();
        currentDisplayText += chr;
        inputDisplayElement.innerHTML = currentDisplayText;
        inputDisplayElement.classList.remove('hide');
        resetAlphaNumericShortcutTimeout();
    }

    function onAlphanumericShortcutTimeout() {
        var value = currentDisplayText;
        var container = currentDisplayTextContainer;

        currentDisplayText = '';
        currentDisplayTextContainer = null;
        inputDisplayElement.innerHTML = '';
        inputDisplayElement.classList.add('hide');
        clearAlphaNumericShortcutTimeout();
        selectByShortcutValue(container, value);
    }

    function selectByShortcutValue(container, value) {

        value = value.toUpperCase();

        var focusElem;
        if (value === '#') {

            focusElem = container.querySelector('*[data-prefix]');
        }

        if (!focusElem) {
            focusElem = container.querySelector('*[data-prefix^=\'' + value + '\']');
        }

        if (focusElem) {
            focusManager.focus(focusElem);
        }
    }

    function AlphaNumericShortcuts(options) {

        this.options = options;

        var keyDownHandler = onKeyDown.bind(this);

        dom.addEventListener(window, 'keydown', keyDownHandler, {
            passive: true
        });

        this.keyDownHandler = keyDownHandler;
    }

    AlphaNumericShortcuts.prototype.destroy = function () {

        var keyDownHandler = this.keyDownHandler;

        if (keyDownHandler) {
            dom.removeEventListener(window, 'keydown', keyDownHandler, {
                passive: true
            });
            this.keyDownHandler = null;
        }
        this.options = null;
    };

    return AlphaNumericShortcuts;
});
