<!--
Copyright (C) 2016 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<link rel="import" href="../../bower_components/polymer/polymer.html">
<link rel="import" href="../../bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">

<script>
(function(window) {
  'use strict';

  var getKeyboardEvent = function(e) {
    return Polymer.dom(e.detail ? e.detail.keyboardEvent : e);
  };

  var KeyboardShortcutBehaviorImpl = {
    modifierPressed: function(e) {
      e = getKeyboardEvent(e);
      // When e is a keyboardEvent, e.event is not null.
      if (e.event) { e = e.event; }
      return e.altKey || e.ctrlKey || e.metaKey || e.shiftKey;
    },

    isModifierPressed: function(e, modifier) {
      e = getKeyboardEvent(e);
      // When e is a keyboardEvent, e.event is not null.
      if (e.event) { e = e.event; }
      return e[modifier];
    },

    shouldSuppressKeyboardShortcut: function(e) {
      e = getKeyboardEvent(e);
      if (e.path[0].tagName === 'INPUT' || e.path[0].tagName === 'TEXTAREA') {
        return true;
      }
      for (var i = 0; i < e.path.length; i++) {
        if (e.path[i].tagName === 'GR-OVERLAY') { return true; }
      }
      return false;
    },
  };

  window.Gerrit = window.Gerrit || {};
  /** @polymerBehavior Gerrit.KeyboardShortcutBehavior */
  window.Gerrit.KeyboardShortcutBehavior = [
    Polymer.IronA11yKeysBehavior,
    KeyboardShortcutBehaviorImpl,
  ];
})(window);
</script>
