var solved_stickers =
    ["U","U","U","U","U","U","U","U","U","D","D","D","D","D","D","D","D","D",
     "F","F","F","F","F","F","F","F","F","B","B","B","B","B","B","B","B","B",
     "R","R","R","R","R","R","R","R","R","L","L","L","L","L","L","L","L","L"];
var blank_stickers =
    ["blank","blank","blank","blank","U","blank","blank","blank","blank",
     "blank","blank","blank","blank","D","blank","blank","blank","blank",
     "blank","blank","blank","blank","F","blank","blank","blank","blank",
     "blank","blank","blank","blank","B","blank","blank","blank","blank",
     "blank","blank","blank","blank","R","blank","blank","blank","blank",
     "blank","blank","blank","blank","L","blank","blank","blank","blank"];
var blank_stickers2 =
    ["blank","blank","blank","blank","blank","blank","blank","blank","blank",
     "blank","blank","blank","blank","blank","blank","blank","blank","blank",
     "blank","blank","blank","blank","blank","blank","blank","blank","blank",
     "blank","blank","blank","blank","blank","blank","blank","blank","blank",
     "blank","blank","blank","blank","blank","blank","blank","blank","blank",
     "blank","blank","blank","blank","blank","blank","blank","blank","blank"];

var identity54 = new Array(54);
for (var i = 0; i < identity54.length; i++) { identity54[i] = i }

/* permutations :: Array (Side,Depth,Times) Permutation */
var permutations = {
    U: [[[ 6, 3, 0, 7, 4, 1, 8, 5, 2,   9,10,11,12,13,14,15,16,17,
          38,37,36,21,22,23,24,25,26,  47,46,45,30,31,32,33,34,35,
          27,28,29,39,40,41,42,43,44,  18,19,20,48,49,50,51,52,53]],
        [[ 0, 1, 2, 3, 4, 5, 6, 7, 8,   9,10,11,12,13,14,15,16,17,
          18,19,20,41,40,39,24,25,26,  27,28,29,50,49,48,33,34,35,
          36,37,38,30,31,32,42,43,44,  45,46,47,21,22,23,51,52,53]],
        [[ 0, 1, 2, 3, 4, 5, 6, 7, 8,  15,12, 9,16,13,10,17,14,11,
          18,19,20,21,22,23,44,43,42,  27,28,29,30,31,32,53,52,51,
          36,37,38,39,40,41,33,34,35,  45,46,47,48,49,50,24,25,26]]],
    F: [[[45,48,51, 3, 4, 5, 6, 7, 8,  36,39,42,12,13,14,15,16,17,
          20,23,26,19,22,25,18,21,24,  27,28,29,30,31,32,33,34,35,
           2,37,38, 1,40,41, 0,43,44,  11,46,47,10,49,50, 9,52,53]],
        [[ 0, 1, 2,46,49,52, 6, 7, 8,   9,10,11,37,40,43,15,16,17,
          18,19,20,21,22,23,24,25,26,  27,28,29,30,31,32,33,34,35,
          36, 5,38,39, 4,41,42, 3,44,  45,14,47,48,13,50,51,12,53]],
        [[ 0, 1, 2, 3, 4, 5,47,50,53,   9,10,11,12,13,14,38,41,44,
          18,19,20,21,22,23,24,25,26,  29,32,35,28,31,34,27,30,33,
          36,37, 8,39,40, 7,42,43, 6,  45,46,17,48,49,16,51,52,15]]],
    R: [[[24, 1, 2,21, 4, 5,18, 7, 8,  33,10,11,30,13,14,27,16,17,
           9,19,20,12,22,23,15,25,26,   0,28,29, 3,31,32, 6,34,35,
          42,39,36,43,40,37,44,41,38,  45,46,47,48,49,50,51,52,53]],
        [[ 0,25, 2, 3,22, 5, 6,19, 8,   9,34,11,12,31,14,15,28,17,
          18,10,20,21,13,23,24,16,26,  27, 1,29,30, 4,32,33, 7,35,
          36,37,38,39,40,41,42,43,44,  45,46,47,48,49,50,51,52,53]],
        [[ 0, 1,26, 3, 4,23, 6, 7,20,   9,10,35,12,13,32,15,16,29,
          18,19,11,21,22,14,24,25,17,  27,28, 2,30,31, 5,33,34, 8,
          36,37,38,39,40,41,42,43,44,  51,48,45,52,49,46,53,50,47]]] };

var ufr = ["U","F","R"];
for (var i = 0; i < ufr.length; i++) {
    var side = ufr[i];
    for (var j = 0; j < 3; j++) {
        for (var k = 1; k < 4; k++) {
            permutations[side][j][k] = power(permutations[side][j][0], k) }
        permutations[side][j][0] = identity54 } }

function compose(p,q) {
    var pq = new Array(p.length);
    for (var i = 0; i < p.length; i++) { pq[i] = q[p[i]] }
    return pq }

function power(p,n) {
    return n == 0 ? identity54 : compose(p, power(p, n - 1)) }




var edge_stickers = [[ 1,19], [ 3,37], [ 7,28], [ 5,46],
                     [10,25], [12,43], [16,34], [14,52],
                     [21,39], [23,48], [30,41], [32,50]];
var edge_sides = [["U","F"], ["U","R"], ["U","B"], ["U","L"],
                  ["D","F"], ["D","R"], ["D","B"], ["D","L"],
                  ["F","R"], ["F","L"], ["B","R"], ["B","L"]];

var corner_stickers = [[ 0,18,36], [ 6,38,27], [ 8,29,47], [ 2,45,20],
                       [ 9,42,24], [15,33,44], [17,53,35], [11,26,51]];
var corner_sides = [["U","F","R"], ["U","R","B"], ["U","B","L"], ["U","L","F"],
                    ["D","R","F"], ["D","B","R"], ["D","L","B"], ["D","F","L"]];

function edge_stickers_to_piece(centers,s1,s2) {
    for (var i = 0; i < edge_sides.length; i++) {
        var t1 = centers[edge_sides[i][0]],
            t2 = centers[edge_sides[i][1]];
        if (s1 === t1 && s2 === t2) { return { p:i, o:0 } }
        if (s1 === t2 && s2 === t1) { return { p:i, o:1 } } }
    return { p:'-', o:'-' } }

function corner_stickers_to_piece(centers,s1,s2,s3) {
    for (var i = 0; i < corner_sides.length; i++) {
        var t1 = centers[corner_sides[i][0]],
            t2 = centers[corner_sides[i][1]],
            t3 = centers[corner_sides[i][2]];
        if (s1 === t1 && s2 === t2 && s3 === t3) { return { p:i, o:0 } }
        if (s1 === t2 && s2 === t3 && s3 === t1) { return { p:i, o:1 } }
        if (s1 === t3 && s2 === t1 && s3 === t2) { return { p:i, o:2 } } }
    return { p:'-', o:'-' } }

function stickers_to_pieces(stickers) {
    var centers = { U: stickers[ 4], D: stickers[13],
                    F: stickers[22], B: stickers[31],
                    R: stickers[40], L: stickers[49] };

    var edges = new Array(12);
    for (var i = 0; i < edge_stickers.length; i++) {
        edges[i] = edge_stickers_to_piece(centers,
                stickers[edge_stickers[i][0]],
                stickers[edge_stickers[i][1]]) }
    var corners = new Array(8);
    for (var i = 0; i < corner_stickers.length; i++) {
        corners[i] = corner_stickers_to_piece(centers,
                stickers[corner_stickers[i][0]],
                stickers[corner_stickers[i][1]],
                stickers[corner_stickers[i][2]]) }

    return { e: edges, c: corners } }

function unzip_pieces(pieces) {
    var ep = ['-','-','-','-','-','-','-','-','-','-','-','-'],
        eo = ['-','-','-','-','-','-','-','-','-','-','-','-'],
        cp = ['-','-','-','-','-','-','-','-'],
        co = ['-','-','-','-','-','-','-','-'];

    for (var i = 0; i < 12; i++) {
        ep[i] = pieces.e[i].p;
        if (ep[i] !== '-') { eo[ep[i]] = pieces.e[i].o } }
    for (var i = 0; i < 8; i++) {
        cp[i] = pieces.c[i].p;
        if (cp[i] !== '-') { co[cp[i]] = pieces.c[i].o } }

    return { ep:ep, eo:eo, cp:cp, co:co } }


