/*
(c) Copyrights 2007 - 2008

Original idea by by Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
 
jQuery Plugin by Tzury Bar Yochay 
tzury.by@gmail.com
http://evalinux.wordpress.com
http://facebook.com/profile.php?id=513676303

Project's sites: 
http://code.google.com/p/js-hotkeys/
http://github.com/tzuryby/hotkeys/tree/master

License: same as jQuery license. 

USAGE:
    // simple usage
    $(document).bind('keydown', 'Ctrl+c', function(){ alert('copy anyone?');});
    
    // special options such as disableInIput
    $(document).bind('keydown', {combi:'Ctrl+x', disableInInput: true} , function() {});
    
Note:
    This plugin wraps the following jQuery methods: $.fn.find, $.fn.bind and $.fn.unbind
    
*/

(function(j){j.fn.__bind__=j.fn.bind;j.fn.__unbind__=j.fn.unbind;j.fn.__find__=j.fn.find;var k={version:'0.7.8',override:/keydown|keypress|keyup/g,triggersMap:{},specialKeys:{27:'esc',9:'tab',32:'space',13:'return',8:'backspace',145:'scroll',20:'capslock',144:'numlock',19:'pause',45:'insert',36:'home',46:'del',35:'end',33:'pageup',34:'pagedown',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'},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":":","'":"\"",",":"<",".":">","/":"?","\\":"|"},newTrigger:function(a,b,c){var d={};d[a]={};d[a][b]={cb:c,disableInInput:false};return d}};if(j.browser.mozilla){k.specialKeys=j.extend(k.specialKeys,{96:'0',97:'1',98:'2',99:'3',100:'4',101:'5',102:'6',103:'7',104:'8',105:'9'})}j.fn.find=function(a){this.query=a;return j.fn.__find__.apply(this,arguments)};j.fn.unbind=function(a,b,c){if(j.isFunction(b)){c=b;b=null}if(b&&typeof b==='string'){var d=((this.prevObject&&this.prevObject.query)||(this[0].id&&this[0].id)||this[0]).toString();var e=a.split(' ');for(var x=0;x<e.length;x++){delete k.triggersMap[d][e[x]][b]}}return this.__unbind__(a,c)};j.fn.bind=function(b,c,d){var e=b.match(k.override);if(j.isFunction(c)||!e){return this.__bind__(b,c,d)}else{var f=null,pass2jq=j.trim(b.replace(k.override,''));if(pass2jq){f=this.__bind__(pass2jq,c,d)}if(typeof c==="string"){c={'combi':c}}if(c.combi){for(var x=0;x<e.length;x++){var g=e[x];var h=c.combi.toLowerCase(),trigger=k.newTrigger(g,h,d),selectorId=((this.prevObject&&this.prevObject.query)||(this[0].id&&this[0].id)||this[0]).toString();trigger[g][h].disableInInput=c.disableInInput;if(!k.triggersMap[selectorId]){k.triggersMap[selectorId]=trigger}else if(!k.triggersMap[selectorId][g]){k.triggersMap[selectorId][g]=trigger[g]}var i=k.triggersMap[selectorId][g][h];if(!i){k.triggersMap[selectorId][g][h]=[trigger[g][h]]}else if(i.constructor!==Array){k.triggersMap[selectorId][g][h]=[i]}else{k.triggersMap[selectorId][g][h][i.length]=trigger[g][h]}this.each(function(){var a=j(this);if(a.attr('hkId')&&a.attr('hkId')!==selectorId){selectorId=a.attr('hkId')+";"+selectorId}a.attr('hkId',selectorId)});f=this.__bind__(e.join(' '),c,k.handler)}}return f}};k.findElement=function(a){if(!j(a).attr('hkId')){if(j.browser.opera||j.browser.safari){while(!j(a).attr('hkId')&&a.parentNode){a=a.parentNode}}}return a};k.handler=function(a){var b=k.findElement(a.currentTarget),jTarget=j(b),ids=jTarget.attr('hkId');if(ids){ids=ids.split(';');var c=a.which,type=a.type,special=k.specialKeys[c],character=!special&&String.fromCharCode(c).toLowerCase(),shift=a.shiftKey,ctrl=a.ctrlKey,alt=a.altKey||a.originalEvent.altKey,mapPoint=null;for(var x=0;x<ids.length;x++){if(k.triggersMap[ids[x]][type]){mapPoint=k.triggersMap[ids[x]][type];break}}if(mapPoint){var d;if(!shift&&!ctrl&&!alt){d=mapPoint[special]||(character&&mapPoint[character])}else{var e='';if(alt)e+='alt+';if(ctrl)e+='ctrl+';if(shift)e+='shift+';d=mapPoint[e+special];if(!d){if(character){d=mapPoint[e+character]||mapPoint[e+k.shiftNums[character]]||(e==='shift+'&&mapPoint[k.shiftNums[character]])}}}if(d){var f=false;for(var x=0;x<d.length;x++){if(d[x].disableInInput){var g=j(a.target);if(jTarget.is("input")||jTarget.is("textarea")||g.is("input")||g.is("textarea")){return true}}f=f||d[x].cb.apply(this,[a])}return f}}}};window.hotkeys=k;return j})(jQuery);