15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2011 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var KEY_MAP = {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  12: 'Clear',
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  14: 'Enter',
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  33: 'PgUp',
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  34: 'PgDown',
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  35: 'End',
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  36: 'Home',
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  37: 'Left',
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  38: 'Up',
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  39: 'Right',
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  40: 'Down',
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  45: 'Insert',
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  46: 'Delete',
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  96: 'Numpad0',
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  97: 'Numpad1',
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  98: 'Numpad2',
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  99: 'Numpad3',
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  100: 'Numpad4',
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  101: 'Numpad5',
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  102: 'Numpad6',
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  103: 'Numpad7',
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  104: 'Numpad8',
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  105: 'Numpad9',
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  106: '*',
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  107: 'Plus',
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  108: '_',
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  109: '-',
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  111: '/',
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  112: 'F1',
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  113: 'F2',
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  114: 'F3',
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  115: 'F4',
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  116: 'F5',
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  117: 'F6',
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  118: 'F7',
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  119: 'F8',
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  120: 'F9',
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  121: 'F10',
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  122: 'F11',
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  123: 'F12',
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  124: 'F13',
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  125: 'F14',
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  126: 'F15',
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  186: ';',
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  187: '=',
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  188: ',',
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  189: '-',
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  190: '.',
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  191: '/',
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  192: '`',
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  219: '[',
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  221: ']'
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var isMac = (navigator.appVersion.indexOf("Mac") != -1);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function keyEventToString(evt) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var tokens = [];
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (evt.ctrlKey) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokens.push('Control');
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (evt.altKey) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokens.push(isMac ? 'Option' : 'Alt');
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (evt.metaKey) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokens.push(isMac ? 'Command' : 'Meta');
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (evt.shiftKey) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokens.push('Shift');
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (evt.keyCode >= 48 && evt.keyCode <= 90) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokens.push(String.fromCharCode(evt.keyCode));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (KEY_MAP[evt.keyCode]) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tokens.push(KEY_MAP[evt.keyCode]);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return '';
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return tokens.join('+');
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getDefaultKeyString() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return keyEventToString({
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    keyCode: 83,  // 's'
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shiftKey: true,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    altKey: true,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctrlKey: true,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    metaKey: false});
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
95