// version 0.1  DJEMSolutions / Garrett

var keyboard = {
	
	keycodes : {
		"Ctrl"			: 17,
		"Alt"			: 18,
		"Win"			: 91,
		"Shift"			: 16,
		"CapsLock"		: 20,
		"Tab"			: 9,
		"Esc"			: 27,
		"Spacebar"		: 32,
		"F5"			: 11,
		"arrowRight"	: 39,
		"arrowLeft"		: 37,
		"arrowUp"		: 38,
		"arrowDown"		: 40
	},
	
	binded : false,
	pressed : new Array(),
	combinations : new Array(),
	
	combinations_check : function() {
		for(i=0;i<keyboard.combinations.length;i++) {
			combination_true = true;
			combination = keyboard.combinations[i][0];
			if(combination.length == keyboard.pressed.length) {
				for(j=0;j<keyboard.pressed.length;j++) {
					if($.inArray(keyboard.pressed[j], combination) == -1) {
						combination_true = false;
					}
				}
				if(combination_true) {
					keyboard.combinations[i][1].call();
					return true;
				}
			}
		}
		return false;
	},
	
	listen : function (keys, callback) {	
		if(typeof(keys) == 'string') {
			if(!keyboard.binded) {
				keyboard.bind();
			}
			keys = keys.split(" ");
			for(i=0;i<keys.length;i++) {
				if(keyboard.keycodes[keys[i]] != undefined) {
					keys[i] = keyboard.keycodes[keys[i]];
				} else if(keys[i].length == 1) {
					keys[i] = keys[i].charCodeAt(0);
				} else {
					alert("Undefined characters combination");
				}
			}
			keyboard.combinations.push(new Array(keys, callback));
		}
	},
	
	pressed_reinit : function() {
		keyboard.pressed = new Array();
	},
	
	pressed_add : function(keycode) {
		if(keyboard.pressed != null) {
			if(!(keycode == "" || keycode == null || keycode == undefined)) {
				if($.inArray(keycode, keyboard.pressed) == -1) {
					keyboard.pressed.push(keycode);
				}
				if(keyboard.combinations_check()) {
					keyboard.pressed = null;
				}
			}
		}
	},
	
	pressed_delete : function(keycode) {
		if(keyboard.pressed == null) {
			keyboard.pressed = new Array();
		} 
		if(!(keycode == "" || keycode == null || keycode == undefined)) {
			if($.inArray(keycode, keyboard.pressed) != -1) {
				var new_pressed = new Array();
				for(i=0;i<keyboard.pressed.length;i++) {
					if(keyboard.pressed[i] != keycode) {
						new_pressed.push(keyboard.pressed[i]);
					}
				}
				keyboard.pressed = new_pressed;
			}
		}
	},
	
	bind : function() {
		$(document).keydown(function(e) {
			keyboard.pressed_add(e.keyCode);
		})
		$(document).keyup(function(e) {
			keyboard.pressed_delete(e.keyCode);
		})
		keyboard.binded = true;
	}
}
