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>
 | |
| 
 |