
var KeyboardCodes={'backspace':8,'bksp':8,'enter':13,'return':13,'space':32,'tab':9,'esc':27,'escape':27,'caps':20,'capslock':20,'caps_lock':20,'num':144,'numlock':144,'num_lock':144,'scrllk':145,'scrl_lk':145,'scroll':145,'scrolllock':145,'scroll_lock':145,'pause':19,'break':19,'del':46,'delete':46,'ins':45,'insert':45,'home':36,'end':35,'pageup':33,'page_up':33,'pgup':33,'pagedown':34,'page_down':34,'pgdown':34,'pgdn':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,',':188,'.':190,'/':191,';':59,'\'':222,'`':192,'-':109,'=':61,'[':219,']':221,'\\':220}
var KeyboardCodesIE={';':186,'-':189,'=':187}
var KeyboardCodesToString={8:'Bksp',13:'Enter',32:'Space',9:'Tab',27:'Esc',20:'Caps',144:'Num',145:'Scroll',19:'Break',46:'Del',45:'Ins',36:'Home',33:'PgUp',34:'PgDn',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',188:',',190:'.',191:'/',59:';',186:';',222:'\'',192:'`',109:'-',189:'-',61:'=',187:'=',219:'[',221:']',220:'\\'}
var KeyboardShortcut=Class.create();KeyboardShortcut.prototype={initialize:function(key,element,callback){this.element=(typeof element=='string')?z(element):element;this.callback=callback;this.event_type="keydown";this.key=key.toLowerCase();this.func=function(e){e=e||window.event;var code=null;if(e.keyCode){code=e.keyCode}else if(e.which){code=e.which;}
var code_as_char=String.fromCharCode(code).toLowerCase();var count=0;var is_ie=(e.which)?false:true;var ctrl_pressed=false;var alt_pressed=false;var shift_pressed=false;var meta_pressed=false;var ctrl_desired=false;var alt_desired=false;var shift_desired=false;var meta_desired=false;if(e.ctrlKey){ctrl_pressed=true;count++;}
if(e.altKey){alt_pressed=true;count++;}
if(e.shiftKey){shift_pressed=true;count++;}
if(e.metaKey){meta_pressed=true;count++;}
keys=key.toLowerCase().split('+');for(var i=0;i<keys.length;i++){k=keys[i];if((k=='ctrl')||(k=='control')){ctrl_desired=true;}else if(k=='alt'){alt_desired=true;}else if(k=='shift'){shift_desired=true;}else if(k=='meta'){meta_desired=true;}else if((is_ie)&&(KeyboardCodesIE[k])){if(KeyboardCodesIE[k]==code)count++;}else if(KeyboardCodes[k]){if(KeyboardCodes[k]==code)count++;}else{if(code_as_char==k)count++;}}
if((count==keys.length)&&(ctrl_desired==ctrl_pressed)&&(alt_desired==alt_pressed)&&(shift_desired==shift_pressed)&&(meta_desired==meta_pressed)){callback(e);Event.stop(e);}};},enable:function(){Event.observe(this.element,this.event_type,this.func);},disable:function(){Event.stopObserving(this.element,this.event_type,this.func);}};KSM={shortcuts:{},enable_all:function(){this.disable_all();for(key in this.shortcuts){this.shortcuts[key].enable();}},disable_all:function(){for(key in this.shortcuts){this.shortcuts[key].disable();}},enable:function(shortcut_key){key=shortcut_key.toLowerCase();s=this.shortcuts[key];if(s)s.enable();},disable:function(shortcut_key){key=shortcut_key.toLowerCase();s=this.shortcuts[key];if(s)s.disable();},registerShortcut:function(shortcut){existing=this.shortcuts[shortcut.key];if(existing){existing.disable();}
this.shortcuts[shortcut.key]=shortcut;shortcut.enable();},unregisterShortcut:function(shortcut_key){key=shortcut_key.toLowerCase();s=this.shortcuts[key];this.shortcuts[key]=null;if(s)s.disable();return s;}};function keycode_to_string(e){e=e||window.event;var code=null;if(e.keyCode){code=e.keyCode;}else if(e.which){code=e.which;}
var str='';if(e.ctrlKey)str+='Ctrl+';if(e.altKey)str+='Alt+';if(e.shiftKey)str+='Shift+';if(e.metaKey)str+='Meta+';if(KeyboardCodesToString[code]){str+=KeyboardCodesToString[code];}else{str+=String.fromCharCode(code).toUpperCase();}
return str;}