(function(f){f.Shortcuts={special:{backspace:8,tab:9,enter:13,pause:19,capslock:20,esc:27,space:32,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40,insert:45,"delete":46,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,"?":191},lists:{},pressed:{},start:function(){var a=this;f(document).bind(f.browser.opera?"keypress":"keydown",function(b){a.pressed[b.which]||a.run("down",b);a.pressed[b.which]=true;a.run("hold",b)});f(document).bind("keyup", function(b){a.pressed[b.which]=false;a.run("up",b)})},add:function(a){if(!a.mask)throw new Error("$.Shortcuts.add: required parameter 'params.mask' is undefined.");if(!a.handler)throw new Error("$.Shortcuts.add: required parameter 'params.handler' is undefined.");if(!a.type)a.type="down";if(!a.list)a.list="default";var b=this.getMaskObject(a.mask);b=this.getKey(a.type,b);this.lists[a.list]||(this.lists[a.list]={});var c=this.lists[a.list];c[b]||(c[b]=[]);c[b].push(a);this.active||this.setList(a.list)}, remove:function(a){if(!a.mask)throw new Error("$.Shortcuts.remove: required parameter 'params.mask' is undefined.");if(!a.type)a.type="down";if(!a.list)a.list="default";if(this.lists[a.list]){var b=this.getMaskObject(a.mask);b=this.getKey(a.type,b);delete this.lists[a.list][b]}},setList:function(a){this.active=this.lists[a]},getKey:function(a,b){var c="";c+=a;if(b.ctrl)c+="_ctrl";if(b.alt)c+="_alt";if(b.shift)c+="_shift";if(b.which&&b.which!==16&&b.which!==17&&b.which!==18)c+="_"+b.which;return c}, getMaskObject:function(a){var b={};a=a.toLowerCase().replace(/\s+/g,"").split(/\+/);for(var c,e=0,d=a.length;e<d;e+=1){c=a[e];if(c==="ctrl"||c==="alt"||c==="shift")b[c]=true;else b.which=this.special[c]||c.toUpperCase().charCodeAt()}return b},run:function(a,b){if(this.active){var c={ctrl:b.ctrlKey,alt:b.altKey,shift:b.shiftKey,which:b.which},e=this.isInput(b.target);a=this.active[this.getKey(a,c)];c=false;if(a&&a.length>0)for(var d=0,g=a.length;d<g;d+=1)if(!e||a[d].enableInInput){if(!c){b.preventDefault(); c=true}a[d].handler(b)}}},isInput:function(a){var b=a.tagName.toLowerCase();a=a.type;return b==="input"&&(a==="text"||a==="password"||a==="file"||a==="search")||b==="textarea"?true:false}}})(jQuery);
