1/** 2 * http://www.openjs.com/scripts/events/keyboard_shortcuts/ 3 * Version : 2.01.A 4 * By Binny V A 5 * License : BSD 6 */ 7shortcut = { 8 'all_shortcuts':{},//All the shortcuts are stored in this array 9 'add': function(shortcut_combination,callback,opt) { 10 //Provide a set of default options 11 var default_options = { 12 'type':'keydown', 13 'propagate':false, 14 'disable_in_input':false, 15 'target':document, 16 'keycode':false 17 } 18 if(!opt) opt = default_options; 19 else { 20 for(var dfo in default_options) { 21 if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; 22 } 23 } 24 25 var ele = opt.target 26 if(typeof opt.target == 'string') ele = document.getElementById(opt.target); 27 var ths = this; 28 shortcut_combination = shortcut_combination.toLowerCase(); 29 30 //The function to be called at keypress 31 var func = function(e) { 32 e = e || window.event; 33 34 if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields 35 var element; 36 if(e.target) element=e.target; 37 else if(e.srcElement) element=e.srcElement; 38 if(element.nodeType==3) element=element.parentNode; 39 40 if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; 41 } 42 43 //Find Which key is pressed 44 if (e.keyCode) code = e.keyCode; 45 else if (e.which) code = e.which; 46 var character = String.fromCharCode(code).toLowerCase(); 47 48 if(code == 188) character=","; //If the user presses , when the type is onkeydown 49 if(code == 190) character="."; //If the user presses , when the type is onkeydown 50 51 var keys = shortcut_combination.split("+"); 52 //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked 53 var kp = 0; 54 55 //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken 56 var shift_nums = { 57 "`":"~", 58 "1":"!", 59 "2":"@", 60 "3":"#", 61 "4":"$", 62 "5":"%", 63 "6":"^", 64 "7":"&", 65 "8":"*", 66 "9":"(", 67 "0":")", 68 "-":"_", 69 "=":"+", 70 ";":":", 71 "'":"\"", 72 ",":"<", 73 ".":">", 74 "/":"?", 75 "\\":"|" 76 } 77 //Special Keys - and their codes 78 var special_keys = { 79 'esc':27, 80 'escape':27, 81 'tab':9, 82 'space':32, 83 'return':13, 84 'enter':13, 85 'backspace':8, 86 87 'scrolllock':145, 88 'scroll_lock':145, 89 'scroll':145, 90 'capslock':20, 91 'caps_lock':20, 92 'caps':20, 93 'numlock':144, 94 'num_lock':144, 95 'num':144, 96 97 'pause':19, 98 'break':19, 99 100 'insert':45, 101 'home':36, 102 'delete':46, 103 'end':35, 104 105 'pageup':33, 106 'page_up':33, 107 'pu':33, 108 109 'pagedown':34, 110 'page_down':34, 111 'pd':34, 112 113 'left':37, 114 'up':38, 115 'right':39, 116 'down':40, 117 118 'f1':112, 119 'f2':113, 120 'f3':114, 121 'f4':115, 122 'f5':116, 123 'f6':117, 124 'f7':118, 125 'f8':119, 126 'f9':120, 127 'f10':121, 128 'f11':122, 129 'f12':123 130 } 131 132 var modifiers = { 133 shift: { wanted:false, pressed:false}, 134 ctrl : { wanted:false, pressed:false}, 135 alt : { wanted:false, pressed:false}, 136 meta : { wanted:false, pressed:false} //Meta is Mac specific 137 }; 138 139 if(e.ctrlKey) modifiers.ctrl.pressed = true; 140 if(e.shiftKey) modifiers.shift.pressed = true; 141 if(e.altKey) modifiers.alt.pressed = true; 142 if(e.metaKey) modifiers.meta.pressed = true; 143 144 for(var i=0; k=keys[i],i<keys.length; i++) { 145 //Modifiers 146 if(k == 'ctrl' || k == 'control') { 147 kp++; 148 modifiers.ctrl.wanted = true; 149 150 } else if(k == 'shift') { 151 kp++; 152 modifiers.shift.wanted = true; 153 154 } else if(k == 'alt') { 155 kp++; 156 modifiers.alt.wanted = true; 157 } else if(k == 'meta') { 158 kp++; 159 modifiers.meta.wanted = true; 160 } else if(k.length > 1) { //If it is a special key 161 if(special_keys[k] == code) kp++; 162 163 } else if(opt['keycode']) { 164 if(opt['keycode'] == code) kp++; 165 166 } else { //The special keys did not match 167 if(character == k) kp++; 168 else { 169 if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase 170 character = shift_nums[character]; 171 if(character == k) kp++; 172 } 173 } 174 } 175 } 176 177 if(kp == keys.length && 178 modifiers.ctrl.pressed == modifiers.ctrl.wanted && 179 modifiers.shift.pressed == modifiers.shift.wanted && 180 modifiers.alt.pressed == modifiers.alt.wanted && 181 modifiers.meta.pressed == modifiers.meta.wanted) { 182 callback(e); 183 184 if(!opt['propagate']) { //Stop the event 185 //e.cancelBubble is supported by IE - this will kill the bubbling process. 186 e.cancelBubble = true; 187 e.returnValue = false; 188 189 //e.stopPropagation works in Firefox. 190 if (e.stopPropagation) { 191 e.stopPropagation(); 192 e.preventDefault(); 193 } 194 return false; 195 } 196 } 197 } 198 this.all_shortcuts[shortcut_combination] = { 199 'callback':func, 200 'target':ele, 201 'event': opt['type'] 202 }; 203 //Attach the function with the event 204 if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); 205 else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); 206 else ele['on'+opt['type']] = func; 207 }, 208 209 //Remove the shortcut - just specify the shortcut and I will remove the binding 210 'remove':function(shortcut_combination) { 211 shortcut_combination = shortcut_combination.toLowerCase(); 212 var binding = this.all_shortcuts[shortcut_combination]; 213 delete(this.all_shortcuts[shortcut_combination]) 214 if(!binding) return; 215 var type = binding['event']; 216 var ele = binding['target']; 217 var callback = binding['callback']; 218 219 if(ele.detachEvent) ele.detachEvent('on'+type, callback); 220 else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); 221 else ele['on'+type] = false; 222 } 223}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.