ace.define("ace/ext/menu_tools/overlay_page", ["require", "exports", "module", "ace/lib/dom"], function (require, exports, module) {
  'use strict';

  var dom = require("../../lib/dom");

  var cssText = "#ace_settingsmenu, #kbshortcutmenu {\
background-color: #F7F7F7;\
color: black;\
box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\
padding: 1em 0.5em 2em 1em;\
overflow: auto;\
position: absolute;\
margin: 0;\
bottom: 0;\
right: 0;\
top: 0;\
z-index: 9991;\
cursor: default;\
}\
.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\
box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\
background-color: rgba(255, 255, 255, 0.6);\
color: black;\
}\
.ace_optionsMenuEntry:hover {\
background-color: rgba(100, 100, 100, 0.1);\
transition: all 0.3s\
}\
.ace_closeButton {\
background: rgba(245, 146, 146, 0.5);\
border: 1px solid #F48A8A;\
border-radius: 50%;\
padding: 7px;\
position: absolute;\
right: -8px;\
top: -8px;\
z-index: 100000;\
}\
.ace_closeButton{\
background: rgba(245, 146, 146, 0.9);\
}\
.ace_optionsMenuKey {\
color: darkslateblue;\
font-weight: bold;\
}\
.ace_optionsMenuCommand {\
color: darkcyan;\
font-weight: normal;\
}\
.ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\
vertical-align: middle;\
}\
.ace_optionsMenuEntry button[ace_selected_button=true] {\
background: #e7e7e7;\
box-shadow: 1px 0px 2px 0px #adadad inset;\
border-color: #adadad;\
}\
.ace_optionsMenuEntry button {\
background: white;\
border: 1px solid lightgray;\
margin: 0px;\
}\
.ace_optionsMenuEntry button:hover{\
background: #f0f0f0;\
}";
  dom.importCssString(cssText);

  module.exports.overlayPage = function overlayPage(editor, contentElement, callback) {
    var closer = document.createElement('div');
    var ignoreFocusOut = false;

    function documentEscListener(e) {
      if (e.keyCode === 27) {
        close();
      }
    }

    function close() {
      if (!closer) return;
      document.removeEventListener('keydown', documentEscListener);
      closer.parentNode.removeChild(closer);

      if (editor) {
        editor.focus();
      }

      closer = null;
      callback && callback();
    }

    function setIgnoreFocusOut(ignore) {
      ignoreFocusOut = ignore;

      if (ignore) {
        closer.style.pointerEvents = "none";
        contentElement.style.pointerEvents = "auto";
      }
    }

    closer.style.cssText = 'margin: 0; padding: 0; ' + 'position: fixed; top:0; bottom:0; left:0; right:0;' + 'z-index: 9990; ' + (editor ? 'background-color: rgba(0, 0, 0, 0.3);' : '');
    closer.addEventListener('click', function (e) {
      if (!ignoreFocusOut) {
        close();
      }
    });
    document.addEventListener('keydown', documentEscListener);
    contentElement.addEventListener('click', function (e) {
      e.stopPropagation();
    });
    closer.appendChild(contentElement);
    document.body.appendChild(closer);

    if (editor) {
      editor.blur();
    }

    return {
      close: close,
      setIgnoreFocusOut: setIgnoreFocusOut
    };
  };
});
ace.define("ace/ext/menu_tools/get_editor_keyboard_shortcuts", ["require", "exports", "module", "ace/lib/keys"], function (require, exports, module) {
  "use strict";

  var keys = require("../../lib/keys");

  module.exports.getEditorKeybordShortcuts = function (editor) {
    var KEY_MODS = keys.KEY_MODS;
    var keybindings = [];
    var commandMap = {};
    editor.keyBinding.$handlers.forEach(function (handler) {
      var ckb = handler.commandKeyBinding;

      for (var i in ckb) {
        var key = i.replace(/(^|-)\w/g, function (x) {
          return x.toUpperCase();
        });
        var commands = ckb[i];
        if (!Array.isArray(commands)) commands = [commands];
        commands.forEach(function (command) {
          if (typeof command != "string") command = command.name;

          if (commandMap[command]) {
            commandMap[command].key += "|" + key;
          } else {
            commandMap[command] = {
              key: key,
              command: command
            };
            keybindings.push(commandMap[command]);
          }
        });
      }
    });
    return keybindings;
  };
});
ace.define("ace/ext/keybinding_menu", ["require", "exports", "module", "ace/editor", "ace/ext/menu_tools/overlay_page", "ace/ext/menu_tools/get_editor_keyboard_shortcuts"], function (require, exports, module) {
  "use strict";

  var Editor = require("../editor").Editor;

  function showKeyboardShortcuts(editor) {
    if (!document.getElementById('kbshortcutmenu')) {
      var overlayPage = require('./menu_tools/overlay_page').overlayPage;

      var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts;

      var kb = getEditorKeybordShortcuts(editor);
      var el = document.createElement('div');
      var commands = kb.reduce(function (previous, current) {
        return previous + '<div class="ace_optionsMenuEntry"><span class="ace_optionsMenuCommand">' + current.command + '</span> : ' + '<span class="ace_optionsMenuKey">' + current.key + '</span></div>';
      }, '');
      el.id = 'kbshortcutmenu';
      el.innerHTML = '<h1>Keyboard Shortcuts</h1>' + commands + '</div>';
      overlayPage(editor, el);
    }
  }

  module.exports.init = function (editor) {
    Editor.prototype.showKeyboardShortcuts = function () {
      showKeyboardShortcuts(this);
    };

    editor.commands.addCommands([{
      name: "showKeyboardShortcuts",
      bindKey: {
        win: "Ctrl-Alt-h",
        mac: "Command-Alt-h"
      },
      exec: function exec(editor, line) {
        editor.showKeyboardShortcuts();
      }
    }]);
  };
});

(function () {
  ace.require(["ace/ext/keybinding_menu"], function (m) {
    if (typeof module == "object" && typeof exports == "object" && module) {
      module.exports = m;
    }
  });
})();