﻿(function ()
{
	var window = this, undefined;

	// *** Private Variables ***

	var shiftPressed = false;

	window["Input"] = {
		// *** Public Constants ***

		// *** Public Variables ***

		// *** Public Functions ***

		keyDown: function (e)
		{
			switch (e.keyCode)
			{
				case 116: // F5
					switch (Game.currentState)
					{
						case Game.STATE_SPLASH_SCREEN:
							return false;

						case Game.STATE_GAME:
							Game.exitLevel(false);
							return false;

						default:
							Game.setState(Game.currentState);
							return false;
					}
					break;
					
				case 9:	// Tabulator
					if (Game.currentState == Game.STATE_GAME)
					{
						Game.switchBox();
						return false;
					}
					break;

				case 32:	// Spacebar
					if (Game.currentState == Game.STATE_GAME)
					{
						Game.mergeBox(shiftPressed ? 2 : 0);
						if (!shiftPressed)
						{
							Game.splitAsSoonAsPossible = false;
						}
						return false;
					}
					break;
				case 16:	// Shift
					if (Game.currentState == Game.STATE_GAME)
					{
						if (!shiftPressed)
						{
							Game.mergeBox(3);
							shiftPressed = true;
							Game.splitAsSoonAsPossible = false;
						}
						return false;
					}
					break;

				case 37:	// Left
					if (Game.currentState == Game.STATE_GAME)
					{
						Game.moveBoxXn();
						return false;
					}
					break;
				case 39:	// Right
					if (Game.currentState == Game.STATE_GAME)
					{
						Game.moveBoxXp();
						return false;
					}
					break;
				case 38:	// Up
					if (Game.currentState == Game.STATE_GAME)
					{
						Game.moveBoxYp();
						return false;
					}
					break;
				case 40:	// Down
					if (Game.currentState == Game.STATE_GAME)
					{
						Game.moveBoxYn();
						return false;
					}
					break;

				case 27: // Escape
					switch (Game.currentState)
					{
						case Game.STATE_NEW_GAME:
						case Game.STATE_LOAD_GAME:
							Game.setState(Game.STATE_SPLASH_SCREEN);
							return false;

						case Game.STATE_LEVEL_SELECTION:
							Game.setState(Game.STATE_SPLASH_SCREEN);
							return false;

						case Game.STATE_HELP:
						case Game.STATE_ABOUT:
							Game.setState(Game.STATE_LEVEL_SELECTION);
							return false;

						case Game.STATE_GAME:
							Game.exitLevel(false);
							return false;
					}
					break;

				case 8: // Back
					if (Game.currentState == Game.STATE_SPLASH_SCREEN)
					{
						Game.codeKeyPressed(-1);
						return false;
					}
					break;

				case (e.keyCode >= 48 && e.keyCode <= 57 ? e.keyCode : !e.keyCode): // 0-9
					if (Game.currentState == Game.STATE_SPLASH_SCREEN)
					{
						Game.codeKeyPressed(e.keyCode - 48);
						return false;
					}
					break;

				case (e.keyCode >= 96 && e.keyCode <= 105 ? e.keyCode : !e.keyCode): // 0-9 (Numpad)
					if (Game.currentState == Game.STATE_SPLASH_SCREEN)
					{
						Game.codeKeyPressed(e.keyCode - 96);
						return false;
					}
					break;

				case (e.keyCode >= 65 && e.keyCode <= 90 ? e.keyCode : !e.keyCode): // A-Z
					if (Game.currentState == Game.STATE_SPLASH_SCREEN)
					{
						Game.codeKeyPressed(e.keyCode - 55);
						return false;
					}
					else if (e.keyCode == 82 && Game.currentState == Game.STATE_GAME) // r
					{
						Game.rotateLevel();
						return false;
					}
					else if (e.keyCode == 72 && Game.currentState == Game.STATE_GAME) // h
					{
						var hash = '';
						hash += Level.currentLevel
						for (var i = 0; i < Level.boxes.length; i++)
						{
							hash += ',' + Level.boxes[i].x + ',' + Level.boxes[i].y + ',' + Level.boxes[i].z + ',' + Level.boxes[i].state;
						}
						alert('Hint-Code:\n' + hash);
						return false;
					}
					break;
			}

			Sound.play(Sound.UNSUPPORTED_KEY_PRESSED);
			return true;
		},

		keyUp: function (e)
		{
			if (Game.currentState == Game.STATE_GAME)
			{
				switch (e.keyCode)
				{
					case 16:	// Shift
						shiftPressed = false;
						Game.splitAsSoonAsPossible = !Game.mergeBox(1);
						break;
				}

				return false;
			}

			return true;
		}
	}
})();
