Spaces:
Running
Running
/** | |
* http://www.openjs.com/scripts/events/keyboard_shortcuts/ | |
* Version : 2.01.B | |
* By Binny V A | |
* License : BSD | |
*/ | |
shortcut = { | |
'all_shortcuts':{},//All the shortcuts are stored in this array | |
'add': function(shortcut_combination,callback,opt) { | |
//Provide a set of default options | |
var default_options = { | |
'type':'keydown', | |
'propagate':false, | |
'disable_in_input':false, | |
'target':document, | |
'keycode':false | |
} | |
if(!opt) opt = default_options; | |
else { | |
for(var dfo in default_options) { | |
if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; | |
} | |
} | |
var ele = opt.target; | |
if(typeof opt.target == 'string') ele = document.getElementById(opt.target); | |
var ths = this; | |
shortcut_combination = shortcut_combination.toLowerCase(); | |
//The function to be called at keypress | |
var func = function(e) { | |
e = e || window.event; | |
if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields | |
var element; | |
if(e.target) element=e.target; | |
else if(e.srcElement) element=e.srcElement; | |
if(element.nodeType==3) element=element.parentNode; | |
if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; | |
} | |
//Find Which key is pressed | |
if (e.keyCode) code = e.keyCode; | |
else if (e.which) code = e.which; | |
var character = String.fromCharCode(code).toLowerCase(); | |
if(code == 188) character=","; //If the user presses , when the type is onkeydown | |
if(code == 190) character="."; //If the user presses , when the type is onkeydown | |
var keys = shortcut_combination.split("+"); | |
//Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked | |
var kp = 0; | |
//Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken | |
var shift_nums = { | |
"`":"~", | |
"1":"!", | |
"2":"@", | |
"3":"#", | |
"4":"$", | |
"5":"%", | |
"6":"^", | |
"7":"&", | |
"8":"*", | |
"9":"(", | |
"0":")", | |
"-":"_", | |
"=":"+", | |
";":":", | |
"'":"\"", | |
",":"<", | |
".":">", | |
"/":"?", | |
"\\":"|" | |
} | |
//Special Keys - and their codes | |
var special_keys = { | |
'esc':27, | |
'escape':27, | |
'tab':9, | |
'space':32, | |
'return':13, | |
'enter':13, | |
'backspace':8, | |
'scrolllock':145, | |
'scroll_lock':145, | |
'scroll':145, | |
'capslock':20, | |
'caps_lock':20, | |
'caps':20, | |
'numlock':144, | |
'num_lock':144, | |
'num':144, | |
'pause':19, | |
'break':19, | |
'insert':45, | |
'home':36, | |
'delete':46, | |
'end':35, | |
'pageup':33, | |
'page_up':33, | |
'pu':33, | |
'pagedown':34, | |
'page_down':34, | |
'pd':34, | |
'left':37, | |
'up':38, | |
'right':39, | |
'down':40, | |
'f1':112, | |
'f2':113, | |
'f3':114, | |
'f4':115, | |
'f5':116, | |
'f6':117, | |
'f7':118, | |
'f8':119, | |
'f9':120, | |
'f10':121, | |
'f11':122, | |
'f12':123 | |
} | |
var modifiers = { | |
shift: { wanted:false, pressed:false}, | |
ctrl : { wanted:false, pressed:false}, | |
alt : { wanted:false, pressed:false}, | |
meta : { wanted:false, pressed:false} //Meta is Mac specific | |
}; | |
if(e.ctrlKey) modifiers.ctrl.pressed = true; | |
if(e.shiftKey) modifiers.shift.pressed = true; | |
if(e.altKey) modifiers.alt.pressed = true; | |
if(e.metaKey) modifiers.meta.pressed = true; | |
for(var i=0; k=keys[i],i<keys.length; i++) { | |
//Modifiers | |
if(k == 'ctrl' || k == 'control') { | |
kp++; | |
modifiers.ctrl.wanted = true; | |
} else if(k == 'shift') { | |
kp++; | |
modifiers.shift.wanted = true; | |
} else if(k == 'alt') { | |
kp++; | |
modifiers.alt.wanted = true; | |
} else if(k == 'meta') { | |
kp++; | |
modifiers.meta.wanted = true; | |
} else if(k.length > 1) { //If it is a special key | |
if(special_keys[k] == code) kp++; | |
} else if(opt['keycode']) { | |
if(opt['keycode'] == code) kp++; | |
} else { //The special keys did not match | |
if(character == k) kp++; | |
else { | |
if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase | |
character = shift_nums[character]; | |
if(character == k) kp++; | |
} | |
} | |
} | |
} | |
if(kp == keys.length && | |
modifiers.ctrl.pressed == modifiers.ctrl.wanted && | |
modifiers.shift.pressed == modifiers.shift.wanted && | |
modifiers.alt.pressed == modifiers.alt.wanted && | |
modifiers.meta.pressed == modifiers.meta.wanted) { | |
callback(e); | |
if(!opt['propagate']) { //Stop the event | |
//e.cancelBubble is supported by IE - this will kill the bubbling process. | |
e.cancelBubble = true; | |
e.returnValue = false; | |
//e.stopPropagation works in Firefox. | |
if (e.stopPropagation) { | |
e.stopPropagation(); | |
e.preventDefault(); | |
} | |
return false; | |
} | |
} | |
} | |
this.all_shortcuts[shortcut_combination] = { | |
'callback':func, | |
'target':ele, | |
'event': opt['type'] | |
}; | |
//Attach the function with the event | |
if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); | |
else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); | |
else ele['on'+opt['type']] = func; | |
}, | |
//Remove the shortcut - just specify the shortcut and I will remove the binding | |
'remove':function(shortcut_combination) { | |
shortcut_combination = shortcut_combination.toLowerCase(); | |
var binding = this.all_shortcuts[shortcut_combination]; | |
delete(this.all_shortcuts[shortcut_combination]) | |
if(!binding) return; | |
var type = binding['event']; | |
var ele = binding['target']; | |
var callback = binding['callback']; | |
if(ele.detachEvent) ele.detachEvent('on'+type, callback); | |
else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); | |
else ele['on'+type] = false; | |
} | |
} | |