(function() {
    function showOptionsList(_input) {
        let ol = $(_input).next('.data-option-list');
        if(ol.length && !ol.is(':visible')) {
            ol.show();
            return true;
        }
        return false;
    }
    function hideOptionsList(_input) {
        let ol = $(_input).next('.data-option-list');
        if(ol.length && ol.is(':visible')) {
            ol.hide();
            return true;
        }
        return false;
    }
    function init() {
        $(document)
            .off('mousedown.option-list', '.data-option-list>div')
            .on('mousedown.option-list', '.data-option-list>div', function(_e) {
                _e.stopPropagation();
                _e.preventDefault();
                markEventAsConsumed(_e);
                let elem = $(this).parent().prev('input[data-option-list]'),
                    text = $(this).text();
                if(!elem.is('[multi-option-list]')) {
                    elem.val('');
                }
                else {
                    elem.val($.trim(elem.val()));
                    elem[0].selectionStart = elem[0].selectionEnd = elem.val().length;
                    if(elem.val() !== '') text = ', ' + text;
                }
                elem.focus();
                document.execCommand('insertText', false, text);
                if(!elem.is('[sticky-option-list]')) {
                    $(this).closest('.data-option-list').hide();
                }
                return false;
            });
        $(document)
            .off('click.trigger-option-list', 'input[data-option-list]')
            .on('click.trigger-option-list', 'input[data-option-list]', function() {
                showOptionsList(this);
            })
            .off('focus.trigger-option-list', 'input[data-option-list]')
            .on('focus.trigger-option-list', 'input[data-option-list]', function() {
                showOptionsList(this);
            })
            .off('blur.trigger-option-list', 'input[data-option-list]')
            .on('blur.trigger-option-list', 'input[data-option-list]', function() {
                hideOptionsList(this);
            })
            .off('keydown.discard-option-list', 'input[data-option-list]')
            .on('keydown.discard-option-list', 'input[data-option-list]', function(_e) {
                if(_e.which === 27) {
                    if(hideOptionsList(this)) {
                        markEventAsConsumed(_e);
                        return false;
                    }
                }
            })
    }
    addMCInitializer('option-list', init);
})();
