function Hand(keyMapper) {
	this.keyMapper = keyMapper;
	this.pressingFinger = KeyButton.NONE_FINGER;
	this.prevFingerSprite = null;

	this.hand = game.add.image(0, Hand.DEFAULT_Y_PX, "hand_palm");
	this.hand.anchor.set(0.5);
	this.hand.scale.set(2);

	this.thumb = game.add.image(0, 0, "hand_thumb");
	this.thumb.alpha = 0.5;
	this.hand.addChild(this.thumb);

	this.index_finger = game.add.image(0, 0, "hand_index_finger");
	this.index_finger.alpha = 0.5;
	this.hand.addChild(this.index_finger);

	this.middle_finger = game.add.image(0, 0, "hand_middle_finger");
	this.middle_finger.alpha = 0.5;
	this.hand.addChild(this.middle_finger);

	this.ring_filger = game.add.image(0, 0, "hand_little_finger");
	this.ring_filger.alpha = 0.5;
	this.hand.addChild(this.ring_filger);

	this.little_finger = game.add.image(0, 0, "hand_ring_finger");
	this.little_finger.alpha = 0.5;
	this.hand.addChild(this.little_finger);

	this.offsetY = 0;
	if(isTypingTestApp())
		this.offsetY = 80;

	var maskOffsetY = 0;
	if(isTypingTestApp())
		maskOffsetY = 40;

	var mask = game.add.graphics();
	mask.beginFill(0xffffff);
	mask.drawRect(100, 300 + maskOffsetY, 828, 360);
	this.hand.mask = mask;
}

Hand.prototype.move = function(sprite, x, y) {
	sprite.x = x;
	sprite.y = y;
}

Hand.prototype.moveTo = function(key) {
}

Hand.prototype.moveToDefaultPosition = function() {
	this.moveRow(3, null);
	this.unhighlightOffFinger(KeyButton.NONE_FINGER);
}


Hand.prototype.moveRow = function(rowNo, key) {
	var rowIndex = rowNo - 1;
	this.hand.y = Hand.DEFAULT_Y_PX + Keyboard.DEFAULT_KEY_SIZE_PX * rowIndex + this.offsetY;

	this.moveColumn(rowNo, key);
}

Hand.prototype.moveColumn = function(rowNo, key) {
}


Hand.prototype.getFingerSprite = function(fingerNo) {
	var fingerSprite = null;
	switch(fingerNo) {
		case KeyButton.THUMB:
		fingerSprite = this.thumb;
		break;
		case KeyButton.INDEX_FINGER:
		case KeyButton.INDEX_FINGER_BASELINE:
		fingerSprite = this.index_finger;
		break;
		case KeyButton.MIDDLE_FINGER:
		fingerSprite = this.middle_finger;
		break;
		case KeyButton.RING_FINGER:
		fingerSprite = this.ring_filger;
		break;
		case KeyButton.LITTLE_FINGER:
		fingerSprite = this.little_finger;
		break;
	}
	return fingerSprite;
}

Hand.prototype.highlightOnFinger = function(fingerNo) {
	// console.log(fingerNo);
	var pressingFingerSprite = this.getFingerSprite(fingerNo);
	if(pressingFingerSprite === this.prevFingerSprite)
		return;

	if(this.prevFingerSprite !== null)
		this.unhighlightOffFinger();

	if(pressingFingerSprite !== null) {
		// console.log(pressingFingerSprite);
		pressingFingerSprite.tint = 0xffff00;
		pressingFingerSprite.alpha = 1;
	}

	this.prevFingerSprite = pressingFingerSprite;
}

Hand.prototype.unhighlightOffFinger = function() {
	if(this.prevFingerSprite === null)
		return;
	this.prevFingerSprite.tint = 0xffffff;
	this.prevFingerSprite.alpha = 0.5;

	this.prevFingerSprite = null;
}


Hand.loadResources = function() {
	game.load.image('hand_palm',	'../../../resources/image/ui/hand_palm.png');
	game.load.image('hand_thumb',	'../../../resources/image/ui/hand_thumb.png');
	game.load.image('hand_index_finger',	'../../../resources/image/ui/hand_index_finger.png');
	game.load.image('hand_middle_finger',	'../../../resources/image/ui/hand_middle_finger.png');
	game.load.image('hand_little_finger',	'../../../resources/image/ui/hand_little_finger.png');
	game.load.image('hand_ring_finger',	'../../../resources/image/ui/hand_ring_finger.png');
}


Hand.DEFAULT_Y_PX		= 540;	// 680;



LeftHand.prototype = Object.create(Hand.prototype);
LeftHand.constructor = LeftHand;

function LeftHand(keyMapper) {
	Hand.call(this, keyMapper);

	this.move(this.thumb, 126, -50);
	this.move(this.index_finger, 96, -102);
	this.move(this.middle_finger, 58, -116);
	this.move(this.ring_filger, 32, -110);
	this.move(this.little_finger, 4, -106);
	this.moveToDefaultPosition();
}

LeftHand.prototype.moveTo = function(key) {
	if(key === undefined)
		return;

	// console.log(key);
	var keyCode = this.keyMapper.getKeyIDOfText(key.normalText);

	if(keyCode != "Space")
		this.moveRow(key.row, key);
	else
		this.moveRow(3, key);

	switch(key.keyCode) {
		case "Key5":
		case "KeyT":
		case "KeyG":
		case "KeyB":
		this.moveColumn(5, key);
		break;
	}

	this.highlightOnFinger(key.fingerType);
}

LeftHand.prototype.moveColumn = function(rowNo, key) {
	var rowIndex = rowNo - 1;
	this.hand.x = LeftHand.DEFAULT_X_PX + (Keyboard.DEFAULT_KEY_SIZE_PX / 2) * rowIndex;

	if(key === null)
		return;

	var keyCode = this.keyMapper.getKeyIDOfText(key.normalText);
	switch(keyCode) {
		case "Key5":
		case "KeyT":
		case "KeyG":
		case "KeyB":
		this.hand.x += Keyboard.DEFAULT_KEY_SIZE_PX;
		break;

		case "ShiftLeft":
		this.hand.x = LeftHand.DEFAULT_X_PX;
		break;
	}
}


LeftHand.DEFAULT_X_PX	= 100;



RightHand.prototype = Object.create(Hand.prototype);
RightHand.constructor = RightHand;

function RightHand(keyMapper) {
	Hand.call(this, keyMapper);

	this.hand.scale.x *= -1;

	this.move(this.thumb, 126, -50);
	this.move(this.index_finger, 96, -102);
	this.move(this.middle_finger, 58, -116);
	this.move(this.ring_filger, 32, -110);
	this.move(this.little_finger, 4, -106);
	this.moveToDefaultPosition();
}

RightHand.prototype.moveTo = function(key) {
	if(key === undefined)
		return;

	// console.log(key);
	var keyCode = this.keyMapper.getKeyIDOfText(key.normalText);

	if(keyCode != "Space")
		this.moveRow(key.row, key);
	else
		this.moveRow(3, key);

	switch(key.keyCode) {
		case "Key5":
		case "KeyT":
		case "KeyG":
		case "KeyB":
		this.moveColumn(5, key);
		break;
	}

	this.highlightOnFinger(key.fingerType);
}

RightHand.prototype.moveColumn = function(rowNo, key) {
	var rowIndex = rowNo - 1;
	this.hand.x = RightHand.DEFAULT_X_PX + (Keyboard.DEFAULT_KEY_SIZE_PX / 2) * rowIndex;

	if(key === null)
		return;

	var keyCode = this.keyMapper.getKeyIDOfText(key.normalText);
	switch(keyCode) {
		case "Key6":
		case "KeyY":
		case "KeyH":
		case "KeyN":
		this.hand.x -= Keyboard.DEFAULT_KEY_SIZE_PX;
		break;

		case "Minus":
		case "BracketLeft":
		case "Quote":
		this.hand.x += (Keyboard.DEFAULT_KEY_SIZE_PX / 2) * 3;
		break;

		case "Equal":
		case "BracketRight":
		this.hand.x += (Keyboard.DEFAULT_KEY_SIZE_PX / 2) * 5;
		break;

		case "Backspace":
		case "Backslash":
		this.hand.x += (Keyboard.DEFAULT_KEY_SIZE_PX / 2) * 7;
		break;

		case "Enter":
		this.hand.x = RightHand.DEFAULT_X_PX + (Keyboard.DEFAULT_KEY_SIZE_PX / 2) * 6;
		break;

		case "ShiftRight":
		this.hand.x = RightHand.DEFAULT_X_PX + (Keyboard.DEFAULT_KEY_SIZE_PX / 2) * 6;
		break;
	}
}



RightHand.DEFAULT_X_PX	= 810;