/*
 * jQuery Keys - A jQuery key event plugin
 * @version 1.0
 * Copyright (c) 2008 Trey Shugart (shugartweb.com/jquery/)
 * Dual licensed under:
 *  MIT - (http://www.opensource.org/licenses/mit-license.php)
 *  GPL - (http://www.gnu.org/licenses/gpl.txt)
 */
(function(jQuery){Array.prototype.remove=function(from,to){var rest=this.slice((to||from)+1||this.length);this.length=from<0?this.length+from:from;return this.push.apply(this,rest);};jQuery.extend({keys:function(keySelectors,options,callback1,callback2){jQuery(window).keys(keySelectors,options,callback1,callback2);},keyCode:function(e){var e=(!e)?window.event:e;return k=(e.keyCode)?e.keyCode:e.which;},keyName:function(e){var keyMap={8:'backspace',9:'tab',13:'enter',16:'shift',17:'ctrl',18:'alt',19:'pause',19:'break',20:'caps lock',27:'escape',32:'space',33:'page up',34:'page down',35:'end',36:'home',37:'left arrow',38:'up arrow',39:'right arrow',40:'down arrow',45:'insert',46:'delete',47:'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:'numpad *',107:'numpad +',109:'numpad -',110:'numpad .',111:'numpad /',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',186:';',187:'=',188:',',189:'-',190:'.',191:'/',192:'`',219:'[',220:'\\',221:']',222:"'"};for(var i=48;i<=57;i++)keyMap[i]=i-48;for(var i=65;i<=90;i++){var alpha='abcdefghijklmnopqrstuvwxyz';keyMap[i]=alpha.charAt(i-65);}return keyMap[jQuery.keyCode(e)];}});jQuery.fn.extend({keys:function(keySelectors,options,callback1,callback2){if(typeof keySelectors!=='string')return false;var jQueryjQuery=jQuery(this),all,currentKeys=[];if(jQueryjQuery===('body'||window))jQueryjQuery=(jQuery.browser.msie)?'body':window;if(jQuery.isFunction(options)){callback2=callback1;callback1=options;options={};}options=jQuery.extend({type:'keydown',propagate:true},options);jQueryjQuery[options.type](function(e){var k=jQuery.keyCode(e);var element=jQuery(this);if(jQuery.inArray(k,currentKeys)===-1)currentKeys[currentKeys.length]=k;var sets=(keySelectors.match(/\\{0},/))?keySelectors.split(/\\{0},/):new Array(keySelectors);jQuery.each(sets,function(i,set){var set=jQuery.trim(set),combo=new Array,matches=0,setArr=set.split(/\\{0}\+/);jQuery.each(currentKeys,function(i,key){combo[i]=set.match(/\+?\[[0-9]+\]\+?/)?'['+key+']':jQuery.keyName(e);jQuery.each(setArr,function(ii,match){setArr[ii]=jQuery.trim(match);if(jQuery.trim(match.toLowerCase())===combo[i])matches++;});});if((matches===combo.length&&matches===setArr.length)||set==='*'){if(typeof callback1==='function')callback1(e,element);if(!options.propagate){e.stopPropagation();e.preventDefault();return false;}}});});jQueryjQuery.keyup(function(e){var k=jQuery.keyCode(e);if(currentKeys.length>0)currentKeys.remove(jQuery.inArray(k,currentKeys));if(typeof callback2==='function')callback2(e);});return jQueryjQuery;}});})(jQuery);
