﻿function parser() {

	// Unfortunately commentaries have to be parsed for the whole PGN file and stored in this class
	// because it is necessary to split the file into games correctly
	var commentaries = [];

	// Special commentaries
	var nags = [];
	var nagEn = [];
	var nagFr = [];
	var nagRu = [];
	var nagDe = [];
	var nagEs = [];
	var nagIt = [];
	
	nags["English"] = nagEn;
	nags["French"] = nagFr;
	nags["Russian"] = nagRu;
	nags["German"] = nagDe;
	nags["Spanish"] = nagEs;
	nags["Italian"] = nagIt;
	
	nagEn[1] = "!";
	nagEn[2] = "?";
	nagEn[3] = "!!";
	nagEn[4] = "??";
	nagEn[5] = "!?";
	nagEn[6] = "?!";
	nagEn[7] = "the only move";
	nagEn[8] = "the only move";
	nagEn[9] = "worst move";
	nagEn[10] = "equal chances";
	nagEn[11] = "equal chances";
	nagEn[12] = "equal chances";
	nagEn[13] = "unclear";
	nagEn[14] = "white stands slightly better";
	nagEn[15] = "black stands slightly better";
	nagEn[16] = "White has the upper hand";
	nagEn[17] = "Black has the upper hand";
	nagEn[18] = "White has a decisive advantage";
	nagEn[19] = "Black has a decisive advantage";
	nagEn[20] = "White has a crushing advantage";
	nagEn[21] = "Black has a crushing advantage";
	nagEn[22] = "zugzwang";
	nagEn[23] = "zugzwang";
	nagEn[30] = "Development advantage";
	nagEn[31] = "Development advantage";
	nagEn[36] = "With iniative";
	nagEn[37] = "With iniative";
	nagEn[40] = "With attack";
	nagEn[41] = "With attack";
	nagEn[44] = "With compensation for the material";
	nagEn[45] = "With compensation for the material";
	nagEn[130] = "With counter-play";
	nagEn[131] = "With counter-play";
	nagEn[201] = "An inaccuracy";
	nagEn[202] = "An error";
	nagEn[203] = "A blunder";
	nagEn[204] = "The second error in a row";
	nagEn[205] = "Not the best continuation";
	nagEn[206] = "White fails to take advantage of the opponent's error";
	nagEn[207] = "Black fails to take advantage of the opponent's error";
	nagEn[211] = "Stronger is";
	nagEn[212] = "More promising is";
	nagEn[213] = "Preferable is";
	nagEn[214] = "Worth attention is";
	nagEn[215] = "An interesting alternative is";
	nagEn[216] = "Better is";
	nagEn[217] = "More stubborn is";
	nagEn[221] = "retains an advantage";
	nagEn[222] = "retains an approximate equality";
	nagEn[223] = "gives a chance to save the game";
	nagEn[231] = "White stands slightly better";
	nagEn[232] = "Black stands slightly better";
	nagEn[233] = "White's chances are slightly better";
	nagEn[234] = "Black's chances are slightly better";
	nagEn[235] = "White's position is slightly more promising";
	nagEn[236] = "Black's position is slightly more promising";
	nagEn[237] = "Chances are equal ";
	nagEn[238] = "The position is approximately equal";
	nagEn[239] = "Chances are mutual";
	nagEn[240] = "Double-edged play";
	nagEn[241] = "White is winning";
	nagEn[242] = "Black is winning";
	nagEn[243] = "White has a decisive advantage ";
	nagEn[244] = "Black has a decisive advantage ";
	nagEn[245] = "White has an initiative ";
	nagEn[246] = "Black has an initiative ";
	nagEn[247] = "White's king is in danger";
	nagEn[248] = "Black's king is in danger";
	nagEn[249] = "White develops a dangerous attack";
	nagEn[250] = "Black develops a dangerous attack";
	nagEn[251] = "White has a pair of bishops ";
	nagEn[252] = "Black has a pair of bishops";
	nagEn[253] = "There arises a quiet position with a slight white advantage";
	nagEn[254] = "There arises a quiet position with a slight black advantage";
	nagEn[255] = "White king is deprived of castling ";
	nagEn[256] = "Black king is deprived of castling";
	nagEn[257] = "In the ensuing endgame white's chances are slightly better";
	nagEn[258] = "In the ensuing endgame black's chances are slightly better";
	nagEn[259] = "A passed pawn secures an advantage for White   ";
	nagEn[260] = "A passed pawn secures an advantage for Black  ";
	nagEn[261] = "Both sides exchange blows ";
	nagEn[263] = "An unpleasant pin granting a slight advantage to White";
	nagEn[264] = "An unpleasant pin granting a slight advantage to Black";
	nagEn[265] = "White has good compensation for sacrificed material";
	nagEn[266] = "Black has good compensation for sacrificed material";
	nagEn[267] = "White has no compensation for lacking material";
	nagEn[268] = "Black has no compensation for lacking material";
	nagEn[269] = "White has a material advantage";
	nagEn[270] = "Black has a material advantage";
	nagEn[271] = "The ensuing closed position is favorable for White ";
	nagEn[272] = "The ensuing closed position is favorable for Black";
	nagEn[291] = "With a threat of";
	nagEn[292] = "With the idea of";
	nagEn[501] = "A rare move";
	nagEn[502] = "The main continuation is";
	nagEn[503] = "Novelty";
	nagEn[504] = "Previously occured";
	nagEn[505] = "An old move";
	nagEn[506] = "Recently more popular is the continuation";
	nagEn[507] = "This move has not occurred at the high level before";
	nagEn[508] = "Leading chessplayers prefer";
	nagEn[509] = "The more reliable continuation is";
	nagEn[510] = "Worth attention is";
	nagEn[511] = "This move becomes more and more unpopular ";
	
	nagRu[1] = "!";
	nagRu[2] = "?";
	nagRu[3] = "!!";
	nagRu[4] = "??";
	nagRu[5] = "!?";
	nagRu[6] = "?!";
	nagRu[7] = "единственный ход";
	nagRu[8] = "единственный ход";
	nagRu[9] = "худщий ход";
	nagRu[10] = "равные шансы";
	nagRu[11] = "равные шансы";
	nagRu[12] = "равные шансы";
	nagRu[13] = "неясность";
	nagRu[14] = "у белых небольшой перевес";
	nagRu[15] = "у черный небольшой перевес";
	nagRu[16] = "у белых ощутимый перевес";
	nagRu[17] = "у черных ощутимый перевес";
	nagRu[18] = "у белых решающее преимущество";
	nagRu[19] = "у черных решающее преимущество";
	nagRu[20] = "у белых разгромное преимущество";
	nagRu[21] = "у черных разгромное преимущество";
	nagRu[22] = "цуцванг";
	nagRu[23] = "цуцванг";
	nagRu[30] = "преимущество в развитии";
	nagRu[31] = "преимущество в развитии";
	nagRu[36] = "с инициативой";
	nagRu[37] = "с инициативой";
	nagRu[40] = "с атакой";
	nagRu[41] = "с атакой";
	nagRu[44] = "с компенсацией за материал";
	nagRu[45] = "с компенсацией за материал";
	nagRu[201] = "Неточность";
	nagRu[202] = "Ошибка";
	nagRu[203] = "Грубая ошибка";
	nagRu[204] = "Вторая ошибка подряд";
	nagRu[205] = "Не лучшее продолжение";
	nagRu[206] = "Белые не воспользовались ошибкой соперника";
	nagRu[207] = "Черные не воспользовались ошибкой соперника";
	nagRu[211] = "Сильнее было";
	nagRu[212] = "Перспективнее";
	nagRu[213] = "Предпочтительнее было";
	nagRu[214] = "Заслуживало внимания";
	nagRu[215] = "Интересной альтернативой было";
	nagRu[216] = "Лучше";
	nagRu[217] = "Упорнее было";
	nagRu[221] = "сохраняло перевес";
	nagRu[222] = "сохраняло примерное равновесие";
	nagRu[223] = "оставляло шансы на спасение";
	nagRu[231] = "У белых немного лучше";
	nagRu[232] = "У черных немного лучше";
	nagRu[233] = "Шансы белых немного выше";
	nagRu[234] = "Шансы черных немного выше";
	nagRu[235] = "Позиция белых неcколько перспективнее";
	nagRu[236] = "Позиция черных неcколько перспективнее";
	nagRu[237] = "Шансы сторон равны ";
	nagRu[238] = "Позиция примерно равна";
	nagRu[239] = "Шансы сторон взаимны";
	nagRu[240] = "Обоюдоострая игра";
	nagRu[241] = "У белых выиграно";
	nagRu[242] = "У черных выиграно";
	nagRu[243] = "У белых решающий перевес  ";
	nagRu[244] = "У черных решающий перевес ";
	nagRu[245] = "У белых инициатива ";
	nagRu[246] = "У черных инициатива ";
	nagRu[247] = "Белый король в опасности";
	nagRu[248] = "Черный король в опасности";
	nagRu[249] = "Белые развивают опасную атаку";
	nagRu[250] = "Черные развивают опасную атаку";
	nagRu[251] = "У белых преимущество 2-х слонов ";
	nagRu[252] = "У черных преимущество 2-х слонов";
	nagRu[253] = "Возникла спокойная позиция с небольшим перевесом белых";
	nagRu[254] = "Возникла спокойная позиция с небольшим перевесом черных";
	nagRu[255] = "Белый король лишился рокировки ";
	nagRu[256] = "Черный король лишился рокировки";
	nagRu[257] = "В возникшем эндшпиле шансы белых несколько выше";
	nagRu[258] = "В возникшем эндшпиле шансы черных несколько выше";
	nagRu[259] = "Проходная пешка обеспечивает перевес белым   ";
	nagRu[260] = "Проходная пешка обеспечивает перевес черным  ";
	nagRu[261] = "Стороны обмениваются ударами ";
	nagRu[263] = "Неприятная связка, дающая небольшой перевес белым";
	nagRu[264] = "Неприятная связка, дающая небольшой перевес черным";
	nagRu[265] = "У белых хорошая компенсация за материальный перевес";
	nagRu[266] = "У черных хорошая компенсация за материальный перевес";
	nagRu[267] = "У белых нет компенсации за отсутствующий материал";
	nagRu[268] = "У черных нет компенсации за отсутствующий материал";
	nagRu[269] = "У белых материальный перевес";
	nagRu[270] = "У черных материальный перевес";
	nagRu[271] = "Возникшая закрытая позиция в пользу белых ";
	nagRu[272] = "Возникшая закрытая позиция в пользу черных";
	nagRu[291] = "C угрозой";
	nagRu[292] = "C идеей";
	nagRu[501] = "Редкий ход";
	nagRu[502] = "Основное продолжение";
	nagRu[503] = "Новинка";
	nagRu[504] = "Ранее встречалось";
	nagRu[505] = "Старый ход";
	nagRu[506] = "В последнее время популярнее продолжение";
	nagRu[507] = "Ход, не применявшийся на высоком уровне";
	nagRu[508] = "Ведущие шахматисты предпочитали";
	nagRu[509] = "Более надежное продолжение";
	nagRu[510] = "Заслуживает внимания";
	nagRu[511] = "Ход становится непопулярным";
	
	nagDe[201] = "Eine Ungenauigkeit";
	nagDe[202] = "Ein Fehler";
	nagDe[203] = "Ein grober Fehler";
	nagDe[204] = "Ein zweiter Fehler in Folge";
	nagDe[205] = "Nicht die beste Fortsetzung. Mehr verspricht...";
	nagDe[206] = "Wei? versaumt es, aufgrund eines gegnerischen Fehlers Vorteil zu erlangen. Starker ist...";
	nagDe[207] = "Schwarz versaumt es, aufgrund eines gegnerischen Fehlers Vorteil zu erlangen. Starker ist...";
	nagDe[211] = "Starker ist...";
	nagDe[212] = "Verspricht mehr";
	nagDe[213] = "Vorzuziehen ist...";
	nagDe[214] = "Beachtung verdient...";
	nagDe[215] = "Eine interessante Alternative ist...";
	nagDe[216] = "Besser ist...";
	nagDe[217] = "Hartnackiger ist...";
	nagDe[221] = "behalt einen Vorteil";
	nagDe[222] = "behalt annahernd Ausgleich";
	nagDe[223] = "Gibt ein Chance die Partei zu retten";
	nagDe[231] = "Wei? steht geringfugig besser (mit einem kleinen Vorteil)";
	nagDe[232] = "Schwarz steht geringfugig besser (mit einem kleinen Vorteil)";
	nagDe[233] = "Die wei?en Chancen sind geringfugig besser";
	nagDe[234] = "Die schwarzen Chancen sind geringfugig besser";
	nagDe[235] = "Die wei?e Stellung verspricht etwas mehr";
	nagDe[236] = "Die schwarze Stellung verspricht etwas mehr";
	nagDe[237] = "Die Chancen sind gleich";
	nagDe[238] = "Die Stellung ist annahernd gleichwertig";
	nagDe[239] = "Die Chancen sind beiderseitig";
	nagDe[240] = "Zweischneidiges Spiel";
	nagDe[241] = "Wei? gewinnt";
	nagDe[242] = "Schwarz gewinnt";
	nagDe[243] = "Wei? hat entscheidenden Vorteil";
	nagDe[244] = "Schwarz hat entscheidenden Vorteil";
	nagDe[245] = "Wei? hat die Initiative";
	nagDe[246] = "Schwarz hat die Initiative";
	nagDe[247] = "Der wei?e Konig ist in Gefahr";
	nagDe[248] = "Der schwarze Konig ist in Gefahr";
	nagDe[249] = "Wei? entwickelt einen gefahrlichen Angriff";
	nagDe[250] = "Schwarz entwickelt einen gefahrlichen Angriff";
	nagDe[251] = "Wei? hat ein Lauferpaar";
	nagDe[252] = "Schwarz hat ein Lauferpaar";
	nagDe[253] = "Es entsteht eine ruhige Stellung mit leichtem wei?en Vorteil.";
	nagDe[254] = "Es entsteht eine ruhige Stellung mit leichtem schwarzen Vorteil.";
	nagDe[255] = "Der wei?e Konig hat sein Rochaderecht verloren.";
	nagDe[256] = "Der schwarze Konig hat sein Rochaderecht verloren.";
	nagDe[257] = "In dem folgenden Endspiel sind die wei?en Chancen geringfugig besser";
	nagDe[258] = "In dem folgenden Endspiel sind die schwarzen Chancen geringfugig besser";
	nagDe[259] = "Ein Freibauer sichert einen wei?en Vorteil";
	nagDe[260] = "Ein Freibauer sichert einen schwarzen Vorteil";
	nagDe[261] = "Schlagabtausch beider Parteien";
	nagDe[263] = "Eine unangehme Fesselung gewahrt einen leichten wei?en Vorteil.";
	nagDe[264] = "Eine unangehme Fesselung gewahrt einen leichten schwarzen Vorteil.";
	nagDe[265] = "Wei? hat gute Kompensation fur den materiellen Nachteil";
	nagDe[266] = "Schwarzute Kompensation fur den materiellen Nachteil";
	nagDe[267] = "Wei? hat keine Kompensation fur das fehlende Material";
	nagDe[268] = "Scgwarz hat keine Kompensation fur das fehlende Material";
	nagDe[269] = "Wei? hat materiellen Vorteil";
	nagDe[270] = "Schwarz hat materiellen Vorteil";
	nagDe[271] = "Die darauf folgende geschlossene Stellung ist fur Wei? vorzuziehen";
	nagDe[272] = "Die darauf folgende geschlossene Stellung ist fur Schwarz vorzuziehen";
	nagDe[291] = "mit der Drohung";
	nagDe[292] = "mit der Idee";
	nagDe[501] = "Ein seltener Zug";
	nagDe[502] = "Hauptfortsetzung ist";
	nagDe[503] = "Neuheit";
	nagDe[504] = "Zuvor aufgetreten";
	nagDe[505] = "Ein alter Zug";
	nagDe[506] = "In der letzten Zeit ist folgende Fortsetzung popularer";
	nagDe[507] = "Dieser Zug ist bis jetzt nicht auf hohem Niveau gespielt worden";
	nagDe[508] = "Fuhrende Schachspieler bevorzugen";
	nagDe[509] = "ist eine zuverlassigere Fortsetzung";
	nagDe[510] = "Wert zu beachten ist";
	nagDe[511] = "Dieser Zug wird immer unpopularer";
	
	nagFr[201] = "Une imprecision";
	nagFr[211] = "Plus fort est…";
	nagFr[205] = "Ce n'est pas la meilleure suite. ";
	nagFr[212] = "Plus prometteur est…";
	nagFr[213] = "Preferable est…";
	nagFr[214] = "Merite attention…";
	nagFr[215] = "Une alternative interessante est…";
	nagFr[202] = "Une erreur";
	nagFr[216] = "Meilleur est…";
	nagFr[221] = "conserve l'avantage";
	nagFr[222] = "conduit a une egalite approximative";
	nagFr[203] = "Une gaffe";
	nagFr[204] = "Une 2eme erreur d'affile";
	nagFr[217] = "Plus subtil est…";
	nagFr[206] = "Les blancs ratent l'occasion de tirer avantage de l'erreur adverse. Plus fort est…";
	nagFr[207] = "Les noirs ratent l'occasion de tirer avantage de l'erreur adverse. Plus fort est…";
	nagFr[231] = "Les blancs sont legerement mieux (petit avantage)";
	nagFr[232] = "Les noirs sont legerement mieux (petit avantage)";
	nagFr[233] = "Les chances des blancs sont legerement superieures";
	nagFr[234] = "Les chances des noirs sont legerement superieures";
	nagFr[235] = "La position blanche est plus prometteuse";
	nagFr[236] = "La position noire est plus prometteuse";
	nagFr[237] = "Les chances sont egales";
	nagFr[238] = "La position est approximativement egale";
	nagFr[239] = "Avec des chances des deux cotes";
	nagFr[240] = "Jeu a double tranchant";
	nagFr[241] = "Les blancs gagnent";
	nagFr[242] = "Les noirs gagnent";
	nagFr[243] = "Les blancs ont un avantage decisif";
	nagFr[244] = "Les noirs ont un avantage decisif";
	nagFr[245] = "Les blancs ont l'initiative";
	nagFr[246] = "Les noirs ont l'initiative";
	nagFr[247] = "Le roi blanc est en danger";
	nagFr[248] = "Le roi noir est en danger";
	nagFr[249] = "Les blancs developpent une attaque dangereuse";
	nagFr[250] = "Les noirs developpent une attaque dangereuse";
	nagFr[251] = "Les blancs ont la paire de fous";
	nagFr[252] = "Les noirs ont la paire de fous";
	nagFr[253] = "Une position tranquille survient avec un leger avantage blanc";
	nagFr[254] = "Une position tranquille survient avec un leger avantage noir";
	nagFr[255] = "Le roi blanc est prive du roque";
	nagFr[256] = "Le roi noir est prive du roque";
	nagFr[257] = "Dans la finale qui s'en suit, les chances des blancs sont legerement superieures";
	nagFr[258] = "Dans la finale qui s'en suit, les chances des noirs sont legerement superieures";
	nagFr[259] = "Le pion passe donne un avantage aux blancs";
	nagFr[260] = "Le pion passe donne un avantage aux noirs";
	nagFr[261] = "Les deux camps font des echanges";
	nagFr[263] = "Un clouage deplaisant donnant un leger avantage aux blancs";
	nagFr[264] = "Un clouage deplaisant donnant un leger avantage aux noirs";
	nagFr[265] = "Les blancs ont de bonnes compensations pour l'avantage materiel";
	nagFr[266] = "Les noirs ont de bonnes compensations pour l'avantage materiel";
	nagFr[267] = "Les blancs n'ont pas de compensation a leur perte de materiel";
	nagFr[268] = "Les noirs n'ont pas de compensation a leur perte de materiel";
	nagFr[269] = "Les blancs ont l'avantage materiel";
	nagFr[270] = "Les noirs ont l'avantage materiel";
	nagFr[271] = "La position fermee qui survient est favorable aux blancs";
	nagFr[272] = "La position fermee qui survient est favorable aux noirs";
	nagFr[291] = "avec la menace";
	nagFr[292] = "avec l'idee";
	nagFr[501] = "Un coup rare";
	nagFr[502] = "La suite principale est";
	nagFr[503] = "nouveaute";
	nagFr[504] = "Deja vu";
	nagFr[505] = "Un coup ancien";
	nagFr[506] = "Recemment plus populaire est la suite";
	nagFr[507] = "A ce jour, ce coup n’est jamais apparu au top niveau";
	nagFr[508] = "Les joueurs de haut niveau preferent";
	nagFr[509] = "est une suite plus efficace";
	nagFr[510] = "Merite attention";
	nagFr[511] = "Ce coup est de moins en moins apprecie";
	
	nagEs[201] = "Error";
	nagEs[202] = "Error";
	nagEs[203] = "Grave error ";
	nagEs[204] = "Segundo error consecutivo";
	nagEs[205] = "No es la mejor jugada";
	nagEs[206] = "Las blancas no aprovecharon el error del rival. Mas fuerte era ...";
	nagEs[207] = "Las negras no aprovecharon el error del rival. Mas fuerte era ...";
	nagEs[211] = "Mas fuerte es...";
	nagEs[212] = "Mas prometedor es...";
	nagEs[213] = "Preferable is";
	nagEs[214] = "Interesante era ...";
	nagEs[215] = "La alternativa interesante era ...";
	nagEs[216] = "Mejor era...";
	nagEs[217] = "Mas resistente era";
	nagEs[221] = "Mantenia ventaja ...";
	nagEs[222] = "Mantenia aproximado equilibrio...";
	nagEs[223] = "gives a chance to save the game";
	nagEs[231] = "Las blancas estan mejor";
	nagEs[232] = "Las negras estan mejor";
	nagEs[233] = "Chances de las blancas son un poco mejores";
	nagEs[234] = "Chances de las negras son un poco mejores";
	nagEs[235] = "La posicion de las blancas es un poco mas interesante";
	nagEs[236] = "La posicion de las negras es un poco mas interesante";
	nagEs[237] = "Los chances son igualados";
	nagEs[238] = "La posicion es equilibrada";
	nagEs[239] = "Ambos tienen chances. ";
	nagEs[240] = "Juego complejo";
	nagEs[241] = "Las blancas estan ganando";
	nagEs[242] = "Las negras estan ganando";
	nagEs[243] = "Las blancas tienen ventaja decisiva ";
	nagEs[244] = "Las negras tienen ventaja decisiva ";
	nagEs[245] = "Las blancas tienen iniciativa ";
	nagEs[246] = "Las negras tienen  iniciativa ";
	nagEs[247] = "El rey blanco esta en peligro";
	nagEs[248] = "El rey negro esta en peligro";
	nagEs[249] = "Las blancas desarollan un ataque peligroso";
	nagEs[250] = "Las negras desarollan un ataque peligroso";
	nagEs[251] = "Las blancas tienen ventaja de pareja de alfiles ";
	nagEs[252] = "Las negras tienen ventaja de pareja de alfiles ";
	nagEs[253] = "Tenemos la posicion tranquila con ligera ventaja de las blancas";
	nagEs[254] = "Tenemos la posicion tranquila con ligera ventaja de las negras";
	nagEs[255] = "El rey blanco ha perdido el enroque ";
	nagEs[256] = "El rey negro ha perdido el enroque ";
	nagEs[257] = "En el final chances de las blancas son un poco superiores";
	nagEs[258] = "En el final chances de las negras son un poco superiores";
	nagEs[259] = "El peon pasado garantiza la ventaja a las blancas  ";
	nagEs[260] = "El peon pasado garantiza la ventaja a las negras  ";
	nagEs[261] = "Los oponentes estan intercambiando golpes ";
	nagEs[263] = "Clavada fastidiosa que da cierta ventaja a las blancas.";
	nagEs[264] = "Clavada fastidiosa que da cierta ventaja a las negras.";
	nagEs[265] = "Las blancas tienen buena compensacion por el material ";
	nagEs[266] = "Las negras tienen buena compensacion por el material ";
	nagEs[267] = "Las blancas no tienen compensacion por el material";
	nagEs[268] = "Las negras no tienen compensacion por el material";
	nagEs[269] = "Las blancas tienen ventaja material";
	nagEs[270] = "Las negras tienen ventaja material";
	nagEs[271] = "La posicion cerrada que tenemos es ventajosa para las blancas ";
	nagEs[272] = "La posicion cerrada que tenemos es ventajosa para las negras ";
	nagEs[291] = "Сon amenaza";
	nagEs[292] = "Сon idea";
	nagEs[501] = "Una jugada rara";
	nagEs[502] = "La continuacion principal es";
	nagEs[503] = "Novedad";
	nagEs[504] = "Se encontraba antes";
	nagEs[505] = "jugada vieja";
	nagEs[506] = "ultimamente la continuacion mas popular es";
	nagEs[507] = "Esta jugada nunca ha utilizada en los juegos de un alto nivel";
	nagEs[508] = "Los jugadores dirigentes prefieren";
	nagEs[509] = "La continuacion mas segura";
	nagEs[510] = "Merece la atencion";
	nagEs[511] = "Esta jugada se pone a estar mas y mas popular";

	nagIt[201] = "Imprecisione";
	nagIt[211] = "Piu forte sarebbe...";
	nagIt[205] = "Non e la continuazione migliore. Piu promettente sarebbe...";
	nagIt[213] = "Sarebbe preferibile...";
	nagIt[214] = "Degna di attenzione sarebbe...";
	nagIt[215] = "Un'alternativa interessante sarebbe...";
	nagIt[202] = "Errore";
	nagIt[211] = "Piu forte sarebbe...";
	nagIt[216] = "Migliore sarebbe...";
	nagIt[221] = "mantiene il vantaggio";
	nagIt[222] = "mantiene un'uguaglianza approssimativa";
	nagIt[203] = "Svista";
	nagIt[204] = "Secondo errore della serie";
	nagIt[217] = "Piu ostinata sarebbe...";
	nagIt[206] = "Il Bianco non riesce a trarre vantaggio dall'errore dell'avversario. Piu forte sarebbe...";
	nagIt[207] = "Il Nero non riesce a trarre vantaggio dall'errore dell'avversario. Piu forte sarebbe...";
	nagIt[231] = "Il Bianco sta un po' meglio (con piccolo vantaggio)";
	nagIt[232] = "Il Nero sta un po' meglio (con piccolo vantaggio)";
	nagIt[233] = "Le chance del Bianco sono leggermente migliori";
	nagIt[234] = "Le chance del Nero sono leggermente migliori";
	nagIt[235] = "La posizione del Bianco e un poco piu promettente";
	nagIt[236] = "La posizione del Nero e un poco piu promettente";
	nagIt[237] = "Le chance sono uguali";
	nagIt[238] = "La posizione e praticamente uguale";
	nagIt[239] = "Le chance sono reciproche";
	nagIt[240] = "Gioco per entrambe le parti";
	nagIt[241] = "Il Bianco vince";
	nagIt[242] = "Il Nero vince";
	nagIt[243] = "Il Bianco ha un vantaggio decisivo";
	nagIt[244] = "Il Nero ha un vantaggio decisivo";
	nagIt[245] = "Il Bianco ha l'iniziativa";
	nagIt[246] = "Il Nero ha l'iniziativa";
	nagIt[247] = "Il Re bianco e in pericolo";
	nagIt[248] = "Il Re nero e in pericolo";
	nagIt[249] = "Il Bianco sta sviluppando un attacco pericoloso";
	nagIt[250] = "Il Nero sta sviluppando un attacco pericoloso";
	nagIt[251] = "Il Bianco ha la coppia di Alfieri";
	nagIt[252] = "Il Nero ha la coppia di Alfieri";
	nagIt[253] = "Si e creata una posizione tranquilla con un piccolo vantaggio per il Bianco";
	nagIt[254] = "Si e creata una posizione tranquilla con un piccolo vantaggio per il Nero";
	nagIt[255] = "Il Re bianco perde il diritto di arrocco";
	nagIt[256] = "Il Re nero perde il diritto di arrocco";
	nagIt[257] = "Nel finale derivante il Bianco ha un leggero vantaggio";
	nagIt[258] = "Nel finale derivante il Nero ha un leggero vantaggio";
	nagIt[259] = "Il Pedone passato assegna un vantaggio al Bianco";
	nagIt[260] = "Il Pedone passato assegna un vantaggio al Nero";
	nagIt[261] = "Cambi da entrambe le parti";
	nagIt[263] = "Sgradevole inchiodatura che concede un leggero vantaggio al Bianco";
	nagIt[264] = "Sgradevole inchiodatura che concede un leggero vantaggio al Nero";
	nagIt[265] = "Il Bianco ha una buona compensazione per il vantaggio di materiale";
	nagIt[266] = "Il Nero ha una buona compensazione per il vantaggio di materiale";
	nagIt[267] = "Il Bianco non ha nessuna compensazione per lo svantaggio di materiale";
	nagIt[268] = "Il Nero non ha nessuna compensazione per lo svantaggio di materiale";
	nagIt[269] = "Il Bianco e in vantaggio di materiale";
	nagIt[270] = "Il Nero e in vantaggio di materiale";
	nagIt[271] = "La posizione chiusa derivante e favorevole al Bianco";
	nagIt[272] = "La posizione chiusa derivante e favorevole al Nero";
	nagIt[291] = "con la minaccia di";
	nagIt[292] = "con l'idea di";
	nagIt[212] = "Piu promettente sarebbe...";
	nagIt[223] = "da la possibilita di salvare una partita";
	nagIt[501] = "Mossa inconsueta";
	nagIt[502] = "La continuazione principale e";
	nagIt[503] = "Novita";
	nagIt[504] = "Avvenuto in precedenza";
	nagIt[505] = "Vecchia  mossa";
	nagIt[506] = "La continuazione recente piu popolare e";
	nagIt[507] = "Mossa mai giocata prima ad alti livelli";
	nagIt[508] = "I giocatori piu forti preferiscono";
	nagIt[509] = "e una continuazione piu affidabile";
	nagIt[510] = "Degna di attenzione e";
	nagIt[511] = "Questa mossa sta diventando sempre piu impopolare";
	
	
	this.rules = new chessRules();

	// Parses the PGN file, splits it for every game and creates game objects
	this.parsePGN = 
	function(PGN) {
		commentaries = [];
		// IE uses \r\n, Gecko browsers use \n
		PGN = PGN.replace(/\r\n/g,"\n");
		// Replace bracket {} commentaries because the can mess up how we determine the game edges, store them in array
		PGN = PGN.replace(/\{([\W\w]*?)\}/g, function($1) {
			commentaries.push($1.substring(1, $1.length - 1));
			return "{" + (commentaries.length - 1) + "}";
		});

		// Replace strings (because they can contain the semicolon comments,
		// which could once again cripple our ability to parse the games correctly) and store them in array
		var tagStrings = [];
		PGN = PGN.replace(/"([^"\\\r\n]*(?:\\.[^"\\\r\n]*)*)"/g, function($1) {
			// Also attempt to replace back "nested" {} comments because they can appear inside these strings
			var tagValue = $1.replace(/\{([\d]+)\}/g, function ($1) {
				return commentaries[$1.substring(1, $1.length - 1)];
			});
			tagStrings.push(tagValue.substring(1, tagValue.length - 1));
			return "\"" + (tagStrings.length - 1) + "\"";
		});

		// Replace semicolon this.commentaries and store them in array
		PGN = PGN.replace(/(;[\W\w]*?)\n/, function($1) {
			// Also attempt to replace back "nested" {} comments because they can appear inside semicolon commentaries
				commValue = $1.replace(/\{([\d]+)\}/g, function ($1) {
				return "{" + commentaries[$1.substring(1, $1.length - 1)] + "}";
			});
			commentaries.push(commValue.substring(1, commValue.length));
			return "{" + (commentaries.length - 1) + "}\n";
		});
		
		// Split the Games
		var gamesArray = PGN.match(/(\[[\W\w]*?(?:0-1|1-0|1\/2-1\/2|\*))(?:[\s]+|$)/g);


		// Create Game object for every game in PGN file
		if (gamesArray != null) {
			for (var i = 0; i < gamesArray.length; i++) {
				var game;
				var ifNew = true;
				if (broadcast.games[i]) {
					ifNew = false;
					game = broadcast.games[i];
				} else {
					game = new chessGame();
				}
				// Add tags from the tag section to game object
				var tagsArray = gamesArray[i].match(/(\[[\W\w]*?\])/g);
				for (var j = 0; j < tagsArray.length; j++) {
					var tagMatch = tagsArray[j].match(/\[[\s]*([\w]+)[\s]*"([\d]+)"[\s]*\]/);
					game.tags[tagMatch[1]] = tagStrings[tagMatch[2]];
				}
				
				var notation = gamesArray[i].replace(/(\[[\W\w]*?\])/g, "");
				// Strip the numbers notation 
				// (this doesn't quite follow the PGN import format, as the numbers MUST end with at least one dot)
				// But virtually every PGN file has dot after the number, and its so much easier to execute
				// regular expression, mainly because JavaScript has no lookbehind support for regular expressions
				notation = notation.replace(/\b[\d]+[\s]*[\.]+/g, "");

				// Recursive variations are just that, recursive and require a loop to be parsed, mainly because 
				// JavaScript's regular expressions do not support the recursion
				// While having recursive variations,it looks for deepest one and replaces it
				while(/\([^\(\)]*?\)/.test(notation)) {
					notation = notation.replace(/\([^\(\)]*?\)/, function ($1) {
						game.variations.push($1.substring(1, $1.length - 1));
						return "<" + (game.variations.length - 1) + ">";
					});
				}

				// Strip the result (ending), as we store it in game.tags["Result"]
				notation = notation.replace(/[\s]+(?:0-1|1-0|1\/2-1\/2|\*)[\s]+/, "");

				// Assign notation to game object for later parsing
				game.notation = notation;
				
				if(game.lastStamp == -1 || (game.tags["Stamp"] && game.lastStamp < game.tags["Stamp"])) {
					game.displayNotation = [];
				}

				// Add games to games[] array
				if (ifNew) {
					broadcast.games.push(game);
				}
			}
		}
	}

	// Parses the notation of given game. Uses board object
	this.parseNotation = 
	function (board, game) {
		// Determine starting position
		if (game.tags['SetUp']) {
			game.FENs[0].push(game.tags['FEN']);
		} else {
			// Default starting position
			game.FENs[0].push("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1");
		}

		var dispMove = [];
		dispMove["type"] = "start";
		dispMove["fenlink"] = {variation: 0, number: 0};
		game.displayNotation["start"] = dispMove;

		if (!game.currPosition) {
			game.currPosition = game.FENs[0][0];
		}

		// Load starting position into board
		board.loadFEN(game.FENs[0][0]);

		// Parse the notation tokens
		this.parseNotationTokens(board, game, game.notation, 0);
	}

	// Recursive move parsing
	// Also prepare notation for display
	this.parseNotationTokens =
	function (board, game, notation, varNum) {
		var notationTokens = notation.split(/[\s]+/);
		var token;
		// Loop through notation tokens
		for(var i = 0; i < notationTokens.length; i++) {
			token = notationTokens[i];
			// Regular move
			if (/[RBQKPN]?[a-h]?[1-8]?[x]?[a-h][1-8][=]?[QNRB]?[+#]?/.test(token)) {
				this.parseMove(board, game, token, varNum);
			// Castling
			} else if (/(O-O-O|O-O)\+?/.test(token)) {
				this.castle(board, game, token, varNum);
			// Variation
			} else if (/<[\d]+>/.test(token)) {

				var dispMove1 = [];
				dispMove1["type"] = "variation_start";
				game.displayNotation.push(dispMove1);

				var vN = parseInt(token.match(/<([\d]+)>/)[1]);
				// Create arrays for FENs and moves if there are none
				game.FENs[vN] = [];
				
				var saveFEN = board.currentFEN();

				// Loads the previous move
				board.loadFEN(game.FENs[varNum][game.FENs[varNum].length - 2]);
				// First FEN of a variation is a FEN from previous level
				game.FENs[vN][0] = game.FENs[varNum][game.FENs[varNum].length - 2];

				// Parse the variation
				this.parseNotationTokens(board, game, game.variations[vN], vN);

				// Load the latest position when we are finished parsing the variation
				board.loadFEN(saveFEN);

				var dispMove2 = [];
				dispMove2["type"] = "variation_end";
				game.displayNotation.push(dispMove2);
			// Commentary
			} else if (/(\$[\d]+)?\{[\d]+\}/.test(token)) {
				var comNum = token.match(/\{([\d]+)\}/)[1];
				var cM = commentaries[comNum];
				cM = cM.replace(/\&gt\;/g, ">");
				cM = cM.replace(/\&lt\;/g, "<");
				cM = cM.replace(/\&amp\;/g, "&");
				cM = cM.replace(/\$([\d]+)/g, function($1) {
					return nags[broadcast.gui.displayLang][$1.substr(1)];
				});
				var dispMove = [];
				dispMove["type"] = "commentary";
				dispMove["value"] = cM;
				game.displayNotation.push(dispMove);
			// Z0 token - possible continuation of last move
			} else if (/Z0/.test(token)) {
				// Add FEN to game.FENs
				var dispMove = [];
				dispMove["type"] = "z0";
				game.displayNotation.push(dispMove);
				game.FENs[varNum].push(board.currentFEN());
			} else if (/\$[\d]+/.test(token)) {
				var nag = token.match(/\$([\d]+)/)[1];
				var dispMove = [];
				dispMove["type"] = "commentary";
				dispMove["value"] = nags[broadcast.gui.displayLang][nag];
				game.displayNotation.push(dispMove);
			}
		}
	}
	
	this.parseMove =
	function(board, game, token, varNum) {
		var moveArray = token.match(/([RBQKPN])?([a-h])?([1-8])?([x])?([a-h])([1-8])([=]?)([QNRB]?)([+#]?)/);
		var piece;
		if (moveArray[1]) {
			switch (moveArray[1].toLowerCase()) {
			case "r":
				piece = "rook";
				break;
			case "b":
				piece = "bishop";
				break;
			case "q":
				piece = "queen";
				break;
			case "n":
				piece = "knight";
				break;
			case "k":
				piece = "king";
				break;
			default:
				break;
			}
		} else {
			piece = "pawn";
		}

		var fromX = moveArray[2];
		var fromY = moveArray[3];

		var capture;
		if(moveArray[4]) {
			capture = true;
		} else {
			capture = false;
		}

		var toX = moveArray[5];
		var toY = moveArray[6];

		var promotion;
		var promoteTo;
		if(moveArray[8]) {
			promotion = true;
			switch (moveArray[8].toLowerCase()) {
			case "r":
				promoteTo = "rook";
				break;
			case "b":
				promoteTo = "bishop";
				break;
			case "q":
				promoteTo = "queen";
				break;
			case "n":
				promoteTo = "knight";
				break;
			default:
				break;
			}
		} else {
			promotion = false;
			promoteTo = '';
		}

		// Determine the location of the piece to move using chess rules and incomplete information about it
		var pieceXY = eval("this.rules." + piece + "(board, fromX, fromY, toX, toY, capture);");

		var dispMove = [];
		dispMove["type"] = "regular";
		dispMove["token"] = token;
		dispMove["color"] = board.currentMove;
		dispMove["fromto"] = {fromX: pieceXY[0], fromY: pieceXY[1], toX: toX, toY: toY};

		// Make piece move
		board.moveHandler(piece, pieceXY[0], pieceXY[1], toX, toY, capture, promotion, promoteTo);

		// Add FEN to game.FENs
		game.FENs[varNum].push(board.currentFEN());

		dispMove["num"] = board.fullMoves;
		dispMove["fenlink"] = {variation: varNum, number: game.FENs[varNum].length - 1};
		game.displayNotation.push(dispMove);
	}
	
	this.castle =
	function(board, game, token, varNum) {
		var line;
		if (board.currentMove == "white")
			line = 1;
		else
			line = 8;
		
		
		var dispMove = [];
		dispMove["type"] = "regular";
		dispMove["token"] = token;
		dispMove["color"] = board.currentMove;

		// Add move to game.moves[]
		if (/^O-O\+?$/.test(token)) {
			dispMove["fromto"] = {fromX: "e", fromY: line, toX: "g", toY: line};
			
		} else {
			dispMove["fromto"] = {fromX: "e", fromY: line, toX: "c", toY: line};
		}

		// Castle on board
		board.castle(token);

		// Add FEN to game.FENs
		game.FENs[varNum].push(board.currentFEN());

		dispMove["num"] = board.fullMoves;
		dispMove["fenlink"] = {variation: varNum, number: game.FENs[varNum].length - 1};
		game.displayNotation.push(dispMove);
	}
}




