<!--
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';

  // Must be declared outside behavior implementation to be accessed inside
  // behavior functions.
  const getKeyboardEvent = function(e) {
    e = Polymer.dom(e.detail ? e.detail.keyboardEvent : e);
    // When e is a keyboardEvent, e.event is not null.
    if (e.event) { e = e.event; }
    return e;
  };

  /** @polymerBehavior KeyboardShortcutBehaviorImpl */
  const KeyboardShortcutBehaviorImpl = {
    modifierPressed(e) {
      e = getKeyboardEvent(e);
      return e.altKey || e.ctrlKey || e.metaKey || e.shiftKey;
    },

    isModifierPressed(e, modifier) {
      return getKeyboardEvent(e)[modifier];
    },

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

    // Alias for getKeyboardEvent.
    getKeyboardEvent(e) {
      return getKeyboardEvent(e);
    },
  };

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