// The six sides.
var moveList = [ "F", "B", "R", "L", "U", "D"];
// An array to hold all the possible moves.
var moves = new Array();

// A move knows both its own symbol and the inverse symbol.
function moveObject(move, inverse) {
	this.move = move;
	this.inverse = inverse;
}

// Holds the inverted algorithm and any error.
function resultStruct() {
	this.result = "";
	this.error = ""; 
}

// Initializing the moves that are recognized.
function initMoves() {
	for (var i = 0; i < moveList.length; i++) {
		var cubeMove = new moveObject("C" + moveList[i], "C" + moveList[i] + "'");
		var cubeMoveInverse = new moveObject("C" + moveList[i] + "'", "C" + moveList[i]);
		var plainMove = new moveObject(moveList[i], moveList[i] + "'");
		var plainMoveInverse = new moveObject(moveList[i] + "'", moveList[i]);
		var tierMove = new moveObject("T" + moveList[i], "T" + moveList[i] + "'");
		var tierMoveInverse = new moveObject("T" + moveList[i] + "'", "T" + moveList[i]);
		var midMove = new moveObject("M" + moveList[i], "M" + moveList[i] + "'");
		var midMoveInverse = new moveObject("M" + moveList[i] + "'", "M" + moveList[i]);
		
		moves.push(cubeMove);
		moves.push(cubeMoveInverse);
		moves.push(plainMove);
		moves.push(plainMoveInverse);
		moves.push(tierMove);
		moves.push(tierMoveInverse);
		moves.push(midMove);
		moves.push(midMoveInverse);
	}
}

// Expect moves delimited by spaces.
function parseMoves(input, result) {
	
	input = input.replace(/^\s+|\s+$/g, '');
	var userMoves = input.split(" ");
	userMoves.reverse();
	
	for (var i = 0; i < userMoves.length; i++) {
		if (result.result != "") { result.result += " "; }
		if (userMoves[i].charAt(userMoves[i].length - 1) == '2') {
			result.result += userMoves[i];
		}
		else {
			result.result += getInverse(userMoves[i], result);
		}
	}	
}

// Return the inverse (String) of a move symbol (String).
// If an error occurs result.error is set.
function getInverse(move, result) {
	for (var i = 0; i < moves.length; i++) {
		if (moves[i].move == move) {
			return moves[i].inverse;
		}
	}
	result.error = "Encountered unknown symbol: " + move;
    return "";
}

function invertAlgorithm() {
    initMoves();
	var result = new resultStruct();
	var input = document.getElementById("inputBox").value;
	var output = parseMoves(input.toUpperCase(), result);	
	document.getElementById("outputBox").innerHTML 
		= result.error == "" ? result.result 
			: "<span class='error'>" + result.error + "</span>";	
}
