(function(e){e.event.special.keystrokes={debug:false,global:{customValidation:null},add:function(a){var d=a.handler,b=a.data,c=a.namespace;if(a.data.preventDefault===true){a=0;for(var g=b.keys.length;a<g;a++)for(var i=b.keys[a].split("+"),f=0,j=i.length;f<j;f++){var l=e.event.special.keystrokes._getCodeFromString(i[f]);l&&e(this).keydown(function(h){if(h.keyCode==l&&!(k!=h.target&&(/textarea|select/i.test(h.target.nodeName)||h.target.type==="text")))h.preventDefault()})}}var k=e(this);b=e.isArray(b)? b:[b];b=e.event.special.keystrokes._addPrivateKeys.call(this,b,c,d);b=(d=k.data("stack"))?d.concat(b):b;k.data("stack",b)},remove:function(a){e.event.special.keystrokes._removeKeyListeners.call(this,a.namespace||"keystrokes")},setup:function(){var a=e(this),d=e.event.special.keystrokes._delegate;a.bind("keyup.keystrokes",d).bind("keydown.keystrokes",d);a.data("keys_down",[]);a.data("keys_string",[]);a.data("joined",false);return false},teardown:function(){var a=e(this);a.unbind("keyup.keystrokes").unbind("keydown.keystrokes"); a.removeData("keys_down");a.removeData("keys_string");a.removeData("joined");a.removeData("stack");return false},_delegate:function(a){e.event.special.keystrokes["_"+a.type].call(e.event.special.keystrokes,a,this)},_addPrivateKeys:function(a,d,b){for(var c=a.length;c--;){a[c].name=d?"keystrokes."+d:"keystrokes";a[c]._namespace=d||"keystrokes";delete b.data;a[c]._handler=b}return a},_removeKeyListeners:function(a){for(var d=e(this),b=d.data("stack"),c=b.length;c--;)b[c]._namespace===a&&b.splice(c, 1);d.data("stack",b)},_keydown:function(a,d){var b=e(d),c=b.data("keys_down");if(!(d!=a.target&&(/textarea|select/i.test(a.target.nodeName)||a.target.type==="text"))){c.push(a.keyCode);b.data("keys_down",c);b.data("joined",false)}},_keyup:function(a,d){var b=a.keyCode,c=e(d),g=c.data("stack"),i=c.data("keys_down"),f=c.data("keys_string"),j=g.length;if(!(d!=a.target&&(/textarea|select/i.test(a.target.nodeName)||a.target.type==="text"))){if(i.length>1){f.push(this._joinKeyCodesToString(d));c.data("keys_string", f);c.data("joined",true);this._log(f)}else str=this._getStringFromCode(b);if(!c.data("joined")){f.push(str);c.data("keys_string",f);this._log(f)}b=j;for(f="|"+f.join("|")+"|";b--;)g[b]&&f.indexOf("|"+g[b].keys.join("|")+"|")!==-1&&this._valid(d,a,g,b);c.data("keys_down",[])}},_joinKeyCodesToString:function(a){a=e(a).data("keys_down");for(var d=a.length,b=[],c=0;c<d;){b.push(this._getStringFromCode(a[c]));c++}return b.join("+")},_getStringFromCode:function(a){if(this.codes[a])return this.codes[a]; else{this._log("Keycode "+a+" was not found. You can add it by calling $.extend($.event.special.keystrokes.codes, { "+a+" : 'my key' });");return"undefined"}},_getCodeFromString:function(a){for(code in this.codes)if(this.codes[code]==a)return code},_valid:function(a,d,b,c){d.type="keystrokes";d.keystrokes={};d.keystrokes.stack=b;d.keystrokes.stack_item=b[c];if(typeof this.global.customValidation==="function"){var g=this.global.customValidation.call(a,d,b);if(!g){this._clearKeysString(a);return}}if(typeof b[c].customValidation=== "function"){g=b[c].customValidation.call(a,d,b);if(!g){this._clearKeysString(a);return}}typeof b[c].success==="function"&&b[c].success.call(a,d);b[c].proceedToMainCallback!==false&&b[c]._handler.apply(a,[d]);this._clearKeysString(a)},_clearKeysString:function(a){e(a).data("keys_string",[])},_log:function(a){this.debug&&typeof window.console!=="undefined"&&window.console.log&&console.log(a)},codes:{8:"backspace",9:"tab",13:"enter",16:"shift",17:"ctrl",18:"alt",19:"pause/break",20:"caps lock",27:"escape", 33:"page up",32:"space",34:"page down",35:"end",36:"home",37:"arrow left",38:"arrow up",39:"arrow right",40:"arrow down",44:"print screen",45:"insert",46:"delete",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:"semi-colon",61:"add",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",91:"left window key",92:"right window key",93:"select key",96:"numpad 0", 97:"numpad 1",98:"numpad 2",99:"numpad 3",100:"numpad 4",101:"numpad 5",102:"numpad 6",103:"numpad 7",104:"numpad 8",105:"numpad 9",106:"multiply",107:"add",109:"subtract",110:"decimal point",111:"divide",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"num lock",145:"scroll lock",182:"my computer (multimedia keyboard)",183:"my calculator (multimedia keyboard)",186:"semi-colon",187:"equal sign",188:"comma",189:"dash",190:"period", 191:"forward slash",192:"tilde",219:"open bracket",220:"back slash",221:"close bracket",222:"single quote",224:"command"}}})(jQuery);

