/**
 * Handles keyboard inputs.
 *
 * Features:
 * - Cross browser compatibility
 * - Easy to implement
 *
 * Version 0.5
 *
 *---------------------------------------
 * Originally written by Kjetil Hårtveit.
 *		www.kjetil-hartveit.com
 *---------------------------------------
 */
KeyInputHandler =
{
	keyCodes: [],
	// constants
	KEY_DASH: '-',
	KEY_COMMA: ',',
	KEY_DOT: '.',
	KEY_A: 'A',
	KEY_B: 'B',
	KEY_C: 'C',
	KEY_D: 'D',
	KEY_E: 'E',
	KEY_F: 'F',
	KEY_G: 'G',
	KEY_H: 'H',
	KEY_I: 'I',
	KEY_J: 'J',
	KEY_K: 'K',
	KEY_L: 'L',
	KEY_M: 'M',
	KEY_N: 'N',
	KEY_O: 'O',
	KEY_P: 'P',
	KEY_Q: 'Q',
	KEY_R: 'R',
	KEY_S: 'S',
	KEY_T: 'T',
	KEY_U: 'U',
	KEY_V: 'V',
	KEY_W: 'W',
	KEY_X: 'X',
	KEY_Y: 'Y',
	KEY_Z: 'Z',

	checkKey: function(ev)
	{
		ev = ev || window.event;
		var self = KeyInputHandler;
		var key;
			if ((key = self.findKeyCode(ev.keyCode)) === false)
			{
				return;
			}

		var keyCodes = self.getKeyCodes();
		var keyCode = keyCodes[key][0];
		var callback = keyCodes[key][1];
		callback();
	},

	/**
	 * @param inpKeyCode
	 * @return int|false Key as integer or false as no match
	 */
	findKeyCode: function(inpKeyCode)
	{
		var keyCodes = this.getKeyCodes();
		var keyCode;
		var res = false;
			for (var i=0, length=keyCodes.length; i<length; i++)
			{
				keyCode = keyCodes[i][0];
					if (keyCode == inpKeyCode)
					{
						res = i;
						break;
					}
			}
		return res;
	},

	/**
	 * @param inpKeyCode The keycode as integer or string as one of the KEY_ constants. Always use constants if the latter and not the string value.
	 * @param callback
	 */
	registerKey: function(inpKeyCode, callback)
	{
		var keyCodes = this.getKeyCodes();
		var keyCode;
		var browser = '';
			if (navigator.appName.toLowerCase() == 'microsoft internet explorer')
				browser = 'ie';
			else if (navigator.appName.toLowerCase() == 'opera')
				browser = 'opera';
			else if (navigator.appName.toLowerCase() == 'netscape')
				browser = 'netscape';
			else
				browser = 'other';

			// browser compatibility fix
			switch (inpKeyCode)
			{
				case this.KEY_DASH: 
					if (browser == 'ie')
						keyCode = 189;
					else if (browser == 'opera')
						keyCode = 45;
					else
						keyCode = 109;					
				break;
				case this.KEY_COMMA:
					if (browser == 'opera')
						keyCode = 44;
					else
						keyCode = 188;
				break;
				case this.KEY_DOT:
					if (browser == 'opera')
						keyCode = 46;
					else
						keyCode = 190;
				break;
				case this.KEY_A: keyCode = 65; break;
				case this.KEY_B: keyCode = 66; break;
				case this.KEY_C: keyCode = 67; break;
				case this.KEY_D: keyCode = 68; break;
				case this.KEY_E: keyCode = 69; break;
				case this.KEY_F: keyCode = 70; break;
				case this.KEY_G: keyCode = 71; break;
				case this.KEY_H: keyCode = 72; break;
				case this.KEY_I: keyCode = 73; break;
				case this.KEY_J: keyCode = 74; break;
				case this.KEY_K: keyCode = 75; break;
				case this.KEY_L: keyCode = 76; break;
				case this.KEY_M: keyCode = 77; break;
				case this.KEY_N: keyCode = 78; break;
				case this.KEY_O: keyCode = 79; break;
				case this.KEY_P: keyCode = 80; break;
				case this.KEY_Q: keyCode = 81; break;
				case this.KEY_R: keyCode = 82; break;
				case this.KEY_S: keyCode = 83; break;
				case this.KEY_T: keyCode = 84; break;
				case this.KEY_U: keyCode = 85; break;
				case this.KEY_V: keyCode = 86; break;
				case this.KEY_W: keyCode = 87; break;
				case this.KEY_X: keyCode = 88; break;
				case this.KEY_Y: keyCode = 89; break;
				case this.KEY_Z: keyCode = 90; break;
				default: keyCode = inpKeyCode; break;
			}

		keyCodes[keyCodes.length] = [keyCode, callback];
		this.setKeyCodes(keyCodes);
	},

	setKeyCodes: function(keyCodes) { this.keyCodes = keyCodes; },
	getKeyCodes: function() { return this.keyCodes; }
}