kease={};kease.keyboard={'bindings':new Array(),'add':function(id,shortcut,callback,options)
{id=id.toLowerCase();if(!options)
{options=this.defaultOptions;}else
{for(var index in this.defaultOptions)
{if(typeof options[index]=='undefined')
{options[index]=this.defaultOptions[index];}}}
if(typeof options.target=="object"&&options.target.length>0)
{for(var t in options.target)
{var tOptions={};var target=options.target[t]
if(typeof target=='string')target=document.getElementById(target);tOptions['target']=target;this.add(id,shortcut,callback,tOptions);}}else
{var target=options.target;if(typeof target=='string')target=document.getElementById(target);shortcut=shortcut.toLowerCase();var bindingDelegate=this.createBindingDelegate(shortcut,options,callback);var bindingExists=false;for(var b in this.bindings)
{var existingBinding=this.bindings[b];if(existingBinding.id==id)
{existingBinding.targets.push(target);bindingExists=true;break;}}
if(!bindingExists)
{this.bindings.push({'id':id,'callback':bindingDelegate,'targets':[target],'event':options['type'],'description':options['description'],'group':options['group'],'shortcut':shortcut});}
if(target.addEventListener)target.addEventListener(options['type'],bindingDelegate,false);else if(target.attachEvent)target.attachEvent('on'+options['type'],bindingDelegate);else target['on'+options['type']]=bindingDelegate;}},'remove':function(id)
{id=id.toLowerCase();for(var b in this.bindings)
{var binding=this.bindings[b];if(binding.id==id)
{delete this.bindings[b];if(!binding)return;var type=binding['event'];var targets=binding['targets'];var callback=binding['callback'];for(var t in targets)
{var target=targets[t];if(target.removeEventListener)target.removeEventListener(type,callback,false);else if(target.detachEvent)target.detachEvent('on'+type,callback);else target['on'+type]=false;}
break;}}},'defaultOptions':{'type':'keydown','allowPropogation':false,'disableFireInInput':false,'target':document,'description':null,'group':null},'createBindingDelegate':function(shortcut,options,callback)
{var self=this;return function(e)
{e=e||window.event;if(options['disableFireInInput'])
{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;}
if(e.keyCode)code=e.keyCode;else if(e.which)code=e.which;var character=String.fromCharCode(code).toLowerCase();if(code==188)character=",";if(code==190)character=".";var keys=shortcut.split("+");var keyPresses=0;var keyModifiers={shift:{expected:false,pressed:false},ctrl:{expected:false,pressed:false},alt:{expected:false,pressed:false},meta:{expected:false,pressed:false}};if(e.ctrlKey)keyModifiers.ctrl.pressed=true;if(e.shiftKey)keyModifiers.shift.pressed=true;if(e.altKey)keyModifiers.alt.pressed=true;if(e.metaKey)keyModifiers.meta.pressed=true;for(var i=0;k=keys[i],i<keys.length;i++)
{if(k=='ctrl'||k=='control')
{keyPresses++;keyModifiers.ctrl.expected=true;}else if(k=='shift')
{keyPresses++;keyModifiers.shift.expected=true;}else if(k=='alt')
{kp++;keyModifiers.alt.expected=true;}else if(k=='meta')
{keyPresses++;keyModifiers.meta.expected=true;}else if(k.length>1)
{if(self.specialKeys[k]==code)keyPresses++;}else
{if(character==k)keyPresses++;else
{if(self.shiftedNumberKeys[character]&&e.shiftKey)
{character=self.shiftedNumberKeys[character];if(character==k)keyPresses++;}}}}
if(keyPresses==keys.length&&keyModifiers.ctrl.pressed==keyModifiers.ctrl.expected&&keyModifiers.shift.pressed==keyModifiers.shift.expected&&keyModifiers.alt.pressed==keyModifiers.alt.expected&&keyModifiers.meta.pressed==keyModifiers.meta.expected)
{callback(e);if(!options['allowPropogation'])
{e.cancelBubble=true;e.returnValue=false;if(e.stopPropagation)
{e.stopPropagation();e.preventDefault();}
return false;}}}},'shiftedNumberKeys':{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":":","'":"\"",",":"<",".":">","/":"?","\\":"|"},'specialKeys':{"forwardslash":191,'esc':27,'escape':27,'tab':9,'space':32,'return':13,'enter':13,'backspace':8,'scrolllock':145,'capslock':20,'numlock':144,'pause':19,'break':19,'insert':45,'home':36,'delete':46,'end':35,'pageup':33,'pagedown':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}};
