var a=24; // bok kwadratu (w pikselach)
var maxx=20;  // rozmiar
var maxy=20;  // planszy
var imax=maxx-1; //liczba kwadratow w pozomie
var jmax=maxy-1; //liczba kwadratow w pionie
var kropki = new Object();
//kropki["ac"] = 0; nie ma kropki na polu o współrzędnych (a,c)
//kropki["aa"] = 1; kropka niebieska na polu (a,a)  -- gracz B (rozpoczynajacy)
//kropki["de"] = 2; kropka czerwona na polu (d,e)   -- gracz W
var ENCLmask = 4;
var ENCL_DOTmask = 7;
var COUNTEDmask = 8;
//kropki["cd"] = 4; pole niedostępne (wewnątrz stopu) (c,d)
//kropki["cd"] = 5; kropka gracza 1 wewnatrz panstwa
//kropki["cd"] = 6; kropka gracza 2 wewnatrz panstwa
// maska COUNTEDmask:  jesli jest, oznacza, ze kropka jest policzona do punktacji
//   (np. kropka niebieskiego wewn. czerwonego panstwa)

var litera = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
	      'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
	      'O', 'P', 'Q',' R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

var punktacja = new Array(0,0);  // punkty gracza 1, gracza 2
var koniecGry = false;               // czy gra sie skonczyla, jesli tak, nie bedzie mozna postawic kropki
var ktoWygral = '';                  // do wyswietlania kto wygral
var jakWygral = '';                  // do wyswietlania jak wygral (remis, poddanie, na czas, punkty)
var zasadyGry = '';              // zasady gry: 'zagram', 'rosyjskie', 'szkrab', ale na poczatku bez
var zasadyCzasT0 = 0;   // czas poczatkowy
var zasadyCzasT1 = 0;   // czas dodawany

var rK=2; // rozmiar kropki, może być jeszcze 1 i 3

var czekajNaOdp = 0; //gdy 1 nie podswietla ani nie reaguje na klikniecia gracza, czeka na odp z serwera

var jra=1;  // to bedzie obiekt Raphael
var jra_arr; // tutaj sa pamietane obiekty Raphaela, do kasowania
var jra_arr_numery=[]; // tutaj sa pamietane numery ruchow sgf odpowiadajace rysunkom
var jra_arr_okr=null; // a tutaj - obiekty Raphaela odpowiadajace za aktualnie rysowane okrazenie
var jrax0 = 0;
var jray0 = 0;
var max_pl_px = 457;    // max. wielkosc planszy to 457px (24px kwadraty dla planszy 20x20)
var abs_max_pl_px = 557;    // abs. max. wielkosc planszy, do zainicjowania Raphaela

var napisKPop = '';  // poprzednia wartosc id("kropki"), razem z ostatnia kropka


var okrazam = 0;  // 0 = nie okrazam, 1=okrazam, ale jeszcze kropki nie postawilem, 2=okrazam, zaznaczam stop(y)
var okrazenia = '';
var whoPressedStop = 0;
var poprzednieXY = '';

function przyciskiZalezneOdZasad(noweZ, instantWin, rodzajGry, time0, time1){
    //    alert(zasadyGry + '-->' + noweZ);
    if (zasadyGry !== noweZ) {
	zasadyGry = noweZ;
	if (zasadyGry === 'na terytorium'){
	    id('okrazamDiw').style.display = 'inline';
	}else{
	    id('okrazamDiw').style.display = 'none';
	}
	if (zasadyGry === 'bez terytorium'){
	    id('stopDiw').style.display = 'inline';
	}else{
	    id('stopDiw').style.display = 'none';
	}
    }
    var instWinInfo = '. ';
    if (instantWin==15)
	instWinInfo = ', ' + slownik('gra do 15 kropek przewagi') + '. ';
    else if (instantWin==30)
	instWinInfo = ', ' + slownik('gra do 30 kropek przewagi') + '. ';
    var czasInfo;
    if (time0=='0') {
	czasInfo = slownik('Bez limitu czasu') + '. ';
    } else {
	czasInfo = slownik('Czas początkowy') + ' ' + time0 + slownik('s') + ', ' 
	    + slownik('czas dodawany') + ' '
	    + time1 + slownik('s') + '. ';
    }
    var typGry;
    if (rodzajGry=='F') {
	typGry = slownik('Gra towarzyska') + '.';
    }else if (rodzajGry=='A'){
	typGry = slownik('Gra z komputerem') + '.';	
    }else{
	typGry = slownik('Gra rankingowa') + '.';
    }
    id('jakieZasady').innerHTML = slownik('Zasady gry') + ':' + slownik(zasadyGry) + instWinInfo + czasInfo + typGry;
}

function inicjujWlkPl(){
    dodatek = (maxx>=30 || maxy>=30) ? 96 : 0;   // po dodaniu 95 mamy a=19 na 30x30 (jak na 25x25)
    max_pl_px = 457 + dodatek;   // 457 to standard...

    id('glowne').style.width = (max_pl_px - 457 + 1000) + "px";
    //id('obszarGry').style.width = (max_pl_px - 457 + 510) + "px";
    //id('obszarGry').style.height = (max_pl_px - 457 + 540) + "px";
    id('planszaKropek').style.width = (max_pl_px - 457 + 510) + "px";
    id('planszaKropek').style.height = (max_pl_px - 457 + 540) + "px";
    id('poPrawej').style.left = (max_pl_px - 457 + 515) + "px";
    id('tloObszaruGry').style.width = (max_pl_px - 457 + 497) + "px";
    id('tloObszaruGry').style.height = (max_pl_px - 457 + 497) + "px";
    //    id('jakieZasady').style.top = (max_pl_px - 457 + 480) + "px";

    id('okrazamOkno').style.top = (max_pl_px - 457 + 520) + "px";

    id('jakieZasadyWynik').style.top = (max_pl_px - 457 + 590) + "px";
    id('xyRuchu').style.top = (max_pl_px - 457 + 550) + "px";
    id('wlacznikHistorii').style.top = (max_pl_px - 457 + 535) + "px";
    id('ruchPlus').style.top = (max_pl_px - 457 + 535) + "px";
    id('ruchMinus').style.top = (max_pl_px - 457 + 560) + "px";
    id('historiaRuchow').style.top = (max_pl_px - 457 + 535) + "px";
    poprzednieXY='';

    // inicjuje a,imax,jmax,jrax0,jray0  na podstawie maxx i maxy
    imax = maxx-1;  jmax = maxy-1;
    var max = (imax>jmax) ? imax:jmax;
    a = Math.floor(( (max_pl_px-1) / max) + 0.00001);

    // zobacz ile zostaje px niewykorzystanych
    var niewykorzystane_w_poziomie = max_pl_px - (imax*a+1);
    jrax0 = 30+Math.floor(niewykorzystane_w_poziomie/2 + 0.00001);
    //var niewykorzystane_w_pionie = max_pl_px - (jmax*a+1);
    jray0 = 30; //Math.floor(niewykorzystane_w_pionie/2 + 0.00001);
}

function planszaKropek(){
    poczatkowaTablicaKropek();
    rysowaniePlanszy();

}

function poczatkowaTablicaKropek(){
    for(var i=0; i<=imax; i++){
	for(var j=0; j<=jmax; j++){
	    kropki[ litera[i] + litera[j] ] = 0;
	}
    }
    punktacja[0] = 0;
    punktacja[1] = 0;
}


function kasujObiektyRaphael()
{
    while (jra_arr.length > 0) {
	var el = jra_arr.pop();
	el.remove();
    }
    jra_arr_numery = [];
    while (jra_arr_okr.length > 0) {
	var el = jra_arr_okr.pop();
	el.remove();
    }
}

function kasujObiektyRaphaelOkr(){
    while (jra_arr_okr.length > 0) {
	var el = jra_arr_okr.pop();
	el.remove();
    }
}

function inicjujRaphael()
{
    if (jra==1) {
	//jra = Raphael(id("obszarGry"), 44+abs_max_pl_px, 44+abs_max_pl_px);
	jra = Raphael(id("planszaKropek"), 44+abs_max_pl_px, 44+abs_max_pl_px);
	jra_arr = [];
	jra_arr_numery = [];
	jra_arr_okr = [];
	inicjujWlkPl();
    }
}
function inicjujLubKasujRaphael()
{
    if (jra==1) {
	//jra = Raphael(id("obszarGry"), 44+abs_max_pl_px, 44+abs_max_pl_px);
	jra = Raphael(id("planszaKropek"), 44+abs_max_pl_px, 44+abs_max_pl_px);
	jra_arr = [];
	jra_arr_numery = [];
	jra_arr_okr = [];
    }
    else
	kasujObiektyRaphael();
}

function rysowaniePlanszy(){
    inicjujRaphael();
    krata(jra);

    var html = "";
    for(var i=0; i<=imax; i+=1){
	var cofacz = (i>=8) + (i>=33);
	html += '<div class="wspolrzedne" id="wspx' + litera[i] + '" style="position:absolute; top:'
	    + (jray0+3) + 'px; left:' + (pxnAbs(litera[i],0)-4) + 'px; "' +
		'>'+litera[i+cofacz]+'</div>';

	for(var j=0; j<=jmax; j+=1){
	    var wlk = Math.floor((a+2)/3);
	    var pj = pynAbs(litera[j],0)-wlk;
	    var pi = pxnAbs(litera[i],0)-wlk;
	    wlk = 2*wlk+1;
	    /*
	    if (rK == 1){
		var pj = pyn(litera[j],0);
		var pi = pxn(litera[i],0);
	    }else if (rK == 2){
		var pj = pyn(litera[j],0)+2;
		var pi = pxn(litera[i],0)+2;
	    }else if (rK == 3){
		var pj = pyn(litera[j],0)+5;
		var pi = pxn(litera[i],0)+5;		
		}*/
	    //alert(pjn + '***' + pin + '---' + pj + '***' + pi);
	    html += '<div style="position:absolute; top:' + pj + 'px; left:' + pi + 'px; ' +
		'background-color:black; color:black; filter:alpha(opacity=0); -moz-opacity:0; opacity:0; '+
		'width:' + wlk + 'px; height:' + wlk + 'px; padding:0px; margin:0px; font-size:0px;"'+
		'onmouseover=\'podswietlKropke("'+ litera[i] + litera[j] +'")\' '+
		'onmouseout=\'czyszczenieTymczasDiv()\' '+
		'onclick=\'graczStawiaKropke("' + litera[i] + litera[j] +'")\' ' +
		'></div>';
	}
    }
    for(var j=0; j<=jmax; j+=1){
	html += '<div class="wspolrzedne2" id="wspy' + litera[j] + '" style="position:absolute; top:'
	    + (pynAbs(litera[j],0)-6) + 'px; left:' + (jrax0-23) + 'px; "' +
	    '>'+(jmax-j+1)+'</div>';

    }
    id("aktywneNaKursor").innerHTML = html;
}

function krata(jra){
    var path = "";
    var maxXY = (maxx<maxy) ? maxy : maxx;
    var LGrog_x = jrax0;
    var LGrog_y = jray0;
    var PDrog_x = jrax0 + a*(maxx-1) + 1;
    var PDrog_y = jray0 + a*(maxy-1) + 1;
    var poprawkaX = 0;
    var poprawkaY = 0.5;
    for (var i=0; i<maxXY; i++) {
	  if (i<maxx) {
	      var x = (i * a + jrax0) + poprawkaX;
	      path += "M " + x + " " + (LGrog_y+poprawkaY) + "L " + x + " " + (PDrog_y+poprawkaY) +" ";
	  }
	  if (i<maxy) {
	      var y = (i * a + jray0) + poprawkaY;
	      path += "M " + (LGrog_x+poprawkaX) + " " + y + "L " + (PDrog_x+poprawkaX) + " " + y + " ";
	  }
      }
    var tmp = jra.path(path).attr({stroke: "#666666", "stroke-width": 1});
    tmp.toBack();
    jra_arr.push(tmp);  // zapamietaj obiekt
    jra_arr_numery.push(0);
}

//przelozenie polozenia na planszy np. "c" na polozenie w pikselach
function pxnAbs(l,nr_znaku){
    return jrax0 + nrLitery(l.charAt(nr_znaku))*a;
}
function pynAbs(l,nr_znaku){
    return jray0+28 + nrLitery(l.charAt(nr_znaku))*a;
}
function pxn(l,nr_znaku){
    var cofnij;
    if (rK == 1){
	cofnij = 4;
    }else if (rK == 2){
	cofnij = 6;
    }else if (rK == 3){
	cofnij = 9;
    }
    return pxnAbs(l,nr_znaku) - cofnij;
}
function pyn(l,nr_znaku){
    var cofnij;
    if (rK == 1){
	cofnij = 4;
    }else if (rK == 2){
	cofnij = 6;
    }else if (rK == 3){
	cofnij = 9;
    }
    return pynAbs(l,nr_znaku) - cofnij;
}

function podswietlKropke(xy){
    if (czekajNaOdp == 0){
	if (kropki[xy] == 0){
	    if (ktoryGracz == '1'){
		id("tymczas").innerHTML =
		    '<img style="position:absolute; top:' + pyn(xy,1) + 'px; left:' + pxn(xy,0) +'px;" src="kropkaAlfaBlue'+rK+'.gif">';
	    }else{
		id("tymczas").innerHTML =
		    '<img style="position:absolute; top:' + pyn(xy,1) + 'px; left:' + pxn(xy,0) +'px;" src="kropkaAlfaRed'+rK+'.gif">';
	    }
	}else{
	    id("tymczas").innerHTML =
		'<img style="position:absolute; top:' + pyn(xy,1) + 'px; left:' + pxn(xy,0) +'px;" src="obwodka'+rK+'.png">';
	}
	{ 
	    var i = nrLitery(xy.substring(0,1));
	    var cofacz = (i>=8) + (i>=33);
	    id("xyRuchu").innerHTML = litera[i+cofacz] +  (jmax + 1 - nrLitery(xy.substr(1,1)));
	}
	if (poprzednieXY.length>=2){
	    var tlo = id("tloObszaruGry").style.background;
	    id("wspx" + poprzednieXY.substring(0,1)).style.background = tlo;//"#ffffff";
	    id("wspy" + poprzednieXY.substring(1,2)).style.background = tlo;"#ffffff";
	}
	if (xy.length>=2) {
	    id("wspx" + xy.substring(0,1)).style.background = "#77ff77";
	    id("wspy" + xy.substring(1,2)).style.background = "#77ff77";
	    poprzednieXY = xy;
	}
    }
}

function nrLitery(l){
    //    var chr=l.charAt(0);    var kod =  chr.charCodeAt(chr);
    var kod =  l.charCodeAt(0);
    return (kod>=97) ? kod - 97 : kod - 65 + 26;
}

function czyszczenieTymczasDiv(){
    id("tymczas").innerHTML = "";
}

function jestSasiadem(p1, p2){
    var x1 = litera.indeks(p1.substr(0,1));
    var y1 = litera.indeks(p1.substr(1,1));
    var x2 = litera.indeks(p2.substr(0,1));
    var y2 = litera.indeks(p2.substr(1,1));
    var dx = x2-x1;
    var dy = y2-y1;
    return (dx>=-1.1 && dx<=1.1 && dy>=-1.1 && dy<=1.1);
}

function graczStawiaKropke(xy){
    if (koniecGry) {
	id('plansza').innerHTML += '<div style="position:absolute; top:54px; left:4px; background-color:#f2ef91; ' +
	    'border: 1px solid #b2a36c; border-radius:7px; -moz-border-radius:3px; -webkit-border-radius:3px; ' +
	    'padding:5px 0px; width:447px; text-align:center; font:normal 15px verdana;">' +
	    slownik('Gra się już skończyła') + '</div>';
	znikajaceInfo = 2;
    }else if (jestHistoria && ktoryRuchWysw<ruchySgf.length-1){
	// gracz nie widzi wszystkich kropek! - pokaz mu je...
	pokazRuchyDoWsp(xy);
    }else if (okrazam<=1 && kropki[xy] == 0){
	if (kogoRuch == ktoryGracz){
	    if (ktoryGracz == '1'){
		id("kropkiTymczas").innerHTML = '<img style="position:absolute; top:' + pyn(xy,1) + 'px; left:' + pxn(xy,0) + 
		    'px;" src="kropkaBlueOst' + rK+'.gif">';
	    }else{
		id("kropkiTymczas").innerHTML = '<img style="position:absolute; top:' + pyn(xy,1) + 'px; left:' + pxn(xy,0) +
		    'px;" src="kropkaRedOst' + rK+'.gif">';
	    }
	    //jak po 2s czyszczę tymczasową kropkę, powinna być wyświetlana ta z sgf
	    setTimeout('if (insgfPoprzednie.indexOf("[' + xy + '") == -1) id("kropkiTymczas").innerHTML = ""',4000);

	    if (okrazam==0) {
		if (uidStolu == graZKOMP){
		    if (moznaZkomputerem == false){
			id('nieMoznaZkomputerem').style.display = 'block';
			return true;
		    }
		    var ajaxUrl = rootUrl + 'nkropki.py?idGracza=' + idGracza + '&co=graczStawiaKropke&stol=' + 
			encodeURIComponent(uidStolu) + '&gdzie=' + xy;
		}else{
		    nrOstWiadomosci++;
		    var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + idGracza + '&co=graczStawiaKropke&stol=' + 
			encodeURIComponent(uidStolu) + '&gdzie=' + xy + '&msgNo=' + nrOstWiadomosci;
		    ostatniaWiadomosc = 's' + nrOstWiadomosci + '.' + uidStolu + '.' + encodeURIComponent(xy);
		}
		wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
		znikajaceInfo = 0;
		id('plansza').innerHTML = '';
	    } else {
		okrazam = 2;
		okrazenia = xy + '.';
		wyslijOkrazenia();
		okrazamPokazInfo();
	    }
	}else {
	    var info =  (ktoryGracz!='kibic') ? slownik('Teraz jest ruch przeciwnika'):slownik('Nie grasz w tej grze');
	id('plansza').innerHTML += '<div style="position:absolute; top:54px; left:4px; background-color:#f2ef91; ' +
	    'border: 1px solid #b2a36c; border-radius:7px; -moz-border-radius:3px; -webkit-border-radius:3px; ' +
	    'padding:5px 0px; width:447px; text-align:center; font:normal 15px verdana;">' + info  + '</div>';
	znikajaceInfo = 2;
	}
    }else{
	if (okrazam==2 && (kropki[xy]==ktoryGracz || xy==okrazenia.substr(0,2))) {
	    if ((okrazenia.length > 2 && okrazenia.substr(okrazenia.length-2) === xy) ||
		(okrazenia.length > 4 && okrazenia.substr(okrazenia.length-4,2) === xy)) {
		// skasuj kropke z lancucha
		okrazenia = okrazenia.substring(0,okrazenia.length-2);
		wyslijOkrazenia();
		wyswietlPlikSgf(insgfPoprzednie, false, opisGracza);
	    }else{
		if (okrazenia.substr(okrazenia.length-1,1) == '.') {
		    // dodaj kropke do lancucha
		    okrazenia += xy;
		}else{
		    if (jestSasiadem(okrazenia.substr(okrazenia.length-2), xy)) {
			// dodaj kropke do lancucha
			okrazenia += xy;
			var ind = okrazenia.lastIndexOf('.');
			if (okrazenia.substr(ind+1,2) == xy) {
			    // lamana sie zamknela
			    okrazenia += '.';
			}
		    }
		}
		wyslijOkrazenia();
		wyswietlPlikSgf(insgfPoprzednie, false, opisGracza);
	    }
	}else if (okrazam==2 && kropki[xy]==3-ktoryGracz && okrazenia.substr(okrazenia.length-1,1)==='.') {
	    // zamknij kropke
	    var okr = znajdzOkrazenie(xy, okrazenia.substr(0,2));
	    if (okr!=='' && okrazenia.indexOf('.' + okr + '.') == -1) {
		okrazenia += okr + '.';
		wyslijOkrazenia();
		wyswietlPlikSgf(insgfPoprzednie, false, opisGracza);
	    }
	}
    }
}//ajaxNieDoszedl, wyslijZapytanieAjaxBezObslugiOdpowiedzi,okrazamPokazInfo,wyswietlPlikSgf

function ajaxNieDoszedl(){
}

function wezInfoOZasadach(insgff){
    var pocz = insgff.substr(insgff.indexOf('RU[')+3);
    var nawias = pocz.indexOf(']');
    pocz = pocz.substring(0,nawias);
    maxx = parseInt(pocz.substring(0,2));
    maxy = parseInt(pocz.substring(2,4));
    var liczby = pocz.substring(9).split('.');
    var instantWin = parseInt(liczby[0]);
    zasadyCzasT0 = parseInt(liczby[1]);
    zasadyCzasT1 = parseInt(liczby[2]);
    if (pocz.substring(4,6)=='te'){
	przyciskiZalezneOdZasad('na terytorium', instantWin, pocz.substring(8,9), zasadyCzasT0, zasadyCzasT1);
    }else if (pocz.substring(4,6)=='no'){
	przyciskiZalezneOdZasad('bez terytorium', instantWin, pocz.substring(8,9), zasadyCzasT0, zasadyCzasT1);
    }else {
	przyciskiZalezneOdZasad('standardowe', instantWin, pocz.substring(8,9), zasadyCzasT0, zasadyCzasT1);
    }
}

function oznaczKropke(nrRuchu, ozn){
    // oznacza kropke (ozn=true) o zadanym numerze w tablicy ruchySgf, lub kasuje oznaczenie (ozn=false)
    if (nrRuchu<=0 || nrRuchu >= ruchySgf.length) return;
    if (ruchySgf[nrRuchu]){
	id(ruchySgf[nrRuchu].substring(1) + ".").src = "kropka" +
	    ((ruchySgf[nrRuchu].charAt(0)=='B') ? "Blue":"Red") + (ozn?"Ost":"") + rK + ".gif";
    }
}

function zrobNavTree(aktualizujHistorie){
    // aktualizujHistorie: =-1 nic nie rob, =0 zmien tylko polozenie 'current', =1 zrob na nowo
    if (!jestHistoria || aktualizujHistorie == -1) return;  // jesli nie jest widoczna, to nic nie rob
    if (aktualizujHistorie==1) {
	var html = "<table class='nav-tree'><tr>";
	for (var i=0; i<ruchySgf.length; i++) {
	    html += "<td>";
	    html += "<div id='navtree-node-" + i + "'class='" + 
		(i == ktoryRuchWysw ? 'current' :
		 ((i && ruchySgf[i]) ? ruchySgf[i].charAt(0) : 'x')) +
		"' onclick='pokazRuchyDo(" + i +", 0)'>" + i + "</div>";
	    html += "</td>";
	}
	html += "</tr></table>";
	id("historiaRuchow").innerHTML = html;
    }else{  // tutaj trzeba zmienic polozenie wskaznika
	for (var i=0; i<ruchySgf.length; i++) {
	    id('navtree-node-'+i).className =
		(i == ktoryRuchWysw ? 'current' :
		 ((i && ruchySgf[i]) ? ruchySgf[i].charAt(0) : 'x'));
	}
    }
}

function wlaczamHistorie(){
    if (jestHistoria) {
	id('wlacznikHistorii').innerHTML = '&gt;';
	id('historiaRuchow').style.display = 'none';
	id('ruchPlus').style.display = 'none';
	id('ruchMinus').style.display = 'none';
	pokazRuchyDo(ruchySgf.length-1, -1);
	jestHistoria = false;
    }else{
	id('wlacznikHistorii').innerHTML = 'X';
	id('ruchPlus').style.display = 'inline';
	id('ruchMinus').style.display = 'inline';
	jestHistoria = true;
	zrobNavTree(1);
	id('historiaRuchow').style.display = 'inline';
    }
}

function pokazRuchyDo(dokad, aktualizujHistorie){
    dokad = (dokad -1) + 1;  // konwersja do inta, gdyby byl to string...
    if (dokad<0) dokad=0;
    else if (dokad>ruchySgf.length-1) dokad=ruchySgf.length-1;

    if (dokad<ktoryRuchWysw) {
	// ukryj czesc ruchow
	for (var i=dokad+1; i<=ktoryRuchWysw; i++) {
	    if (ruchySgf[i]) {
		id(ruchySgf[i].substring(1) + ".").style.visibility = "hidden";
	    }
	}
	// ukryj czesc okrazen
	for (var i=0; i<jra_arr.length; i++)
	    if (jra_arr_numery[i] > dokad) { // trzeba go ukryc
		jra_arr[i].hide();
	    }
	// skasuj podkreslenie akt ostatnia kropke, jesli nie jest ona calkiem ostatnia
	if (ktoryRuchWysw<ruchySgf.length-1) {
	    oznaczKropke(ktoryRuchWysw, false);
	}
	// podkresl akt ostatnia kropke
	oznaczKropke(dokad, true);
    }else if (dokad>ktoryRuchWysw) { // pokaz czesc ruchow
	oznaczKropke(ktoryRuchWysw, false);// skasuj oznaczenie akt ostatniej kropki
	for (var i=ktoryRuchWysw+1; i<=dokad; i++) {
	    // wyswietl ruch [i]...
	    if (ruchySgf[i]) {
		id(ruchySgf[i].substring(1) + ".").style.visibility = "visible";
	    }
	}
	// pokaz czesc okrazen
	for (var i=0; i<jra_arr.length; i++)
	    if (jra_arr_numery[i] <= dokad) { // trzeba go pokazac
		jra_arr[i].show();
	    }
	// podkresl akt ostatnia kropke
	if (dokad<ruchySgf.length-1) {
	    oznaczKropke(dokad, true);
	}
    }
    ktoryRuchWysw = dokad;
    try{  // wynikiSgf moga byc jeszcze niezainicjowane
	id("punktyB").innerHTML = wynikiSgf[ktoryRuchWysw][0];
	id("punktyW").innerHTML = wynikiSgf[ktoryRuchWysw][1];
    }catch(e){};
    zrobNavTree(aktualizujHistorie);
}

function pokazRuchyDoWsp(xy){
    // skacze do ruchu o zadanych wsp, lub na koniec, jesli ruchu nie ma
    if (!jestHistoria) return;
    for (var i=0; i<ruchySgf.length; i++) {
	if (ruchySgf[i].substring(1) == xy) {
	    pokazRuchyDo(i);
	    return;
	}
    }
    pokazRuchyDo(ruchySgf.length-1);
}
function pokazKtoRobiRuch(flagi2, nowyKogoRuch){
    var nowyKoniecGry = false;
    if (flagi2.length > 0 && flagi2.charAt(0)!='S') {
	nowyKoniecGry = flagi2;
    }
    if (nowyKoniecGry) {
	var kto = nowyKoniecGry.charAt(0);
	var jak;
	if (kto == '0') {
	    kto = '';
	    jak = 'remis';
	}else{
	    kto = (kto == 'B') ? graczB : graczW;
	    switch (nowyKoniecGry.charAt(2)) {
	    case 'T': jak = 'na czas'; break;
	    case 'R': jak = 'przeciwnik poddał'; break;
	    default: jak = 'punkty'; break;
	    }
	}
	if (koniecGry != nowyKoniecGry || kto != ktoWygral || jak != jakWygral) {
	    ktoWygral = kto;
	    jakWygral = jak;
	    id("jakiWynik").innerHTML = slownik('Koniec gry') + ', ' + (kto ? (slownik('zwycięzca') + ': ' + kto + ' (' + slownik(jak) + ').') : (slownik('remis') + '.'));
	}
    } else if (ktoWygral || jakWygral) {
	ktoWygral = '';
	jakWygral = '';
	id('jakiWynik').innerHTML = '';
    }
    if (nowyKogoRuch == kogoRuch && nowyKoniecGry == koniecGry)
	return;
    var kolory = ["#c6c396", "#77ee33"];
    if (koniecGry != nowyKoniecGry) {
	koniecGry = nowyKoniecGry;
	if (koniecGry) {
	    id("punktyB").style.background = kolory[0];
	    id("punktyW").style.background = kolory[0];
	    id('zakonczGre').innerHTML = slownik('nowa gra');
	    return;
	} else {
	    id('zakonczGre').innerHTML = slownik('zakończ grę');
	}
    }
    kogoRuch = nowyKogoRuch;
    if (!koniecGry) {
	id("punktyB").style.background = kolory[2-kogoRuch];
	id("punktyW").style.background = kolory[kogoRuch-1];
    }
}
function pokazPunktacje(){
    if (punktacja[0]>=100 || punktacja[1]>=100) {
	id("punktyB").style.fontSize = "10px";
	id("punktyW").style.fontSize = "10px";
	id("dwukropekGorny").style.fontSize = "10px";
    }else{
	id("punktyB").style.fontSize = "15px";
	id("punktyW").style.fontSize = "15px";
	id("dwukropekGorny").style.fontSize = "15px";
    }
    id("punktyB").innerHTML = punktacja[0];
    id("punktyW").innerHTML = punktacja[1];
}
function wyswietlPlikSgf(insgff, odswiez, opisGracza){
    // odswiez: jesli True, rysuje calkiem na nowo sgf-a
    // opisGracza: przydaje sie, jak jest pusty sgf (wtedy mamy gre z kompem)
    //var cz = aktualnyCzas();
    if (insgff == undefined) return;
    insgff = insgff.replace(/\n/g,'');
    var kk = insgff.lastIndexOf(')'); //szuka ostatniego nawiasu )
    var koniecSgfa = insgff.substring(kk+1); //zostawia flagi (lastId_czasy_finished_okrazenie)
    var flagi = koniecSgfa ? koniecSgfa.split('_') : ['','',''];
    // flagi[0] = lastId, flagi[1] = 'czasB.czasW' lub '', flagi[2] = '(finished.scoreB.scoreW)',
    //  flagi[3], jesli sa, to = okrazenie
    var wzieteInfoOZasadach = false;
    if (flagi[1].length >0) {  // sa czasy?
	var czasy = flagi[1].split('.');
	if (czasy[0].charAt(0) == 'p') {
	    if ((pauzaWcisnieta & 1)==0) {
		pauzaWcisnieta |= 1;
		id("pauzaB").style.background = "#77ee33";
	    }
	    czasy[0] = czasy[0].substring(1);
	}else if (pauzaWcisnieta & 1) {
	    pauzaWcisnieta &= ~1;
	    id("pauzaB").style.background = "#ffeedd";
	}
	if (czasy[1].charAt(0) == 'p') {
	    if ((pauzaWcisnieta & 2)==0) {
		pauzaWcisnieta |= 2;
		id("pauzaW").style.background = "#77ee33";
	    }
	    czasy[1] = czasy[1].substring(1);
	}else if (pauzaWcisnieta & 2) {
	    pauzaWcisnieta &= ~2;
	    id("pauzaW").style.background = "#ffeedd";
	}

	id("czasB").innerHTML = czasy[0] + ' ' +slownik('s');
	id("czasW").innerHTML = czasy[1] + ' ' +slownik('s');
	if (ktoryGracz == '1') {
	    id("dodajCzasW").style.display = 'inline';
	    id("dodajCzasB").style.display = 'none';
	    id("pauzaW").style.display = 'inline';
	    id("pauzaB").style.display = (pauzaWcisnieta & 1) ? 'inline' : 'none';
	}else if (ktoryGracz == '2') {
	    id("dodajCzasW").style.display = 'none';
	    id("dodajCzasB").style.display = 'inline';
	    id("pauzaW").style.display = (pauzaWcisnieta & 2) ? 'inline' : 'none';
	    id("pauzaB").style.display = 'inline';
	}else{
	    id("dodajCzasB").style.display = 'none';
	    id("dodajCzasW").style.display = 'none';
	    id("pauzaW").style.display = (pauzaWcisnieta & 2) ? 'inline' : 'none';
	    id("pauzaB").style.display = (pauzaWcisnieta & 1) ? 'inline' : 'none';
	}
	//	var sek = czasy[0] % 60;
	//	id("czasB").innerHTML = (czasy[0]-sek)/60 + ':' + sek;
	//	sek = czasy[1] % 60;
	//	id("czasW").innerHTML = (czasy[1]-sek)/60 + ':' + sek;
//	id("stopery").style.display = 'block';
	id("stopery").style.visibility = 'visible';
    }else{
	if (insgff=='') wezInfoOZasadach('RU[2020stanA0.0.0]');
	else wezInfoOZasadach(insgff);
	wzieteInfoOZasadach = true;
	if (zasadyCzasT0 == 0)
	    id("stopery").style.visibility = 'hidden';
    }
    insgff = insgff.substring(0,kk+1); //zostawia tylko właściwą treść sgf
    // sprawdz STOP
    if (flagi[2] == 'SB') // = B pressed STOP
	whoPressedStop = 1;
    else if (flagi[2] == 'SW') // = W pressed STOP
	whoPressedStop = 2;
    else whoPressedStop = 0;
    // sprawdz czy serwer wyslal okrazenie:
    if (okrazam == 0){   //okrazenia === '') {
	if (flagi.length >= 4){
	    okrazenia = flagi[3];
	    if (kogoRuch == ktoryGracz){
		okrazam = 2;
		okrazamPokazInfo();
	    }
	}
	else okrazenia = '';
    }
    var sgfNowy = insgff;
    var podciag = false;
    if (insgfPoprzednie && !odswiez && 
	insgff.substring(0, insgfPoprzednie.length-1) == insgfPoprzednie.substring(0, insgfPoprzednie.length-1)) { 
	sgfNowy = insgff.substr(insgfPoprzednie.length-1);
	podciag = true;
    }else{
	napisKPop = '';	
    }
    insgfPoprzednie = insgff;

    id('kropkiTymczas').innerHTML = '';
    id('plansza').innerHTML = '';   // czysc ew. info  'Teraz jest ruch gracza...'
    if (!podciag) {
	if (insgff!='') {
	    graczB = insgff.substr(insgff.indexOf('PB[')+3);
	    var nawias = graczB.indexOf(']');
	    graczB = graczB.substring(0,nawias);
	    graczW = insgff.substr(insgff.indexOf('PW[')+3);
	    nawias = graczW.indexOf(']');
	    graczW = graczW.substring(0,nawias);
	    if (!wzieteInfoOZasadach)
		wezInfoOZasadach(insgff);
	    wzieteInfoOZasadach = true;
	    if (graczW.indexOf('.')>=0) // np. 'kropki8347.2_0T'
		graczW = slownik('komputer');
	}else{
	    graczB = opisGracza;
	    graczW = slownik('komputer');
	    if (!wzieteInfoOZasadach)
		wezInfoOZasadach('RU[2020stanA0.0.0]');
	    wzieteInfoOZasadach = true;
	}
	pokazKtoRobiRuch(flagi[2], kogoRuch);

	/*
	// wez wielkosc planszy z sgf-a
	var sz = insgff.indexOf('SZ[');
	if (sz==-1) {
	    maxx=20; maxy=20;
	}
	else{
	    var sub = insgff.substr(sz+3, 8);
	    maxx = parseInt(sub);
	    if (sub.charAt(1)==':' || sub.charAt(2)==':') {
		var where = (sub.charAt(1)==':') ? 2:3;
		maxy = parseInt(sub.substr(where));
	    }
	    else maxy = maxx;
	    if (maxx<5 || maxx>52)
		maxx = 20;
	    if (maxy<5 || maxy>52)
		maxy=20;
		} */
	inicjujWlkPl();

	inicjujLubKasujRaphael();
	planszaKropek();  // wyzeruj plansze, narysuj

	id("graczB").innerHTML = graczB;
	id("graczW").innerHTML = graczW;

	if (graczW == slownik('komputer')){
	    if ((awatary[graczB] == '0') || (!(awatary[graczB]))){
		displayNone('awatarBB')
		displayBlock('dodajSwojAwatar');
		if (graczB.indexOf('*') == 0){ //z gwiazdką więc gość
		    id('dodajSwojAwatar').onclick = function(){ zmienOpisGracza('noweKonto'); };
		}else{
		    id('dodajSwojAwatar').onclick = function(){ zmienOpisGracza('ustawienia'); };
		}
	    }else{
		displayNone('dodajSwojAwatar');
		id('dodajSwojAwatar').onclick = null;
		displayBlock('awatarBB');
		id('imgB').src = (awatary[graczB]) ? 'awatary/' + awatary[graczB] + '.gif' : 'awatar1.png';
	    }
	    id('imgW').src = 'awatar2.png';
	}else{
	    displayNone('dodajSwojAwatar');
	    id('dodajSwojAwatar').onclick = null;
	    displayBlock('awatarBB');
	    id('imgB').src = ((awatary[graczB]) && (awatary[graczB] != '0')) ? 'awatary/' + awatary[graczB] + '.gif' : 'awatar1.png';
	    id('imgW').src = ((awatary[graczW]) && (awatary[graczW] != '0')) ? 'awatary/' + awatary[graczW] + '.gif' : 'awatar2.png';
	}

    } else {  // mamy podciag
	if (!wzieteInfoOZasadach)
	    wezInfoOZasadach(insgff);
	wzieteInfoOZasadach = true;
	pokazKtoRobiRuch(flagi[2], kogoRuch); //(insgff.indexOf('RE[') >= 0);
    }
    // sprawdz czy gracze sa przy grze
    if (uidStolu != graZKOMP){
	id("graczB").style.fontStyle = (opisyGraczy.jest(graczB)) ? "normal" : "italic";
	id("graczW").style.fontStyle = (opisyGraczy.jest(graczW)) ? "normal" : "italic";
    }else{
	id("graczB").style.fontStyle = "normal";
	id("graczW").style.fontStyle = "normal";
    }

    //var kk = sgfNowy.lastIndexOf(')'); //szuka ostatniego nawiasu )
    //sgfNowy = sgfNowy.substring(0,kk); //zostawia tylko właściwą treść sgf

    var noweKropki = new Array();
    var ileNowych = 0;
    var ruchy = sgfNowy.split(";");
    var startujOd = podciag ? 0 : 2;      // n=2, czyli zacznij od wlasciwego sgf
    var nrOstKropki = ruchySgf.length-1;
    if (podciag) {
	;
    }else{
	ruchySgf = [];
	wynikiSgf = [];
	ktoryRuchWysw = 0;
    }
    if (!podciag && ruchy.length>=2) {
	// wyswietl ewentualne kropki AB/AW z ruchy[1] (=root properties)
	ruchySgf.push('');   // dodaj zerowy element (dla korzenia) niezaleznie od tego, czy jest AB, czy nie
	wynikiSgf.push([0,0]);
	var m = ruchy[1].indexOf('AB[');
	if (m>=0) {
	    var rest = ruchy[1].substring(m+3);
	    for (;;) {
		var where = rest.substring(0,2);
		kropki[where] = 1;
		noweKropki[ileNowych++] = where;
		ruchySgf[0] += 'B' + where;
		if (rest.substring(2,4) == '][') {
		    rest = rest.substring(4);
		}
		else break;
	    }
	}
	m = ruchy[1].indexOf('AW[');
	if (m>=0) {
	    var rest = ruchy[1].substring(m+3);
	    for (;;) {
		var where = rest.substring(0,2);
		kropki[where] = 2;
		noweKropki[ileNowych++] = where;
		ruchySgf[0] += 'W' + where;
		if (rest.substring(2,4) == '][') {
		    rest = rest.substring(4);
		}
		else break;
	    }
	}
    }
    for(var n=startujOd; n<ruchy.length; n++){
	var kolor;
	var baseny = 0;
	if (ruchy[n].substring(0,2) == "W["){
	    kolor = 2;
	}else if (ruchy[n].substring(0,2) == "B["){
	    kolor = 1;
	}else if (ruchy[n].substring(0,3) == "TW["){
	    kolor = 2;  baseny = 1;
	}else if (ruchy[n].substring(0,3) == "TB["){
	    kolor = 1;  baseny = 1;
	}
	else continue;   // to nie ruch (pusta linia?)

	ruchySgf.push('');

	if (!baseny) {
	    var ruchGracza = ruchy[n].substring(2,ruchy[n].indexOf(']')).split(".");

	    kropki[ruchGracza[0]] = kolor;
	    noweKropki[ileNowych++] = ruchGracza[0];
	    ruchySgf[ruchySgf.length-1] += (kolor==1 ? 'B':'W') + ruchGracza[0];
	    if (n == ruchy.length-1){
		var ostatniaKropka = ruchGracza[0];
	    }

	    if (ruchGracza.length > 1){
		for(k=1; k<ruchGracza.length; k++){
		    stop(jra,ruchGracza[k],kolor,0, ruchySgf.length-1);
		}
	    }
	} else {
	    // baseny
	    var gdzie = ruchy[n].indexOf(']');
	    var baseny1 = ruchy[n].substring(3, gdzie);
	    var baseny2 = ruchy[n].substr(gdzie+1);
	    if (baseny2.substring(0,3) == "TB[" || baseny2.substring(0,3) == "TW[") {
		baseny2 = baseny2.substring(3, baseny2.length-1);
		baseny1 += baseny2;
	    }
	    var baseny = baseny1.split(".");
	    for (k=0; k<baseny.length; k++)
		if (baseny[k].length > 0)
		    stop(jra, baseny[k], 1, 1, ruchySgf.length-1);// kolor=1 jest dowolny, i tak jest to ustawiane w stop()
	    // wez punktacje
	    if (flagi[2]) {
		var punktTab = flagi[2].split('.');
		if (punktTab.length==3) {
		    punktacja[0] = (punktTab[1] - 1) +1;   // zamien na liczbe
		    punktacja[1] = (punktTab[2] - 1) +1;   // zamien na liczbe
		}
	    }
	    /*
	    gdzie = ruchy[n].indexOf('C[');
	    if (gdzie >= 0) {
		punkty = ruchy[n].substr(gdzie+2);
		gdzie = punkty.indexOf(']');
		punkty = punkty.substr(0, gdzie);
		punkty = punkty.split(':');
		if (punkty.length==2) {
		    punktacja[0] = (punkty[0] -1 ) + 1;   // zamien na liczbe
		    punktacja[1] = (punkty[1] -1 ) + 1;   // zamien na liczbe
		}
	    } */
	}
	// tu mozna by zapamietac wynik w tablicy, zeby sie ladnie wyswietlalo...
	wynikiSgf.push([punktacja[0], punktacja[1]]);
    }

    var napis = '';
    for (var i=0; i<ileNowych; i++) {
	napis += wyswietlKropkeStr(noweKropki[i], (kropki[noweKropki[i]] & 3), ostatniaKropka);
    }

    if (podciag) {
	if (ruchySgf.length-1 > nrOstKropki) {
	    pokazRuchyDo(nrOstKropki, -1);
	    ktoryRuchWysw = ruchySgf.length-1;
	    zrobNavTree(1);
	    pokazPunktacje();
	    if (punktacja[0]>=100 || punktacja[1]>=100) {
		id("punktyB").style.fontSize = "10px";
		id("punktyW").style.fontSize = "10px";
		id("dwukropekGorny").style.fontSize = "10px";
	    }else{
		id("punktyB").style.fontSize = "15px";
		id("punktyW").style.fontSize = "15px";
		id("dwukropekGorny").style.fontSize = "15px";
	    }
	    id("punktyB").innerHTML = punktacja[0];
	    id("punktyW").innerHTML = punktacja[1];
	}
	if (ileNowych) {
	    oznaczKropke(nrOstKropki, false); // zmien ostatnia kropke w zwykla
	    napisKPop = napisKPop.replace('Ost', '');    // zmien ostatnia kropke w zwykla
	    napisKPop += napis;                   // dodaj nowe kr.
	    id("kropki").innerHTML += napis;
	}
    } else {
	id("kropki").innerHTML = napisKPop = napis;
	ktoryRuchWysw = ruchySgf.length-1;
	zrobNavTree(1);
	pokazPunktacje();
    }

    if (uidStolu == graZKOMP){
	id('cofnijDiw').style.display = 'none';
	id('zakonczGre').disabled = false;
    }else{
	var wartosc = (ktoryGracz=='kibic') ? true : false;
	id('zakonczGre').disabled = wartosc;
	id('cofnij').disabled = wartosc;
	id('okrazam').disabled = wartosc;
	id('stop').disabled = wartosc;
	id('cofnijDiw').style.display = 'inline';
    }
    kasujObiektyRaphaelOkr();
    if (okrazenia) {
	var okr = okrazenia.split('.');
	napisOst= wyswietlKropkeStr(okr[0], kogoRuch, okr[0]);
	id("kropkiOst").innerHTML = napisOst;
	for (var i=1; i<okr.length; i++)
	    if (okr[i] != '')
		stop(jra, okr[i], 1,2, -1);  // -1 bez znaczenia
    }else{
	id("kropkiOst").innerHTML = "";
    }
    //var cz2 = aktualnyCzas();
    //alert(cz2-cz + '***' + podciag + '***' + sgfNowy);
}//stop, wyswietlKropkeStr


function stop(jra,stop,kolor, rodzaj, nrRuchuSgf){
    //kolor ==1 albo 2, nie ma znaczenia
    // rodzaj=0 (zwykly stop), lub 1 (basen), lub 2 (tymczasowy stop)
    //nrRuchuSgf sluzy do przegladania historii gry
    var x = new Array();
    var y = new Array();

    //tablica do zaznaczania wnetrza
    var dad = new Array();
    for (var i=0; i<(imax+3)*(jmax+3); i++)
      dad[i] = 0;

    var i=0;
    var pocz_pole=-1;
    var poprz_pole = -1;
    var zamknieta = false;
    for(var n=0; n<stop.length; n+=2){
        var xx = nrLitery( stop.substring(n,n+1)  );
        var yy;
	if (n+2 < stop.length){
	    yy = nrLitery( stop.substring(n+1,n+2)  );
	}else{
	    yy = nrLitery( stop.substring(n+1)  );
	}
	x[i] = jrax0 + xx*a + 0.5;
        y[i] = jray0 + yy*a + 0.5;
	if (poprz_pole>0)
	    dad[wsp(xx,yy)] = poprz_pole;   // zaznacz brzeg stopu
	poprz_pole = wsp(xx,yy);
	if (pocz_pole==-1) {
	  pocz_pole = wsp(xx,yy);
	  var kol2 = kropki[ litera[xx]+litera[yy] ];   // sprawdz, czy stop nie nalezy do 2. gracza
	  if (kol2==1 || kol2==2)
	    kolor = kol2;
	}
	else if (pocz_pole == wsp(xx,yy)) {
	    zamknieta = true;
	    break;   // jest juz lamana zamknieta!
	}
	i++;
    }

    if (rodzaj != 2)
	zaznaczWnetrzeStopu(dad, kolor, rodzaj);
    var path = "M "+x[0] + ' ' + y[0] + ' ';
    for (var i=1; i<x.length; i++) {
	path += "L " + x[i] + ' ' + y[i];
    }
    
    var thisstop;
    if (rodzaj==2) {
	if (zamknieta){
	    thisstop = jra.path(path).attr({stroke: "#cc55cc", "stroke-width": 3});
	}else if (x.length>1){
	    thisstop = jra.path(path).attr({stroke: "#00ff00", "stroke-width": 3});
	}else{
	    // pojedynczy punkt!
	    thisstop = jra.circle(x[0], y[0], 11).attr({stroke: "#00ff00", fill: "#00ff00"});
	}
	thisstop.toFront();
	jra_arr_okr.push(thisstop);
    }else{
	if (kolor == 1){
	    if (rodzaj==0){
		thisstop = jra.path(path).attr({fill: "#a0a7d4", stroke: "black"});
	    }else{
		thisstop = jra.path(path).attr({fill: "#c0c7f4", stroke: "#c0c7f4"});
	    }
	}else{
	    if (rodzaj==0){
		thisstop = jra.path(path).attr({fill: "#da9287", stroke: "black"});
	    }else{
		thisstop = jra.path(path).attr({fill: "#fab2a7", stroke: "#fab2a7"});
	    }
	}
	thisstop.toBack();
    jra_arr.push(thisstop);
    jra_arr_numery.push(nrRuchuSgf);
    }
}//wsp, zaznaczWnetrzeStopu


function wsp(i,j){
    //przelicza wspolrzedne
    //tablicy ,,dwuwymiarowej'' indeksowanej [-1,...,maxx] x [-1,...,maxy]
    //na wspolrzedna jednowymiarowa,
    //ten margines ulatwia sprawdzanie, czy nie wyszlismy poza plansze
    return (i+1)*(maxy+2)+j+1;
}
function dajX(p){
    // pierwsza wsp. funkcji odwrotnej do wsp, konkretnie: wsp( dajX(p), dajY(p) ) == p
    return Math.floor(p / (maxy+2) + 0.000001) - 1;
}
function dajY(p){
    // druga wsp. funkcji odwrotnej do wsp, konkretnie: wsp( dajX(p), dajY(p) ) == p
    return (p % (maxy+2)) - 1;
}
function sasiad(ind, nr){
    // daj sasiada numer nr pola [ind]
    var tab = [-1, maxy+2, 1, -maxy-2];
    return ind + tab[nr];
}
function ind2sgf(ind) {
    return litera[dajX(ind)] + litera[dajY(ind)];
}
function sgf2ind(xy) {
    var x = litera.indeks(xy.substr(0,1));
    var y = litera.indeks(xy.substr(1,1));
    return wsp(x,y);
}

function zaznaczWnetrzeStopu(dad, kolor, basen){
    //ustawia odp. bity ENCLmask i COUNTEDmask w kropki[], we wnetrzu stopu o brzegu podanym w dad
    // (niezerowe dad[...] = pole [...] na brzegu, dad[...] wskazuje kolejna kropke z brzegu)
    //kolor (=1 lub 2) to kolor gracza, ktory zamyka dany stop

    //druga tablica - lista w odwrotnym kierunku
    var dad2 = new Array();
    for (var i=0; i<(imax+3)*(jmax+3); i++)
	if (dad[i]){
	    dad2[ dad[i] ] = i;
	}else{
	    dad2[i] = 0;
	}
    
    var wnetrze = new Array();
    var ile_wewnatrz = 0;

    for (var i=0; i<maxx; i++) {
	var przeciec = 0;
	var zktorej = 0;
	var ind = wsp(i, 0);
	for (var j=0; j<maxy; j++) {
	    if (dad[ind]) {
		var d = (dajX(dad[ind]) - i) + (dajX(dad2[ind]) - i);
		if (zktorej==0) {   // przed chwila nie bylismy na brzegu
		    if (d==0) {
			przeciec ^= 1;   // przecinamy
		    }
		    else if (d==1 || d==-1) {
			zktorej = d;
		    }
		}
		else {  // przed chwila BYLISMY na brzegu
		    if (d) {   // gdy d==0, to dalej bedziemy na brzegu, wiec tylko przypadek d!=0 jest ciekawy
			if (d!=zktorej)
			    przeciec ^= 1;  // przecinamy, a nie przechodzimy bokiem
			zktorej = 0;   // wychodzimy z brzegu
		    }
		}
	    }
	    else if (przeciec){
		wnetrze[ile_wewnatrz++] = ind;
	    }
	    ind++;
	}
	//assert(przeciec==0);
    }

    var przec = 3-kolor;   // przeciwnik

    for (var j=0; j<ile_wewnatrz; j++) {
	var ind = wnetrze[j];
	var x = dajX(ind);
	var y = dajY(ind);
	var wspSgf = litera[x] + litera[y];
	var colour = kropki[wspSgf] & 3;
	if (colour == kolor) {
	    if (kropki[wspSgf] & COUNTEDmask) {
		punktacja[przec-1] -= 1;    // we free our dot
		kropki[wspSgf] &= ~COUNTEDmask;
	    }
	}
	else if (colour == przec) {
	    if ((kropki[wspSgf] & COUNTEDmask) == 0) {
		punktacja[kolor-1] += 1;         // we capture new dot
		kropki[wspSgf] |= COUNTEDmask;
	    }
	}
	kropki[wspSgf] |= ENCLmask;
    }
}

function czySaBasenyKoloru(kolor){
    // zwraca 1, gdy sa baseny podanego koloru, i 0 gdy nie ma

    // zrob powodz zaczynajac od bandy, i zatrzymujac ja na wolnych kropkach o podanym kolorze
    var flood = new Array();
    var stos  = new Array();
    var na_stosie = 0;
    var wielkosc = (maxx+2)*(maxy+2);
    for (var i=0; i<wielkosc; i++)
	flood[i] = 0;
    // dodaj marginesy - pionowe
    for (var j=-1; j<=maxy; j++) {
	flood[wsp(-1  , j)] = 1;
	flood[wsp(maxx, j)] = 1;
	if (j>0 && j<maxy-1) {   // narozniki dodajemy przy okazji poziomych marginesow
	    var ind = wsp(0, j);
	    if ((kropki[ind2sgf(ind)] & ENCL_DOTmask) != kolor) {
		flood[ind] = 1;
		stos[na_stosie++] = ind;
	    }
	    ind = wsp(maxx-1, j);
	    if ((kropki[ind2sgf(ind)] & ENCL_DOTmask) != kolor) {
		flood[ind] = 1;
		stos[na_stosie++] = ind;
	    }
	}
    }
    // dodaj marginesy - poziome
    for (var i=0; i<maxx; i++) {
	flood[wsp(i, -1  )] = 1;
	flood[wsp(i, maxy)] = 1;
	var ind = wsp(i, 0);
	if ((kropki[ind2sgf(ind)] & ENCL_DOTmask) != kolor) {
	    flood[ind] = 1;
	    stos[na_stosie++] = ind;
	}
	ind = wsp(i, maxy-1);
	if ((kropki[ind2sgf(ind)] & ENCL_DOTmask) != kolor) {
	    flood[ind] = 1;
	    stos[na_stosie++] = ind;
	}
    }
    // rob powodz :)
    while (na_stosie) {
	var ind = stos[--na_stosie];
	// odwiedz sasiadow
	for (var k=0; k<4; k++) {
	    var nind = sasiad(ind, k);
	    if (!flood[nind] && (kropki[ind2sgf(nind)] & ENCL_DOTmask) != kolor) {
		flood[nind]=1;
		stos[na_stosie++] = nind;
	    }
	}
    }
    // powodz zrobiona, zobacz, co zostalo wolne...
    for (var i=0; i<wielkosc; i++)
	if (!flood[i] && (kropki[ind2sgf(i)] & ENCL_DOTmask) == 0)
	    return 1;   // sa baseny!
    return 0;   // nie ma basenow!
}

function czySaBaseny(){
    if (zasadyGry === 'bez terytorium') return 0;   // w zasadach bez terytorium nie ma basenow
    if (czySaBasenyKoloru(1)) return 1;
    return czySaBasenyKoloru(2);
}

function findNextOnRight(origin, ngb){
    var kierunki = [-1, maxy+1, maxy+2, maxy+3, 1, -maxy-1, -maxy-2, -maxy-3];
    var wektor = ngb-origin;
    var ind = 0;
    while (ind<7 && kierunki[ind]!=wektor) ind++;
    return origin + kierunki[(ind+1) & 7]
}

function znajdzOkrazenie(kropka, nowaKropka){
    // zwraca okrazenie kropki 'kropka', gdy jest, lub '', gdy nie ma
    //  kropka rowna sie np. 'bc'
    // nowaKropka -- swiezo postawiona nasza kropka
    var czyja = kropki[kropka];
    if (czyja != 1 && czyja !=2)
	return '';
    var przec = 3-czyja;
    // zaznacz brzegi planszy
    var flood = new Array();
    var wielkosc = (maxx+2)*(maxy+2);
    for (var i=0; i<wielkosc; i++)
	flood[i] = 0;
    // dodaj marginesy - pionowe
    for (var j=-1; j<=maxy; j++) {
	flood[wsp(-1  , j)] = -1;  // -1 == poza plansza
	flood[wsp(maxx, j)] = -1;
    }
    // dodaj marginesy - poziome
    for (var i=0; i<maxx; i++) {
	flood[wsp(i, -1  )] = -1;
	flood[wsp(i, maxy)] = -1;
    }
    // rob powodz zaczynajac od kropki, i konczac na kropkach przeciwnika
    var stos  = new Array();
    var na_stosie = 1;
    stos[0] = sgf2ind(kropka);
    flood[stos[0]] = 1;  // wewnatrz
    var leftmost = stos[0];
    var nowaKrPrzec = sgf2ind(nowaKropka);
    while (na_stosie) {
	var ind = stos[--na_stosie];
	// odwiedz sasiadow
	for (var k=0; k<4; k++) {
	    var nind = sasiad(ind, k);
	    if (flood[nind] < 0) // wyszlismy poza plansze
		return ''; 
	    if (!flood[nind]){
		if (kropki[ind2sgf(nind)] != przec && nind!=nowaKrPrzec) {
		    flood[nind]=1;
		    stos[na_stosie++] = nind;
		}else{
		    flood[nind]=2;  // brzeg stopu
		    if (nind<leftmost) leftmost=nind;
		}
	    }
	}
    }
    // teraz przejdz przez potencjalnie brzegowe kropki
    stos[0] = leftmost + (maxy+1);   // +NE
    stos[1] = leftmost;
    flood[stos[0]] |= 4;   // odwiedzone
    flood[stos[1]] |= 4;   // odwiedzone
    stos[2] = findNextOnRight(stos[1], stos[0])
    na_stosie = 3;
    var dlug = 2;
    while (stos[dlug] != stos[0]) {
	while ((flood[stos[dlug]] & 2)==0)
	    stos[dlug] = findNextOnRight(stos[dlug-1], stos[dlug]);
	if (stos[dlug] == stos[0])
	    break;
	if (flood[ stos[dlug] ] & 4){
	    // go back (to our first visit of stos[dlug])
	    var thisPoint = stos[--na_stosie];
	    dlug -= 1;
	    var prevPoint = stos[dlug];
	    while (stos[dlug] != thisPoint) {
		flood[ stos[--na_stosie] ] &= ~4;
		dlug -= 1;
		if (dlug < 0) return '';
	    }
	    stos[na_stosie++] = findNextOnRight(stos[dlug], prevPoint);
	    dlug ++;
	}else{
	    // visit the point
	    flood[ stos[dlug] ] |= 4;
	    dlug ++;
	    stos[na_stosie++] = findNextOnRight(stos[dlug-1], stos[dlug-2]);
	}
    }
    if (dlug<4) return '';
    // zamien na sgf
    var tekst = '';
    for (var i=0; i<=dlug; i++)
	tekst += ind2sgf(stos[i]);
    return tekst;
}


function wyswietlKropkeStr(xy,kolor,ostatniaKropka){
    var x = pxn(xy,0);
    var y = pyn(xy,1);
    var plik = "kropka" + (kolor==1? "Blue":"Red") + (xy==ostatniaKropka?"Ost":"") + rK + ".gif";
    return '<img id="'+xy+'." style="position:absolute; top:' + y + 'px; left:'+ x +'px;" src="' + plik + '">';
}

