1 /**
  2  * @fileOverview some keycodes definition and utils from closure-library
  3  * @author yiminghe@gmail.com
  4  */
  5 KISSY.add("event/keycodes", function() {
  6     var KeyCodes = {
  7         MAC_ENTER: 3,
  8         BACKSPACE: 8,
  9         TAB: 9,
 10         NUM_CENTER: 12,  // NUMLOCK on FF/Safari Mac
 11         ENTER: 13,
 12         SHIFT: 16,
 13         CTRL: 17,
 14         ALT: 18,
 15         PAUSE: 19,
 16         CAPS_LOCK: 20,
 17         ESC: 27,
 18         SPACE: 32,
 19         PAGE_UP: 33,     // also NUM_NORTH_EAST
 20         PAGE_DOWN: 34,   // also NUM_SOUTH_EAST
 21         END: 35,         // also NUM_SOUTH_WEST
 22         HOME: 36,        // also NUM_NORTH_WEST
 23         LEFT: 37,        // also NUM_WEST
 24         UP: 38,          // also NUM_NORTH
 25         RIGHT: 39,       // also NUM_EAST
 26         DOWN: 40,        // also NUM_SOUTH
 27         PRINT_SCREEN: 44,
 28         INSERT: 45,      // also NUM_INSERT
 29         DELETE: 46,      // also NUM_DELETE
 30         ZERO: 48,
 31         ONE: 49,
 32         TWO: 50,
 33         THREE: 51,
 34         FOUR: 52,
 35         FIVE: 53,
 36         SIX: 54,
 37         SEVEN: 55,
 38         EIGHT: 56,
 39         NINE: 57,
 40         QUESTION_MARK: 63, // needs localization
 41         A: 65,
 42         B: 66,
 43         C: 67,
 44         D: 68,
 45         E: 69,
 46         F: 70,
 47         G: 71,
 48         H: 72,
 49         I: 73,
 50         J: 74,
 51         K: 75,
 52         L: 76,
 53         M: 77,
 54         N: 78,
 55         O: 79,
 56         P: 80,
 57         Q: 81,
 58         R: 82,
 59         S: 83,
 60         T: 84,
 61         U: 85,
 62         V: 86,
 63         W: 87,
 64         X: 88,
 65         Y: 89,
 66         Z: 90,
 67         META: 91, // WIN_KEY_LEFT
 68         WIN_KEY_RIGHT: 92,
 69         CONTEXT_MENU: 93,
 70         NUM_ZERO: 96,
 71         NUM_ONE: 97,
 72         NUM_TWO: 98,
 73         NUM_THREE: 99,
 74         NUM_FOUR: 100,
 75         NUM_FIVE: 101,
 76         NUM_SIX: 102,
 77         NUM_SEVEN: 103,
 78         NUM_EIGHT: 104,
 79         NUM_NINE: 105,
 80         NUM_MULTIPLY: 106,
 81         NUM_PLUS: 107,
 82         NUM_MINUS: 109,
 83         NUM_PERIOD: 110,
 84         NUM_DIVISION: 111,
 85         F1: 112,
 86         F2: 113,
 87         F3: 114,
 88         F4: 115,
 89         F5: 116,
 90         F6: 117,
 91         F7: 118,
 92         F8: 119,
 93         F9: 120,
 94         F10: 121,
 95         F11: 122,
 96         F12: 123,
 97         NUMLOCK: 144,
 98         SEMICOLON: 186,            // needs localization
 99         DASH: 189,                 // needs localization
100         EQUALS: 187,               // needs localization
101         COMMA: 188,                // needs localization
102         PERIOD: 190,               // needs localization
103         SLASH: 191,                // needs localization
104         APOSTROPHE: 192,           // needs localization
105         SINGLE_QUOTE: 222,         // needs localization
106         OPEN_SQUARE_BRACKET: 219,  // needs localization
107         BACKSLASH: 220,            // needs localization
108         CLOSE_SQUARE_BRACKET: 221, // needs localization
109         WIN_KEY: 224,
110         MAC_FF_META: 224, // Firefox (Gecko) fires this for the meta key instead of 91
111         WIN_IME: 229
112     };
113 
114     KeyCodes.isTextModifyingKeyEvent = function(e) {
115         if (e.altKey && !e.ctrlKey ||
116             e.metaKey ||
117             // Function keys don't generate text
118             e.keyCode >= KeyCodes.F1 &&
119                 e.keyCode <= KeyCodes.F12) {
120             return false;
121         }
122 
123         // The following keys are quite harmless, even in combination with
124         // CTRL, ALT or SHIFT.
125         switch (e.keyCode) {
126             case KeyCodes.ALT:
127             case KeyCodes.CAPS_LOCK:
128             case KeyCodes.CONTEXT_MENU:
129             case KeyCodes.CTRL:
130             case KeyCodes.DOWN:
131             case KeyCodes.END:
132             case KeyCodes.ESC:
133             case KeyCodes.HOME:
134             case KeyCodes.INSERT:
135             case KeyCodes.LEFT:
136             case KeyCodes.MAC_FF_META:
137             case KeyCodes.META:
138             case KeyCodes.NUMLOCK:
139             case KeyCodes.NUM_CENTER:
140             case KeyCodes.PAGE_DOWN:
141             case KeyCodes.PAGE_UP:
142             case KeyCodes.PAUSE:
143             case KeyCodes.PHANTOM:
144             case KeyCodes.PRINT_SCREEN:
145             case KeyCodes.RIGHT:
146             case KeyCodes.SHIFT:
147             case KeyCodes.UP:
148             case KeyCodes.WIN_KEY:
149             case KeyCodes.WIN_KEY_RIGHT:
150                 return false;
151             default:
152                 return true;
153         }
154     };
155 
156     KeyCodes.isCharacterKey = function(keyCode) {
157         if (keyCode >= KeyCodes.ZERO &&
158             keyCode <= KeyCodes.NINE) {
159             return true;
160         }
161 
162         if (keyCode >= KeyCodes.NUM_ZERO &&
163             keyCode <= KeyCodes.NUM_MULTIPLY) {
164             return true;
165         }
166 
167         if (keyCode >= KeyCodes.A &&
168             keyCode <= KeyCodes.Z) {
169             return true;
170         }
171 
172         // Safari sends zero key code for non-latin characters.
173         if (goog.userAgent.WEBKIT && keyCode == 0) {
174             return true;
175         }
176 
177         switch (keyCode) {
178             case KeyCodes.SPACE:
179             case KeyCodes.QUESTION_MARK:
180             case KeyCodes.NUM_PLUS:
181             case KeyCodes.NUM_MINUS:
182             case KeyCodes.NUM_PERIOD:
183             case KeyCodes.NUM_DIVISION:
184             case KeyCodes.SEMICOLON:
185             case KeyCodes.DASH:
186             case KeyCodes.EQUALS:
187             case KeyCodes.COMMA:
188             case KeyCodes.PERIOD:
189             case KeyCodes.SLASH:
190             case KeyCodes.APOSTROPHE:
191             case KeyCodes.SINGLE_QUOTE:
192             case KeyCodes.OPEN_SQUARE_BRACKET:
193             case KeyCodes.BACKSLASH:
194             case KeyCodes.CLOSE_SQUARE_BRACKET:
195                 return true;
196             default:
197                 return false;
198         }
199     };
200 
201     return KeyCodes;
202 
203 });