(function (global, factory) {
    if (typeof define === "function" && define.amd) {
        define([], factory);
    } else if (typeof exports !== "undefined") {
        factory();
    } else {
        var mod = {
            exports: {}
        };
        factory();
        global.bootstrapTableKeyEvents = mod.exports;
    }
})(this, function () {
    'use strict';

    /**
     * @author: Dennis Hernández
     * @webSite: http://djhvscf.github.io/Blog
     * @version: v1.0.0
     *
     * @update zhixin wen <wenzhixin2010@gmail.com>
     */

    !function ($) {

        'use strict';

        $.extend($.fn.bootstrapTable.defaults, {
            keyEvents: false
        });

        var BootstrapTable = $.fn.bootstrapTable.Constructor,
            _init = BootstrapTable.prototype.init;

        BootstrapTable.prototype.init = function () {
            _init.apply(this, Array.prototype.slice.apply(arguments));
            this.initKeyEvents();
        };

        BootstrapTable.prototype.initKeyEvents = function () {
            if (this.options.keyEvents) {
                var that = this;

                $(document).off('keydown').on('keydown', function (e) {
                    var $search = that.$toolbar.find('.search input'),
                        $refresh = that.$toolbar.find('button[name="refresh"]'),
                        $toggle = that.$toolbar.find('button[name="toggle"]'),
                        $paginationSwitch = that.$toolbar.find('button[name="paginationSwitch"]');

                    if (document.activeElement === $search.get(0) || !$.contains(document.activeElement, that.$toolbar.get(0))) {
                        return true;
                    }

                    switch (e.keyCode) {
                        case 83:
                            //s
                            if (!that.options.search) {
                                return;
                            }
                            $search.focus();
                            return false;
                        case 82:
                            //r
                            if (!that.options.showRefresh) {
                                return;
                            }
                            $refresh.click();
                            return false;
                        case 84:
                            //t
                            if (!that.options.showToggle) {
                                return;
                            }
                            $toggle.click();
                            return false;
                        case 80:
                            //p
                            if (!that.options.showPaginationSwitch) {
                                return;
                            }
                            $paginationSwitch.click();
                            return false;
                        case 37:
                            // left
                            if (!that.options.pagination) {
                                return;
                            }
                            that.prevPage();
                            return false;
                        case 39:
                            // right
                            if (!that.options.pagination) {
                                return;
                            }
                            that.nextPage();
                            return;
                    }
                });
            }
        };
    }(jQuery);
});