/*******************************************************************************
    Kropkidlpl -- play Kropki online.
    Copyright (C) 2008  Jakub Grzegorzek and Bartek Dyda
     email: kropki (at) yahoo (dot) co (dot) uk

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/

function pokazHistorieZciacha(){
    var historia = znajdzCiastko("historia");
    if (historia != 'brak'){
	var ruch = historia.split("x");
	if (ruch.length > 1){
	    for(var n=ruch.length-1; n>=0; n-=2){
		wyswietlKropke(ruch[n],1);
	    }
	    for(var n=ruch.length-2; n>=0; n-=2){
		wyswietlKropke(ruch[n],2);
	    }

	}
    }
}

function doCiacha(xy){
    var ciacho;
    ciacho = znajdzCiastko("historia");
    if (ciacho == 'brak'){
	ciacho = xy;
    }else{
	ciacho += 'x' + xy;
    }
    upieczCiacho("historia",ciacho);
}


function wezNazweGracza(ktory_gracz)
// ktory_gracz == 1 albo 2
// dane bierze ze zmiennej globalne insgf
// nie silimy sie na pelna ogolnosc -- szukamy np. PB[
//  (czyli w nazwie wszystkie nawiasy [ powinny byc ,,uciekane'': \[)
{
  var wlasnosc = (ktory_gracz==1) ? "PB[" : "PW[";
  var odkad = insgf.indexOf(wlasnosc);
  if (odkad<0) return "";  // nie ma nazwy
  var aktsgf = insgf.substring(odkad + wlasnosc.length);
  // szukaj nawiasu zamykajacego kw bez poprzedzajacej palki
  var ind = aktsgf.indexOf("]");
  if (ind<0) return "";  // nie ma nawiasu zamykajacego
  if (ind>0) {
    // jest nawias, ale moze poprzedzony palka -- szukaj jeszcze raz
    ind = aktsgf.search(/[^\\]]/);
    if (ind<0) return "";   // niby jest nazwa, ale niezamknieta nawiasem (bez palki)
    ind++;   // bo wzorzec zaczyna sie od [^\\]
  }
  aktsgf = aktsgf.substring(0, ind);
  // zamien w nim \. na .  (dla dow. znaku .)
  var koniec = aktsgf.length;
  var wynik = "";
  for (var i=0; i<koniec; i++) {
    var z = aktsgf.substr(i,1);
    if (z=="\\") {
      i++;
      if (i<koniec) break;
      wynik += aktsgf.substr(i,1);
    }
    else wynik += z;
  }
  return wynik;
}

function zastapWlasnoscKorzenia(wlasnosc, nowa_wartosc)
// w korzeniu insgf szuka podanej wlasnosci i zastepuje je wartosc nowa
// jesli takiej wlasnosci nie ma, nie robi nic
{
  wlasnosc += "[";
  // szukaj miejsca
  var odkad = insgf.indexOf(wlasnosc);
  if (odkad<0) return "";  // nie ma nazwy
  var poczsgf = insgf.substring(0, odkad + wlasnosc.length);
  var aktsgf = insgf.substring(odkad + wlasnosc.length);
  // szukaj nawiasu zamykajacego kw bez poprzedzajacej palki
  var ind = aktsgf.indexOf("]");
  if (ind<0) return "";  // nie ma nawiasu zamykajacego
  if (ind>0) {
    // jest nawias, ale moze poprzedzony palka -- szukaj jeszcze raz
    ind = aktsgf.search(/[^\\]]/);
    if (ind<0) return "";   // niby jest nazwa, ale niezamknieta nawiasem (bez palki)
    ind++;   // bo wzorzec zaczyna sie od [^\\]
  } 
  var koniecsgf = aktsgf.substring(ind);
  // przygotuj wlasnosc
  nowa_wartosc = nowa_wartosc.replace(/\\/g,"\\\\");
  nowa_wartosc = nowa_wartosc.replace(/:/g,"\\:");
  nowa_wartosc = nowa_wartosc.replace(/]/g,"\\]");
  nowa_wartosc = nowa_wartosc.replace(/\[/g,"\\[");
  //
  insgf = poczsgf + nowa_wartosc + koniecsgf;
}

function dodajNazweGracza(kolor, nazwa)
{
  zastapWlasnoscKorzenia(((kolor==1) ? "PB" : "PW"), nazwa);  
}

function wyswietlPlikSgf(insgff){
    id("plansza").innerHTML = "";  // wyczysc stare
    var jg = new jsGraphics("plansza");
//    var pp = insgff.indexOf("\n;"); //szuka pierwszej lini zaczynającej się od \n; czyli właściwej treści sgf
    var kk = insgff.lastIndexOf(')'); //szuka ostatniego nawiasu )
//    insgff = insgff.substring(pp+2,kk); //zostawia tylko właściwą treść sgf
    insgff = insgff.substring(0,kk); //zostawia tylko właściwą treść sgf
    insgff = insgff.replace(/\n/g,'');

    dodajNazweGracza(1, opisGracza);

    poczatkowaTablicaKropek();  // wyzeruj plansze
    jg.clear();   // wyczysc rysunki
    var ruchy = insgff.split(";");
    for(var n=2; n<ruchy.length; n++){    // n=2, czyli zacznij od wlasciwego sgf
	var kolor;
	if (ruchy[n].substring(0,2) == "W["){
	    kolor = 2;
	}else if (ruchy[n].substring(0,2) == "B["){
	    kolor = 1;
	}
	else continue;   // to nie ruch (pusta linia?)


	var ruchGracza = ruchy[n].substring(2,ruchy[n].length-1).split(".");

	kropki[ruchGracza[0]] = kolor;
	if (n == ruchy.length-1){
	    var ostatniaKropka = ruchGracza[0];
	}

//	alert(ruchGracza.length);
	if (ruchGracza.length > 1){
	    for(k=1; k<ruchGracza.length; k++){
		Stop(jg,ruchGracza[k],kolor);

	    }
	}

    }
    var napis = "";
    for(var i=0; i<=imax; i++){
        for(var j=0; j<=jmax; j++){
	    var xy = litera[i] + litera[j];
	    if (kropki[xy] & 3)
		napis += wyswietlKropkeStr(xy, (kropki[xy] & 3), ostatniaKropka);
        }
    }

    id("kropki").innerHTML = napis;

	// dla testu
//	jg.setFont("arial","15px",Font.ITALIC_BOLD);
//	var tekst = "Gracz 1: " + wezNazweGracza(1) + ".";
//	jg.drawString(tekst,550,20);
    id("punktyProgramu").innerHTML = punktacja[0];
    id("punktyGracza").innerHTML = punktacja[1];


    Krata(jg);

    jg.paint();
}

function wczytajPlikSgf(co,ajax){
    if (co == "wyslij"){
	ajaxWyslijGet(url+"kropki.py", "co=pokazsgf&sgf="+escape(sgf), 'wczytajPlikSgf');
    }else{
	insgf = decodeURIComponent(ajax);
	wyswietlPlikSgf(insgf);
    }
}

function nowaNazwaDlaPlikuSgf(id){
    var d = new Date();
    var dzien = d.getDate();
    var miesiac = d.getMonth() + 1;
    return id + '.' + dzien + '.' + miesiac + '.' + d.getHours() + '.' + d.getMinutes() + '.' + d.getSeconds() + '.sgf';
}

//uzywane w nowyOpisGracza i wpiszNick
function zabezpiecz(txt){
    opisGracza = opisGracza.replace(/</g,'&#60;');
    opisGracza = opisGracza.replace(/>/g,'&#62;');
    opisGracza = opisGracza.replace(/`/g,'&#8216;');
    opisGracza = opisGracza.replace(/\'/g,'&#8217;');
    return txt;
}

function nowyOpisGracza(){
    if (id("opisGracza").value != ""){
	opisGracza = id("opisGracza").value;
	opisGracza = zabezpiecz( opisGracza );
    }else{
	opisGracza = idGracza;
    }
    upieczCiacho("opisGracza",opisGracza);
}

function dajOpisGracza(){
    opisGracza = znajdzCiastko("opisGracza");
    if ((opisGracza == 'brak') || (opisGracza == '')){
	opisGracza = idGracza;
	upieczCiacho("opisGracza",opisGracza);
    }
    if (opisGracza == idGracza){
	id("opisGracza").value = "";
    }else{
	id("opisGracza").value = opisGracza;
    }
}

function czyMySieZnamy(){
    idGracza = znajdzCiastko("idGracza");
    //jezeli gracz jest nowy, czyli dana osoba poraz pierwszy na stronie
    if (idGracza == 'brak'){
	idGracza = "";
	for(var n=0; n<5; n++){
	    //losuje litere z przedziału a ... z
	    var litera = String.fromCharCode( Math.floor( 97 + Math.random() * 25 ) );
	    idGracza += litera;
	}
	upieczCiacho("idGracza",idGracza);
	dajOpisGracza();
	sgf = nowaNazwaDlaPlikuSgf(idGracza);
	jakaGra = "nowa";
    }else{
	dajOpisGracza();
	sgf = znajdzCiastko("sgf");
	if (sgf == "brak"){
	    sgf = nowaNazwaDlaPlikuSgf(idGracza);
	    jakaGra = "nowa";	    
	}else{
	    jakaGra = "kontynuacja";
	}

    }
}

function wpiszNick(dalej){
    id("jakNieMaOpisuGracza").style.display = "block";
    id("opisGraczaZielony").value = "";
    id("opisGraczaZielony").focus();
    id("okNick").onclick = function(){
	var opis = id("opisGraczaZielony").value;
	if ( opis != ""){
	    id("jakNieMaOpisuGracza").style.display = "none";
	    opisGracza = zabezpiecz( opis );
	    upieczCiacho("opisGracza",opisGracza);
	    dajOpisGracza(); //aby się pojawił opis gracza w input po prawej
	    if (dalej == 'zakonczGre') zakonczGre();
	    if (dalej == 'graZczlowiekiem') dajGreZczlowiekiem();
	}
    }
}

function zakonczGre(){
    if ( insgf.substring(20).indexOf(';')>0 ){ //sprawdza, czy jest choć jeden ruch (co poznaje po ;)
	
	if ((opisGracza == idGracza) || (opisGracza == "")){
	    wpiszNick('zakonczGre');
	    return true;
	}
	wczytajRanking('wyslij','iAktualizuj');
    }

    poczatkowaTablicaKropek();    
    id("plansza").innerHTML = "";
    id("kropki").innerHTML = "";
    killCiacho("sgf");
    sgf = nowaNazwaDlaPlikuSgf(idGracza);
    insgf = "(;GM[40]FF[4]\n" +
	"SZ[" + (imax+1) + "]\n" +
	"DT[" + data() + "]\n" +
	"PB[]PW[kropki8347.2/0T]\n" +
	"RU[1]AP[Kropki:0083.47]\n" + 
	")";
    rysowaniePlanszy();

//    window.location.reload();
}

var moznaWczytacRanking = true;
function wczytajRanking(co,jak){
    if (co == "wyslij"){
	if (moznaWczytacRanking){
	    id("tabelaRankingu").innerHTML = '<img style="padding-top:30px; padding-left:1px;" src="czekajKolo.gif">';
	    id("topTygodnia").innerHTML = '<img style="padding-top:30px; padding-left:1px;" src="czekajKolo.gif">';
	    if (jak == 'tylko'){
		ajaxWyslijPost(url+'kropki.py', 'co=rankingtylko', 'wczytajRanking');
	    }else if (jak == 'zNowymOpisem'){
		ajaxWyslijPost(url+'kropki.py','co=rankingznowymopisem&idgracza=' + idGracza + 
			       '&opisgracza=' + encodeURIComponent(opisGracza), 'wczytajRanking' );
	    }else{
		ajaxWyslijPost(url+'kropki.py','co=rankingznowymmiejscemopisem&idgracza=' + idGracza + 
			       '&punktygracza=' + punktacja[0] + '&punktykropek=' + punktacja[1] + 
			       '&opisgracza=' + encodeURIComponent(opisGracza) + 
			       '&sgf=' + encodeURIComponent(sgf),
			       'wczytajRanking');
	    }
	    moznaWczytacRanking = false;
	}
    }else{
	var ajax = decodeURIComponent(jak);
	while(ajax.substring(ajax.length-1) == "\n"){ //obcina \n\n na koncu
	    ajax = ajax.substring(0,ajax.length-1);
	}
	var p = ajax.indexOf(">>>"); // rozdziela ranking dnia od topTygodnia
	wyswietlRanking(ajax.substring(0,p-1));
	wyswietlTopTygodnia(ajax.substring(p+4));
	moznaWczytacRanking = true;
    }
}

function sortujacaF(dane1, dane2)
{
  return dane2[1] - dane1[1];
}

function skladajTabele(ranking){
    var tabela = '<table id="tRanking">';
    var wiersz = ranking.split("\n");
    var dane = new Array(wiersz.length);
    for(var n=0; n<wiersz.length; n++)
	dane[n] = wiersz[n].split(' <> ');
    dane.sort(sortujacaF);

    for(var n=0; n<wiersz.length; n++){
	var info = dane[n];
	var miejsce = n+1;
	if (idGracza == info[0]){
	    tabela += '<tr id="gracz"><td>'+miejsce+'. </td><td>';
	}else{
	    tabela += '<tr><td>'+miejsce+'. </td><td>';
	}

	for(var k=1; k<3; k++){ tabela += info[k] + '</td><td>'; }
	
	if (info.length == 4){
	    if (info[3] == 'brak'){
		tabela += '-</td><td>';
	    }else{
		tabela += info[3]+'</td><td>';
	    }
	}else{
	    tabela += '<a href="http://eidokropki.reaktywni.pl/index.phtml#url:kropkidlpl-' + 
		    info[4] + '">' + info[3] + '</a></td></tr>';
	}
    }

    tabela += '</table>';
    return tabela;
}

function jakNieMaRankingu(gdzie,info){
    setTimeout("id(\""+gdzie+"\").innerHTML = \"<span>" + info + "</span>\";",1500);
}

function wyswietlRanking(ranking){
    id("aktualizuj").onclick = function(){ wczytajRanking('wyslij','zNowymOpisem'); }
    if (ranking == "nieOk"){
	jakNieMaRankingu("tabelaRankingu","Nikt jeszcze dzisiaj nie grał.");
	return true;
    }
    setTimeout('id("tabelaRankingu").innerHTML = \'' + skladajTabele(ranking) + '\';',2000);
}

function wyswietlTopTygodnia(ranking){
    if (ranking == "nieOk"){
	jakNieMaRankingu("topTygodnia","Nikt jeszcze w tym tygodniu nie uzyskał dodatniej liczby punktów.");
	return true;
    }
    setTimeout('id("topTygodnia").innerHTML = \'' + skladajTabele(ranking) + '\';',2000);
}



