Blame view

frontend/web/js/jquery/jquery.hotkeys.js 5.48 KB
c7f222e2   Artem   first
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  /******************************************************************************************************************************
  
   * @ Original idea by by Binny V A, Original version: 2.00.A
   * @ http://www.openjs.com/scripts/events/keyboard_shortcuts/
   * @ Original License : BSD
  
   * @ jQuery Plugin by Tzury Bar Yochay
          mail: tzury.by@gmail.com
          blog: evalinux.wordpress.com
          face: facebook.com/profile.php?id=513676303
  
          (c) Copyrights 2007
  
   * @ jQuery Plugin version Beta (0.0.2)
   * @ License: jQuery-License.
  
  TODO:
      add queue support (as in gmail) e.g. 'x' then 'y', etc.
      add mouse + mouse wheel events.
  
  USAGE:
      $.hotkeys.add('Ctrl+c', function(){ alert('copy anyone?');});
      $.hotkeys.add('Ctrl+c', {target:'div#editor', type:'keyup', propagate: true},function(){ alert('copy anyone?');});>
      $.hotkeys.remove('Ctrl+c');
      $.hotkeys.remove('Ctrl+c', {target:'div#editor', type:'keypress'});
  
  ******************************************************************************************************************************/
  (function (jQuery){
      this.version = '(beta)(0.0.3)';
  	this.all = {};
      this.special_keys = {
          27: 'esc', 9: 'tab', 32:'space', 13: 'return', 8:'backspace', 145: 'scroll', 20: 'capslock',
          144: 'numlock', 19:'pause', 45:'insert', 36:'home', 46:'del',35:'end', 33: 'pageup',
          34:'pagedown', 37:'left', 38:'up', 39:'right',40:'down', 112:'f1',113:'f2', 114:'f3',
          115:'f4', 116:'f5', 117:'f6', 118:'f7', 119:'f8', 120:'f9', 121:'f10', 122:'f11', 123:'f12'};
  
      this.shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^", "7":"&",
          "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":", "'":"\"", ",":"<",
          ".":">",  "/":"?",  "\\":"|" };
  
      this.add = function(combi, options, callback) {
          if (jQuery.isFunction(options)){
              callback = options;
              options = {};
          }
          var opt = {},
              defaults = {type: 'keydown', propagate: false, disableInInput: false, target: jQuery('html')[0]},
              that = this;
          opt = jQuery.extend( opt , defaults, options || {} );
          combi = combi.toLowerCase();
  
          // inspect if keystroke matches
          var inspector = function(event) {
              // WP: not needed with newer jQuery
              // event = jQuery.event.fix(event); // jQuery event normalization.
              var element = event.target;
              // @ TextNode -> nodeType == 3
              // WP: not needed with newer jQuery
              // element = (element.nodeType==3) ? element.parentNode : element;
  
              if ( opt['disableInInput'] ) { // Disable shortcut keys in Input, Textarea fields
                  var target = jQuery(element);
  
  				if ( ( target.is('input') || target.is('textarea') ) &&
  					( ! opt.noDisable || ! target.is( opt.noDisable ) ) ) {
  
  					return;
                  }
              }
              var code = event.which,
                  type = event.type,
                  character = String.fromCharCode(code).toLowerCase(),
                  special = that.special_keys[code],
                  shift = event.shiftKey,
                  ctrl = event.ctrlKey,
                  alt= event.altKey,
                  meta = event.metaKey,
                  propagate = true, // default behaivour
                  mapPoint = null;
  
              // in opera + safari, the event.target is unpredictable.
              // for example: 'keydown' might be associated with HtmlBodyElement
              // or the element where you last clicked with your mouse.
              // WP: needed for all browsers
              // if (jQuery.browser.opera || jQuery.browser.safari){
                  while (!that.all[element] && element.parentNode){
                      element = element.parentNode;
                  }
              // }
              var cbMap = that.all[element].events[type].callbackMap;
              if(!shift && !ctrl && !alt && !meta) { // No Modifiers
                  mapPoint = cbMap[special] ||  cbMap[character]
  			}
              // deals with combinaitons (alt|ctrl|shift+anything)
              else{
                  var modif = '';
                  if(alt) modif +='alt+';
                  if(ctrl) modif+= 'ctrl+';
                  if(shift) modif += 'shift+';
                  if(meta) modif += 'meta+';
                  // modifiers + special keys or modifiers + characters or modifiers + shift characters
                  mapPoint = cbMap[modif+special] || cbMap[modif+character] || cbMap[modif+that.shift_nums[character]]
              }
              if (mapPoint){
                  mapPoint.cb(event);
                  if(!mapPoint.propagate) {
                      event.stopPropagation();
                      event.preventDefault();
                      return false;
                  }
              }
  		};
          // first hook for this element
          if (!this.all[opt.target]){
              this.all[opt.target] = {events:{}};
          }
          if (!this.all[opt.target].events[opt.type]){
              this.all[opt.target].events[opt.type] = {callbackMap: {}}
              jQuery.event.add(opt.target, opt.type, inspector);
          }
          this.all[opt.target].events[opt.type].callbackMap[combi] =  {cb: callback, propagate:opt.propagate};
          return jQuery;
  	};
      this.remove = function(exp, opt) {
          opt = opt || {};
          target = opt.target || jQuery('html')[0];
          type = opt.type || 'keydown';
  		exp = exp.toLowerCase();
          delete this.all[target].events[type].callbackMap[exp]
          return jQuery;
  	};
      jQuery.hotkeys = this;
      return jQuery;
  })(jQuery);