1479 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			1479 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
|   | <!DOCTYPE HTML> | ||
|  | <html> | ||
|  | 
 | ||
|  | <!--
 | ||
|  |   pgn4web javascript chessboard | ||
|  |   copyright (C) 2009-2013 Paolo Casaschi | ||
|  |   see README file and http://pgn4web.casaschi.net | ||
|  |   for credits, license and more details | ||
|  | 
 | ||
|  |   Huffman encoding/decoding derived from code at http://rumkin.com/tools/compression/compress_huff.php | ||
|  | 
 | ||
|  |   PLEASE NOTE THIS FILE IS USED ONLY TO FINE TUNE HUFFMANN ENCODING: | ||
|  |   actual functions for PGN encoding/decoding are contained in pgn-decoder.js and pgn-encoder.js | ||
|  | --> | ||
|  | 
 | ||
|  | <head> | ||
|  | 
 | ||
|  | <title>pgn4web PGN encoder/decoder test</title> | ||
|  | 
 | ||
|  | <link rel="shortcut icon" href="pawn.ico" /> | ||
|  | 
 | ||
|  | <script type="text/javascript"> | ||
|  | "use strict"; | ||
|  | 
 | ||
|  | // fix this to use customized letter distribution | ||
|  | var USE_PRESET_LETTER_DISTRIBUTION = true; | ||
|  | // fix this once you have the letter codes corresponding to the letter distribution above | ||
|  | var USE_PRESET_LETTER_CODES = true; | ||
|  | // fix this once you have the decoding values l[] corresponding to the letter codes above | ||
|  | var USE_PRESET_DECODING_SET = true; | ||
|  | 
 | ||
|  | var encodingCharSet = "$0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; | ||
|  | var encodingVersion = 1; | ||
|  | // version 1 of PGN encoding: | ||
|  | //   encodedPGN = nnn$xxx0 | ||
|  | //   nnn = number representing bytes length of the decoded message | ||
|  | //   $ = dollar char (delimiter for length info) | ||
|  | //   xxx = encoded text (using LetterCodes below) | ||
|  | //   0 = zero char (version marker) | ||
|  | 
 | ||
|  | function BitsToBytes(i) { | ||
|  |   var o = 0; | ||
|  |   if (i.charAt(0) == '1') { o += 32; } | ||
|  |   if (i.charAt(1) == '1') { o += 16; } | ||
|  |   if (i.charAt(2) == '1') { o +=  8; } | ||
|  |   if (i.charAt(3) == '1') { o +=  4; } | ||
|  |   if (i.charAt(4) == '1') { o +=  2; } | ||
|  |   if (i.charAt(5) == '1') { o +=  1; } | ||
|  |   return encodingCharSet.charAt(o); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | function EncodePGN(ov) { | ||
|  |   var i, idx, c; | ||
|  | 
 | ||
|  |   var Letters = new Array(256); | ||
|  |   var LetterCodes = new Array(256); | ||
|  | 
 | ||
|  |   for (i = 0; i < 256; i ++) { Letters[i] = 0; } | ||
|  |   for (i = 0; i < ov.length; i ++) { Letters[ov.charCodeAt(i)]++; } | ||
|  | 
 | ||
|  |   if (USE_PRESET_LETTER_DISTRIBUTION) { | ||
|  |   Letters[0] = 1; | ||
|  |   Letters[1] = 1; | ||
|  |   Letters[2] = 1; | ||
|  |   Letters[3] = 1; | ||
|  |   Letters[4] = 1; | ||
|  |   Letters[5] = 1; | ||
|  |   Letters[6] = 1; | ||
|  |   Letters[7] = 1; | ||
|  |   Letters[8] = 1; | ||
|  |   Letters[9] = 1; | ||
|  |   Letters[10] = 25000; | ||
|  |   Letters[11] = 1; | ||
|  |   Letters[12] = 1; | ||
|  |   Letters[13] = 25000; | ||
|  |   Letters[14] = 1; | ||
|  |   Letters[15] = 1; | ||
|  |   Letters[16] = 1; | ||
|  |   Letters[17] = 1; | ||
|  |   Letters[18] = 1; | ||
|  |   Letters[19] = 1; | ||
|  |   Letters[20] = 1; | ||
|  |   Letters[21] = 1; | ||
|  |   Letters[22] = 1; | ||
|  |   Letters[23] = 1; | ||
|  |   Letters[24] = 1; | ||
|  |   Letters[25] = 1; | ||
|  |   Letters[26] = 1; | ||
|  |   Letters[27] = 1; | ||
|  |   Letters[28] = 1; | ||
|  |   Letters[29] = 1; | ||
|  |   Letters[30] = 1; | ||
|  |   Letters[31] = 1; | ||
|  |   Letters[32] = 273240; | ||
|  |   Letters[33] = 200;    // ! | ||
|  |   Letters[34] = 64928;    // " | ||
|  |   Letters[35] = 326;    // # | ||
|  |   Letters[36] = 163;    // $ | ||
|  |   Letters[37] = 25;    // % | ||
|  |   Letters[38] = 25;    // & | ||
|  |   Letters[39] = 500;    // ' | ||
|  |   Letters[40] = 1607;    // ( | ||
|  |   Letters[41] = 1592;    // ) | ||
|  |   Letters[42] = 10;    // * | ||
|  |   Letters[43] = 9086;    // + | ||
|  |   Letters[44] = 4231;    // , | ||
|  |   Letters[45] = 11848;    // - | ||
|  |   Letters[46] = 91283;    // . | ||
|  |   Letters[47] = 9685;    // / | ||
|  |   Letters[48] = 27308;    // 0 | ||
|  |   Letters[49] = 57229;    // 1 | ||
|  |   Letters[50] = 57065;    // 2 | ||
|  |   Letters[51] = 49049;    // 3 | ||
|  |   Letters[52] = 46441;    // 4 | ||
|  |   Letters[53] = 42430;    // 5 | ||
|  |   Letters[54] = 38872;    // 6 | ||
|  |   Letters[55] = 27853;    // 7 | ||
|  |   Letters[56] = 21292;    // 8 | ||
|  |   Letters[57] = 14627;    // 9 | ||
|  |   Letters[58] = 270;    // : | ||
|  |   Letters[59] = 136;    // ; | ||
|  |   Letters[60] = 290;    // < | ||
|  |   Letters[61] = 1015;    // = | ||
|  |   Letters[62] = 290;    // > | ||
|  |   Letters[63] = 7511;    // ? | ||
|  |   Letters[64] = 100;    // @ | ||
|  |   Letters[65] = 3580;    // A | ||
|  |   Letters[66] = 31461;    // B | ||
|  |   Letters[67] = 4369;    // C | ||
|  |   Letters[68] = 6993;    // D | ||
|  |   Letters[69] = 13777;    // E | ||
|  |   Letters[70] = 1719;    // F | ||
|  |   Letters[71] = 1902;    // G | ||
|  |   Letters[72] = 639;    // H | ||
|  |   Letters[73] = 1054;    // I | ||
|  |   Letters[74] = 420;    // J | ||
|  |   Letters[75] = 16962;    // K | ||
|  |   Letters[76] = 961;    // L | ||
|  |   Letters[77] = 1378;    // M | ||
|  |   Letters[78] = 29494;    // N | ||
|  |   Letters[79] = 10671;    // O | ||
|  |   Letters[80] = 7817;    // P | ||
|  |   Letters[81] = 19645;    // Q | ||
|  |   Letters[82] = 34436;    // R | ||
|  |   Letters[83] = 5795;    // S | ||
|  |   Letters[84] = 2037;    // T | ||
|  |   Letters[85] = 1364;    // U | ||
|  |   Letters[86] = 621;    // V | ||
|  |   Letters[87] = 5270;    // W | ||
|  |   Letters[88] = 249;    // X | ||
|  |   Letters[89] = 185;    // Y | ||
|  |   Letters[90] = 620;    // Z | ||
|  |   Letters[91] = 31633;    // [ | ||
|  |   Letters[92] = 15;    // \ | ||
|  |   Letters[93] = 31628;    // ] | ||
|  |   Letters[94] = 10;    // ^ | ||
|  |   Letters[95] = 15;    // _ | ||
|  |   Letters[96] = 10;    // ` | ||
|  |   Letters[97] = 35573;    // a | ||
|  |   Letters[98] = 19456;    // b | ||
|  |   Letters[99] = 33228;    // c | ||
|  |   Letters[100] = 36380;    // d | ||
|  |   Letters[101] = 64738;    // e | ||
|  |   Letters[102] = 25736;    // f | ||
|  |   Letters[103] = 19801;    // g | ||
|  |   Letters[104] = 20415;    // h | ||
|  |   Letters[105] = 16706;    // i | ||
|  |   Letters[106] = 530;    // j | ||
|  |   Letters[107] = 7806;    // k | ||
|  |   Letters[108] = 18510;    // l | ||
|  |   Letters[109] = 3044;    // m | ||
|  |   Letters[110] = 20680;    // n | ||
|  |   Letters[111] = 17771;    // o | ||
|  |   Letters[112] = 9101;    // p | ||
|  |   Letters[113] = 903;    // q | ||
|  |   Letters[114] = 10153;    // r | ||
|  |   Letters[115] = 9963;    // s | ||
|  |   Letters[116] = 32763;    // t | ||
|  |   Letters[117] = 10268;    // u | ||
|  |   Letters[118] = 7508;    // v | ||
|  |   Letters[119] = 2173;    // w | ||
|  |   Letters[120] = 32913;    // x | ||
|  |   Letters[121] = 2135;    // y | ||
|  |   Letters[122] = 722;    // z | ||
|  |   Letters[123] = 1000;   // { | ||
|  |   Letters[124] = 10;   // | | ||
|  |   Letters[125] = 1000;   // } | ||
|  |   Letters[126] = 10;   // ~ | ||
|  |   Letters[127] = 1; | ||
|  |   Letters[128] = 1; | ||
|  |   Letters[129] = 1; | ||
|  |   Letters[130] = 1; | ||
|  |   Letters[131] = 1; | ||
|  |   Letters[132] = 1; | ||
|  |   Letters[133] = 1; | ||
|  |   Letters[134] = 1; | ||
|  |   Letters[135] = 1; | ||
|  |   Letters[136] = 1; | ||
|  |   Letters[137] = 1; | ||
|  |   Letters[138] = 1; | ||
|  |   Letters[139] = 1; | ||
|  |   Letters[140] = 1; | ||
|  |   Letters[141] = 1; | ||
|  |   Letters[142] = 1; | ||
|  |   Letters[143] = 1; | ||
|  |   Letters[144] = 1; | ||
|  |   Letters[145] = 1; | ||
|  |   Letters[146] = 1; | ||
|  |   Letters[147] = 1; | ||
|  |   Letters[148] = 1; | ||
|  |   Letters[149] = 1; | ||
|  |   Letters[150] = 1; | ||
|  |   Letters[151] = 1; | ||
|  |   Letters[152] = 1; | ||
|  |   Letters[153] = 1; | ||
|  |   Letters[154] = 1; | ||
|  |   Letters[155] = 1; | ||
|  |   Letters[156] = 1; | ||
|  |   Letters[157] = 1; | ||
|  |   Letters[158] = 1; | ||
|  |   Letters[159] = 1; | ||
|  |   Letters[160] = 1; | ||
|  |   Letters[161] = 1; | ||
|  |   Letters[162] = 1; | ||
|  |   Letters[163] = 1; | ||
|  |   Letters[164] = 1; | ||
|  |   Letters[165] = 1; | ||
|  |   Letters[166] = 1; | ||
|  |   Letters[167] = 1; | ||
|  |   Letters[168] = 1; | ||
|  |   Letters[169] = 1; | ||
|  |   Letters[170] = 1; | ||
|  |   Letters[171] = 1; | ||
|  |   Letters[172] = 1; | ||
|  |   Letters[173] = 1; | ||
|  |   Letters[174] = 1; | ||
|  |   Letters[175] = 1; | ||
|  |   Letters[176] = 1; | ||
|  |   Letters[177] = 1; | ||
|  |   Letters[178] = 1; | ||
|  |   Letters[179] = 1; | ||
|  |   Letters[180] = 1; | ||
|  |   Letters[181] = 1; | ||
|  |   Letters[182] = 1; | ||
|  |   Letters[183] = 1; | ||
|  |   Letters[184] = 1; | ||
|  |   Letters[185] = 1; | ||
|  |   Letters[186] = 1; | ||
|  |   Letters[187] = 1; | ||
|  |   Letters[188] = 1; | ||
|  |   Letters[189] = 1; | ||
|  |   Letters[190] = 1; | ||
|  |   Letters[191] = 1; | ||
|  |   Letters[192] = 1; | ||
|  |   Letters[193] = 1; | ||
|  |   Letters[194] = 1; | ||
|  |   Letters[195] = 1; | ||
|  |   Letters[196] = 1; | ||
|  |   Letters[197] = 1; | ||
|  |   Letters[198] = 1; | ||
|  |   Letters[199] = 1; | ||
|  |   Letters[200] = 1; | ||
|  |   Letters[201] = 1; | ||
|  |   Letters[202] = 1; | ||
|  |   Letters[203] = 1; | ||
|  |   Letters[204] = 1; | ||
|  |   Letters[205] = 1; | ||
|  |   Letters[206] = 1; | ||
|  |   Letters[207] = 1; | ||
|  |   Letters[208] = 1; | ||
|  |   Letters[209] = 1; | ||
|  |   Letters[210] = 1; | ||
|  |   Letters[211] = 1; | ||
|  |   Letters[212] = 1; | ||
|  |   Letters[213] = 1; | ||
|  |   Letters[214] = 1; | ||
|  |   Letters[215] = 1; | ||
|  |   Letters[216] = 1; | ||
|  |   Letters[217] = 1; | ||
|  |   Letters[218] = 1; | ||
|  |   Letters[219] = 1; | ||
|  |   Letters[220] = 1; | ||
|  |   Letters[221] = 1; | ||
|  |   Letters[222] = 1; | ||
|  |   Letters[223] = 1; | ||
|  |   Letters[224] = 1; | ||
|  |   Letters[225] = 1; | ||
|  |   Letters[226] = 1; | ||
|  |   Letters[227] = 1; | ||
|  |   Letters[228] = 1; | ||
|  |   Letters[229] = 1; | ||
|  |   Letters[230] = 1; | ||
|  |   Letters[231] = 1; | ||
|  |   Letters[232] = 1; | ||
|  |   Letters[233] = 1; | ||
|  |   Letters[234] = 1; | ||
|  |   Letters[235] = 1; | ||
|  |   Letters[236] = 1; | ||
|  |   Letters[237] = 1; | ||
|  |   Letters[238] = 1; | ||
|  |   Letters[239] = 1; | ||
|  |   Letters[240] = 1; | ||
|  |   Letters[241] = 1; | ||
|  |   Letters[242] = 1; | ||
|  |   Letters[243] = 1; | ||
|  |   Letters[244] = 1; | ||
|  |   Letters[245] = 1; | ||
|  |   Letters[246] = 1; | ||
|  |   Letters[247] = 1; | ||
|  |   Letters[248] = 1; | ||
|  |   Letters[249] = 1; | ||
|  |   Letters[250] = 1; | ||
|  |   Letters[251] = 1; | ||
|  |   Letters[252] = 1; | ||
|  |   Letters[253] = 1; | ||
|  |   Letters[254] = 1; | ||
|  |   Letters[255] = 1; | ||
|  |   } | ||
|  | 
 | ||
|  |   // Build a Huffman tree from the letter count frequencies | ||
|  |   var NodeLetter = new Array(512); | ||
|  |   var NodeCount = new Array(512); | ||
|  |   var NodeChild1 = new Array(512); | ||
|  |   var NodeChild2 = new Array(512); | ||
|  |   var NextParent = 0; | ||
|  | 
 | ||
|  |   for (i = 0; i < 256; i ++) { | ||
|  |     if (Letters[i] > 0) { | ||
|  |       NodeLetter[NextParent] = i; | ||
|  |       NodeCount[NextParent] = Letters[i]; | ||
|  |       NodeChild1[NextParent] = -1; | ||
|  |       NodeChild2[NextParent] = -1; | ||
|  |       NextParent ++; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   // Built node list.  Now combine nodes to make a tree | ||
|  |   var SmallestNode1; | ||
|  |   var SmallestNode2 = 1; | ||
|  |   while (SmallestNode2 != -1) { | ||
|  |     SmallestNode1 = -1; | ||
|  |     SmallestNode2 = -1; | ||
|  | 
 | ||
|  |     for (i = 0; i < NextParent; i ++) { | ||
|  |       if (NodeCount[i] > 0) { | ||
|  |         if (SmallestNode1 == -1) { | ||
|  |           SmallestNode1 = i; | ||
|  |         } else if (SmallestNode2 == -1) { | ||
|  |           if (NodeCount[i] < NodeCount[SmallestNode1]) { | ||
|  |             SmallestNode2 = SmallestNode1; | ||
|  |             SmallestNode1 = i; | ||
|  |           } else { | ||
|  |             SmallestNode2 = i; | ||
|  |           } | ||
|  |         } else if (NodeCount[i] <= NodeCount[SmallestNode1]) { | ||
|  |           SmallestNode2 = SmallestNode1; | ||
|  |           SmallestNode1 = i; | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     if (SmallestNode2 != -1) { | ||
|  |       NodeCount[NextParent] = NodeCount[SmallestNode1] + NodeCount[SmallestNode2]; | ||
|  |       NodeCount[SmallestNode1] = 0; | ||
|  |       NodeCount[SmallestNode2] = 0; | ||
|  |       // Reversed SmallestNode numbers here for ordering in the tree | ||
|  |       NodeChild1[NextParent] = SmallestNode2; | ||
|  |       NodeChild2[NextParent] = SmallestNode1; | ||
|  |       NextParent ++; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   // We have constructed the nodes. Now rewrite the list into a single array. | ||
|  |   // The value of an array element will be positive if it is the character | ||
|  |   // code we want. Otherwise, it branches. The left branch will be the next | ||
|  |   // array element. The value of the array will be (offset * -1), which is | ||
|  |   // the right branch. | ||
|  |   var FinalNodes = Array(NextParent); | ||
|  |   var DepthIndex = Array(256); | ||
|  |   var Depth = 0; | ||
|  |   var NextFinal = 0; | ||
|  |   DepthIndex[Depth] = SmallestNode1; | ||
|  |   while (Depth >= 0) { | ||
|  |     if (NodeChild1[DepthIndex[Depth]] > -1 && NodeChild2[DepthIndex[Depth]] > -1) { | ||
|  |       // If there is a left and right, push them on the stack | ||
|  |       idx = NodeChild1[DepthIndex[Depth]]; | ||
|  |       NodeChild1[DepthIndex[Depth]] = -2 - NextFinal; | ||
|  |       Depth ++; | ||
|  |       DepthIndex[Depth] = idx; | ||
|  |       NextFinal ++; | ||
|  |     } else if (NodeChild1[DepthIndex[Depth]] < 0 && NodeChild2[DepthIndex[Depth]] > -1) { | ||
|  |       // If there is a left and a right, but the left was taken, | ||
|  |       // push the right on the stack. | ||
|  |       // Update the FinalNodes[] with the location for the right branch. | ||
|  |       idx = NodeChild1[DepthIndex[Depth]]; | ||
|  |       idx = 0 - idx; | ||
|  |       idx -= 2; | ||
|  |       FinalNodes[idx] = - NextFinal; | ||
|  | 
 | ||
|  |       // Traverse right branch | ||
|  |       idx = NodeChild2[DepthIndex[Depth]]; | ||
|  |       NodeChild2[DepthIndex[Depth]] = -2; | ||
|  |       Depth ++; | ||
|  |       DepthIndex[Depth] = idx; | ||
|  |     } else if (NodeChild1[DepthIndex[Depth]] < -1 && NodeChild2[DepthIndex[Depth]] < -1) { | ||
|  |       // If there was a left and a right, but they were both taken, pop up a level | ||
|  |       Depth --; | ||
|  |     } else if (NodeChild1[DepthIndex[Depth]] == -1 && NodeChild2[DepthIndex[Depth]] == -1) { | ||
|  |       // If we have a child here, add it to the final nodes, pop up | ||
|  |       FinalNodes[NextFinal] = NodeLetter[DepthIndex[Depth]]; | ||
|  |       NextFinal ++; | ||
|  |       Depth --; | ||
|  |     } else { | ||
|  |       // This shouldn't ever happen | ||
|  |       alert('Bad algorithm!'); | ||
|  |       return new Array ("", "", ""); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   // We have the tree. Associate codes with the letters. | ||
|  |   var CodeIndex = new Array(256); | ||
|  |   DepthIndex[0] = 0; | ||
|  |   CodeIndex[0] = ""; | ||
|  |   Depth = 0; | ||
|  |   while (Depth >= 0) { | ||
|  |     if (FinalNodes[DepthIndex[Depth]] < 0) { | ||
|  |       c = CodeIndex[Depth]; | ||
|  |       idx = DepthIndex[Depth]; | ||
|  |       DepthIndex[Depth + 1] = DepthIndex[Depth] + 1; | ||
|  |       CodeIndex[Depth + 1] = c + '0'; | ||
|  |       DepthIndex[Depth] = 0 - FinalNodes[idx]; | ||
|  |       CodeIndex[Depth] = c + '1'; | ||
|  |       Depth ++; | ||
|  |     } else { | ||
|  |       LetterCodes[FinalNodes[DepthIndex[Depth]]] = CodeIndex[Depth]; | ||
|  |       Depth --; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  | 
 | ||
|  |   if (USE_PRESET_LETTER_CODES) { | ||
|  |   LetterCodes[0]   = '00111111111111110'; | ||
|  |   LetterCodes[1]   = '0101101'; | ||
|  |   LetterCodes[2]   = '00111111111111111'; | ||
|  |   LetterCodes[3]   = '00111111111111100'; | ||
|  |   LetterCodes[4]   = '00111111111111101'; | ||
|  |   LetterCodes[5]   = '000011111111111010'; | ||
|  |   LetterCodes[6]   = '000011111111111011'; | ||
|  |   LetterCodes[7]   = '000011111111111000'; | ||
|  |   LetterCodes[8]   = '000011111111111001'; | ||
|  |   LetterCodes[9]   = '000011111111111110'; | ||
|  |   LetterCodes[10]  = '0101100'; | ||
|  |   LetterCodes[11]  = '000011111111111111'; | ||
|  |   LetterCodes[12]  = '000011111111111100'; | ||
|  |   LetterCodes[13]  = '0011100'; | ||
|  |   LetterCodes[14]  = '000011111111111101'; | ||
|  |   LetterCodes[15]  = '000011111111110010'; | ||
|  |   LetterCodes[16]  = '000011111111110011'; | ||
|  |   LetterCodes[17]  = '000011111111110000'; | ||
|  |   LetterCodes[18]  = '000011111111110001'; | ||
|  |   LetterCodes[19]  = '000011111111110110'; | ||
|  |   LetterCodes[20]  = '000011111111110111'; | ||
|  |   LetterCodes[21]  = '000011111111110100'; | ||
|  |   LetterCodes[22]  = '000011111111110101'; | ||
|  |   LetterCodes[23]  = '1111111111110101010'; | ||
|  |   LetterCodes[24]  = '1111111111110101011'; | ||
|  |   LetterCodes[25]  = '1111111111110101000'; | ||
|  |   LetterCodes[26]  = '1111111111110101001'; | ||
|  |   LetterCodes[27]  = '1111111111110101110'; | ||
|  |   LetterCodes[28]  = '1111111111110101111'; | ||
|  |   LetterCodes[29]  = '1111111111110101100'; | ||
|  |   LetterCodes[30]  = '1111111111110101101'; | ||
|  |   LetterCodes[31]  = '1111111111110100010'; | ||
|  |   LetterCodes[32]  = '1000'; | ||
|  |   LetterCodes[33]  = '101111111110'; | ||
|  |   LetterCodes[34]  = '00010'; | ||
|  |   LetterCodes[35]  = '11111111110'; | ||
|  |   LetterCodes[36]  = '0011111111110'; | ||
|  |   LetterCodes[37]  = '1011111111110'; | ||
|  |   LetterCodes[38]  = '00001111111110'; | ||
|  |   LetterCodes[39]  = '00111111110'; | ||
|  |   LetterCodes[40]  = '0011101'; | ||
|  |   LetterCodes[41]  = '111111110'; | ||
|  |   LetterCodes[42]  = '11001111111110'; | ||
|  |   LetterCodes[43]  = '1111110'; | ||
|  |   LetterCodes[44]  = '000011110'; | ||
|  |   LetterCodes[45]  = '0011110'; | ||
|  |   LetterCodes[46]  = '00000'; | ||
|  |   LetterCodes[47]  = '0110110'; | ||
|  |   LetterCodes[48]  = '010100'; | ||
|  |   LetterCodes[49]  = '00110'; | ||
|  |   LetterCodes[50]  = '01000'; | ||
|  |   LetterCodes[51]  = '01100'; | ||
|  |   LetterCodes[52]  = '11000'; | ||
|  |   LetterCodes[53]  = '11010'; | ||
|  |   LetterCodes[54]  = '11100'; | ||
|  |   LetterCodes[55]  = '001010'; | ||
|  |   LetterCodes[56]  = '011100'; | ||
|  |   LetterCodes[57]  = '0001110'; | ||
|  |   LetterCodes[58]  = '001111111110'; | ||
|  |   LetterCodes[59]  = '1111111111100'; | ||
|  |   LetterCodes[60]  = '10111111110'; | ||
|  |   LetterCodes[61]  = '1100110100'; | ||
|  |   LetterCodes[62]  = '000011111110'; | ||
|  |   LetterCodes[63]  = '00011110'; | ||
|  |   LetterCodes[64]  = '1100111111110'; | ||
|  |   LetterCodes[65]  = '110011100'; | ||
|  |   LetterCodes[66]  = '000010'; | ||
|  |   LetterCodes[67]  = '10111110'; | ||
|  |   LetterCodes[68]  = '00111110'; | ||
|  |   LetterCodes[69]  = '0010110'; | ||
|  |   LetterCodes[70]  = '110011101'; | ||
|  |   LetterCodes[71]  = '110011110'; | ||
|  |   LetterCodes[72]  = '1100110101'; | ||
|  |   LetterCodes[73]  = '0010111110'; | ||
|  |   LetterCodes[74]  = '11001111110'; | ||
|  |   LetterCodes[75]  = '101110'; | ||
|  |   LetterCodes[76]  = '1100111110'; | ||
|  |   LetterCodes[77]  = '101111110'; | ||
|  |   LetterCodes[78]  = '000110'; | ||
|  |   LetterCodes[79]  = '0101110'; | ||
|  |   LetterCodes[80]  = '1011110'; | ||
|  |   LetterCodes[81]  = '011101'; | ||
|  |   LetterCodes[82]  = '11101'; | ||
|  |   LetterCodes[83]  = '11001100'; | ||
|  |   LetterCodes[84]  = '001111110'; | ||
|  |   LetterCodes[85]  = '0000111110'; | ||
|  |   LetterCodes[86]  = '1111111110'; | ||
|  |   LetterCodes[87]  = '11111110'; | ||
|  |   LetterCodes[88]  = '110011111110'; | ||
|  |   LetterCodes[89]  = '0000111111110'; | ||
|  |   LetterCodes[90]  = '1011111110'; | ||
|  |   LetterCodes[91]  = '10010'; | ||
|  |   LetterCodes[92]  = '00111111111110'; | ||
|  |   LetterCodes[93]  = '10011'; | ||
|  |   LetterCodes[94]  = '11001111111111'; | ||
|  |   LetterCodes[95]  = '11111111111010'; | ||
|  |   LetterCodes[96]  = '10111111111110'; | ||
|  |   LetterCodes[97]  = '11110'; | ||
|  |   LetterCodes[98]  = '011010'; | ||
|  |   LetterCodes[99]  = '10100'; | ||
|  |   LetterCodes[100] = '11011'; | ||
|  |   LetterCodes[101] = '00100'; | ||
|  |   LetterCodes[102] = '010010'; | ||
|  |   LetterCodes[103] = '010011'; | ||
|  |   LetterCodes[104] = '011110'; | ||
|  |   LetterCodes[105] = '0000110'; | ||
|  |   LetterCodes[106] = '00001111110'; | ||
|  |   LetterCodes[107] = '00001110'; | ||
|  |   LetterCodes[108] = '110010'; | ||
|  |   LetterCodes[109] = '000111110'; | ||
|  |   LetterCodes[110] = '010101'; | ||
|  |   LetterCodes[111] = '111110'; | ||
|  |   LetterCodes[112] = '0110111'; | ||
|  |   LetterCodes[113] = '1100110110'; | ||
|  |   LetterCodes[114] = '0111110'; | ||
|  |   LetterCodes[115] = '0111111'; | ||
|  |   LetterCodes[116] = '10110'; | ||
|  |   LetterCodes[117] = '0101111'; | ||
|  |   LetterCodes[118] = '00101110'; | ||
|  |   LetterCodes[119] = '000111111'; | ||
|  |   LetterCodes[120] = '10101'; | ||
|  |   LetterCodes[121] = '001011110'; | ||
|  |   LetterCodes[122] = '1100110111'; | ||
|  |   LetterCodes[123] = '0010111111'; | ||
|  |   LetterCodes[124] = '001111111111110'; | ||
|  |   LetterCodes[125] = '0011111110'; | ||
|  |   LetterCodes[126] = '111111111110110'; | ||
|  |   LetterCodes[127] = '1111111111110100011'; | ||
|  |   LetterCodes[128] = '1111111111110100000'; | ||
|  |   LetterCodes[129] = '1111111111110100001'; | ||
|  |   LetterCodes[130] = '1111111111110100110'; | ||
|  |   LetterCodes[131] = '1111111111110100111'; | ||
|  |   LetterCodes[132] = '1111111111110100100'; | ||
|  |   LetterCodes[133] = '1111111111110100101'; | ||
|  |   LetterCodes[134] = '1111111111110111010'; | ||
|  |   LetterCodes[135] = '1111111111110111011'; | ||
|  |   LetterCodes[136] = '1111111111110111000'; | ||
|  |   LetterCodes[137] = '1111111111110111001'; | ||
|  |   LetterCodes[138] = '1111111111110111110'; | ||
|  |   LetterCodes[139] = '1111111111110111111'; | ||
|  |   LetterCodes[140] = '1111111111110111100'; | ||
|  |   LetterCodes[141] = '1111111111110111101'; | ||
|  |   LetterCodes[142] = '1111111111110110010'; | ||
|  |   LetterCodes[143] = '1111111111110110011'; | ||
|  |   LetterCodes[144] = '1111111111110110000'; | ||
|  |   LetterCodes[145] = '1111111111110110001'; | ||
|  |   LetterCodes[146] = '1111111111110110110'; | ||
|  |   LetterCodes[147] = '1111111111110110111'; | ||
|  |   LetterCodes[148] = '1111111111110110100'; | ||
|  |   LetterCodes[149] = '1111111111110110101'; | ||
|  |   LetterCodes[150] = '1111111111110001010'; | ||
|  |   LetterCodes[151] = '1111111111110001011'; | ||
|  |   LetterCodes[152] = '1111111111110001000'; | ||
|  |   LetterCodes[153] = '1111111111110001001'; | ||
|  |   LetterCodes[154] = '1111111111110001110'; | ||
|  |   LetterCodes[155] = '1111111111110001111'; | ||
|  |   LetterCodes[156] = '1111111111110001100'; | ||
|  |   LetterCodes[157] = '1111111111110001101'; | ||
|  |   LetterCodes[158] = '1111111111110000010'; | ||
|  |   LetterCodes[159] = '1111111111110000011'; | ||
|  |   LetterCodes[160] = '1111111111110000000'; | ||
|  |   LetterCodes[161] = '1111111111110000001'; | ||
|  |   LetterCodes[162] = '1111111111110000110'; | ||
|  |   LetterCodes[163] = '1111111111110000111'; | ||
|  |   LetterCodes[164] = '1111111111110000100'; | ||
|  |   LetterCodes[165] = '1111111111110000101'; | ||
|  |   LetterCodes[166] = '1111111111110011010'; | ||
|  |   LetterCodes[167] = '1111111111110011011'; | ||
|  |   LetterCodes[168] = '1111111111110011000'; | ||
|  |   LetterCodes[169] = '1111111111110011001'; | ||
|  |   LetterCodes[170] = '1111111111110011110'; | ||
|  |   LetterCodes[171] = '1111111111110011111'; | ||
|  |   LetterCodes[172] = '1111111111110011100'; | ||
|  |   LetterCodes[173] = '1111111111110011101'; | ||
|  |   LetterCodes[174] = '1111111111110010010'; | ||
|  |   LetterCodes[175] = '1111111111110010011'; | ||
|  |   LetterCodes[176] = '1111111111110010000'; | ||
|  |   LetterCodes[177] = '1111111111110010001'; | ||
|  |   LetterCodes[178] = '1111111111110010110'; | ||
|  |   LetterCodes[179] = '1111111111110010111'; | ||
|  |   LetterCodes[180] = '1111111111110010100'; | ||
|  |   LetterCodes[181] = '1111111111110010101'; | ||
|  |   LetterCodes[182] = '1111111111111101010'; | ||
|  |   LetterCodes[183] = '1111111111111101011'; | ||
|  |   LetterCodes[184] = '1111111111111101000'; | ||
|  |   LetterCodes[185] = '1111111111111101001'; | ||
|  |   LetterCodes[186] = '1111111111111101110'; | ||
|  |   LetterCodes[187] = '1111111111111101111'; | ||
|  |   LetterCodes[188] = '1111111111111101100'; | ||
|  |   LetterCodes[189] = '1111111111111101101'; | ||
|  |   LetterCodes[190] = '1111111111111100010'; | ||
|  |   LetterCodes[191] = '1111111111111100011'; | ||
|  |   LetterCodes[192] = '1111111111111100000'; | ||
|  |   LetterCodes[193] = '1111111111111100001'; | ||
|  |   LetterCodes[194] = '1111111111111100110'; | ||
|  |   LetterCodes[195] = '1111111111111100111'; | ||
|  |   LetterCodes[196] = '1111111111111100100'; | ||
|  |   LetterCodes[197] = '1111111111111100101'; | ||
|  |   LetterCodes[198] = '1111111111111111010'; | ||
|  |   LetterCodes[199] = '1111111111111111011'; | ||
|  |   LetterCodes[200] = '1111111111111111000'; | ||
|  |   LetterCodes[201] = '1111111111111111001'; | ||
|  |   LetterCodes[202] = '1111111111111111110'; | ||
|  |   LetterCodes[203] = '1111111111111111111'; | ||
|  |   LetterCodes[204] = '1111111111111111100'; | ||
|  |   LetterCodes[205] = '1111111111111111101'; | ||
|  |   LetterCodes[206] = '1111111111111110010'; | ||
|  |   LetterCodes[207] = '1111111111111110011'; | ||
|  |   LetterCodes[208] = '1111111111111110000'; | ||
|  |   LetterCodes[209] = '1111111111111110001'; | ||
|  |   LetterCodes[210] = '1111111111111110110'; | ||
|  |   LetterCodes[211] = '1111111111111110111'; | ||
|  |   LetterCodes[212] = '1111111111111110100'; | ||
|  |   LetterCodes[213] = '1111111111111110101'; | ||
|  |   LetterCodes[214] = '1111111111111001010'; | ||
|  |   LetterCodes[215] = '1111111111111001011'; | ||
|  |   LetterCodes[216] = '1111111111111001000'; | ||
|  |   LetterCodes[217] = '1111111111111001001'; | ||
|  |   LetterCodes[218] = '1111111111111001110'; | ||
|  |   LetterCodes[219] = '1111111111111001111'; | ||
|  |   LetterCodes[220] = '1111111111111001100'; | ||
|  |   LetterCodes[221] = '1111111111111001101'; | ||
|  |   LetterCodes[222] = '1111111111111000010'; | ||
|  |   LetterCodes[223] = '1111111111111000011'; | ||
|  |   LetterCodes[224] = '1111111111111000000'; | ||
|  |   LetterCodes[225] = '1111111111111000001'; | ||
|  |   LetterCodes[226] = '1111111111111000110'; | ||
|  |   LetterCodes[227] = '1111111111111000111'; | ||
|  |   LetterCodes[228] = '1111111111111000100'; | ||
|  |   LetterCodes[229] = '1111111111111000101'; | ||
|  |   LetterCodes[230] = '1111111111111011010'; | ||
|  |   LetterCodes[231] = '1111111111111011011'; | ||
|  |   LetterCodes[232] = '1111111111111011000'; | ||
|  |   LetterCodes[233] = '1111111111111011001'; | ||
|  |   LetterCodes[234] = '1111111111111011110'; | ||
|  |   LetterCodes[235] = '1111111111111011111'; | ||
|  |   LetterCodes[236] = '1111111111111011100'; | ||
|  |   LetterCodes[237] = '1111111111111011101'; | ||
|  |   LetterCodes[238] = '1111111111111010010'; | ||
|  |   LetterCodes[239] = '1111111111111010011'; | ||
|  |   LetterCodes[240] = '1111111111111010000'; | ||
|  |   LetterCodes[241] = '1111111111111010001'; | ||
|  |   LetterCodes[242] = '1111111111111010110'; | ||
|  |   LetterCodes[243] = '1111111111111010111'; | ||
|  |   LetterCodes[244] = '1111111111111010100'; | ||
|  |   LetterCodes[245] = '1111111111111010101'; | ||
|  |   LetterCodes[246] = '10111111111111010'; | ||
|  |   LetterCodes[247] = '10111111111111011'; | ||
|  |   LetterCodes[248] = '10111111111111000'; | ||
|  |   LetterCodes[249] = '10111111111111001'; | ||
|  |   LetterCodes[250] = '10111111111111110'; | ||
|  |   LetterCodes[251] = '10111111111111111'; | ||
|  |   LetterCodes[252] = '10111111111111100'; | ||
|  |   LetterCodes[253] = '10111111111111101'; | ||
|  |   LetterCodes[254] = '1111111111101110'; | ||
|  |   LetterCodes[255] = '1111111111101111'; | ||
|  |   } | ||
|  | 
 | ||
|  |   // Build resulting data stream | ||
|  |   // The bits string could get very large | ||
|  |   var bits = ""; | ||
|  |   var bytes = ov.length + "$"; | ||
|  |   for (i = 0; i < ov.length; i ++) { | ||
|  |     // converts ASCII chars above 255 to a star (code 42) avoiding decoding failure | ||
|  |     if (ov.charCodeAt(i) > 255) { bits += LetterCodes[42]; } | ||
|  |     else { bits += LetterCodes[ov.charCodeAt(i)]; } | ||
|  |     while (bits.length > 5) { | ||
|  |       bytes += BitsToBytes(bits); | ||
|  |       bits = bits.slice(6, bits.length); | ||
|  |     } | ||
|  |   } | ||
|  |   bytes += BitsToBytes(bits); | ||
|  | 
 | ||
|  |   var encodedNodes = ""; | ||
|  |   for (i = 0; i < FinalNodes.length; i ++) { | ||
|  |     var x, y; | ||
|  |     x = FinalNodes[i] + 512; | ||
|  |     y = x & 0x3F; | ||
|  |     x >>= 6; | ||
|  |     x &= 0x3F; | ||
|  |     encodedNodes += encodingCharSet.charAt(x) + encodingCharSet.charAt(y); | ||
|  |   } | ||
|  | 
 | ||
|  |   bytes += encodingCharSet.charAt(encodingVersion); | ||
|  | 
 | ||
|  |   return new Array (bytes, encodedNodes, LetterCodes); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | function DecodePGN(bytes, encodedNodes) { | ||
|  | 
 | ||
|  |   if (bytes.charAt(bytes.length - 1) != encodingCharSet.charAt(encodingVersion)) { | ||
|  |     alert("ERROR: PGN encoding version mismatch (e:" + | ||
|  |            bytes.charAt(bytes.length - 1) + " d:" + encodingCharSet.charAt(encodingVersion) + ")"); | ||
|  |   } | ||
|  | 
 | ||
|  |   var originalLength = parseInt(bytes.match(/^[0-9]*/), 10); | ||
|  |   bytes = bytes.replace(/^[0-9]*\$/,""); | ||
|  | 
 | ||
|  |   var l = new Array(); | ||
|  |   while(encodedNodes.length) { | ||
|  |     l.push((encodingCharSet.indexOf(encodedNodes.charAt(0))<<6)+encodingCharSet.indexOf(encodedNodes.charAt(1))-512); | ||
|  |     encodedNodes = encodedNodes.slice(2,encodedNodes.length); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (USE_PRESET_DECODING_SET) { | ||
|  |   l[0] = -146; | ||
|  |   l[1] = -111; | ||
|  |   l[2] = -66; | ||
|  |   l[3] = -55; | ||
|  |   l[4] = -6; | ||
|  |   l[5] = 46; | ||
|  |   l[6] = -8; | ||
|  |   l[7] = 66; | ||
|  |   l[8] = -10; | ||
|  |   l[9] = 105; | ||
|  |   l[10] = -12; | ||
|  |   l[11] = 107; | ||
|  |   l[12] = -14; | ||
|  |   l[13] = 44; | ||
|  |   l[14] = -16; | ||
|  |   l[15] = 85; | ||
|  |   l[16] = -18; | ||
|  |   l[17] = 106; | ||
|  |   l[18] = -20; | ||
|  |   l[19] = 62; | ||
|  |   l[20] = -22; | ||
|  |   l[21] = 89; | ||
|  |   l[22] = -24; | ||
|  |   l[23] = 38; | ||
|  |   l[24] = -40; | ||
|  |   l[25] = -33; | ||
|  |   l[26] = -30; | ||
|  |   l[27] = -29; | ||
|  |   l[28] = 17; | ||
|  |   l[29] = 18; | ||
|  |   l[30] = -32; | ||
|  |   l[31] = 15; | ||
|  |   l[32] = 16; | ||
|  |   l[33] = -37; | ||
|  |   l[34] = -36; | ||
|  |   l[35] = 21; | ||
|  |   l[36] = 22; | ||
|  |   l[37] = -39; | ||
|  |   l[38] = 19; | ||
|  |   l[39] = 20; | ||
|  |   l[40] = -48; | ||
|  |   l[41] = -45; | ||
|  |   l[42] = -44; | ||
|  |   l[43] = 7; | ||
|  |   l[44] = 8; | ||
|  |   l[45] = -47; | ||
|  |   l[46] = 5; | ||
|  |   l[47] = 6; | ||
|  |   l[48] = -52; | ||
|  |   l[49] = -51; | ||
|  |   l[50] = 12; | ||
|  |   l[51] = 14; | ||
|  |   l[52] = -54; | ||
|  |   l[53] = 9; | ||
|  |   l[54] = 11; | ||
|  |   l[55] = -57; | ||
|  |   l[56] = 34; | ||
|  |   l[57] = -59; | ||
|  |   l[58] = 78; | ||
|  |   l[59] = -61; | ||
|  |   l[60] = 57; | ||
|  |   l[61] = -63; | ||
|  |   l[62] = 63; | ||
|  |   l[63] = -65; | ||
|  |   l[64] = 109; | ||
|  |   l[65] = 119; | ||
|  |   l[66] = -80; | ||
|  |   l[67] = -69; | ||
|  |   l[68] = 101; | ||
|  |   l[69] = -71; | ||
|  |   l[70] = 55; | ||
|  |   l[71] = -73; | ||
|  |   l[72] = 69; | ||
|  |   l[73] = -75; | ||
|  |   l[74] = 118; | ||
|  |   l[75] = -77; | ||
|  |   l[76] = 121; | ||
|  |   l[77] = -79; | ||
|  |   l[78] = 73; | ||
|  |   l[79] = 123; | ||
|  |   l[80] = -82; | ||
|  |   l[81] = 49; | ||
|  |   l[82] = -86; | ||
|  |   l[83] = -85; | ||
|  |   l[84] = 13; | ||
|  |   l[85] = 40; | ||
|  |   l[86] = -88; | ||
|  |   l[87] = 45; | ||
|  |   l[88] = -90; | ||
|  |   l[89] = 68; | ||
|  |   l[90] = -92; | ||
|  |   l[91] = 84; | ||
|  |   l[92] = -94; | ||
|  |   l[93] = 125; | ||
|  |   l[94] = -96; | ||
|  |   l[95] = 39; | ||
|  |   l[96] = -98; | ||
|  |   l[97] = 58; | ||
|  |   l[98] = -100; | ||
|  |   l[99] = 36; | ||
|  |   l[100] = -102; | ||
|  |   l[101] = 92; | ||
|  |   l[102] = -104; | ||
|  |   l[103] = 124; | ||
|  |   l[104] = -108; | ||
|  |   l[105] = -107; | ||
|  |   l[106] = 3; | ||
|  |   l[107] = 4; | ||
|  |   l[108] = -110; | ||
|  |   l[109] = 0; | ||
|  |   l[110] = 2; | ||
|  |   l[111] = -129; | ||
|  |   l[112] = -118; | ||
|  |   l[113] = -115; | ||
|  |   l[114] = 50; | ||
|  |   l[115] = -117; | ||
|  |   l[116] = 102; | ||
|  |   l[117] = 103; | ||
|  |   l[118] = -122; | ||
|  |   l[119] = -121; | ||
|  |   l[120] = 48; | ||
|  |   l[121] = 110; | ||
|  |   l[122] = -126; | ||
|  |   l[123] = -125; | ||
|  |   l[124] = 10; | ||
|  |   l[125] = 1; | ||
|  |   l[126] = -128; | ||
|  |   l[127] = 79; | ||
|  |   l[128] = 117; | ||
|  |   l[129] = -137; | ||
|  |   l[130] = -132; | ||
|  |   l[131] = 51; | ||
|  |   l[132] = -134; | ||
|  |   l[133] = 98; | ||
|  |   l[134] = -136; | ||
|  |   l[135] = 47; | ||
|  |   l[136] = 112; | ||
|  |   l[137] = -141; | ||
|  |   l[138] = -140; | ||
|  |   l[139] = 56; | ||
|  |   l[140] = 81; | ||
|  |   l[141] = -143; | ||
|  |   l[142] = 104; | ||
|  |   l[143] = -145; | ||
|  |   l[144] = 114; | ||
|  |   l[145] = 115; | ||
|  |   l[146] = -192; | ||
|  |   l[147] = -153; | ||
|  |   l[148] = -150; | ||
|  |   l[149] = 32; | ||
|  |   l[150] = -152; | ||
|  |   l[151] = 91; | ||
|  |   l[152] = 93; | ||
|  |   l[153] = -157; | ||
|  |   l[154] = -156; | ||
|  |   l[155] = 99; | ||
|  |   l[156] = 120; | ||
|  |   l[157] = -159; | ||
|  |   l[158] = 116; | ||
|  |   l[159] = -161; | ||
|  |   l[160] = 75; | ||
|  |   l[161] = -163; | ||
|  |   l[162] = 80; | ||
|  |   l[163] = -165; | ||
|  |   l[164] = 67; | ||
|  |   l[165] = -167; | ||
|  |   l[166] = 77; | ||
|  |   l[167] = -169; | ||
|  |   l[168] = 90; | ||
|  |   l[169] = -171; | ||
|  |   l[170] = 60; | ||
|  |   l[171] = -173; | ||
|  |   l[172] = 33; | ||
|  |   l[173] = -175; | ||
|  |   l[174] = 37; | ||
|  |   l[175] = -177; | ||
|  |   l[176] = 96; | ||
|  |   l[177] = -185; | ||
|  |   l[178] = -182; | ||
|  |   l[179] = -181; | ||
|  |   l[180] = 248; | ||
|  |   l[181] = 249; | ||
|  |   l[182] = -184; | ||
|  |   l[183] = 246; | ||
|  |   l[184] = 247; | ||
|  |   l[185] = -189; | ||
|  |   l[186] = -188; | ||
|  |   l[187] = 252; | ||
|  |   l[188] = 253; | ||
|  |   l[189] = -191; | ||
|  |   l[190] = 250; | ||
|  |   l[191] = 251; | ||
|  |   l[192] = -228; | ||
|  |   l[193] = -225; | ||
|  |   l[194] = -196; | ||
|  |   l[195] = 52; | ||
|  |   l[196] = -198; | ||
|  |   l[197] = 108; | ||
|  |   l[198] = -208; | ||
|  |   l[199] = -201; | ||
|  |   l[200] = 83; | ||
|  |   l[201] = -205; | ||
|  |   l[202] = -204; | ||
|  |   l[203] = 61; | ||
|  |   l[204] = 72; | ||
|  |   l[205] = -207; | ||
|  |   l[206] = 113; | ||
|  |   l[207] = 122; | ||
|  |   l[208] = -212; | ||
|  |   l[209] = -211; | ||
|  |   l[210] = 65; | ||
|  |   l[211] = 70; | ||
|  |   l[212] = -214; | ||
|  |   l[213] = 71; | ||
|  |   l[214] = -216; | ||
|  |   l[215] = 76; | ||
|  |   l[216] = -218; | ||
|  |   l[217] = 74; | ||
|  |   l[218] = -220; | ||
|  |   l[219] = 88; | ||
|  |   l[220] = -222; | ||
|  |   l[221] = 64; | ||
|  |   l[222] = -224; | ||
|  |   l[223] = 42; | ||
|  |   l[224] = 94; | ||
|  |   l[225] = -227; | ||
|  |   l[226] = 53; | ||
|  |   l[227] = 100; | ||
|  |   l[228] = -232; | ||
|  |   l[229] = -231; | ||
|  |   l[230] = 54; | ||
|  |   l[231] = 82; | ||
|  |   l[232] = -234; | ||
|  |   l[233] = 97; | ||
|  |   l[234] = -236; | ||
|  |   l[235] = 111; | ||
|  |   l[236] = -238; | ||
|  |   l[237] = 43; | ||
|  |   l[238] = -240; | ||
|  |   l[239] = 87; | ||
|  |   l[240] = -242; | ||
|  |   l[241] = 41; | ||
|  |   l[242] = -244; | ||
|  |   l[243] = 86; | ||
|  |   l[244] = -246; | ||
|  |   l[245] = 35; | ||
|  |   l[246] = -256; | ||
|  |   l[247] = -249; | ||
|  |   l[248] = 59; | ||
|  |   l[249] = -251; | ||
|  |   l[250] = 95; | ||
|  |   l[251] = -253; | ||
|  |   l[252] = 126; | ||
|  |   l[253] = -255; | ||
|  |   l[254] = 254; | ||
|  |   l[255] = 255; | ||
|  |   l[256] = -384; | ||
|  |   l[257] = -321; | ||
|  |   l[258] = -290; | ||
|  |   l[259] = -275; | ||
|  |   l[260] = -268; | ||
|  |   l[261] = -265; | ||
|  |   l[262] = -264; | ||
|  |   l[263] = 160; | ||
|  |   l[264] = 161; | ||
|  |   l[265] = -267; | ||
|  |   l[266] = 158; | ||
|  |   l[267] = 159; | ||
|  |   l[268] = -272; | ||
|  |   l[269] = -271; | ||
|  |   l[270] = 164; | ||
|  |   l[271] = 165; | ||
|  |   l[272] = -274; | ||
|  |   l[273] = 162; | ||
|  |   l[274] = 163; | ||
|  |   l[275] = -283; | ||
|  |   l[276] = -280; | ||
|  |   l[277] = -279; | ||
|  |   l[278] = 152; | ||
|  |   l[279] = 153; | ||
|  |   l[280] = -282; | ||
|  |   l[281] = 150; | ||
|  |   l[282] = 151; | ||
|  |   l[283] = -287; | ||
|  |   l[284] = -286; | ||
|  |   l[285] = 156; | ||
|  |   l[286] = 157; | ||
|  |   l[287] = -289; | ||
|  |   l[288] = 154; | ||
|  |   l[289] = 155; | ||
|  |   l[290] = -306; | ||
|  |   l[291] = -299; | ||
|  |   l[292] = -296; | ||
|  |   l[293] = -295; | ||
|  |   l[294] = 176; | ||
|  |   l[295] = 177; | ||
|  |   l[296] = -298; | ||
|  |   l[297] = 174; | ||
|  |   l[298] = 175; | ||
|  |   l[299] = -303; | ||
|  |   l[300] = -302; | ||
|  |   l[301] = 180; | ||
|  |   l[302] = 181; | ||
|  |   l[303] = -305; | ||
|  |   l[304] = 178; | ||
|  |   l[305] = 179; | ||
|  |   l[306] = -314; | ||
|  |   l[307] = -311; | ||
|  |   l[308] = -310; | ||
|  |   l[309] = 168; | ||
|  |   l[310] = 169; | ||
|  |   l[311] = -313; | ||
|  |   l[312] = 166; | ||
|  |   l[313] = 167; | ||
|  |   l[314] = -318; | ||
|  |   l[315] = -317; | ||
|  |   l[316] = 172; | ||
|  |   l[317] = 173; | ||
|  |   l[318] = -320; | ||
|  |   l[319] = 170; | ||
|  |   l[320] = 171; | ||
|  |   l[321] = -353; | ||
|  |   l[322] = -338; | ||
|  |   l[323] = -331; | ||
|  |   l[324] = -328; | ||
|  |   l[325] = -327; | ||
|  |   l[326] = 128; | ||
|  |   l[327] = 129; | ||
|  |   l[328] = -330; | ||
|  |   l[329] = 31; | ||
|  |   l[330] = 127; | ||
|  |   l[331] = -335; | ||
|  |   l[332] = -334; | ||
|  |   l[333] = 132; | ||
|  |   l[334] = 133; | ||
|  |   l[335] = -337; | ||
|  |   l[336] = 130; | ||
|  |   l[337] = 131; | ||
|  |   l[338] = -346; | ||
|  |   l[339] = -343; | ||
|  |   l[340] = -342; | ||
|  |   l[341] = 25; | ||
|  |   l[342] = 26; | ||
|  |   l[343] = -345; | ||
|  |   l[344] = 23; | ||
|  |   l[345] = 24; | ||
|  |   l[346] = -350; | ||
|  |   l[347] = -349; | ||
|  |   l[348] = 29; | ||
|  |   l[349] = 30; | ||
|  |   l[350] = -352; | ||
|  |   l[351] = 27; | ||
|  |   l[352] = 28; | ||
|  |   l[353] = -369; | ||
|  |   l[354] = -362; | ||
|  |   l[355] = -359; | ||
|  |   l[356] = -358; | ||
|  |   l[357] = 144; | ||
|  |   l[358] = 145; | ||
|  |   l[359] = -361; | ||
|  |   l[360] = 142; | ||
|  |   l[361] = 143; | ||
|  |   l[362] = -366; | ||
|  |   l[363] = -365; | ||
|  |   l[364] = 148; | ||
|  |   l[365] = 149; | ||
|  |   l[366] = -368; | ||
|  |   l[367] = 146; | ||
|  |   l[368] = 147; | ||
|  |   l[369] = -377; | ||
|  |   l[370] = -374; | ||
|  |   l[371] = -373; | ||
|  |   l[372] = 136; | ||
|  |   l[373] = 137; | ||
|  |   l[374] = -376; | ||
|  |   l[375] = 134; | ||
|  |   l[376] = 135; | ||
|  |   l[377] = -381; | ||
|  |   l[378] = -380; | ||
|  |   l[379] = 140; | ||
|  |   l[380] = 141; | ||
|  |   l[381] = -383; | ||
|  |   l[382] = 138; | ||
|  |   l[383] = 139; | ||
|  |   l[384] = -448; | ||
|  |   l[385] = -417; | ||
|  |   l[386] = -402; | ||
|  |   l[387] = -395; | ||
|  |   l[388] = -392; | ||
|  |   l[389] = -391; | ||
|  |   l[390] = 224; | ||
|  |   l[391] = 225; | ||
|  |   l[392] = -394; | ||
|  |   l[393] = 222; | ||
|  |   l[394] = 223; | ||
|  |   l[395] = -399; | ||
|  |   l[396] = -398; | ||
|  |   l[397] = 228; | ||
|  |   l[398] = 229; | ||
|  |   l[399] = -401; | ||
|  |   l[400] = 226; | ||
|  |   l[401] = 227; | ||
|  |   l[402] = -410; | ||
|  |   l[403] = -407; | ||
|  |   l[404] = -406; | ||
|  |   l[405] = 216; | ||
|  |   l[406] = 217; | ||
|  |   l[407] = -409; | ||
|  |   l[408] = 214; | ||
|  |   l[409] = 215; | ||
|  |   l[410] = -414; | ||
|  |   l[411] = -413; | ||
|  |   l[412] = 220; | ||
|  |   l[413] = 221; | ||
|  |   l[414] = -416; | ||
|  |   l[415] = 218; | ||
|  |   l[416] = 219; | ||
|  |   l[417] = -433; | ||
|  |   l[418] = -426; | ||
|  |   l[419] = -423; | ||
|  |   l[420] = -422; | ||
|  |   l[421] = 240; | ||
|  |   l[422] = 241; | ||
|  |   l[423] = -425; | ||
|  |   l[424] = 238; | ||
|  |   l[425] = 239; | ||
|  |   l[426] = -430; | ||
|  |   l[427] = -429; | ||
|  |   l[428] = 244; | ||
|  |   l[429] = 245; | ||
|  |   l[430] = -432; | ||
|  |   l[431] = 242; | ||
|  |   l[432] = 243; | ||
|  |   l[433] = -441; | ||
|  |   l[434] = -438; | ||
|  |   l[435] = -437; | ||
|  |   l[436] = 232; | ||
|  |   l[437] = 233; | ||
|  |   l[438] = -440; | ||
|  |   l[439] = 230; | ||
|  |   l[440] = 231; | ||
|  |   l[441] = -445; | ||
|  |   l[442] = -444; | ||
|  |   l[443] = 236; | ||
|  |   l[444] = 237; | ||
|  |   l[445] = -447; | ||
|  |   l[446] = 234; | ||
|  |   l[447] = 235; | ||
|  |   l[448] = -480; | ||
|  |   l[449] = -465; | ||
|  |   l[450] = -458; | ||
|  |   l[451] = -455; | ||
|  |   l[452] = -454; | ||
|  |   l[453] = 192; | ||
|  |   l[454] = 193; | ||
|  |   l[455] = -457; | ||
|  |   l[456] = 190; | ||
|  |   l[457] = 191; | ||
|  |   l[458] = -462; | ||
|  |   l[459] = -461; | ||
|  |   l[460] = 196; | ||
|  |   l[461] = 197; | ||
|  |   l[462] = -464; | ||
|  |   l[463] = 194; | ||
|  |   l[464] = 195; | ||
|  |   l[465] = -473; | ||
|  |   l[466] = -470; | ||
|  |   l[467] = -469; | ||
|  |   l[468] = 184; | ||
|  |   l[469] = 185; | ||
|  |   l[470] = -472; | ||
|  |   l[471] = 182; | ||
|  |   l[472] = 183; | ||
|  |   l[473] = -477; | ||
|  |   l[474] = -476; | ||
|  |   l[475] = 188; | ||
|  |   l[476] = 189; | ||
|  |   l[477] = -479; | ||
|  |   l[478] = 186; | ||
|  |   l[479] = 187; | ||
|  |   l[480] = -496; | ||
|  |   l[481] = -489; | ||
|  |   l[482] = -486; | ||
|  |   l[483] = -485; | ||
|  |   l[484] = 208; | ||
|  |   l[485] = 209; | ||
|  |   l[486] = -488; | ||
|  |   l[487] = 206; | ||
|  |   l[488] = 207; | ||
|  |   l[489] = -493; | ||
|  |   l[490] = -492; | ||
|  |   l[491] = 212; | ||
|  |   l[492] = 213; | ||
|  |   l[493] = -495; | ||
|  |   l[494] = 210; | ||
|  |   l[495] = 211; | ||
|  |   l[496] = -504; | ||
|  |   l[497] = -501; | ||
|  |   l[498] = -500; | ||
|  |   l[499] = 200; | ||
|  |   l[500] = 201; | ||
|  |   l[501] = -503; | ||
|  |   l[502] = 198; | ||
|  |   l[503] = 199; | ||
|  |   l[504] = -508; | ||
|  |   l[505] = -507; | ||
|  |   l[506] = 204; | ||
|  |   l[507] = 205; | ||
|  |   l[508] = -510; | ||
|  |   l[509] = 202; | ||
|  |   l[510] = 203; | ||
|  |   } | ||
|  | 
 | ||
|  |   var a=0, b=0, e=0, i, o=""; | ||
|  | 
 | ||
|  |   function B() { if (a===0) { b=encodingCharSet.indexOf(bytes.charAt(e++)); a=6; } return ((b>>--a)&0x01); } | ||
|  | 
 | ||
|  |   while(originalLength>0) { i=0; | ||
|  |     while(l[i]<0) { | ||
|  |       if (B()) { i=-l[i]; } | ||
|  |       else { i++; } | ||
|  |     } | ||
|  |     o+=String.fromCharCode(l[i]); | ||
|  |     originalLength--; | ||
|  |   } | ||
|  | 
 | ||
|  |   return o; | ||
|  | } | ||
|  | 
 | ||
|  | </script> | ||
|  | 
 | ||
|  | </head> | ||
|  | 
 | ||
|  | <body style="margin: 0px; padding: 1.75em; font-family: sans-serif;"> | ||
|  | 
 | ||
|  | <h1 style="margin-top:0px; padding-top:0px;">pgn4web PGN encoder/decoder test</h1> | ||
|  | 
 | ||
|  | <center> | ||
|  | 
 | ||
|  | <textarea id="textArea" style="height:300px; width:900px;"></textarea> | ||
|  | <form> | ||
|  | <input type="button" style="width:700px;" onClick="javascript: testPGNencode();" value="pgn4web PGN encoder/decoder test"> | ||
|  | <input type="button" style="width:200px;" onClick="javascript: document.getElementById('textArea').value = '';" value="clear form"> | ||
|  | </form> | ||
|  | <div style="width: 900px; text-align: left"><b>status: </b><span id="status">enter PGN data and press the test button</span></div> | ||
|  | <br> | ||
|  | <table cellspacing=2 cellpadding=0 border=1> | ||
|  | <tr style="font-weight: bold; text-align: center;"> | ||
|  | <td>original</td> | ||
|  | <td>decoded</td> | ||
|  | </tr> | ||
|  | <tr> | ||
|  | <td> | ||
|  | <textarea id="original" readonly style="height:300px; width:447px;"> | ||
|  | </textarea> | ||
|  | </td> | ||
|  | <td> | ||
|  | <textarea id="decoded" readonly style="height:300px; width:447px;"> | ||
|  | </textarea> | ||
|  | </td> | ||
|  | </tr> | ||
|  | </table> | ||
|  | <br> | ||
|  | <table cellspacing=2 cellpadding=0 border=1> | ||
|  | <tr style="font-weight: bold; text-align: center;"> | ||
|  | <td>encoded</td> | ||
|  | </tr> | ||
|  | <tr> | ||
|  | <td> | ||
|  | <textarea id="encoded" readonly style="height:80px; width:896px;"> | ||
|  | </textarea> | ||
|  | </td> | ||
|  | </tr> | ||
|  | <tr style="font-weight: bold; text-align: center;"> | ||
|  | <td>decoding key</td> | ||
|  | </tr> | ||
|  | <tr> | ||
|  | <td> | ||
|  | <textarea id="decodingKey" readonly style="height:80px; width:896px;"> | ||
|  | </textarea> | ||
|  | </td> | ||
|  | </tr> | ||
|  | </table> | ||
|  | <br> | ||
|  | <table cellspacing=2 cellpadding=0 border=1> | ||
|  | <tr style="font-weight: bold; text-align: center;"> | ||
|  | <td>original letters</td> | ||
|  | <td>letter codes</td> | ||
|  | <td>decoding values</td> | ||
|  | <td>encoded letters</td> | ||
|  | </tr> | ||
|  | <tr> | ||
|  | <td> | ||
|  | <textarea id="originalLetters" readonly style="height:300px; width:195px;"> | ||
|  | </textarea> | ||
|  | </td> | ||
|  | <td> | ||
|  | <textarea id="LetterCodes" readonly style="height:300px; width:335px;"> | ||
|  | </textarea> | ||
|  | </td> | ||
|  | <td> | ||
|  | <textarea id="decodingValues" readonly style="height:300px; width:165px;"> | ||
|  | </textarea> | ||
|  | </td> | ||
|  | <td> | ||
|  | <textarea id="encodedLetters" readonly style="height:300px; width:195px;"> | ||
|  | </textarea> | ||
|  | </td> | ||
|  | </tr> | ||
|  | </table> | ||
|  | <br> | ||
|  | 
 | ||
|  | </center> | ||
|  | 
 | ||
|  | <script type="text/javascript"> | ||
|  | 
 | ||
|  | function testPGNencode() { | ||
|  | 
 | ||
|  |   document.getElementById("status").innerHTML = "encoding data, please wait..."; | ||
|  | 
 | ||
|  |   if (document.getElementById("textArea").value === "") { | ||
|  |     document.getElementById("original").value = document.getElementById("originalInput").innerHTML; | ||
|  |   } else { | ||
|  |     document.getElementById("original").value = document.getElementById("textArea").value; | ||
|  |   } | ||
|  |   original_var = document.getElementById("original").value; | ||
|  |   ret = new Array(3); | ||
|  |   ret = EncodePGN(original_var); | ||
|  |   test_bytes = ret[0]; | ||
|  |   test_encodedNodes = ret[1]; | ||
|  |   test_LetterCodes = ret[2]; | ||
|  | 
 | ||
|  |   document.getElementById("status").innerHTML = "decoding data, please wait..."; | ||
|  | 
 | ||
|  |   document.getElementById("encoded").value = test_bytes; | ||
|  | 
 | ||
|  |   document.getElementById("decoded").value = DecodePGN(test_bytes, test_encodedNodes); | ||
|  | 
 | ||
|  |   compressPerc = Math.floor(100 * (document.getElementById("original").value.length - document.getElementById("encoded").value.length) / document.getElementById("original").value.length); | ||
|  | 
 | ||
|  |   document.getElementById("status").innerHTML = "encoding/decoding test completed;" + | ||
|  |     " original: " + document.getElementById("original").value.length + ";" + | ||
|  |     " encoded: " + document.getElementById("encoded").value.length + ";" + | ||
|  |     " compression rate: " + compressPerc + "%"; | ||
|  | 
 | ||
|  |   if (document.getElementById("decoded").value != document.getElementById("original").value) { | ||
|  |     document.getElementById("status").innerHTML += "<br><span style='font-weight: bold; color: red;'>error: decoded different from original, please check for ASCII chars greater than 255 in the original input</span>"; | ||
|  |   } | ||
|  | 
 | ||
|  |   document.getElementById("originalLetters").value = letter_frequency(document.getElementById("original").value); | ||
|  | 
 | ||
|  |   document.getElementById("encodedLetters").value = letter_frequency(document.getElementById("encoded").value); | ||
|  | 
 | ||
|  |   document.getElementById("decodingKey").value = test_encodedNodes; | ||
|  | 
 | ||
|  |   l = new Array(); | ||
|  |   while(test_encodedNodes.length) { | ||
|  |     l.push((encodingCharSet.indexOf(test_encodedNodes.charAt(0))<<6)+encodingCharSet.indexOf(test_encodedNodes.charAt(1))-512); | ||
|  |     test_encodedNodes = test_encodedNodes.slice(2,test_encodedNodes.length); | ||
|  |   } | ||
|  |   o = ""; | ||
|  |   for (i=0; i<l.length; i++) { | ||
|  |     o += "l[" + i + "]"; | ||
|  |     if (i < 10) { o += "  "; } | ||
|  |     else { if (i < 100) { o += " "; } } | ||
|  |     o += " = " + l[i] + ";\n"; | ||
|  |   } | ||
|  |   document.getElementById("decodingValues").value = o; | ||
|  | 
 | ||
|  |   o = ""; | ||
|  |   for (i=0; i<test_LetterCodes.length; i++) { | ||
|  |     o += "LetterCodes[" + i + "]"; | ||
|  |     if (i < 10) { o += "  "; } | ||
|  |     else { if (i < 100) { o += " "; } } | ||
|  |     o += " = '" + test_LetterCodes[i] + "';\n"; | ||
|  |   } | ||
|  |   document.getElementById("LetterCodes").innerHTML = o; | ||
|  | } | ||
|  | 
 | ||
|  | function letter_frequency(s) { | ||
|  |   var thisLetters = new Array(256); | ||
|  |   for (i = 0; i < thisLetters.length; i ++) { thisLetters[i]=0; } | ||
|  |   var o = ""; | ||
|  |   for (i = 0; i < s.length; i ++) { thisLetters[s.charCodeAt(i)]++; } | ||
|  |   for (i = 0; i < thisLetters.length; i ++) { | ||
|  |     o += "Letters[" + i + "]"; | ||
|  |     if (i < 10) { o += "  "; } | ||
|  |     else { if (i < 100) { o += " "; } } | ||
|  |     o += " = " + thisLetters[i] + ";"; | ||
|  |     if (i > 32) { o += "   // " + String.fromCharCode(i); } | ||
|  |     o += "\n"; | ||
|  |   } | ||
|  |   return o; | ||
|  | } | ||
|  | 
 | ||
|  | </script> | ||
|  | 
 | ||
|  | <textarea id="originalInput" style="display:none;"> | ||
|  | [White "Spassky, Boris"] | ||
|  | [Black "Fischer, Robert"] | ||
|  | [Result "0-1"] | ||
|  | [Date "1972"] | ||
|  | [Event "World Championship"] | ||
|  | [Site "Reykjavik"] | ||
|  | [Round "13"] | ||
|  | 
 | ||
|  | 1. e4 Nf6 2. e5 Nd5 3. d4 d6 4. Nf3 g6 | ||
|  | 5. Bc4 Nb6 6. Bb3 Bg7 7. Nbd2 O-O 8. h3 a5 | ||
|  | 9. a4 dxe5 10. dxe5 Na6 11. O-O Nc5 12. Qe2 Qe8 | ||
|  | 13. Ne4 Nbxa4 14. Bxa4 Nxa4 15. Re1 Nb6 16. Bd2 a4 | ||
|  | 17. Bg5 h6 18. Bh4 Bf5 19. g4 Be6 20. Nd4 Bc4 | ||
|  | 21. Qd2 Qd7 22. Rad1 Rfe8 23. f4 Bd5 24. Nc5 Qc8 | ||
|  | 25. Qc3 e6 26. Kh2 Nd7 27. Nd3 c5 28. Nb5 Qc6 | ||
|  | 29. Nd6 Qxd6 30. exd6 Bxc3 31. bxc3 f6 32. g5 hxg5 | ||
|  | 33. fxg5 f5 34. Bg3 Kf7 35. Ne5 Nxe5 36. Bxe5 b5 | ||
|  | 37. Rf1 Rh8 38. Bf6 a3 39. Rf4 a2 40. c4 Bxc4 | ||
|  | 41. d7 Bd5 42. Kg3 Ra3 43. c3 Rha8 44. Rh4 e5 | ||
|  | 45. Rh7 Ke6 46. Re7 Kd6 47. Rxe5 Rxc3 48. Kf2 Rc2 | ||
|  | 49. Ke1 Kxd7 50. Rexd5 Kc6 51. Rd6 Kb7 52. Rd7 Ka6 | ||
|  | 53. R7d2 Rxd2 54. Kxd2 b4 55. h4 Kb5 56. h5 c4 | ||
|  | 57. Ra1 gxh5 58. g6 h4 59. g7 h3 60. Be7 Rg8 | ||
|  | 61. Bf8 h2 62. Kc2 Kc6 63. Rd1 b3 64. Kc3 h1Q | ||
|  | 65. Rxh1 Kd5 66. Kb2 f4 67. Rd1 Ke4 68. Rc1 Kd3 | ||
|  | 69. Rd1 Ke2 70. Rc1 f3 71. Bc5 Rxg7 72. Rxc4 Rd7 | ||
|  | 73. Re4 Kf1 74. Bd4 f2 0-1 | ||
|  | </textarea> | ||
|  | 
 | ||
|  | </body> | ||
|  | </html> | ||
|  | 
 |