var App = App || {};

App.Keyboard = function(jQuery, mousetrap, browsingSettings) {

    var enabled = browsingSettings.getSettings().keyboardShortcuts;
    var oldStopCallback = mousetrap.stopCallback;
    mousetrap.stopCallback = function(e, element, combo, sequence) {
        if (combo.indexOf('ctrl') === -1 && e.ctrlKey) {
            return true;
        }
        if (combo.indexOf('alt') === -1 && e.altKey) {
            return true;
        }
        if (combo.indexOf('ctrl') !== -1) {
            return false;
        }
        var $focused = jQuery(':focus').eq(0);
        if ($focused.length) {
            if ($focused.prop('tagName').match(/embed|object/i)) {
                return true;
            }
            if ($focused.prop('tagName').toLowerCase() === 'input' &&
                $focused.attr('type').match(/checkbox|radio/i)) {
                return false;
            }
        }
        return oldStopCallback.apply(mousetrap, arguments);
    };

    function keyup(key, callback) {
        unbind(key);
        if (enabled) {
            mousetrap.bind(key, callback, 'keyup');
        }
    }

    function keydown(key, callback) {
        unbind(key);
        if (enabled) {
            mousetrap.bind(key, callback);
        }
    }

    function reset() {
        mousetrap.reset();
    }

    function unbind(key) {
        mousetrap.unbind(key, 'keyup');
        mousetrap.unbind(key);
    }

    return {
        keydown: keydown,
        keyup: keyup,
        reset: reset,
        unbind: unbind,
    };
};

App.DI.register('keyboard', ['jQuery', 'mousetrap', 'browsingSettings'], App.Keyboard);