$K = {
	fn:{up:[],down:[],press:[]},
	toCode:function(key){
		if(typeof(key)==='number'){
			return key;
		} if( Event.Keys[key] ){
			return Event.Keys[key];
		}
		return toCharCode(key);
	},
	up		:function(key, fn){ $K.fn.up	[$K.toCode(key)] = fn; },
	down	:function(key, fn){ $K.fn.down	[$K.toCode(key)] = fn; },
	press	:function(key, fn){ $K.fn.press	[$K.toCode(key)] = fn; },
	_up		:function(e){ $K._event(e, 'up'); },
	_down	:function(e){ $K._event(e, 'down'); },
	_press	:function(e){ $K._event(e, 'press'); },
	_event:function(e, what){
		var ev = new Event(e);
		if( ev.target.tagName == 'INPUT' || ev.target.tagName == 'SELECT' || ev.target.tagName == 'TEXTAREA'){ return; }
		if( ev.target.contentEditable === 'true' || ev.target.contentEditable === true ){ return; }
		var akey = ev.code;
		$K.fn[what].each( function(func, key){
							if(akey === key){
								if(func){
									func(ev);
								}
							}
						}
					);
	}
};

document.addEvent('keypress', 	$K._press);
document.addEvent('keyup', 		$K._up);
document.addEvent('keydown', 	$K._down);


charCode = {
			'a':65, 
			'b':66, 
			'c':67, 
			'd':68, 
			'e':69, 
			'f':70, 
			'g':71, 
			'h':72, 
			'i':73, 
			'j':74, 
			'k':75, 
			'l':76, 
			'm':77, 
			'n':78, 
			'o':79, 
			'p':80, 
			'q':81, 
			'r':82, 
			's':83, 
			't':84, 
			'u':85, 
			'v':86, 
			'w':87, 
			'x':88, 
			'y':89, 
			'z':90, 
			'1':49, 
			'2':50, 
			'3':52, 
			'4':53, 
			'5':54, 
			'6':55, 
			'7':56, 
			'8':57, 
			'9':58, 
			'0':48 
};
function toCharCode(str){
	return charCode[str];
}







