/* * 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 */ // 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) "use strict"; var encodingCharSet_dec; var encodingCharSet_enc; var encodingCharSet = encodingCharSet_dec = "$0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; var encodingVersion_dec; var encodingVersion_enc; var encodingVersion = encodingVersion_dec = 1; var errorString; if (((encodingCharSet_enc != undefined) && (encodingCharSet_enc != encodingCharSet_dec)) || ((encodingVersion_enc != undefined) && (encodingVersion_enc != encodingVersion_dec))) { errorString = "error: PGN encoding/decoding mismatch"; if (typeof myAlert == "function") { myAlert(errorString); } else { alert(errorString); } } function DecodePGN(bytes) { if (bytes.charAt(bytes.length - 1) != encodingCharSet.charAt(encodingVersion)) { errorString = "error: PGN encoding version mismatch (e:" + bytes.charAt(bytes.length - 1) + " d:" + encodingCharSet.charAt(encodingVersion) + ")"; if (typeof myAlert == "function") { myAlert(errorString); } else { alert(errorString); } } var originalLength = parseInt(bytes.match(/^[0-9]*/), 10); bytes = bytes.replace(/^[0-9]*\$/,""); var l = new Array(); 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; }