/*******************************************************************************
    zagram.org -- play Kropki online.
    Copyright (C) 2008,2009,2010,2011  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/>.
*******************************************************************************/
var idGracza;
var opisGracza;    // opis gracza, ten który sam wprowadzi
var jezykGracza;   // ustawiany przez select w index.html
var deltaHourMin;  // number which should be added to UTC epoch time to get the current hour and min (but not date!)
var xmlhttp;       //globalny xmlhttp
var rootUrl;       //'http://localhost/kropki/', 'http://192.168.0.1/kropki/', 'http://zagram.org/'
var file = 'index';  // typowo 'index', ale mozna zmienic i uzywac innej nazwy pliku html
var czasWyslania;       //czas ostatniego wyslania do serwera
var znikajaceInfo = 0;  // jesli > 0, to zmniejszamy o 1 przy kazdym pobraniu, i czyscimy id('plansza').innerHTML
                        // po zejsciu do 1

var graZKOMP = '0';   // stala
var moznaZkomputerem = true; //jak false to nie można grać z komputerem
var rK = 2;   // rozmiar kropki

var opisyStolow = [];      //toczących się
var tableUIDs   = [];      // uidki stolow w tej samej kolejnosci co opisy
var tableXInfo  = [];      // info o stolach (tag 'x'), w tej samej kolejnosci co opisy
var opisyGraczy = [];      //opisy graczy, którzy są na stronie
var opisyWolnych = [];      //wolnych graczy
var dTags = { 0: ['2020stanA0.0.0', '', 'komputer']};  // info o stolach, w postaci [gameType, playerB, playerW]
var statyGraczy = {};       // slownik, np. statyGraczy['player'] = 'pl1216.1.0.0' (jezyk,rank.wygrane.remisy.przegrane)
// dodatkowo pamietamy: statyGraczy['?' + nick] = 'a' lub 'b' (status: dostepny/zajety)
var awatary = {};          //np. awatary["Jakub"] = "7" (ma 7.gif), awatary["Ewa"] = "0" (nie ma)
var awatarPodglad = 0; //numer awatara przysłanego przez serwer po załadowaniu nowego obrazka
var awatar = 0;   //numer awatara gracza np. 10 co oznacza plik 10.gif w katalogu awatary/
var zaproszenie = null;      //info o ewentualnym zaproszeniu
var propozycja  = null;      //info o ewentualnej propozycji konca gry
var propozycjaPoprzednia  = null;      //poprzednia propozycja

var nrOstWiadomosciWgSerwera =0;   // komendy postawienia kropki i dodania wpisu sa numerowane, jesli
var nrOstWiadomosci = 0;      // nrOstWiadomosci > nrOstWiadomosciWgSerwera, bedziemy ponownie wysylac ostatnia wiadomosc
var ostatniaWiadomosc = 'x';  // ostatnia wyslana wiadomosc

var ustawOpis;  //czy pole do wprowadzenia opisu gracza (nick) jest pokazywane
var wyslijJezyk; // czy trzeba wysylac jezyk przy najblizszej okazji
var opisStolu = "";             //nazwa wyświetlanego stołu
var uidStolu = '0';               //unique id wyswietlanego stolu
var zmieniamStolNa = 'x';        // na jaki stol chce zmienic (uzywane w protokole 2), x = bez zmian
var idZsgfa = '0';              //ostatni idek z aktualnego sgfa
var kibice = {};                //kibice ktorzy moga pisac na stole (do zablokowania), slownik: [uidStolu] -> lista
var nowiMogaPisac = {};         //czy nowoprzybyli domyslnie moga pisac (jesli nie, to mozna ich odblokowac)
var kibiceDoOdbl = {};          //kibice ktorzy nie moga pisac na stole, ale mozna ich odblokowac, slownik: [uidStolu] -> lista

var listaOsob = -1; // czy pokazujemy liste osob (<0 nie, >=0 tak, i to jest ostatni numer
// wiadomosci od serwera)

var poprzedniWpis = '';   //poprzednia zawartość inputa nowyWpis

var subskryb = {};       // ktore stoly sa subskrybowane (pamieta pomocnicze info, czyli hTag, dla kazdego stolu)

var cisza = false;   // czy dzwiek jest kompletnie wylaczony
var statusG = true;  // status gracza (true=przyjmuje zapr, false=nie gra)

var glosnikWlaczony = true;; //od tego zależy czy jest dzwiek przy zapraszaniu
var glosnikWlaczonyPocz = true;  // od tego zależy czy jest dzwiek na poczatek gry
var glosnikWlaczonyRuch = false; //od tego zależy czy jest dzwiek przy ruchu
var ustawieniaAlertu = 1;   // kiedy pokazujemy ostrzezenie przed koncem czasu (maski: &1: gdy mi sie konczy, &2 gdy przec,
                            // &4 gdy jestem kibicem)
var czasAlertu = 15;        // kiedy zaczyna sie pojawiac ostrzezenie
var alertyZSerwera = '';
var przegladarka;           //może być: firefox, opera, ie
var maxWyswOpis = 8; //15;       // jak dlugi nick wyswietlamy bez wykropkowania

var graczB, graczW; // nicki grajacych na stole, uaktualniane przez wyswietlPlikSgf(), uzywane tez przez pokazKtoRobiRuch()

var lastMsgNoFromServer=0;  // uzywane w wahadlo2()

//jeśli trwa automatyczne logowanie pokazuje jego czas
//początkowa wartość 4 umożliwia rozpoczęcie automatycznego logowania w funkcji wahadlo
var czasAutomatycznegoLogowania = 4; 
var kliknietoZmien = false;  //powstrzymuje automatyczne logowanie, gdy kliknięto zmien (opis)
//var kliknietoZmien = 'noweKonto'; //ustaw okno "zakładanie konta" na zaciemnionym tle

var jestSwf = false;        // czy jest obsluga plikow swf (flash)

var tbls = new Tables; // from moveTree.js

function poczatek(){
    infoPrzegladarki();
    prototypy();
    var url = document.location.toString();
    if ( url.indexOf("localhost") > 0 ){
	rootUrl = 'http://localhost/kropki/';
    }else if( url.indexOf("192") > 0){
	rootUrl = 'http://192.168.0.1/kropki/'
    }else{
	rootUrl = 'http://zagram.org/';
    }

    if (wczytajIndexWeWlasciwymJezyku()) return true; //nie ma sensu wykonywać pozostałych poleceń jak jest przekierowanie
    getTimeZone();
    przygotujWSlowa();

    if (id('wyborJezyka1')) id('wyborJezyka1').onchange = function(){ zmienJezyk(1);  } //może być display = none;
    id('wyborJezyka2').onchange = function(){ zmienJezyk(2); }
    
    id('zmienOpisGracza').onclick = function(){ zmienOpisGracza('gosc'); }
    id('glosnikImg').onclick = zamienWyciszenie;
    id('settingsImg').onclick = otworzKolory;
    id('statusImg').onclick = zmienStatus;
    id('zakonczGre').onclick = zakonczGre;
    id('okrazam').onclick = okrazamF;
    id('okrazamCofnij').onclick = anulujeOkrazenie;
    id('okrazamAnuluj').onclick = anulujeOkrazenie;
    id('okrazamAkceptuj').onclick = okrazamF;
    id('stop').onclick = stopF;
    id('cofnij').onclick = cofnijRuch;
    id("ostrzezenieTak").onclick = stopFtak;
    id("ostrzezenieNie").onclick = stopFnie;
    id('blokujKibica').onclick = blokujKibica;
    id('przelacznikCzat').onclick = wlaczCzat;
    id('przelacznikObecni').onclick = wlaczObecni;

    id('wlacznikHistorii').onclick = function(){ tbls.toggleHistory(); };
    id('ruchPlus').onclick = function() { tbls.goToNextMove(); };
    id('ruchMinus').onclick = function() { tbls.goToPrevMove(); };
    id('podazajZaGra').onclick = function() { tbls.historyFollowsGame(); };
    ustawRozmiarKropki();
    id('trzyKropki1').onclick = function(){ zmienRozmiarKropki(1); }
    id('trzyKropki2').onclick = function(){ zmienRozmiarKropki(2); }
    id('trzyKropki3').onclick = function(){ zmienRozmiarKropki(3); }
    id('translator').onclick = function(){ pokazTlumaczenie(); }
    id('dodajCzasW').onclick = function(){ dodajCzas('2'); };
    id('dodajCzasW').onmouseover = new Function('this.style.backgroundColor = pauseOffBackgroundColours[1];this.style.cursor = "default"');
    id('dodajCzasW').onmouseout = new Function('this.style.backgroundColor = pauseOffBackgroundColours[0];');

    id('dodajCzasB').onclick = function(){ dodajCzas('1'); };
    id('dodajCzasB').onmouseover = new Function('this.style.backgroundColor = pauseOffBackgroundColours[1];this.style.cursor = "default"');
    id('dodajCzasB').onmouseout = new Function('this.style.backgroundColor = pauseOffBackgroundColours[0];');

    id('pauzaW').onclick = function(){ pauzuj('2'); };
    id('pauzaW').onmouseover =
	new Function('if (tbls.whoAmI()=="1") {this.style.backgroundColor = (tbls.tables[uidStolu].board.paused & 2) ? "#77cc08":pauseOffBackgroundColours[1];}this.style.cursor = "default";');
    id('pauzaW').onmouseout = new Function('this.style.backgroundColor = (tbls.tables[uidStolu].board.paused & 2) ? "#77ee33":pauseOffBackgroundColours[0];');
    id('pauzaB').onclick = function(){ pauzuj('1'); };
    id('pauzaB').onmouseover = 
	new Function('if (tbls.whoAmI()=="2") {this.style.backgroundColor = (tbls.tables[uidStolu].board.paused & 1) ? "#77cc08":pauseOffBackgroundColours[1];}this.style.cursor = "default";');
    id('pauzaB').onmouseout = new Function('this.style.backgroundColor = (tbls.tables[uidStolu].board.paused & 1) ? "#77ee33":pauseOffBackgroundColours[0];');


    sprawdzCzySieZnamy()

    czat();
    menuKropkiKulki("kropkiKulkiNieZaczete");
    try{
	wahadlo2();
    }catch(e){};
    sprawdzamCzyWahadloSieWaha2();
    initRaphael();
    tbls.addToTable(0, '2020stanA0.0.0', '', 'f0__', '', 'h11', ''); //sr(;RU[2020stanA0.0.0]PW[kropki8410.2_0T]');
    tbls.show(0);
    // dla testu daje palete kolorow pod napisem 'zagram.org' w lewym gornym rogu
    id('adresStrony').onclick = otworzKolory;
    poczatekKolorow();
}
function infoPrzegladarki(){
    var przegladarkaInfo = navigator.userAgent.toLowerCase();
    if ((i = przegladarkaInfo.indexOf('msie')) >= 0) {
	przegladarka = 'ie';
    } else if ((i = przegladarkaInfo.indexOf('firefox')) >= 0) {
	przegladarka = 'firefox';
    } else if ((i = przegladarkaInfo.indexOf('opera')) >= 0) {
	przegladarka = 'opera';
    } else if ((i = przegladarkaInfo.indexOf('chrome')) >= 0) {
	przegladarka = 'chrome';
    }else{
	przegladarka = 'firefox'; //pewnie jakas mozilla
    }

    var obslugiwanePliki = navigator.mimeTypes;
    var dl = obslugiwanePliki.length;
    for(var n=0; n<dl; n++){
        var kilkaRozszerzen = obslugiwanePliki[n]['suffixes'].split(',');
        var dll = kilkaRozszerzen.length;
        for(var k=0; k<dll; k++){
            if (kilkaRozszerzen[k] == 'swf'){
                jestSwf = true;
                return true;
            }
        }
    }

}
function prototypy(){
    Array.prototype.jest = function(element){
	var dlugosc = this.length;
	for(var n=0; n<dlugosc; n++){
	    if (this[n] == element) return true;
	}
	return false;
    }
    Array.prototype.indeks = function(element){
	var dlugosc = this.length;
	for(var n=0; n<dlugosc; n++){
	    if (this[n] == element) return n;
	}
	return -1;
    }
}
function getTimeZone(){
    // note that deltaHourMin is good only to adjust time, not date!
    var d = new Date();
    deltaHourMin = (60*(d.getHours() - d.getUTCHours()) + (d.getMinutes() - d.getUTCMinutes()))*60;
}
function wczytajIndexWeWlasciwymJezyku(){
    jezykGracza = znajdzCiastko('jezykGracza');
    var aktualnyUrl = document.location.toString();
    try {
    var ind = aktualnyUrl.indexOf('?');
    if (ind>=0) {
	var reszta = aktualnyUrl.substr(ind+1);
	var pola = reszta.split('&');
	for (var i=0; i<pola.length; i++) {
	    var rown = pola[i].split('=');
	    if (rown[0] == 'lang' && (rown[1]=='en' || rown[1]=='pl' || rown[1]=='ru' || rown[1]=='ua')) {
		jezykGracza = rown[1];
		killCiacho('jezykGracza');
		upieczCiacho('jezykGracza',decodeURIComponent(rown[1]));
	    }else if (rown[0] == 'id') {
		killCiacho('idGracza');
		upieczCiacho('idGracza',decodeURIComponent(rown[1]));
	    }else if (rown[0] == 'opis') {
		killCiacho('opisGracza');
		upieczCiacho('opisGracza',decodeURIComponent(rown[1]));
	    }
	}
    }
    }catch(e) {};
    if(jezykGracza == 'en'){
	if (aktualnyUrl != rootUrl + file + '.en.html'){
	    document.location = rootUrl + file + '.en.html';
	    return true;
	}
    }else if(jezykGracza == 'ru'){
	if (aktualnyUrl != rootUrl + file + '.ru.html'){
	    document.location = rootUrl + file + '.ru.html';
	    return true;
	}
    }else if(jezykGracza == 'ua'){
	if (aktualnyUrl != rootUrl + file + '.ua.html'){
	    document.location = rootUrl + file + '.ua.html';
	    return true;
	}
    }else{
	if (jezykGracza!='pl') {   //gdyby jezykGracza = ''
	    jezykGracza = 'pl';
	    killCiacho('jezykGracza');
	    upieczCiacho('jezykGracza','pl');
	}
	if ( (aktualnyUrl != rootUrl + file + '.html') && (aktualnyUrl != rootUrl)){
	    document.location = rootUrl;
	    return true;
	}
    }
    return false;

}
function wyslijJezykDoSerwera() {
    if (jezykGracza != 'pl' && jezykGracza != 'en' && jezykGracza != 'ru' && jezykGracza != 'ua')
	jezykGracza = 'pl';
    var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + escape(idGracza) + '&co=changeLang&na='+jezykGracza;
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);       

}
function zmienJezyk(ktorySelectWindex){
    var index = id('wyborJezyka' + ktorySelectWindex).value;
    if ((index == '') || (index == file + '.html')){
	jezykGracza = 'pl';
	upieczCiacho('jezykGracza','pl');
    }else if(index == file + '.en.html'){
	jezykGracza = 'en';
	upieczCiacho('jezykGracza','en');
    }else if(index == file + '.ru.html'){
	jezykGracza = 'ru';
	upieczCiacho('jezykGracza','ru');
    }else if(index == file + '.ua.html'){
	jezykGracza = 'ua';
	upieczCiacho('jezykGracza','ua');
    }
    wyslijJezykDoSerwera();
    document.location = rootUrl + index;

}
function zmienOpisGracza(coWyswietlic){
    //po skasowaniu opisu z ciastka i usera z serwera, wahadło dostaje komende 'ustawOpis'
    kliknietoZmien = coWyswietlic;
    killCiacho('opisGracza');
    if (idGracza.length >= 10) killCiacho('idGracza');
    var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + escape(idGracza) + '&co=usunGracza';
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    resetujZmienne();
}

function resetujZmienne(){
    if (idGracza.length >= 10) idGracza = dajLosoweId();
    opisGracza = '';
    opisyStolow = [];
    tableUIDs   = [];
    tableXInfo  = [];
    opisyGraczy = [];
    opisyWolnych = [];
    statyGraczy = {};
    awatary = {};
    dTags = { 0: ['2020stanA0.0.0', '', 'komputer']}; 
    awatarPodglad = 0;
    awatar = 0;
    zaproszenie = null;
    propozycja  = null;
    propozycjaPoprzednia  = null;
    nrOstWiadomosciWgSerwera =0;
    nrOstWiadomosci = 0;
    ostatniaWiadomosc = 'x';
    opisStolu = "";
    uidStolu = '0';
    zmieniamStolNa = 'x';
    idZsgfa = '0';
    kibice = {};
    nowiMogaPisac = {};
    kibiceDoOdbl = {};

    poprzedniWpis = '';
    lastMsgNoFromServer=0;
    if (listaOsob>=0) listaOsob=0;
    koloryZSerwera = '';
    dzwiekiZSerwera = '';
    zasadyZSerwera = '';
    alertyZSerwera = '';
    wlasnieWczytalemKolory = false;
    document.getElementById('kolory').style.display='none';
    przywrocDomyslneKolory();
}
function killCiacho(nazwa){
    var data = new Date(2000,11,10,19,30,30);
    var ciacho = document.cookie;
    if ((ciacho.indexOf(nazwa+'=') >= 0)) document.cookie = nazwa + '=; expires=' + data.toGMTString() + '; path=/';

}
function wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl){
    try{
	var xmlhttp = makexmlhttp();
	if(xmlhttp){
	    xmlhttp.open('GET', ajaxUrl, true);
	    //z powodu ie6 nie można dać =null, tylko trzeba taką nic nie robiącą funkcje umieścić
	    xmlhttp.onreadystatechange = function(){ 
	    if ( (xmlhttp.readyState == 4) && (xmlhttp.status == 200) ){
		var ajax = xmlhttp.responseText;
	    }}
	    xmlhttp.send(null);
	}
    }catch (e){}

}
function ustawRozmiarKropki(){
    rK = znajdzCiastko('rK');
    if (rK == ''){
	rK=2;
	upieczCiacho('rK',rK);
    }else{
	rK = parseInt(rK);
    }
    tbls.changeDefaultDotSize(rK);
}
function zmienRozmiarKropki(rozmiarKropki){
    rK = rozmiarKropki;
    upieczCiacho("rK",rK);
    tbls.tables[uidStolu].changeDotSize(rK);
    tbls.changeDefaultDotSize(rK);
}
function dodajCzas(komu){
    // komu=='1' lub '2'
    if ((tbls.whoAmI()=='1' && komu=='2') || (tbls.whoAmI()=='2' && komu=='1')) {
	var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + escape(idGracza) + '&co=dodajeCzas&ile=30&stol='
	    + encodeURIComponent(uidStolu);
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    }

}
function pauzuj(komu){
    // komu=='1' lub '2'
    var ajaxUrl = '';
    var ktoryGracz = tbls.whoAmI();
    var p = tbls.tables[uidStolu].board.paused;
    if ((ktoryGracz=='1' && komu=='2' && (p & 2)) || (ktoryGracz=='2' && komu=='1' && (p & 1)))
	ajaxUrl = rootUrl + 'a.kropki?idGracza=' + escape(idGracza) + '&co=pause&newState=off&stol='
	    + encodeURIComponent(uidStolu);
    else if ((ktoryGracz=='1' && komu=='2' && (p & 2)==0) || 
	     (ktoryGracz=='2' && komu=='1' && (p & 1)==0))
	ajaxUrl = rootUrl + 'a.kropki?idGracza=' + escape(idGracza) + '&co=pause&newState=on&stol='
	    + encodeURIComponent(uidStolu);
    if (ajaxUrl) {
	wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    }
}
function znajdzCiastko(co){
    var ciacho = document.cookie;

    var p = ciacho.indexOf(co+'=');
    if (p>=0){
	var wycinek = ciacho.substring(p,ciacho.length);
	var p = wycinek.indexOf('=') + 1; //poczatek zawartosci dla np. ustawienia="...zawartosc .."
	var k = wycinek.indexOf(';');     //koniec
	if (k<0) k = wycinek.length;
	var wartosc = wycinek.substring(p,k);
	return decodeURIComponent(wartosc);
    }else{
	return '';
    }

}
function upieczCiacho(nazwa,zawartosc){
    var data = new Date(2090,11,10,19,30,30);
    document.cookie = nazwa+"="+encodeURIComponent(zawartosc)+"; expires="+data.toGMTString()+"; path=/";

}
function poddaje(){
    nrOstWiadomosci++;
    var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + escape(idGracza) + '&co=propose&jak=resign&stol='
	+ encodeURIComponent(uidStolu) + '&msgNo=' + nrOstWiadomosci;
    ostatniaWiadomosc = 'u' + nrOstWiadomosci + '.' + uidStolu + '.resign';
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    id('przygotujZakonczGre').style.display = 'none';

}
function wyslijPropozycje(jaka){
    nrOstWiadomosci++;
    var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + escape(idGracza) + '&co=propose&jak=' + jaka + '&stol='
	+ encodeURIComponent(uidStolu) + '&msgNo=' + nrOstWiadomosci;
    ostatniaWiadomosc = 'u' + nrOstWiadomosci + '.' + uidStolu + '.' + jaka;
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    id('koniecInfo').style.display = 'none';

}
function anulujKoniecGry(){
    id('przygotujZakonczGre').style.display = 'none';

}
function zakonczGre(){
    var ktoryGracz = tbls.whoAmI();
    if (uidStolu!=graZKOMP && ktoryGracz != 's') {
	if (!tbls.tables[uidStolu].isGameFinished()) {
	    id('koniecInfo').style.top = "80px";
	    id("odslonKoniecInfo").style.visibility = "visible";
	    id("poddaje").onclick = poddaje;
	    if (tbls.whoseMove() == ktoryGracz){
		id("koniecWynik").onclick = function() { wyslijPropozycje('score') }
		id("koniecWynik").style.display = 'inline';
		id("koniecRemis").onclick = function() { wyslijPropozycje('draw') }
		id("koniecRemis").style.display = 'inline';
		id("koniecBaseny").onclick = function() { wyslijPropozycje('terr') }
		if (tbls.tables[uidStolu].board.czySaBaseny())
		    id("koniecBaseny").style.display = 'inline';
		else
		    id("koniecBaseny").style.display = 'none';
		/* to tylko dla gier rankingowych
		id("pominGre").onclick = function() { wyslijPropozycje('drop') }
		id("pominGre").style.display = 'block';
		*/
		id("pominGre").style.display = 'none';   // wywal to gdy beda gry rankingowe
		id("propozycjeTekst").innerHTML = slownik('lub zaproponować przeciwnikowi');
	    }else{
		id("koniecWynik").style.display = 'none';
		id("koniecRemis").style.display = 'none';
		id("koniecBaseny").style.display = 'none';
		id("pominGre").style.display = 'none';
		id("propozycjeTekst").innerHTML = slownik(' (dodatkowe możliwości są dostępne podczas Twojego ruchu)');
	    }
	    id("anulujKoniec").onclick = anulujKoniecGry;
	    id('przygotujZakonczGre').style.display = 'block';
	}
	else {
	    if (propozycja == ktoryGracz + 'new')
		wyslijPropozycje('cancel' + propozycja);
	    else
		wyslijPropozycje('new');
	}
    }else if (uidStolu == graZKOMP){
	var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + escape(idGracza) + '&co=zakonczGre&stol='
	    + encodeURIComponent(uidStolu);
	wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    }

}
function anulujeOkrazenie(){
    if (tbls.tables[uidStolu].board.currEncl.length > 0) {
	var k = tbls.tables[uidStolu].board.currEncl.lastIndexOf('.');
	if (k == tbls.tables[uidStolu].board.currEncl.length-1) {
	    // cofnij pelne okrazenie/kropke
	    tbls.tables[uidStolu].board.currEncl = tbls.tables[uidStolu].board.currEncl.substring(0,k);
	    k = tbls.tables[uidStolu].board.currEncl.lastIndexOf('.');
	    if (k >= 0) { // cofamy pelne okrazenie
		tbls.tables[uidStolu].board.currEncl = tbls.tables[uidStolu].board.currEncl.substring(0,k+1);
	    }else{ // cofamy kropke
		tbls.tables[uidStolu].board.currEncl = '';
		tbls.tables[uidStolu].board.Ienclose = 1;
		okrazamPokazInfo();
	    }
	}else{
	    // cofnij czastkowe okrazenie
	    tbls.tables[uidStolu].board.currEncl = tbls.tables[uidStolu].board.currEncl.substring(0,k+1);
	}
	wyslijOkrazenia();
	tbls.tables[uidStolu].showLastDot();
    }else{
	tbls.tables[uidStolu].board.Ienclose=0;
	okrazamPokazInfo();
    }

}
function wyslijOkrazenia(){
    var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + idGracza + '&co=okrazam&stol=' + 
	encodeURIComponent(uidStolu) + '&gdzie=' + (tbls.tables[uidStolu].board.currEncl=='' ? '-' : tbls.tables[uidStolu].board.currEncl);
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);

}
function okrazamPokazInfo(){
    // zmienia okienko na odpowiednie do sytuacji
    if (tbls.tables[uidStolu].board.Ienclose) {
	if (tbls.tables[uidStolu].board.Ienclose==1) {
	    id('okrazamInfo1').style.display = 'inline';
	    id('okrazamInfo2').style.display = 'none';
	    id('okrazamCofnij').style.display = 'none';
	    id('okrazamAkceptuj').style.display = 'none';
	    id('okrazamAnuluj').style.display = 'inline';
	}else{
	    id('okrazamInfo1').style.display = 'none';
	    id('okrazamInfo2').style.display = 'inline';
	    id('okrazamCofnij').style.display = 'inline';
	    id('okrazamAkceptuj').style.display = 'inline';
	    id('okrazamAnuluj').style.display = 'none';
	}
	id('okrazamOkno').style.display = 'block';
    }else{
	id('okrazamOkno').style.display = 'none';
    }

}
function okrazamF(){
    if (uidStolu!=graZKOMP && tbls.whoseMove() == tbls.whoAmI()){
	tbls.goToLastMove();
	if (tbls.tables[uidStolu].board.Ienclose==0) {
	    tbls.tables[uidStolu].board.Ienclose = 1;
	    tbls.tables[uidStolu].board.currEncl = '';
	} else if (tbls.tables[uidStolu].board.Ienclose==2) {
	    tbls.tables[uidStolu].board.Ienclose = 0;
	    // cos z okrazeniem mozna robic...
	    var ind = tbls.tables[uidStolu].board.currEncl.lastIndexOf('.');
	    tbls.tables[uidStolu].board.currEncl = tbls.tables[uidStolu].board.currEncl.substr(0, ind);
	    // wyslij...
	    nrOstWiadomosci++;
	    var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + idGracza + '&co=graczStawiaKropke&stol=' + 
		encodeURIComponent(uidStolu) + '&gdzie=' + encodeURIComponent(tbls.tables[uidStolu].board.currEncl) + '&msgNo=' + nrOstWiadomosci;
	    ostatniaWiadomosc = 's' + nrOstWiadomosci + '.' + uidStolu + '.' + encodeURIComponent(tbls.tables[uidStolu].board.currEncl);
	    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
	    znikajaceInfo = 0;
	    id('plansza').innerHTML = '';
	    tbls.tables[uidStolu].board.currEncl = '';
	}
	okrazamPokazInfo();
    }

}
function stopFtak(){
    var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + idGracza + '&co=stopMove&stol=' + 
	encodeURIComponent(uidStolu);
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    id("ostrzezenieStop").style.display = "none";

}
function stopFnie(){
    id("ostrzezenieStop").style.display = "none";

}
function stopF(){
    if (uidStolu!=graZKOMP && tbls.whoAmI() != 's'){
	tbls.goToLastMove();
	if (tbls.tables[uidStolu].board.whoPressedStop && tbls.tables[uidStolu].board.whoPressedStop != tbls.whoAmI())
	    stopFtak();
	else
	    id("ostrzezenieStop").style.display = "block";	
    }

}
function cofnijRuch() {
    if (uidStolu!=graZKOMP && tbls.whoAmI() != 's' && tbls.whoAmI()!=tbls.whoseMove()) {
	nrOstWiadomosci++;
	var ajaxUrl = rootUrl + 'a.kropki?idGracza=' + idGracza + '&co=propose&jak=undo&stol='
	    + encodeURIComponent(uidStolu) + '&msgNo=' + nrOstWiadomosci;
	ostatniaWiadomosc = 'u' + nrOstWiadomosci + '.' + uidStolu + '.undo';
	wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    }

}
function dajLosoweId() {
    tekst = '';
    var literki = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.A";
    for(var n=0; n<6; n++){
	//losuje znak
	var liczba = Math.floor(  Math.random() * 64 ) ;
	var litera = literki.charAt(liczba);
	tekst += litera;
    }
    return tekst;

}
function zabezpieczenia(tekst) {  // powinna byc identyczna jak funkcja na serwerze
    tekst = tekst.replace(/</g,'&#60;');
    tekst = tekst.replace(/>/g,'&#62;');
    tekst = tekst.replace(/\'/g,'&#39;');
    tekst = tekst.replace(/\"/g,'&#34;');
    tekst = tekst.replace(/-/g,'&#45;');
    return tekst;

}
function sprawdzCzySieZnamy(){
    idGracza = znajdzCiastko("idGracza");
    if (idGracza == ""){
	killCiacho("opisGracza"); //tak na wszelki wypadek, bo i tak nie powinno być tego ciastka
	idGracza = dajLosoweId();
	upieczCiacho("idGracza",idGracza);
    }
    wyslijJezyk = false;
    opisGracza = zabezpieczenia(znajdzCiastko("opisGracza"));
    if (idGracza.length < 10 && opisGracza.length > 0
	&& opisGracza.charAt(0) != "*") // gosc bez gwiazdki na poczatku
	opisGracza = "*" + opisGracza;
    else if (idGracza.length >= 10 && opisGracza.length > 0 && opisGracza.charAt(0) == "*") {
	idGracza = dajLosoweId();
	upieczCiacho("idGracza",idGracza);
    }
    if (opisGracza == ''){
	if (idGracza.length >= 10) { 	// jakos zachowalo sie haslo zalogowanego gracza
	    killCiacho("idGracza");
	    idGracza = dajLosoweId();
	    upieczCiacho("idGracza",idGracza);
	}
	zaciemnijStrone();
    }else{
	var opisGraczaBezGwiazdki;
	if (opisGracza.charAt(0) != "*")
	    opisGraczaBezGwiazdki = opisGracza;
	else{
	    opisGraczaBezGwiazdki = opisGracza.substring(1);
	}
	if (opisGraczaBezGwiazdki.length > maxWyswOpis) {
	    opisGraczaBezGwiazdki = opisGraczaBezGwiazdki.substr(0,maxWyswOpis-2) + '...';
	}
	id('opisGraczaWmenu').innerHTML = slownik('Witaj') +' <b>' + opisGraczaBezGwiazdki + '</b>';
	ustawOpis = false;
	wyslijJezyk = true;
    }

}
function zaciemnijStrone(){
    id('tekstPowitania').style.display = 'block';
    id('tloCien').style.display = 'block';
    ustawOpis = true;
    if (kliknietoZmien == 'noweKonto'){
	opisNoweKonto();
    }else if (kliknietoZmien == 'ustawienia'){
	opisDlaUstawien();
    }else{
	opisDlaGosci();
    }

}
function opisDlaGosci(){
    id('logowanie1').style.display = 'none';
    id('noweKonto2').style.display = 'none';
    id('resetHasla3').style.display = 'none';
    id('ustawienia4').style.display = 'none';
    id('gosc0').style.display = 'block';
    id('infoDlaGracza').innerHTML = slownik('Witaj Graczu');
    nieAktywnyLink('linkGoscia');        id('linkGoscia').onclick = null;
    aktywnyLink('linkLogowanie');        id('linkLogowanie').onclick = opisDlaLogujacychSie;
    aktywnyLink('linkZakladanieKonta');  id('linkZakladanieKonta').onclick = opisNoweKonto;
    aktywnyLink('linkUstawienia');       id('linkUstawienia').onclick = opisDlaUstawien;
    id('opisGracza').value = '';
    id('opisGracza').focus();
    id('opisGracza').onkeydown = enterNaPowitanie;
    id('okPowitanie').onclick = function(){ przedstawiamSie(); }

}
function aktywnyLink(idAktywnego){
    id(idAktywnego).style.color = '#184bde';
    id(idAktywnego).onmouseover = function(){ 
	id(idAktywnego).style.textDecoration = 'underline';
	id(idAktywnego).style.cursor = 'pointer';
    }
    id(idAktywnego).onmouseout = function(){ id(idAktywnego).style.textDecoration = 'none'; }

}
function nieAktywnyLink(idAktywnego){
    id(idAktywnego).style.color = 'black';
    id(idAktywnego).style.textDecoration = 'none';
    id(idAktywnego).onmouseover = null;
    id(idAktywnego).onmouseout = null;

}
function opisDlaLogujacychSie(){
    displayNone(['gosc0','noweKonto2','resetHasla3','ustawienia4']);
    displayBlock('logowanie1');

    id('infoDlaGracza').innerHTML = slownik('Logowanie');
    aktywnyLink('linkGoscia');           id('linkGoscia').onclick = opisDlaGosci;
    nieAktywnyLink('linkLogowanie');     id('linkLogowanie').onclick = null;
    aktywnyLink('linkZakladanieKonta');  id('linkZakladanieKonta').onclick = opisNoweKonto;
    aktywnyLink('linkUstawienia');       id('linkUstawienia').onclick = opisDlaUstawien;

    id('zapomniales1').onclick = function(){ opisDlaResetowaniaHasla(); }
    id('ok1').onclick = logujSie;
    id('haslo1').value = '';

}
function logujSie(){
    valueWyczysc('info1');
    var nick = id('nick1').value;
    var haslo = id('haslo1').value;

    if (nick.length == 0){
	id('info1').innerHTML = slownik('Wpisz swój nick!');
	return true;
    }

    if (haslo.length == 0){
	id('info1').innerHTML = slownik('Wpisz swoje hasło!');
	return true;
    }

    var noweIdGracza = haszujHaslo( nick, haslo);
    var xmlhttp = makexmlhttp();
    if(xmlhttp){
	wylogowanoMnie();
	var ajaxUrl = rootUrl + 'auth.py?co=loguj&opisGracza=' + encodeURIComponent(nick) + 
	    '&idGracza=' + encodeURIComponent(noweIdGracza);

	xmlhttp.open('GET', ajaxUrl, true);
	xmlhttp.onreadystatechange = function(){ 
	    if ( (xmlhttp.readyState == 4) && (xmlhttp.status == 200) ){
		var ajax = xmlhttp.responseText;
		if (ajax.substring(0,3) == 'ok.'){
		    ajax = ajax.substring(3);
		    if (ajax.substr(0,18) == 'zalogowanyNaSerwer'){
			opisGracza = zabezpieczenia(nick);
			upieczCiacho('opisGracza', nick);
			idGracza = noweIdGracza;
			upieczCiacho('idGracza', noweIdGracza);
			var i = ajax.indexOf('pref/');
			if (i!=-1) {
			    var dane = ajax.substring(i).split('/');
			    if (dane[0] == 'pref' && dane[dane.length-1].substr(0,3)=='end') {
				for (var d=1; d<dane.length-1; d++) {
				    if (dane[d].substr(0,8) == 'colours=') {
					koloryZSerwera = dane[d].substring(8);
					wezKolory(koloryZSerwera);
				    }
				    if (dane[d].substr(0,7) == 'sounds=') {
					dzwiekiZSerwera = dane[d].substring(7);
					wezDzwieki(dzwiekiZSerwera);
				    }
				    if (dane[d].substr(0,6) == 'rules=') {
					zasadyZSerwera = dane[d].substring(6);
					wezZasady(zasadyZSerwera);
				    }
				    if (dane[d].substr(0,7) == 'alerts=') {
					alertyZSerwera = dane[d].substring(7);
					wezAlerty(alertyZSerwera);
				    }
				}
			    }
			}else{
			    koloryZSerwera = '';
			    dzwiekiZSerwera = '';
			    zasadyZSerwera = '';
			    alertyZSerwera = '';
			    przywrocDomyslneKolory();
			}
			tbls.show(uidStolu);
			wyslijJezykDoSerwera();
			kliknietoZmien = false;
		    }else{
			id('info1').innerHTML = slownik('Niepoprawny nick lub hasło!');
			return true;
		    }
		    //jak powyższe nie wejdzie to nie wiadomo co się stało
                    //więc może niech jeszcze raz gracz kliknie 'ok' i spróbuje się zalogować
		}
	    }
	}
	xmlhttp.send(null);
    }

}
function opisNoweKonto(){
    displayNone(['gosc0', 'logowanie1', 'resetHasla3', 'ustawienia4']);
    displayBlock('noweKonto2');
    id('infoDlaGracza').innerHTML = slownik('Zakładanie konta');

    aktywnyLink('linkGoscia');              id('linkGoscia').onclick = opisDlaGosci;
    aktywnyLink('linkLogowanie');           id('linkLogowanie').onclick = opisDlaLogujacychSie;
    nieAktywnyLink('linkZakladanieKonta');  id('linkZakladanieKonta').onclick = null;
    aktywnyLink('linkUstawienia');          id('linkUstawienia').onclick = opisDlaUstawien;

    id('mail2d').onclick = function(){
	displayBlock(['mail2', 'info2m']);
	displayNone(['mail2d', 'br2']);
	if (czyBlock(['awatar2d']) == false) displayNone('dodatkowo2');
    }

    id('awatar2d').onclick = function(){
	displayBlock(['awatar2']);
	displayNone(['awatar2d', 'br2']);
	if (czyBlock(['mail2d']) == false){
	    displayNone('dodatkowo2');
	}
    }

    id('wyslij2').onclick = rejestrujeSie;
}
function wyslijAwatar(nr){//pokazuje jedynie krecace sie kolko
    var sciezka = id('sciezka' + nr).value;
    if (sciezka == '') return true;
    if ( (sciezka.indexOf('.jpg') == -1) && 
	 (sciezka.indexOf('.jpeg') == -1) &&
	 (sciezka.indexOf('.gif') == -1) &&
	 (sciezka.indexOf('.png') == -1) ) { 
	alert(slownik('wybierz plik graficzny (jpg, jpeg, gif, png)')); 
	id('sciezka' + nr).value = '';
	return true; 
    }
    id('podgladAwataru' + nr).innerHTML = 
	'<iframe name="odpZserwera' + nr + '" src="#" style="display:none;"></iframe>' +
	'<img src="karuzela.gif">' +
	'<div id="zaczekaj' + nr + '">' + slownik('zaczekaj ładuję') + '</div>';
    id('podgladAwataru' + nr).style.display = 'block'; 
    id('form' + nr).submit();

    return true;
}
function podgladAwatara(co){
    awatarPodglad = co;
    if (czyBlock('noweKonto2')){
	id("podgladAwataru2").innerHTML = '<img style="margin-left:-25px;" src="awatary/' + awatarPodglad + '.gif">';
    }else if (czyBlock('ustawienia4')){
	id("podgladAwataru4").innerHTML = '<img style="margin-left:-25px;" src="awatary/' + awatarPodglad + '.gif">';
    }
}
function rejestrujeSie(){
    valueWyczysc("info2n","info2h", "info2m");
    var nick = id('nick2').value;
    var haslo = id('haslo2').value;
    var hasloo = id('haslo2p').value;
    var email = id('mail2i').value;

    if (sprawdzamPoprawnoscWprowadzonegoNicku(nick) == false){
	id('info2n').innerHTML = slownik('Dozwolone są litery, cyfry i znak _&nbsp;&nbsp;&nbsp;');
	return true;
    }

    if ( (haslo.length == 0) || (haslo.length == 0) ){
	id('info2h').innerHTML = slownik('Wpisz dwa razy to samo hasło!');
	return true;
    }

    if (haslo != hasloo){
	id('info2h').innerHTML = slownik('Hasła nie są takie same!');
	return true;
    }
    if (email.length == 0)
	email = 'x';    // tak zeby nie bylo problemow w rejestracji...
    
    var re = /^\d+$/;
    if (re.test(awatarPodglad)){ //czy nie jest false i czy jest liczbą
	var awatarr = awatarPodglad;
    }else{
	var awatarr = '0';
    }
    var noweIdGracza = haszujHaslo( nick, haslo );

    var xmlhttp = makexmlhttp();
    if(xmlhttp){
	var url = rootUrl + 'auth.py?co=rejestruj&' + 
	    'opisGracza=' + encodeURIComponent(nick) + '&idGracza=' + encodeURIComponent(noweIdGracza) +
	    '&email=' + encodeURIComponent(email) + '&awatar=' + encodeURIComponent(awatarr);

	xmlhttp.open('GET', url, true);
	xmlhttp.onreadystatechange = function(){ 
	    if ( (xmlhttp.readyState == 4) && (xmlhttp.status == 200) ){
		var ajax = xmlhttp.responseText;
		if (ajax.substring(0,3) == 'ok.'){
		    ajax = ajax.substring(3);
		    if (ajax == 'zarejestrowalem\n'){
			opisGracza = zabezpieczenia(nick);
			upieczCiacho('opisGracza', nick);
			idGracza = noweIdGracza;
			upieczCiacho('idGracza', noweIdGracza);
			tbls.show(uidStolu);
			wyslijJezykDoSerwera();
			kliknietoZmien = false;
		    }else if (ajax == 'tenOpisJestJuzZajety\n'){
			id('info2n').innerHTML = slownik('Ten nick jest już zajęty!');
		    }else if (ajax == 'niedozwolonyOpis\n'){
			id('info2n').innerHTML = slownik('Niedozwolony opis!');
		    }
		}

	    }
	}
	xmlhttp.send(null);
    }

}
function haszujHaslo(login, haslo){
    var haslo27znakow = hex_sha1( login + '9WB2qGYzzWry1vbVjoSK'  + haslo );
    haslo27znakow = hex2b64(haslo27znakow);
    return haslo27znakow.substr(0, 10);  // uzywamy jako hasla tylko 10  znakow hasza

}
function hex2b64(tekst) {
 // zamienia ciag cyfr szesnastkowych (male litery a-f)
 // na krotszy (o okolo 1/3) ciag znakow z tablicy tab
  var res = '';
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";
  var obetnijNaKoniec = 0;
  if (tekst.length % 3 == 1) { tekst = tekst + '00'; obetnijNaKoniec=1; }
  else if (tekst.length % 3 == 2) tekst = tekst + '0';
  for (var i=0; i<tekst.length; i+=3) {
     var h0 = tekst.charCodeAt(i);
     if (h0 < 58) h0-=48;  else h0 -= 87;
     var h1 = tekst.charCodeAt(i+1); 
     if (h1 < 58) h1-=48;  else h1 -= 87;
     var h2 = tekst.charCodeAt(i+2); 
     if (h2 < 58) h2-=48;  else h2 -= 87;
     var numb = (h0 << 8) | (h1<< 4) | h2;
     res += tab.charAt(numb >> 6) + tab.charAt(numb & 0x3f);
  }
  if (obetnijNaKoniec) return res.substr(0, res.length-1);
  return res;

}
function opisDlaResetowaniaHasla(){
    displayNone(['gosc0', 'logowanie1', 'noweKonto2', 'ustawienia4', 'wyslane3']);
    displayBlock(['resetHasla3','wpisz3']);


    id('infoDlaGracza').innerHTML = slownik('Resetowanie hasła');
    aktywnyLink('linkGoscia');              id('linkGoscia').onclick = opisDlaGosci;
    aktywnyLink('linkLogowanie');           id('linkLogowanie').onclick = opisDlaLogujacychSie;
    aktywnyLink('linkZakladanieKonta');     id('linkZakladanieKonta').onclick = opisNoweKonto;
    aktywnyLink('linkUstawienia');          id('linkUstawienia').onclick = opisDlaUstawien;
    id('ok3').onclick = zmienHaslo;

}
function zmienHaslo(){
    id('info3n').innerHTML = '';
    var nick = id('nick3').value;
    var email = id('email3').value;

    if (nick.length == 0){
	id('info3n').innerHTML = slownik('Wpisz swój nick!');
	return true;
    }

    if (email.length == 0){
	id('info3n').innerHTML = slownik('Wpisz mail, ktory podałeś przy zakładaniu konta!');
	return true;
    }

    var xmlhttp = makexmlhttp();
    if(xmlhttp){
	var ajaxUrl = rootUrl + 'auth.py?co=zmienHaslo&opisGracza=' + encodeURIComponent(nick) +
	    '&email=' + encodeURIComponent(email);

	xmlhttp.open('GET', ajaxUrl, true);
	xmlhttp.onreadystatechange = function(){ 
	    if ( (xmlhttp.readyState == 4) && (xmlhttp.status == 200) ){
		var ajax = xmlhttp.responseText;
		if (ajax.substring(0,3) == 'ok.'){
		    ajax = ajax.substring(3);
		    if (ajax == 'hasloZmienione\n'){
			id('wpisz3').style.display = 'none';
			id('wyslane3').style.display = 'block';
			id('wyslane3').innerHTML = slownik('Hasło zostało wysłane na') + ' <strong>' + email + '</strong>';
		    }else if( ajax == 'zlyLogin\n'){
			id('info3n').innerHTML = slownik('Nie ma zarejestrowanego takiego nick\'a!');
			return true;
		    }else if(ajax == 'zlyEmail\n'){
			id('info3n').innerHTML = slownik('Nie ma w bazie takiego email\'a.!');
			return true;
		    }
		    //jak powyższe nie wejdzie to nie wiadomo co się stało
                    //więc może niech jeszcze raz gracz kliknie 'ok' i spróbuje się zalogować
		}
	    }
	}
	xmlhttp.send(null);
    }

}
function opisDlaUstawien(){
    displayNone(['gosc0', 'logowanie1', 'noweKonto2', 'resetHasla3']);
    aktywnyLink('linkGoscia');              id('linkGoscia').onclick = opisDlaGosci;
    aktywnyLink('linkLogowanie');           id('linkLogowanie').onclick = opisDlaLogujacychSie;
    aktywnyLink('linkZakladanieKonta');     id('linkZakladanieKonta').onclick = opisNoweKonto
    nieAktywnyLink('linkUstawienia');       id('linkUstawienia').onclick = null;

    id('infoDlaGracza').innerHTML = slownik('Ustawienia');
    displayBlock(['ustawienia4', 'wpisz4']);
    valueWyczysc(['nick4', 'haslo4si', 'email4i', 'haslo4ni', 'haslo4pi', 'sciezka4']);
    htmlWyczysc(['zapisane4']);
    displayNone('podgladAwataru4');
    id('podgladAwataru4').innerHTML = '<img src="karuzela.gif">';

    id('email4d').onclick = function(){ 
	displayBlock(['email4', 'info4e']);
	displayNone(['email4d','br4']);
	if (czyBlock(['haslo4d', 'awatar4d']) == false) displayNone('dodatkowo4');
    }

    id('haslo4d').onclick = function(){ 
	displayBlock(['haslo4nh', 'haslo4ph', 'info4nh', 'info4ph']);
	displayNone(['haslo4d','br4']);
	if (czyBlock(['email4d', 'awatar4d']) == false) displayNone('dodatkowo4');
    }

    id('awatar4d').onclick = function(){
	displayBlock('awatar4');
	displayNone('awatar4d');
	if (czyBlock(['email4d', 'haslo4d']) == false) displayNone('dodatkowo4');
    }

    id('zapisz4').onclick = zapiszUstawienia;

}
function zapiszUstawienia(){
    htmlWyczysc(['info4n', 'info4sh', 'info4e', 'info4nh', 'info4ph']);
    var nick = id('nick4').value;
    var stareHaslo = id('haslo4si').value;
    var nowyEmail = id('email4i').value;
    var noweHaslo = id('haslo4ni').value;
    var noweHasloo = id('haslo4pi').value;

    if ( nick.length == 0 ){
	id('info4n').innerHTML = slownik('Wpisz swój nick!');
	return true;	
    }

    if (sprawdzamPoprawnoscWprowadzonegoNicku(nick) == false){
	id('info4n').innerHTML = slownik('Dozwolone są litery, cyfry i znak _&nbsp;&nbsp;&nbsp;');
	return true;
    }

    if ( stareHaslo.length == 0 ){
	id('info4sh').innerHTML = slownik('Wpisz stare hasło!');
	return true;
    }
    var stareIdGracza = haszujHaslo( nick, stareHaslo );

    if (nowyEmail.length == 0) nowyEmail = 'x';    // tak zeby nie bylo problemow w rejestracji...
    
    if (noweHaslo != noweHasloo){
	id('info4nh').innerHTML = slownik('Hasła nie są takie same!');
	return true;
    }

    if (noweHaslo.length == 1){ // w ten sposób unikam, ze ktoś wpisze 'x' jako haslo ('x' - wykorzystuje pozniej)
	id('info4nh').innerHTML = slownik('Hasło jest za krótkie!');
	return true;
    }

    if ( (noweHaslo.length == 0) && (noweHasloo.length == 0) ){
	noweIdGracza = 'x';
    }else{
	var noweIdGracza = haszujHaslo( nick, noweHaslo );
    }

    //nie ma sensu wysyłać zapytania, jak nic nie zostało zmienione
    if ((nowyEmail == 'x') && (noweIdGracza == 'x') && (awatarPodglad == 0)) return true;     

    var re = /^\d+$/;
    if (re.test(awatarPodglad)){ //czy nie jest false i czy jest liczbą
	var awatarr = awatarPodglad;
    }else{
	var awatarr = '0';
    }

    var xmlhttp = makexmlhttp();
    if(xmlhttp){
	var ajaxUrl = rootUrl + 'auth.py?co=zmienUstawienia' + 
	    '&opisGracza=' + encodeURIComponent(nick) +
	    '&oldId=' + encodeURIComponent(stareIdGracza) +
	    '&newId=' + encodeURIComponent(noweIdGracza) +
	    '&email=' + encodeURIComponent(nowyEmail) +
	    '&awatar=' + encodeURIComponent(awatarr);

	xmlhttp.open('GET', ajaxUrl, true);
	xmlhttp.onreadystatechange = function(){ 
	    if ( (xmlhttp.readyState == 4) && (xmlhttp.status == 200) ){
		var ajax = xmlhttp.responseText;
		if (ajax.substring(0,3) == 'ok.'){
		    ajax = ajax.substring(3);
		    htmlWyczysc(['info4n', 'info4sh', 'info4e', 'info4nh', 'info4ph']);
		    if (ajax == 'ustawieniaZmienione\n'){
			id('zapisane4').innerHTML = 'ustawienia zostały zapisane';
			wylogowanoMnie();
			if (noweIdGracza == 'x') noweIdGracza = stareIdGracza; 
			//po zapisaniu ustawień próbuję się zalogować
			var xmlhttpp = makexmlhttp();
			if(xmlhttpp){
			    var ajaxUrl = rootUrl + 'auth.py?co=loguj&opisGracza=' + encodeURIComponent(nick) + 
				'&idGracza=' + encodeURIComponent(noweIdGracza);
			    xmlhttpp.open('GET', ajaxUrl, true);
			    xmlhttpp.onreadystatechange = function(){ 
				if ( (xmlhttpp.readyState == 4) && (xmlhttpp.status == 200) ){
				    var ajax = xmlhttpp.responseText;
				    if (ajax.substring(0,3) == 'ok.'){
					ajax = ajax.substring(3);
					if (ajax.substr(0,18) == 'zalogowanyNaSerwer'){
					    opisGracza = zabezpieczenia(nick);
					    upieczCiacho('opisGracza', nick);
					    idGracza = noweIdGracza;
					    upieczCiacho('idGracza', noweIdGracza);
					    tbls.show(uidStolu);
					    wyslijJezykDoSerwera();
					    kliknietoZmien = false;
					}
				    }
				}
			    }
			}
			xmlhttpp.send(null);

		    }else if( ajax == 'zlyLogin\n'){
			id('info4n').innerHTML = slownik('Błędny nick!');
			return true;
		    }else if(ajax == 'zleHaslo\n'){
			id('info4sh').innerHTML = slownik('Błędne hasło!');
			return true;
		    }
		    //jak powyższe nie wejdzie to nie wiadomo co się stało
                    //więc może niech jeszcze raz gracz kliknie 'ok' i spróbuje się zalogować
		}
	    }
	}
	xmlhttp.send(null);
    }

}
function htmlWyczysc(idk){
    if(idk.constructor != Array){
	id(idk).innerHTML = '';
    }else{
	for(var n=0; n<idk.length; n++){
	    id(idk[n]).innerHTML = '';
	}
    }
}
function valueWyczysc(idk){
    if(idk.constructor != Array){
	id(idk).value = '';
    }else{
	for(var n=0; n<idk.length; n++){
	    id(idk[n]).value = '';
	}
    }
}
function displayNone(idk){
    if(idk.constructor != Array){
	id(idk).style.display = 'none';
    }else{
	for(var n=0; n<idk.length; n++){
	    id(idk[n]).style.display = 'none';
	}
    }
}
function displayBlock(idk){
    if(idk.constructor != Array){
	id(idk).style.display = 'block';
    }else{
	for(var n=0; n<idk.length; n++){
	    id(idk[n]).style.display = 'block';
	}
    }
}
function czyBlock(idk){
    if(idk.constructor != Array){
	if (id(idk).style.display == 'block') return true; else return false;
    }else{//jak choć jeden block to true
	for(var n=0; n<idk.length; n++){
	    //zakładam, że jak jest '' to się wyświetla, bo tylko nieustawione
	    if ((id(idk[n]).style.display == '') || (id(idk[n]).style.display == 'block')) return true;
	}
	return false;
    }
}
function slownik(tekst){

    var tlumaczenia = {
	'Witaj':['Hello', 'Привет', 'Привіт'],
	'Wpisz swoję imię lub nick':['Enter your name or nick', 'Введи свой ник-нэйм', 'Введи свій нік-нейм'],
	'Zapraszasz gracza':['You\'re inviting player', 'Ты приглашаешь игрока', 'Ти запрошуєш гравця'],
	'do gry':['for a game', 'для игры', 'для гри'],
	'Anuluj':['Cancel', 'Отмена', 'Відміна'],
	'Gracz':['Player', 'Игрок', 'Гравець'],
	'odrzucił zaproszenie':['rejected your invitation', 'отменил приглашение', 'відмінив запрошення'],
	'pisze':['writes', 'пишет', 'пише'],
	'Dozwolone są litery, cyfry i znak _&nbsp;&nbsp;&nbsp;':
	   ['Letters, digits and _ are allowed.&nbsp;&nbsp;&nbsp;&nbsp;',
	    'Разрешаются буквы, цифры и знак _', 'Дозволяються букви, цифри і знак _'],
	'Ktoś teraz używa taki nick.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;':
	['Someone uses such a nick now.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;','Ваш ник уже используется.', 'Ваш нік вже використовується.'],
	'Stół':['Table','стол', 'стіл'],
	'już istnieje':['exists already','уже существует', 'вже існує'],
	'Witaj Graczu':['Hello Player', 'Привет, игрок', 'Привіт, гравець'],
	'Logowanie':['Logging in', 'Выполняется вход', 'Виконується вхід'],
	'Resetowanie hasła':['Resetting the password', 'Ресет пароля', 'Ресет пароля'],
	'Zakładanie konta':['Registering', 'Регистрация', 'Регістрація'],
        'Wpisz swój nick!':['Enter your nick!', 'Введи нік-нейм!', 'Введи нік-нейм!'],
	'Wpisz swoje hasło!':['Enter your password!', 'Введи пароль!', 'Введи пароль!'],
	'Niepoprawny nick lub hasło!':['Incorrect nick or password!', 'неправильный ник-нейм или пароль!', 'неправильний нік-нейм або пароль!'],
	'Wpisz mail, ktory podałeś przy zakładaniu konta!':['Enter the email you entered during registration!', 'Введи пароль отправленный при регистрации!', 'Введи пароль відправлений при реєстрації!'],
	'Hasło zostało wysłane na':['Password has been sent to', 'Пароль отправлен', 'Пароль відправлений'],
	'Nie ma zarejestrowanego takiego nick\'a!':['There\'s no player with this nick!', 'Нету игрока с таким именем!', 'Немає гравця з таким ім\'ям'],
	'Nie ma w bazie takiego email\'a.!':['Incorrect email!', 'неправильный email!', 'неправильний email!'],
	'Hasła nie są takie same!':['Passwords do not match!', 'Пароли не совпадают!', 'Паролі не збігаються!'],
	'komputer':['computer', 'компьютер', 'комп\'ютер'],
	'Gra się już skończyła':['The game has finished', 'Игра закончена', 'Гра закінчена'],
	'zakończ grę':['finish the game', 'закончить игру', 'закінчити гру'],

	'nowa gra':['new game', 'новая игра', 'нова гра'],

	'Teraz jest ruch przeciwnika':['Now your opponent makes move', 'Сейчас ходит оппонент', 'Зараз ходить опонент'],
	'Nie grasz w tej grze':['You are not a player here', 'вы находитесь в режиме просмотра', 'ви знаходитесь в режимі перегляду'],

	'lub zaproponować przeciwnikowi':['or ask your opponent', 'или предложить оппоненту', 'або запропонувати опонентові'],
	'Proponujesz przeciwnikowi ':['You ask your opponent ',
				      'Вы предлагаете оппоненту ', 'Ви пропонуєте опонентові '],
	' (dodatkowe możliwości są dostępne podczas Twojego ruchu)':
   	   [' (additional options are available when it\'s your turn to move)', ' (дополнительные возможности доступны во время своего хода)', '(додаткові можливості доступні під час свого ходу) '],
	'Przeciwnik proponuje ': ['Your opponent is asking ', 'Оппонент предлагает вам ', 'Опонент пропонує вам'],
	'zakończenie gry':['to finish the game', 'закончить игру', 'закінчити гру'],
	'Przyjmuję':['I accept', 'согласен', 'згоден'],
	'Odrzucam' :['I reject', 'не согласен', 'не згоден'],
	'z zachowaniem obecnego wyniku':['with the current result', 'с подсчетом точек', 'з підрахунком точок'],
	'remisem':['by draw', 'by draw (Ничья)', 'Нічия'],
	'i podliczenie punktów na baseny':['and counting points for territory', 'и территории', 'та території'],

	'jeszcze raz?':['care for another one?', 'еще раз?', 'ще раз'],
	'oczekiwanie na przeciwnika':['waiting for your opponent', 'ждем оппонента', 'чекаємо опонента'],
	'Przeciwnik prosi o cofnięcie ruchu':['Your opponent would like to take their last move back',
					      'Оппонент просит взять ход назад', 'Опонент просить взяти хід назад'],
	'Prosisz przeciwnika o cofnięcie ruchu':['You\'re asking your opponent to accept taking your last move back',
						 'Вы предлагаете оппоненту  взять ход назад', 'Ви пропонуєте опонентові взяти хід назад'],
	'Zgoda':['I agree',
 'Согласен', 'Згоден'],
	's':['s', 'сек', 'сек'],
	'min':['min', 'мин', 'хв'],
	'Czas początkowy': ['Initial amount of time', 'Начальное время', 'Початковий час'],
	'czas dodawany po każdym ruchu': ['amount of time added after each move', 'добавочное время за каждый ход', 'додатковий час за кожен хід'],
	'czas dodawany': ['time added', 'добавочное время', 'додатковий час'],
	'Bez limitu czasu': ['No time limits',  'Без ограничений времени', 'Без обмежень часу'],
	//	'Jeszcze nie ma kibiców':['No spectators yet', 'нет наблюдателей', 'немає глядачів'],
	'każdego nowego...': ['all new...', 'всех последующих...', 'усіх наступних'],
	'Żaden kibic nie może pisać': ['No spectator may write',
				       'Запретить комментировать наблюдателям', 'Заборонити коментувати спостерігачам'],
	'Nie ma kibiców do odblokowania': ['No spectators to unblock',
					   'Нету наблюдателей для разблокировки', 'Нема спостерігачів для розблокування'],
	'ODBLOKUJ kibica':
 ['UNBLOCK a spectator', 'РАЗБЛОКИРОВАТЬ наблюдателя', 'РОЗБЛОКУВАТИ спостерігача'],
	
	'Zasady gry': ['Game rules', 'Правила игры', 'Правила гри'],
	'standardowe': ['standard', 'стандартные', 'стандартні'],
	'na terytorium': ['with territory', 'с территорией', 'з територією'],
	'bez terytorium': ['without territory', 'без территории', 'без території'],
	'X w środku' : ['X in the center', 'X в центре', 'X в центрі'],
	'4 X losowo' : ['4 X random', '4 X произвольно', '4 X довільно'],
	'gra do 15 kropek przewagi': ['game until winning by 15 points',
				      'немедленный выигрыш при разнице 15 точек', 'негайний виграш при різниці 15 точок'],
	'gra do 30 kropek przewagi': ['game until winning by 30 points',
				      'немедленный выигрыш при разнице 30 точек', 'негайний виграш при різниці 30 точок'],
	'pozycja początkowa' : ['starting position', 'стартовая позиция', 'стартова позиція'],
	'Gra rankingowa' : ['Rated game', 'Рейтинговая игра', 'Рейтингова гра'],

	'Gra towarzyska' : ['Unrated game', 'Свободная игра', 'Вільна гра'],
	'towarzyska' : ['unrated', 'свободная', 'нерейт'],
	'Gra z komputerem': ['Game with computer', 'Игра с компьютером', 'Гра з комп\'ютером'],
	'zaczyna' : ['first move:', 'first move:', 'перший хід'],
	'Wpisz stare hasło!' : ['Enter your old password!','Введи старый пароль', 'Введи старий пароль'],
	'Hasło jest za krótkie!':['Password is too short','Пароль слишком короткий', 'Пароль занадто короткий'],
	'Ustawienia':['Settings', 'Настройки', 'Установки'],
	'zaczekaj ładuję':['Uploading. Wait...', 'Загрузка. Подождите...', 'Завантаження. Зачекайте…'],
	'wybierz plik graficzny (jpg, jpeg, gif, png)':['choose an image file (jpg, jpeg, gif, png)',
							'выберите изображение (jpg, jpeg, gif, png)', 'виберіть зображення (jpg, jpeg, gif, png)'],
	'Wpisz dwa razy to samo hasło!':['Enter the same password twice.',
					 'Введите этот же пароль пароль ещё раз.', 'Введіть цей же пароль пароль ще раз.'],
	'Hasła nie są takie same!':['Passwords do not match.','Пароли не совпадают.', 'Паролі не збігаються.'],
	'Ten nick jest już zajęty!':['This nick is already in use!', 'Ник уже используется!', 'Нік вже використовується!'],
	'Niedozwolony opis!':['This nick is not allowed!', 'Данный ник не разрешён!', 'Цей нік не дозволено!'],
	'remis':['draw', 'ничья', 'нічия'],
	'przeciwnik poddał':['opponent has resigned', 'оппонент сдался', 'опонент здався'],
	'na czas':['on time', 'по времени', 'за часом'],
	'punkty':['points','по точкам', 'по точках'],
	'Koniec gry':['Game over', 'Игра закончена', 'Гра закінчена'],
	'zwycięzca':['winner', 'победитель', 'переможець'],
	'ustawienia zostały zapisane':['settins have been saved', 'settins have been saved', 'установки збережені'],
	'nie udało się, użyj METODY 1':['failed, use METHOD 1','failed, use METHOD 1', 'помилка, використовуйте МЕТОД 1'],
	'nie udało się':['failed','failed', 'помилка'],
	'czekaj...':['wait...','wait...', 'зачекайте'],
	'Plansza':['Board','Поле', 'Поле'],
	'włącz':['turn on', 'turn on', 'Увімкнути'],

	'wyłącz':['turn off', 'turn off', 'Вимкнути']
    }
    try{//możemy zapomnić wprowadzić tłumaczenia
	if (jezykGracza == 'en'){
	    tekst = tlumaczenia[tekst][0];
	}else if (jezykGracza == 'ru'){
	    tekst = tlumaczenia[tekst][1];
	}else if (jezykGracza == 'ua'){
	    tekst = tlumaczenia[tekst][2];
	}
    }catch(e){}
    
    return tekst;

}
function tlumaczWpisy(tekst){
    // tlumaczy wpisy przysylane z serwera
    var ind = tekst.indexOf('.');
    if (ind==-1) return '';
    var czas = parseInt(tekst.substring(0, ind));
    tekst = tekst.substring(ind+1);
    ind = tekst.indexOf('.');
    if (ind==-1) return '';
    var nick = tekst.substring(0, ind);
    tekst = tekst.substring(ind+1);
    ind = tekst.indexOf('.');
    if (ind==-1) return '';
    var nickType = tekst.substring(0, ind);
    tekst = tekst.substring(ind+1);
    if (nick == '') {   // = server message
	if (jezykGracza == 'pl') {
	    tekst = tekst.replace('Player', 'Gracz');
	    tekst = tekst.replace('Game over, score', 'Koniec gry, wynik');
	    tekst = tekst.replace('Winner:', 'Wygrywa');
	    tekst = tekst.replace('Congratulations!', 'Gratulacje!');
	    tekst = tekst.replace('Draw', 'Remis');
	    tekst = tekst.replace('resigns', 'poddaje grę');
	    tekst = tekst.replace('proposes to finish the game with score', 'proponuje zakończyć grę z wynikiem');
	    tekst = tekst.replace('proposes to finish the game and count points for territory',
				  'proponuje zakończyć grę i policzyć punkty za baseny');
	    tekst = tekst.replace('proposes to finish the game by draw', 'proponuje zakończyć grę remisem');
	    tekst = tekst.replace('asks to take back move', 'prosi o cofnięcie ruchu');
	    tekst = tekst.replace('has witdrawn the request', 'wycofał prośbę');
	    tekst = tekst.replace('has witdrawn the proposition', 'wycofał propozycję');
	    tekst = tekst.replace('agreed', 'się zgodził');
	    tekst = tekst.replace('rejected the request', 'odrzucił prośbę');
	    tekst = tekst.replace('New game started', 'Rozpoczęto nową grę');
	    tekst = tekst.replace('rejected the proposition', 'odrzucił propozycję');
	    tekst = tekst.replace('The time is over', 'Czas się skończył');
	    tekst = tekst.replace('pressed STOP', 'nacisnął STOP');
	    tekst = tekst.replace('has blocked messages from all future spectators', 'zablokował wiadomości od wszystkich przyszłych kibiców');
	    tekst = tekst.replace('has blocked messages from', 'zablokował wiadomości od');
	    tekst = tekst.replace('has unblocked messages from', 'odblokował wiadomości od');
	}
	else if (jezykGracza == 'ru') {
	    tekst = tekst.replace('Player', 'Игрок');
	    tekst = tekst.replace('Game over, score', 'Игра закончена, счет');
	    tekst = tekst.replace('Winner:', 'Победитель:');
	    tekst = tekst.replace('Congratulations!', 'Поздравляем!');
	    tekst = tekst.replace('Draw', 'Ничья');
	    tekst = tekst.replace('resigns', 'сдался');
	    tekst = tekst.replace('proposes to finish the game with score', 'Предлагает закончить игру со счетом');
	    tekst = tekst.replace('proposes to finish the game and count points for territory',
				  'Предлагает закончить игру и сосчитать точки вместе с территорией');
	    tekst = tekst.replace('asks to take back move', 'просит сделать ход назад');
	    tekst = tekst.replace('has witdrawn the request', 'отменил запрос');
	    tekst = tekst.replace('has witdrawn the proposition', 'отменил предложение');
	    tekst = tekst.replace('agreed', 'согласился');
	    tekst = tekst.replace('rejected the request', 'отказал в запросе');
	    tekst = tekst.replace('New game started', 'Началась новая игра');
	    tekst = tekst.replace('rejected the proposition', 'не согласился на предложение');
	    tekst = tekst.replace('The time is over', 'Время вышло');
	    tekst = tekst.replace('has blocked messages from', 'заблокировал сообщения от');
	}
	else if (jezykGracza == 'ua') {
	    tekst = tekst.replace('Player', 'Гравець');
	    tekst = tekst.replace('Game over, score', 'Гра закінчена, рахунок');
	    tekst = tekst.replace('Winner:', 'Переможець:');
	    tekst = tekst.replace('Congratulations!', 'Вітаємо!');
	    tekst = tekst.replace('Draw', 'Нічия');
	    tekst = tekst.replace('resigns', 'здався');
	    tekst = tekst.replace('proposes to finish the game with score', 'Пропонує закінчити гру з рахунком');
	    tekst = tekst.replace('proposes to finish the game and count points for territory',
				  'Пропонує закінчити гру і порахувати точки разом з територією');
	    tekst = tekst.replace('proposes to finish the game by draw', 'пропонує закінчити гру нічиєю');
	    tekst = tekst.replace('asks to take back move', 'просить зробити хід назад');
	    tekst = tekst.replace('has witdrawn the request', 'скасував запит');
	    tekst = tekst.replace('has witdrawn the proposition', 'скасував пропозицію');
	    tekst = tekst.replace('agreed', 'погодився');
	    tekst = tekst.replace('rejected the request', 'відмовив в запиті');
	    tekst = tekst.replace('New game started', 'Почалась нова гра');
	    tekst = tekst.replace('rejected the proposition', 'не погодився на пропозицію');
	    tekst = tekst.replace('The time is over', 'Час вийшов');
	    tekst = tekst.replace('pressed STOP', 'натисніть СТОП');
	    tekst = tekst.replace('has blocked messages from all future spectators', 'заблокував повідомлення від усіх наступних спостерігачів');
	    tekst = tekst.replace('has blocked messages from', 'заблокував повідомлення від');
	    tekst = tekst.replace('has unblocked messages from', 'розблоковано повідомлення від');
	}
	else if (jezykGracza == 'en') {
	    tekst = tekst.replace('Player', '');
	}
	tekst = '<i>' + tekst + '</i>';
    }else{
	// msg from user
	czas += deltaHourMin;
	var dz = Math.floor((czas % 86400) / 60);
	var m = dz % 60;
	var h = Math.floor(dz/60);
	if (nickType)
	    nickType = ' class="c' + nickType + '"';
	return '[' + h + ':' + (m<10 ? '0'+m : m) + '] <b' + nickType + '>' + nick + '</b>: ' + tekst;
    }
    return tekst;
}
function enterNaPowitanie(event){
    var klawisz = event ? event.keyCode : window.event.keyCode;
    if (klawisz == 13){ // 13 = enter
	przedstawiamSie();
    }
}
function przedstawiamSie(){
    opisGracza = id('opisGracza').value;
    if (opisGracza == ''){
	alert(slownik('Wpisz swoję imię lub nick') + '.');
    }else{
	if (idGracza.length>=10){   // Kiedys: zawsze losujemy nowe id, zeby dalo sie zaprosic 'nowego' gracza, gdy juz sie ma z nim stol na starym nicku (taki smieszny blad...). Ale teraz juz nie!
	    killCiacho("idGracza");
	    idGracza = dajLosoweId();      // wylosuj nowe, krotsze id
	}
	upieczCiacho("idGracza",idGracza);
	if (idGracza.length < 10 && opisGracza.length > 0
	    && opisGracza.charAt(0) != "*") // gosc bez kropki na poczatku
	    opisGracza = "*" + opisGracza;
	opisGracza = zabezpieczenia(opisGracza);
	if (opisyGraczy.jest(opisGracza) || (opisGracza == '*komputer') || (opisGracza == '*graZkomputerem')){
	    id('wybierzInnyNick').innerHTML = 
		slownik('Ktoś teraz używa taki nick.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') + '&nbsp;';
	    id('wybierzInnyNick').style.visibility = 'visible';
	}else{
	    // sprawdz poprawnosc nicku...
	    var nickPoprawny = 1;
	    var opisG = opisGracza;
	    if (opisGracza.charAt(0) == "*")
		opisG = opisGracza.substr(1);

	    if (!sprawdzamPoprawnoscWprowadzonegoNicku(opisG)) {
		id('wybierzInnyNick').innerHTML =
		    slownik('Dozwolone są litery, cyfry i znak _&nbsp;&nbsp;&nbsp;') + '&nbsp;';
		id('wybierzInnyNick').style.visibility = 'visible';

	    }else if ( odchamiajNick(opisGracza) == 'nieOk' ){
		id('wybierzInnyNick').innerHTML =
		    slownik('Ten nick jest już zajęty!');
		id('wybierzInnyNick').style.visibility = 'visible';

	    }else{
		id('wybierzInnyNick').innerHTML = '';
		upieczCiacho('opisGracza',opisGracza);
		tbls.show(uidStolu);
		wylogowanoMnie();
		var ajaxUrl = rootUrl + "a.kropki?co=guestLogin&idGracza=" +
		    encodeURIComponent(idGracza) + '&opis=' + encodeURIComponent(opisGracza)
		    + '&lang=' + (jezykGracza ? encodeURIComponent(jezykGracza) : "xxx");
		wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
		kliknietoZmien = false;
	    }
	}
    }

}
function sprawdzamPoprawnoscWprowadzonegoNicku(nick){
    if ( nick.charAt(0) == ' ' || nick.charAt(nick.length-1) == ' ' || nick.indexOf('  ')>=0 )
	return false;

    for (var i=0; i<nick.length; i++) {
	var c = nick.charCodeAt(i);
	if (c==0x20 || (c>=0x30 && c<=0x39) || (c>=0x41 && c<=0x5a) ||
	    c==0x5f || (c>=0x61 && c<=0x7a))
	    continue;
	if (c>= 0xc0) continue;    //dopuszczamy wiele znakow utf o wysokich kodach
	//mozna by jeszcze cos sprawdzac dalej, ale juz wychodzimy
	return false;
    }
    
    return true;

}
function id(co){
    return document.getElementById(co);

}
function wezOstatnieId(s){
    var gdzie = s.lastIndexOf(')');
    if (gdzie>=0) {
	s = s.substring(gdzie+1);
	gdzie = s.indexOf('_');
	if (gdzie>0)
	    idZsgfa = s.substring(0, gdzie);
	else idZsgfa = '0';
    }
    else idZsgfa = '0';

}

function wylogowanoMnie(){
    // resetuje niektore zmienne po wylogowaniu
    nrOstWiadomosciWgSerwera =0;
    nrOstWiadomosci = 0;
    ostatniaWiadomosc = 'x';
}
function sprawdzZalogowanie(infoZserw){
    // funkcja pomocnicza do wahadla, sprawdza czy jestesmy zalogowani,
    // jesli trzeba probuje logowac, wysylac jezyk

    //dla przyszłych automatycznych logowań (np. po chwilowym zawieszeniu się sieci)
    if ((infoZserw != "ustawOpis")) czasAutomatycznegoLogowania = 4;

    if ( (infoZserw == "ustawOpis") && (ustawOpis == false) ){
	wylogowanoMnie();
	if (kliknietoZmien){
	    zaciemnijStrone();
	    ustawOpis = true;
	    wyslijJezyk = false;
	}else{
	    if (czasAutomatycznegoLogowania == 4){
		if ((idGracza.length == 10) && (opisGracza.charAt(0) != "*")){
		    var ajaxUrl = rootUrl + 'auth.py?co=loguj' + 
			'&opisGracza=' + encodeURIComponent(opisGracza) + 
			'&idGracza=' + encodeURIComponent(idGracza);

		    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
		    wyslijJezyk = true;
		    czasAutomatycznegoLogowania--; //zostaje 3s na automatyczne zalogowanie
		}else{
		    // jestem gosciem
		    if (idGracza.length >= 10) idGracza = dajLosoweId();
		    var ajaxUrl = rootUrl + "a.kropki?co=guestLogin&idGracza=" +
			encodeURIComponent(idGracza) + '&opis=' + encodeURIComponent(opisGracza)
			+ '&lang=' + (jezykGracza ? encodeURIComponent(jezykGracza) : "xxx");
		    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
		    czasAutomatycznegoLogowania--; //zostaje 3s na automatyczne zalogowanie
		}
	    }else if (czasAutomatycznegoLogowania > 0){
		//trwa próba automatycznego zalogowania gracza
		czasAutomatycznegoLogowania--;
	    }else{
		zaciemnijStrone();
		ustawOpis = true;
		wyslijJezyk = false;
	    }
	}
    }else if( (infoZserw != 'ustawOpis') && (ustawOpis == true) ){
	id('tekstPowitania').style.display = 'none';
	var opisGraczaBezKolka;
	if (opisGracza.charAt(0) != "*")
	    opisGraczaBezKolka = opisGracza;
	else
	    opisGraczaBezKolka = opisGracza.substring(1);
	if (opisGraczaBezKolka.length > maxWyswOpis) {
	    opisGraczaBezKolka = opisGraczaBezKolka.substr(0,maxWyswOpis-2) + '...';
	    }
	id('opisGraczaWmenu').innerHTML = slownik('Witaj') +' <b>' + opisGraczaBezKolka + '</b>';
	id('tloCien').style.top = '-10px';
	setTimeout('id("tloCien").style.display = "none"',900);
	ustawOpis = false;
	wyslijJezykDoSerwera();
	wyslijJezyk = false;
    }else if (wyslijJezyk) {
	wyslijJezykDoSerwera();
	wyslijJezyk = false;
    }


}

var licznikUruchomien = 0;
var coTeraz = '';

var pisze_w;
var zmianyWstolach_w;   // czy zmienila sie lista stolow
var zmianyWgraczach_w;  // czy zmienila sie lista graczy (albo info o graczach)
var zablokowanyPrzez_w = [];

function wahadlo2(){
    // wahadlo2 korzysta z nowego protokolu...
    try{
	czasWyslania = aktualnyCzas();
	var czasWyslaniaLokalny = czasWyslania;
	var xmlhttp = makexmlhttp();
	if(xmlhttp){
	    var aktualnyWpis = id("nowyWpis").value;
	    if (poprzedniWpis != aktualnyWpis){
		var pisze = 'y';
		poprzedniWpis = aktualnyWpis;
	    }else{
		var pisze = 'n';
	    }
	    var infoCommand = 'i' + uidStolu + pisze + ((jakaGra.substr(0,6) == "kropki") ? 'K' : 'M') + (statusG ? "a":"b");
	    var url = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + 
		"&co=get" + ((listaOsob==-1? "":"B")) + "Msg&msgNo=" + lastMsgNoFromServer +
		(listaOsob==-1 ? "" : ("." + listaOsob)) +
		'&wiad=' + ((nrOstWiadomosci > nrOstWiadomosciWgSerwera) ?
			    (ostatniaWiadomosc + '/' + infoCommand) : infoCommand); 
	    // + "&pisze=" + pisze;
	    xmlhttp.open('GET', url, true);
	    xmlhttp.onreadystatechange = function(){ 
		if ( (xmlhttp.readyState == 4) && (xmlhttp.status == 200) ){
		    var ajax = xmlhttp.responseText;
		    var infoZserwera = ajax.substring(0,2);
		    if ((infoZserwera == 'ok' || infoZserwera == 'sd') && ajax.substring(ajax.length-4)=='/end') {
			ajax = ajax.substring(3);
			try { // na wszelki wypadek try, zeby nie wysypywalo nam wahadla
			    // parsuj ajax...
			    sprawdzZalogowanie(infoZserwera == 'sd' ? 'ustawOpis' : 'ok');
			    subskryb = {};
			    var wiadomosci = ajax.split('/');
			    var aktStol = 0;
			    var ileByloWiad = {};  // tez wykorzystywane jako lista subskr. stolow
			    var propozycje = {};
			    var ktoPisze = {};
			    var zalecanyStol = -1;  // ustawiamy to, jesli pojawil sie nasz nowy stol
			    zmianyWstolach_w = false;
			    zmianyWgraczach_w = false;
			    zaproszenie = null;  // domyslnie nie ma  zaproszenia
			    var sTag = '';  // sgf
			    var hTag = '';  // helpInfo
			    var fTag = '';  // flags
			    var FTag = '';  // flags-added-time
			    var cTags = [];  // chat
			    var bTags = []; // other players subscriptions
			    for (var kn=0; kn<wiadomosci.length; kn++) {
				var k = wiadomosci[kn];
				var pocz = k.charAt(0);
				var reszta = k.substring(1);
				switch (pocz) {
				case 'm':
				    {
					var liczby = reszta.split('.');
					if (liczby.length==3) {
					    if (lastMsgNoFromServer == parseInt(liczby[0])) {
						lastMsgNoFromServer = parseInt(liczby[1]);
						if (listaOsob >= 0){
						    listaOsob = lastMsgNoFromServer;
						}
						nrOstWiadomosciWgSerwera = parseInt(liczby[2]);
						// ponizsze jest konieczne np. po Ctrl-R
						if (nrOstWiadomosci < nrOstWiadomosciWgSerwera)
						    nrOstWiadomosci = nrOstWiadomosciWgSerwera;
					    }
					    else throw "ParseError1";
					}
					else throw "ParseError2";
				    }
				    break;
				case 'g':
				    {
					zmianyWstolach_w = true;
					var noweUIDki = reszta.substring(1).split('.');
					if (reszta.charAt(0) == 'r') {
					    // wyczysc aktualne stoly
					    tableUIDs = [];
					    tableXInfo= [];
					    opisyStolow = [];
					}
					
					if (reszta.charAt(0) == 'd') {
					    // usun stol(y)
					    for (var stoln=0; stoln<noweUIDki.length; stoln++) {
						var stol = noweUIDki[stoln];
						var ind = tableUIDs.indeks(stol);
						if (ind>=0) {
						    tableUIDs.splice(ind, 1);  // usun element
						    tableXInfo.splice(ind, 1);
						    opisyStolow.splice(ind, 1);
						}
					    }
					}else if (reszta.length>1) {   // dodaj stoly, jesli sa
					    for (var stoln=0; stoln<noweUIDki.length; stoln++) {
						var stol = noweUIDki[stoln];
						tableUIDs.push(stol);
						opisyStolow.push('-');  // wstaw tymczasowy opis
						tableXInfo.push('-');  // wstaw tymczasowe info
					    }
					}
				    }
				    break;
				case 'd': // opis stolu, np. d147.2020stanF0.180.15.playerB.playerW
				    {  
					zmianyWstolach_w = true;   // na wszelki wypadek i tutaj zmieniamy
					var pola = reszta.split('.');
					dTags[parseInt(pola[0])] = [pola[1] + '.' + pola[2] + '.' + pola[3],
								    pola[4], pola[5]];
					var ind = tableUIDs.indeks(pola[0]);
					if (ind>=0) {
					    if (opisyStolow[ind] == '-') {  // tymczasowy opis wskazuje na nowy stol
						if (pola[pola.length-2] == opisGracza ||
						    pola[pola.length-1] == opisGracza)
						    zalecanyStol = pola[0];
					    }
					    opisyStolow[ind] = pola[pola.length-2] + ' - ' + pola[pola.length-1];
					}
				    }
				    break;
				case 'p': // gracze
				    {
					zmianyWgraczach_w = true;
					var nowi = reszta.substring(1).split('.');
					if (reszta.charAt(0) == 'r') {
					    // wyczysc aktualnych graczy
					    opisyGraczy = [];
					    opisyWolnych = [];
					}	

					if (reszta.charAt(0) == 'd') {
					    // usun gracza/graczy
					    for (var grn=0; grn<nowi.length; grn++) {
						var gr = nowi[grn];
						var ind = opisyGraczy.indeks(gr);
						if (ind>=0)
						    opisyGraczy.splice(ind,1);
						ind = opisyWolnych.indeks(gr);
						if (ind>=0)
						    opisyWolnych.splice(ind,1);
					    }
					    tbls.removePlayers(reszta.substring(1));
					}else{ // dodaj graczy
					    
					    for (var grn=0; grn<nowi.length; grn++) {
						var gr = nowi[grn];
						if (!opisyGraczy.jest(gr))
						    opisyGraczy.push(gr);
					    }
					}
				    }
				    break;
				case 'i': // info o graczach
				    {
					zmianyWgraczach_w = true;
					var pola = reszta.split('.');
					if (opisyGraczy.jest(pola[0])) {
					    // jest taki gracz, wiec dodajemy staty
					    awatary[pola[0]] = pola[1];
					    if (pola[2].indexOf('F')>=0) {
						if (!opisyWolnych.jest(pola[0]))
						    opisyWolnych.push(pola[0]);
					    }else {
						var ind = opisyWolnych.indeks(pola[0]);
						if (ind>=0)
						    opisyWolnych.splice(ind,1);
					    }
					    if (pola[2].indexOf('a')>=0) {
						statyGraczy['?' + pola[0]] = 'a';
					    }else if (pola[2].indexOf('b')>=0) {
						statyGraczy['?' + pola[0]] = 'b';
					    }
					    if (pola.length==4) {  // tylko jezyk
						statyGraczy[pola[0]] = pola[3]; 
					    } else if (pola.length==8) {   // jezyk+rank+WRP
						statyGraczy[pola[0]] = pola[3] + '.' + pola[4] + '.' + pola[5]
						    + '.' + pola[6] + '.' + pola[7];
					    }
					}
				    }
				    break;
				case 'q': // stol
				    if (fTag || FTag || sTag || hTag || cTags.length) {
					tbls.addToTable(aktStol, dTags[aktStol][0], sTag, fTag, FTag, hTag, cTags);
					fTag = ''; FTag = ''; sTag = ''; hTag = ''; cTags = [];
				    }
				    aktStol = reszta;
				    ileByloWiad[aktStol] = 0;
				    if (!(aktStol in nowiMogaPisac))
					nowiMogaPisac[aktStol] = true;
				    break;
				case 's': // sgf
				    sTag = k;
				    break;
				case 'f': // flagi
				    fTag = k;
				    break;
				case 'F': // flagi-added-time
				    FTag = reszta;
				    break;
				case 'c': // czat
				    cTags.push(k);
				    break;
				case 'b': // subscriptions (of other players)
				    bTags.push(reszta);
				    break;

				case 'v': // zaproszenie
				    {
					if (reszta.charAt(0) == 'r') {
					    var gracz = reszta.substring(1);
					    zaproszenie = { 'co': 'odrzucone', 'doKogo' : gracz};
					}else{
					    var zapr = reszta.substring(1);
					    var ind = zapr.indexOf('.');
					    var gracz = zapr.substring(0, ind);
					    var gameType = zapr.substring(ind+1);
					    if (reszta.charAt(0) == 's') {
						zaproszenie = { 'co': 'wysylam', 'doKogo' : gracz, 'type': gameType};
					    }else{  // 'g', czyli 'I get' (otrzymuje)
						zaproszenie = { 'co': 'otrzymuje', 'odKogo' : gracz, 'type': gameType};
					    }
					}
				    }
				    break;
				case 'w': // pisze
				    {
					ktoPisze[aktStol] = reszta;
				    }
				    break;
				case 'k': // kibice
				    {
					if (!(aktStol in kibice)) kibice[aktStol] = [];
					if (!(aktStol in kibiceDoOdbl)) kibiceDoOdbl[aktStol] = [];
					var jacy = reszta.substring(1).split('.');
					switch (reszta.charAt(0)) {
					case 'r':
					    kibice[aktStol] = jacy;
					    break;
					case 't':
					    kibiceDoOdbl[aktStol] = jacy;
					    nowiMogaPisac[aktStol] = false;
					    break;
					case 'a':
					    {
						for (var v=0; v<jacy.length; v++)
						    if (!kibice[aktStol].jest(jacy[v]))
							kibice[aktStol].push(jacy[v]);
					    }
					    break;
					case 'b':
					    {
						for (var v=0; v<jacy.length; v++)
						    if (!kibiceDoOdbl[aktStol].jest(jacy[v]))
							kibiceDoOdbl[aktStol].push(jacy[v]);
						nowiMogaPisac[aktStol] = false;
					    }
					    break;
					case 'u':
					    {
						for (var v=0; v<jacy.length; v++) {
						    var ind = kibiceDoOdbl[aktStol].indeks( jacy[v] );
						    if (ind>=0)
							kibiceDoOdbl[aktStol].splice(ind,1);
						    if (!kibice[aktStol].jest( jacy[v] ))
							kibice[aktStol].push(jacy[v]);
						}
						nowiMogaPisac[aktStol] = false;
					    }
					    break;
					case 'd':
					    {
						for (var v=0; v<jacy.length; v++) {
						    var ind = kibiceDoOdbl[aktStol].indeks( jacy[v] );
						    if (ind>=0)
							kibiceDoOdbl[aktStol].splice(ind,1);
						    var ind = kibice[aktStol].indeks( jacy[v] );
						    if (ind>=0)
							kibice[aktStol].splice(ind,1);
						}
					    }
					    break;
					}
				    }
				    break;
				case 'u': // propozycja (na stole)
				    propozycje[aktStol] = reszta;
				    break;
				case 'h': // informacje pomocnicze
				    hTag = k;
				    subskryb[aktStol] = reszta;
				    break;
				case 'x': // info stolu, np. x147.g.1.124
				    {  
					var ind = reszta.indexOf('.');
					var idSt = reszta.substring(0, ind);
					var xTag = reszta.substring(ind+1);
					var ind = tableUIDs.indeks(idSt);
					if (ind>=0) {
					    if (tableXInfo[ind].charAt(0) != xTag.charAt(0)) {
						zmianyWstolach_w = true;
					    }else{
						try {
						    if ((dTags[idSt][1] == opisGracza || dTags[idSt][2] == opisGracza) &&
							uidStolu != idSt)
							zmianyWstolach_w = true;
						}catch(e){};
					    }
					    tableXInfo[ind] = xTag;
					}
				    }
				    break;

				}
			    }
			    // ostatni stol:
			    if (fTag || FTag || sTag || hTag || cTags.length) {
				tbls.addToTable(aktStol, dTags[aktStol][0], sTag, fTag, FTag, hTag, cTags);
			    }
			    tbls.addSpectators(bTags);
			    
			    if (zmieniamStolNa in ileByloWiad) {
				// stol na ktory chce zmienic jest subskrybowany
				aktStol = zmieniamStolNa;
			    } else {
				aktStol = uidStolu;  // pozostawiam stol bez zmian
			    }
			    if (zalecanyStol >=0 && zalecanyStol in ileByloWiad) {
				aktStol = zalecanyStol;
				if (glosnikWlaczonyPocz && !cisza) setTimeout('soundOfGameStart()',350);
			    }
			    if (!(aktStol in ileByloWiad)) {  // stolu nie ma w subskrypcjach
				if (tableUIDs.jest(aktStol)) {
				    // stol jest, ale sie w subskrypcjach nie pojawil...
				    aktStol = uidStolu;  // pozostawiam na razie bez zmian, nie kasuje zmieniamStolNa
				}else{
				    // gdy stol zniknie, przejdz na stol AI
				    aktStol = graZKOMP;
				    zmieniamStolNa = 'x';   // skasuj na przyszlosc
				}
			    }else{
				zmieniamStolNa = 'x';   // skasuj na przyszlosc
			    }

			    if (aktStol != uidStolu) {
				uidStolu = aktStol;
				if (uidStolu != graZKOMP && jakaGra == "kulki") menuKropkiKulki("kropki");
				zmianyWstolach_w = true;
			    }
			    if (!(uidStolu in subskryb)){
				// popraw uidStolu
				var pp=0;
				for (p in subskryb) if (p>pp) pp=p;
				uidStolu = pp;
				zmianyWstolach_w = true;
			    }

			    if (aktStol in propozycje)
				propozycja = propozycje[aktStol];
			    else
				propozycja = null;
			    pisze_w = '';
			    if (aktStol in ktoPisze) {
				pisze_w = ktoPisze[aktStol];
			    }
			    
			    // skasuj sgfy ktorych juz nie subskrybujemy
			    {
				var sa = [];
				for (p in tbls.tables) sa.push(p);
				for (var i=0; i<sa.length; i++){
				    if (!(sa[i] in ileByloWiad)){
					/*
					var s = 'usuwam ' + sa[i] + ', widoczny: ' + tbls.shown +' / ';
					for (j=0; j<sa.length; j++) s += sa[j] + ' ';
					alert(s);*/
					tbls.removeTable(sa[i]);
				    }
				}
			    }


				/*
				  TODO:
				  - poprawic subskrypcje na serwerze (zmienStol itp.)
				  - byc moze uwzgledniac 'tuid' do automatycznego wypisywania z subskrypcji
				  - mozna by tez zmienic wywolanie zmienStol na wahadlo2 (ale wtedy trzeba
				    skasowac setTimeOut)
				  - UAKTUALNIAC zablokowanyPrzez_w

				 */
			    setTimeout("aktualizujStronePoWahnieciuGlobal()", 30);

			if (znikajaceInfo) {
			    znikajaceInfo--;
			    if (znikajaceInfo == 0)
				id('plansza').innerHTML = '';   // wyczysc ew. info, ze nie twoj ruch
			}
		        }catch(e){};
		    }

		    var opoznienie = aktualnyCzas() - czasWyslaniaLokalny;
		    var oszczedzaj = (infoZserwera != 'ok' || (jakaGra.substr(0,6) != "kropki")) ? 500 : 0;
		    if (opoznienie<1000 + oszczedzaj){
			setTimeout("wahadlo2()",900+oszczedzaj-opoznienie);
		    }else if (opoznienie<5000){
			setTimeout("wahadlo2()",100);   // czekamy min 100 ms przed kolejnym wahadlem
		    }
		}
	    }
	    xmlhttp.send(null);
	}
    }catch (e){}

}

function aktualizujStronePoWahnieciuGlobal() {
    aktualizujStronePoWahnieciu(zablokowanyPrzez_w, pisze_w, zmianyWstolach_w, zmianyWgraczach_w);
}

function sprobujZalogowacGracza(){
    //Próba automatycznego zalogowania usera za pomocą idGracza (pełni rolę hasła)
    //i opisuGracza. W wahadle jest sprawdzany czasAutomatycznegoLogowania.
    //Jak nie ma odpowiedzi przez 3s nie powiodło się logowanie, ustawOpis zwracane przez serwer
    //zostanie wykorzystane.
    if ((idGracza.length == 10) && (opisGracza.charAt(0) != "*")){
	var xmlhttp = makexmlhttp();
	try{
	    if(xmlhttp){

		
		xmlhttp.open('GET', ajaxUrl, true);
		xmlhttp.onreadystatechange = function(){ 
		    if ( (xmlhttp.readyState == 4) && (xmlhttp.status == 200) ){
			var ajax = xmlhttp.responseText;
			if (ajax.substring(0,3) == 'ok.'){
			    ajax = ajax.substring(3);
			    //na razie nie wiem co można zrobić z odpowiedzią
			}
		    }
		}
	    }
        }catch(e){}
	xmlhttp.send(null);
    }

}
function dodajDoCzata(tekst) {
    // funkcja do testow
    var diw = document.createElement("div");
    diw.innerHTML = tekst;
    id("czat").appendChild(diw);
}
function dajInfoOgraczu(opisG) {
    // zwraca '', albo ' (rank, jezyk)' (jesli sa), np. ' (1200, pl)' albo ' (en)'
    if (!(opisG in statyGraczy)){
	return '';
    }else{
	var jezykZapr = statyGraczy[opisG].substring(0,2);
	var infoG;
	if (jezykZapr.charAt(0)=='.') { // nie ma jezyka, ale jest rank + staty
	    infoG = statyGraczy[opisG].split('.')[1];  // rank zapraszajacego
	}else{
	    if (statyGraczy[opisG].length >= 3) {  // jest rank
		rank = statyGraczy[opisG].split('.')[1];  // rank zapraszajacego			
		infoG = rank + ', ' + jezykZapr;
	    }else{
		infoG = jezykZapr;
	    }
	}
	return ' (' + infoG + ')';
    }

}
function dajRankGracza(opisG)
{
    if (opisG in statyGraczy) {
	var t = statyGraczy[opisG].split('.');
	if (t.length <= 1)
	    return -10000;
	else
	    return parseInt(t[1]);
    }else {
	return -10000;
    }
}
function sortGraczy(a,b)
// porownuje graczy a i b, do sortowania na liscie
{
    var ra = dajRankGracza(a);
    var rb = dajRankGracza(b);
    if (rb>ra) return 1;
    if (ra>rb) return -1;
    return a.localeCompare(b);
}
function dajRankGraczaWNawiasie(opisG){
    var r = dajRankGracza(opisG);
    return (r > -10000) ? ("<span class=\"rankWNawiasie\"> (" + r + ")</span>") : '';
}

function aktualizujStronePoWahnieciu(zablokowanyPrzez, pisze, zmianyWstolach, zmianyWgraczach)
{
    if (uidStolu == graZKOMP){
	id('graZkomputerem').className = 'wyborNieAktywny';
	id('graZkomputerem').onclick = null;
    }else{
	id('graZkomputerem').className = 'wyborAktywny';
	id('graZkomputerem').onclick = function(){ zmienStol(graZKOMP) };
    }

    if (zmianyWstolach){
	var dl = tableUIDs.length;
	if (dl == 0){
	    id("aktywneGry").innerHTML = "<span class=\"tekstt\">--------</span>";
	}else{
	    var html = "";
	    for(var n=0; n<dl; n++){
		var opis = (tableXInfo[n].charAt(0) != 'f') ? opisyStolow[n] : ('<i>' + opisyStolow[n] + '</i>');
		if (uidStolu == tableUIDs[n]){
		    html += "<div class=\"wyborNieAktywny\">" + opis + "</div>\n";
		}else{
		    var jnr = '';
		    if ((dTags[tableUIDs[n]][1] == opisGracza && tableXInfo[n].substr(0,3) == 'g.1') ||
			(dTags[tableUIDs[n]][2] == opisGracza && tableXInfo[n].substr(0,3) == 'g.2')) {
			jnr = 'NaRuchu';
		    }
		    html += "<div onclick=\'zmienStol(" + tableUIDs[n] + ")\' class=\"wyborAktywny" + jnr + "\">" + 
			opis + "</div>\n";
		}
	    }
	    id("aktywneGry").innerHTML = html;
	}
    }

    if (zmianyWgraczach){
	var dl = opisyWolnych.length;
	if (dl == 0){
	    id("wolniGracze").innerHTML = "<span class=\"tekstt\">--------</span>"
		}else{
	    opisyWolnych.sort(sortGraczy);
	    
	    var html = "";
	    for(var n=0; n<dl; n++){
		var rank = dajRankGraczaWNawiasie(opisyWolnych[n]);
		if ( (opisGracza == opisyWolnych[n]) || //(zablokowanyPrzez.jest(opisyWolnych[n]))
		     ( (('?' + opisyWolnych[n]) in statyGraczy) && statyGraczy['?' + opisyWolnych[n]] == 'b')
		     ) {
		    html += "<div class=\"wyborNieAktywnyGracz\">" + opisyWolnych[n] +
			rank + "</div>\n";
		}else{
		    html += "<div onclick=\'przygotujZaproszenie(\"" + opisyWolnych[n] + "\")\' class=\"wyborAktywny\">" +
			opisyWolnych[n] + rank + "</div>\n";
		}
	    }
	    //if (id("wolniGracze").innerHTML != html){ // to i tak nie dziala!
	    id("wolniGracze").innerHTML = html;
	    //}
	}
    }

    //wyświetlanie wysłanych zaproszeń lub otrzymanych
    if (zaproszenie){
	if (zaproszenie["co"] == 'wysylam'){
	    id('tekstInfo').innerHTML = slownik('Zapraszasz gracza') + ' <span>' + zaproszenie['doKogo']
		+ '</span> ' + slownik('do gry') + '.';
	    id('przyciskInfo').value = slownik('Anuluj');
	    id('zaproszenieInfo').style.display = 'block';
	    id('przyciskInfo').onclick = anulujZaproszenie;
	}else if(zaproszenie["co"] == 'otrzymuje'){
	    id("zaproszenieOdGracza").innerHTML = zaproszenie['odKogo'] + dajInfoOgraczu(zaproszenie['odKogo']);
	    id("zaproszenieOdGraczaPlansza").innerHTML = zaproszenie['type'].substr(0,2) + 'x'
		+ zaproszenie['type'].substr(2,2);
	    var numerki = zaproszenie['type'].substring(9).split('.');
	    var instWin = parseInt(numerki[0]);
	    var t0 = parseInt(numerki[1]);
	    var t1 = parseInt(numerki[2]);
	    if (t0 > 0) {
		id("zaproszenieCzas").innerHTML = slownik('Czas początkowy') + ": " + (t0/60) +
		    slownik("min") + ", " + slownik('czas dodawany po każdym ruchu') + ": " + t1 + slownik("s");
	    }else{
		id("zaproszenieCzas").innerHTML = slownik('Bez limitu czasu') + ".";
	    }
	    var domyslne = (zasadyZSerwera.length >= 10) ? zasadyZSerwera : '2525stanF0.180.15';
	    var tekst = slownik('Zasady gry') + ': ';
	    if (zaproszenie['type'].substr(4,3) != domyslne.substr(4,3))
		tekst += '<span class="podkr">';
	    if (zaproszenie['type'].substr(4,4) == 'stan')
		tekst += slownik('standardowe');
	    else if (zaproszenie['type'].substr(4,4) == 'terr')
		tekst += slownik('na terytorium');
	    else if (zaproszenie['type'].substr(4,3) == 'noT') {
		tekst += slownik('bez terytorium') + ', ';
		tekst += slownik('pozycja początkowa') + ': ';
		if (zaproszenie['type'].substr(4,3) == domyslne.substr(4,3) &&
		    zaproszenie['type'].substr(4,4) != domyslne.substr(4,4))
		    tekst += '<span class="podkr">';
		if (zaproszenie['type'].substr(7,1) == '1')
		    tekst += slownik('X w środku');
		else
		    tekst += slownik('4 X losowo');
	    }
	    if (zaproszenie['type'].substr(4,4) != domyslne.substr(4,4))
		tekst += '</span>';
	    if (instWin == 15)
		tekst += ', ' + slownik('gra do 15 kropek przewagi');
	    else if (instWin == 30)
		tekst += ', ' + slownik('gra do 30 kropek przewagi');
	    id("zaproszenieZasady").innerHTML = tekst + '.';
	    if (zaproszenie['type'].substr(8,1) == 'F') {
		id("zaproszenieTypGry").innerHTML = slownik('Gra towarzyska') + '.';
	    }else if (zaproszenie['type'].substr(8,1) == 'R') {
		id("zaproszenieTypGry").innerHTML = slownik('Gra rankingowa') +'.';
	    }else { // 'r', czyli rank, ale zaczyna zapraszajacy
		id("zaproszenieTypGry").innerHTML = slownik('Gra rankingowa') + ', <span class="podkr">' + slownik('zaczyna') +  ' ' + zaproszenie['odKogo'] + '.</span>';
	    }
	    id("zaproszenie").style.display = "block";
	    id("zaproszenieTak").onclick = zaproszenieTak;
	    id("zaproszenieNie").onclick = zaproszenieNie;
	    id("zaproszenieBlokuj").onclick = zaproszenieBlokuj;
	    var htmlGlosnika = '';
	    if (glosnikWlaczony){
		htmlGlosnika = '<img onclick="wylaczGlosnik();" src="glosnikWlaczony.png">';
		if (!cisza) {
		    if (jestSwf){
			htmlGlosnika += '<object width="0" height="0">' +
			    '<param name="movie" value="alert.swf"><param name="volume" value="60">' +
			    '<param name="play" value="true"><param name="loop" value="false">' +
			    '<embed src="alert.swf" width="0" height="0" type="application/x-shockwave-flash" ' + 
			    'play="true" loop="false" volume="60"></embed>' +
			    '</object>';
		    }else{
			if ((przegladarka == 'ie') || (przegladarka == 'opera')){
			    htmlGlosnika += '<bgsound src="alert.wav">';
			}else{
			    htmlGlosnika += '<embed src="alert.wav" hidden="true">';
			}
		    }
		}
	    }else{
		htmlGlosnika = '<img onclick="wlaczGlosnik();" src="glosnikWylaczony.png">';
	    }
	    if (id('glosnik').innerHTML == '') id('glosnik').innerHTML = htmlGlosnika;
	}else if(zaproszenie["co"] == 'odrzucone'){
	    id('tekstInfo').innerHTML = slownik('Gracz') + ' <span>' + zaproszenie['doKogo'] + 
		'</span> ' + slownik('odrzucił zaproszenie') + '.';
	    id('przyciskInfo').value = 'Ok';
	    id('zaproszenieInfo').style.display = 'block';
	    id('przyciskInfo').onclick = zaproszenieOdrzuconeOk;
	}
    }else{
	id("zaproszenieInfo").style.display = "none";
	id("zaproszenie").style.display = "none";
	if (id('glosnik').innerHTML != '') id('glosnik').innerHTML = '';
    }

    // ew. zmiana stolu
    tbls.show(uidStolu);

    //wyświetlanie wysłanych propozycji lub otrzymanych
    if (propozycja!=propozycjaPoprzednia) {
	var ktoryGracz = tbls.whoAmI();
	// odtworz pozycje standardowa...
	id('koniecInfo').style.top = "80px";
	id("odslonKoniecInfo").style.visibility = "visible";
	if (propozycja) {
	    var tekstyProp = {
		'score':'z zachowaniem obecnego wyniku',
		'terr':'i podliczenie punktów na baseny',
		'draw':'remisem'};
	    if (propozycja[0] == ktoryGracz) {
		if (propozycja.substr(1) != 'new') {
		    // moja propozycja
		    id('infoNowaGra').style.visibility = 'hidden';
		    id('przygotujZakonczGre').style.display = 'none';
		    if (propozycja.substr(1)!=='undo')
			id('tekstKoniecInfo').innerHTML = slownik('Proponujesz przeciwnikowi ')
			    +slownik('zakończenie gry') + ' ' + slownik(tekstyProp[propozycja.substr(1)]);
		    else
			id('tekstKoniecInfo').innerHTML = slownik('Prosisz przeciwnika o cofnięcie ruchu');
		    id('przyciskKoniecInfo').value = slownik('Anuluj');
		    id('przyciskKoniecInfo').style.display = 'inline';
		    id('przyciskKoniecOkInfo').style.display = 'none';
		    id('przyciskKoniecOdrzucamInfo').style.display = 'none';
		    id('koniecInfo').style.display = 'block';
		    id('przyciskKoniecInfo').onclick = function() { wyslijPropozycje('cancel' + propozycja); }
		}else{
		    // napisz 'oczekiwanie az przeciwnik zacznie gre'
		    id('infoNowaGra').innerHTML = slownik('oczekiwanie na przeciwnika');
		    id('infoNowaGra').style.visibility = 'visible';
		}
	    }
	    else if (ktoryGracz != 's') {
		if (propozycja.substr(1) != 'new') {
		    // dostaje propozycje
		    tbls.goToLastMove();       // pokaz ostatnie ruchy na wszelki wypadek
		    if (propozycja.substr(1) == 'terr')     // przesun okno, zeby zabezpieczyc
			id('koniecInfo').style.top = "125px"; // usera przed zaakceptowaniem nie tego, co chce
		    else if (propozycja.substr(1) == 'drop')
			id('koniecInfo').style.top = "170px";
		    else if (propozycja.substr(1) == 'undo')
			id('koniecInfo').style.top = "215px";
		    id('infoNowaGra').style.visibility = 'hidden';
		    id('przyciskKoniecInfo').style.display = 'none';
		    id('przyciskKoniecOkInfo').style.display = 'inline';
		    id('przyciskKoniecOdrzucamInfo').style.display = 'inline';
		    if (propozycja.substr(1) !== 'undo'){
			id('tekstKoniecInfo').innerHTML = slownik('Przeciwnik proponuje ')
			    +slownik('zakończenie gry') + ' ' + slownik(tekstyProp[propozycja.substr(1)]);
			id('przyciskKoniecOkInfo').value = slownik('Przyjmuję');
			id('przyciskKoniecOdrzucamInfo').value = slownik('Odrzucam');
		    }else{
			id('tekstKoniecInfo').innerHTML = slownik('Przeciwnik prosi o cofnięcie ruchu');
			id('przyciskKoniecOkInfo').value = slownik('Zgoda');
			id('przyciskKoniecOdrzucamInfo').value = slownik('Odrzucam');
		    }
		    id('koniecInfo').style.display = 'inline';
		    id('przyciskKoniecOkInfo').onclick = function() { wyslijPropozycje('ok' + propozycja); }
		    id('przyciskKoniecOdrzucamInfo').onclick = function() { wyslijPropozycje('reject' + propozycja); }
		}else{
		    // napisz 'jescze raz?'
		    id('infoNowaGra').innerHTML = slownik('jeszcze raz?');
		    id('infoNowaGra').style.visibility = 'visible';
		}
	    }
	}else{
	    id('infoNowaGra').style.visibility = 'hidden';
	    id('infoNowaGra').innerHTML = '';
	    id('przygotujZakonczGre').style.display = 'none';
	    id('koniecInfo').style.display = 'none';
	}
	propozycjaPoprzednia = propozycja;
    }

    //aktualizowanie, kto pisze
    if ((pisze != '') && (pisze != opisGracza)){
	id('graczPisze').innerHTML = pisze + ' ' + slownik('pisze') + '...';
    }else{
	id('graczPisze').innerHTML = '';
    }

    //id('info').innerHTML = awatar + ' ' + awatary[opisGracza];
    if (awatar != awatary[opisGracza]){ //jak jest nowy awatar
	awatar = awatary[opisGracza];
	// TODO: wyswietl awatar!
    }
    if (wlasnieWczytalemKolory) {
	wlasnieWczytalemKolory = false;
	wezKolory(koloryZSerwera);
	wezDzwieki(dzwiekiZSerwera);
	wezZasady(zasadyZSerwera);
	wezAlerty(alertyZSerwera);
    }
    if (koloryZSerwera == '.') {
	if (opisGracza.charAt(0)!="*") {
	    wczytajKoloryIdzwiekiZSerweraFun();
	}else{
            koloryZSerwera = '';
        }
    }
    // sprawdz okrazenie - musi byc po wyswietlPlikSgf, bo tam moze sie uaktualnic okrazam
    //okrazamPokazInfo();  // TODO: cos z tym zrobic

}
function blokujKibica(){
    var html = '';	
    var nowiMoga = !(uidStolu in nowiMogaPisac) || nowiMogaPisac[uidStolu];
    if (nowiMoga){
	html += '<div onclick=\'blokujTego("...")\'><i>' + slownik('każdego nowego...') + '</i></div>';
    }
    if (uidStolu in kibice && kibice[uidStolu].length > 0){
	for(var n=0; n<kibice[uidStolu].length; n++){
	    html += '<div onclick=\'blokujTego("' + kibice[uidStolu][n] + '")\'>' + kibice[uidStolu][n] + '</div>';
	}
    }else if (!nowiMoga){
	html += '<i style="display:block; margin-top:10px; font-size:13px; margin-left:10px; ">' +
	    slownik('Żaden kibic nie może pisać') + '.</i>';
    }
    if (!nowiMoga){
	html += '<b style="display:block; margin-top:10px; font-size:10px; margin-left:10px; ">' +
	    slownik('ODBLOKUJ kibica') + ':</b>';
	if (kibiceDoOdbl[uidStolu].length>0){
	    for(var n=0; n<kibiceDoOdbl[uidStolu].length; n++){
		html += '<div onclick=\'odblokujTego("' + kibiceDoOdbl[uidStolu][n] +
		    '")\'>' + kibiceDoOdbl[uidStolu][n] + '</div>';
	    }
	}
	else{
	    html += '<i style="display:block; margin-top:10px; font-size:13px; margin-left:10px; ">' +
		slownik('Nie ma kibiców do odblokowania') + '.</i>';
	}
    }
    id('listaKibicow').innerHTML = html;
    aktywnyPrzelacznik(2);
    //id('obszarCzata').style.display = 'none';
    //id('obszarObecnych').style.display = 'none';
    //id('kibice').style.display = 'block';
    //id('krzyzykKibica').onclick = function(){ aktywnyPrzelacznik(-1); }

}
function blokujTego(kibic){
    var ajaxUrl = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + "&co=blokujKibica&stol="
	+ encodeURIComponent(uidStolu) + "&ktorego=" + encodeURIComponent(kibic);
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    aktywnyPrzelacznik(-1);

}
function odblokujTego(kibic){
    var ajaxUrl = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + "&co=odblokujKibica&stol="
	+ encodeURIComponent(uidStolu) + "&ktorego=" + encodeURIComponent(kibic);
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
    aktywnyPrzelacznik(-1);
}
function aktywnyPrzelacznik(ktory){
    var el  = ["obszarCzata", "obszarObecnych", "kibice"];
    var prz = ["przelacznikCzat", "przelacznikObecni", "blokujKibica"];
    if (ktory==-1) { // = wybierz domyslny: czat lub obecni
	ktory = (listaOsob==-1) ? 0 : 1;
    }
    for (var p=0; p<3; p++){
	id(el[p]).style.display = (p==ktory) ? 'block' : 'none';
	id(prz[p]).style.fontWeight = (p==ktory) ? 'bold' : 'normal';
    }
}
function wlaczCzat(){
    if (listaOsob >=0) {
	listaOsob = -1;
    }
    aktywnyPrzelacznik(0);
}
function wlaczObecni(){
    if (listaOsob == -1) {
	listaOsob = 0;
	tbls.spectatorsViewTurnedOn();
	id("obszarObecnych").innerHTML = '';
    }
    aktywnyPrzelacznik(1);
}
function zmienStol(nowyStol){
    if (jakaGra == "kulki") menuKropkiKulki("kropki");
    if (nowyStol == uidStolu) return;
    if (nowyStol in subskryb) {
	// mozna zmienic stol bez komunikacji z serwerem
	uidStolu = nowyStol;
	zmieniamStolNa = uidStolu;
	aktualizujStronePoWahnieciu([], '', true, false);
    }else{
	var ajaxUrl = rootUrl + "a.kropki?idGracza=" + escape(idGracza) +
	    "&co=zmienStol&na=" + encodeURIComponent(nowyStol);
	wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);
	zmieniamStolNa = nowyStol;
    }

}
function przygotujZaproszenie(opisZapraszanego){
    if (jakaGra == "kulki") menuKropkiKulki("kropki");
    if (opisGracza.charAt(0) != "*") {  // zarejestrowany
	id('przygotujZaproszenie').style.height = "435px";
	id('zasadyDiw').style.display = "inline";
	if (opisZapraszanego.charAt(0) == '*') {
	    id('rankingowa').style.display = "none";
	    id('towText').innerHTML = '&nbsp;';
	    id('rankText').style.display = "none";
	    id('rankingowaJa').style.display = "none";
	    id('rankJaText').style.display = "none";
	    id('towarzyska').style.display = "none";
	    id('rodzajGryGoscia').style.display = "inline";
	}else{
	    id('rankingowa').style.display = "inline";
	    id('towText').innerHTML = slownik('towarzyska') + '&nbsp;';
	    id('rankText').style.display = "inline";
	    id('rankingowaJa').style.display = "inline";
	    id('rankJaText').style.display = "inline";
	    id('towarzyska').style.display = "inline";
	    id('rodzajGryGoscia').style.display = "none";
	}
	id('tylkoTer').style.display = "inline";
	id('t3932').style.display = "inline";
    }else{ // gosc
	id('przygotujZaproszenie').style.height = "230px";
	id('zasadyDiw').style.display = "none";
	id('tylkoTer').style.display = "none";
	id('t3932').style.display = "none";
    }
    id('zaprosGracza').innerHTML = zabezpieczenia(opisZapraszanego) + dajInfoOgraczu(opisZapraszanego);
    id("zaproszenie").style.display = "none";
    id('przygotujZaproszenie').style.display = 'block';
    id("zaproszenieZapros").onclick = function(){ wyslijPrzygotowaneZaproszenie( opisZapraszanego); };
    id("zaproszenieAnuluj").onclick = anulujPrzygotowaneZaproszenie;

}
function anulujPrzygotowaneZaproszenie(){
    odswiezDane();  // ustawien (po kliknieciu na 'ustawienia')
    id("przygotujZaproszenie").style.display = "none";

}
function wyslijPrzygotowaneZaproszenie(opisZapraszanego){
    var jaka_Gra = pobierzDaneZaproszenia();
    if (opisZapraszanego.charAt(0) == "*" && jaka_Gra.substr(8,1) != 'F') {
	// rank z gosciem - zmien!
	jaka_Gra = jaka_Gra.substr(0,8) + 'F' + jaka_Gra.substr(9);
    }
    id("przygotujZaproszenie").style.display = "none";
    wyslijZaproszenie(opisZapraszanego, jaka_Gra);
    odswiezDane();  // ustawien (po kliknieciu na 'ustawienia')

}
function pobierzDaneZaproszenia(){
    var wlk_pl = 2020;
    if (id("rozmiarPlanszy2525").checked)
	wlk_pl=2525;
    else if (id("rozmiarPlanszy3030").checked)
	wlk_pl=3030;
    else if (id("rozmiarPlanszy3932").checked)
	wlk_pl=3932;
    var czas0 = id('wyborCzas0').value;
    var czasD = id('wyborCzasDod').value;
    var rules = 'stanF0';
    if (opisGracza.charAt(0) != "*") {  // zarejestrowany
	if (id("zasadyGryRosyjskie1").checked)
	    rules = 'noT1';
	else if (id("zasadyGryRosyjskie4").checked)
	    rules = 'noT4';
	else if (id("zasadyGrySzkrab").checked)
	    rules = 'terr';
	else
	    rules = 'stan';
	if (id("rankingowa").checked)
	    rules += 'R';
	else if (id("rankingowaJa").checked)
	    rules += 'r';
	else rules += 'F';
	if (id("przewaga15").checked)
	    rules += '15';
	else if (id("przewaga30").checked)
	    rules += '30';
	else rules += '0';
    }
    if (wlk_pl == '3932' && rules.substr(0,3) != 'noT') {
	wlk_pl = '3030';  // zmien plansze na zasadach innych niz bez terytorium
    }
    if (rules.charAt(4) != 'F' && czas0==0)
	czas0 = 60;
    if (czas0==0) czasD=0;
    return  wlk_pl  + rules + '.' + (czas0*60) + '.' + czasD;
}

function wyslijZaproszenie(opisZapraszanego, jaka_Gra){
    var ajaxUrl = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + "&co=zapraszam&kogo=" + decodeURIComponent(opisZapraszanego) + "&plansza=" + jaka_Gra; //jakaGra = plansza  + rules + '.' + (czas0*60) + '.' + czas1;
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);

}
function anulujZaproszenie(){
    var ajaxUrl = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + "&co=anulujZaproszenie";
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);

}
function zaproszenieTak(){
    var ajaxUrl = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + "&co=zaproszenieTak";
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);

}
function zaproszenieNie(){
    var ajaxUrl = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + "&co=zaproszenieNie";
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);

}
function zaproszenieOdrzuconeOk(){
    var ajaxUrl = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + "&co=zaproszenieOdrzuconeOk";
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);

}
function zaproszenieBlokuj(){
    var ajaxUrl = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + "&co=zaproszenieBlokuj";
    wyslijZapytanieAjaxBezObslugiOdpowiedzi(ajaxUrl);

}
function wylaczGlosnik(){
    glosnikWlaczony = false;
    id('glosnik').innerHTML = '<img onclick="wlaczGlosnik();" src="glosnikWylaczony.png">';

}
function wlaczGlosnik(){
    glosnikWlaczony = true;
    id('glosnik').innerHTML = '<img onclick="wylaczGlosnik();" src="glosnikWlaczony.png">';

}
function zamienWyciszenie(){
    cisza = !cisza;
    id('ikonkiImg').src = "ikonki_" + (cisza ? "off" : "on") + (statusG ? "_on" : "_off") + ".png";
}
function zmienStatus() {
    statusG = !statusG;
    id('ikonkiImg').src = "ikonki_" + (cisza ? "off" : "on") + (statusG ? "_on" : "_off") + ".png";
}
function aktualnyCzas(){
    var d = new Date();
    return d.getTime();

}
function makexmlhttp(){
    var xmlhttp = false;
    if (window.XMLHttpRequest){
	xmlhttp = new XMLHttpRequest();
    }else{
	try{
	    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	}catch(e){
	    try{
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	    }catch (e){
		xmlhttp = false;
	    }
	}
    }
    return xmlhttp;

}
function sprawdzamCzyWahadloSieWaha2(){
    var opoznienie = aktualnyCzas() - czasWyslania;
    if (opoznienie >= 5000){
	wahadlo2();
    }
    setTimeout("sprawdzamCzyWahadloSieWaha2()",2000);

}
function czat(){
    id("nowyWpis").value = "";
    if (ustawOpis == false) id("nowyWpis").focus();
    id("wyslijWpis").onclick = wyslijWpis;
    id("nowyWpis").onkeydown = enterWpis;

}
function enterWpis(event){
    var klawisz = event ? event.keyCode : window.event.keyCode;
    if (klawisz == 13){ // 13 = enter
	wyslijWpis();
    }

}
function zabezpieczAtSlash(tekst){
    // zamienia '@' na '@A' oraz '/' na '@S'
    tekst = tekst.replace(/@/g,'@A');
    tekst = tekst.replace(/\//g,'@S');
    return tekst;

}
function odbezpieczAtSlash(tekst){
    // zamienia '@S' na '/' oraz '@A' na '@'
    tekst = tekst.replace(/@S/g,'/');
    tekst = tekst.replace(/@A/g,'@');
    return tekst;

}
function wyslijWpis(){
    try{
	var wpis = id("nowyWpis").value;
	if (uidStolu == 0){
	    wpis = odchamiajWpis(wpis);
	}else{
	    if ( (opisGracza != graczB) && (opisGracza != graczW) ){
		wpis = odchamiajWpis(wpis);
	    }
	}
	id("nowyWpis").value = '';
	var tekstWpisu = encodeURIComponent( wpis );
	if (tekstWpisu.length == 0) return true;
	nrOstWiadomosci++;
	var url = rootUrl + "a.kropki?idGracza=" + escape(idGracza) + "&co=dodajWpis&stol="
	    + encodeURIComponent(uidStolu) + "&wpis=" + tekstWpisu + '&msgNo='  + nrOstWiadomosci;	
	ostatniaWiadomosc = 'c' + nrOstWiadomosci + '.' + uidStolu + '.' + encodeURIComponent(zabezpieczAtSlash(wpis));
	wyslijZapytanieAjaxBezObslugiOdpowiedzi(url);
    }catch (e){}
}
function zabezpieczHtml(tekst){
    tekst = tekst.replace(/</g,'&#60;');
    tekst = tekst.replace(/>/g,'&#62;');
    tekst = tekst.replace(/\'/g,'&#39;');
    tekst = tekst.replace(/\"/g,'&#34;');
    return tekst;

}
function pokazTlumaczenie(){
    var hl, sl, tl;
    if (jezykGracza == 'pl'){ 
	hl='en'; sl='ru'; tl='pl';
    }else if (jezykGracza == 'ru'){ 
	hl='en'; sl='pl'; tl='ru';
    }else if (jezykGracza == 'en'){ 
	hl='ru'; sl='pl'; tl='en';
    }else if (jezykGracza == 'ua'){ 
	hl='en'; sl='pl'; tl='ua';
    }
    var oG = opisGracza.replace(/\s/g,'-')
    window.open('http://translate.google.' + jezykGracza + 
		'/translate?hl='+ hl + '&sl=' + sl + '&tl=' + tl + 
		'&u=http%3A%2F%2Fzagram.org%2FwpisyZagram.' + uidStolu + '.' + encodeURIComponent(oG) + '.html',
		'translate','width=800px,scrollbars=yes,location=no,screenX=0,screenY=0');
   // window.open(rootUrl + 'wpisyZagram.' + uidStolu + '.' + encodeURIComponent(opisGracza) + '.html',
	//	'translate','width=800px,scrollbars=yes,location=no,screenX=0,screenY=0');

}

var wslowa;   // tu bedzie tablica z wulg slowami

function przygotujWSlowa(){
    var w = 'fLZn.4ta.4d.5fL.5pm.4i.5p.4Sp.5ae.6d.6i.7lS.7n.7pZ.6m.6S.6A.7fL.7p.8m.4Z.fmu.3e.3j.3d.4fL.4pm.3mi.3S.4p.3A.hSniE.5dg.6O.7d.8z.8EA.0z.0p.8p.7EA.9z.9p.7iz.8p.7S.8EA.7A.8zfmi.9pA.8EA.0zfmi.1pA.6om.8zfmi.9pA.8EA.0zfmi.1pA.6rS.8EA.6aybA.5fmi.5me.6j.6i.7fmi.7pA.7yb.5pA.2umiwhSo.9e.9j.9fmi.9m.0g.0O.1d.!z.!EA.#z.#p.!p.1EA.@z.@p.1iz.!p.1S.!EA.1A.!zfmi.@pA.!EA.#zfmi.$pA.0fmi.0om.!zfmi.@pA.!EA.#zfmi.$pA.0pA.0yb.0aybA.9pA.9SrS.hZu.3e.3j.3d.4fL.4pm.3mi.3S.4p.3A.kZfN.4iw.LZn.3ta.3d.4fL.4pm.3i.4p.3Sp.4ae.5d.5i.6lS.6n.6pZ.5m.5S.5A.6fL.6p.7m.3Z.niEdsfta.6d.7fL.7pm.6ip.6Sp.6Z.6A.4re.5d.5i.6lS.6n.6pZ.5m.6if.5A.6fL.6p.7m.3rmjfm.6Xe.7d.7i.8lS.8n.8pZ.7A.8fL.8p.9m.NZwiyXad.8fL.8pm.7ip.7mi.7S.8p.7Z.4a.5yfA.6Ne.7d.7m.8fL.8i.9lS.9n.9pZ.8p.9m.7S.6Xad.8ip.8mi.8S.8Z.3ae.4j.4d.5fL.5pm.4mi.5ybSr.9ta.9d.0fL.0pm.9ip.9mi.9Sp.0am.9A.4S.5p.4A.pdXNSniEfe.9j.9ta.9d.0fL.0pm.9Sp.9A.SfLZndg.6O.7d.8z.8p.7iz.8p.7S.7A.8zfmi.9pA.6om.8zfmi.9pA.ShumiwhSo.9e.9j.9fmi.9m.0g.0O.1d.!z.!EA.#z.#p.!p.1EA.@z.@p.1iz.!p.1S.!EA.1A.!zfmi.@pA.!EA.#zfmi.$pA.0fmi.0om.!zfmi.@pA.!EA.#zfmi.$pA.0pA.0yb.0aybA.9pA.9SrS.umchbmi.7ofta.9d.0fL.0pm.9ip.9Sp.0am.9Z.9A.8if.2iwhSo.7e.8fe.9d.9i.0lS.0n.0pZ.9A.0fL.0p.1m.7j.7fmi.7irm.7m.8g.8O.9d.0z.0p.9EA.9iz.0p.9S.9A.0zfmi.1pA.8fmi.8om.0zfmi.1pA.0EA.8pA.8yb.7pA.7Sre.9d.9i.0lS.0n.0pZ.9A.0fL.0p.1m.2bh.4e.4j.4d.5fL.5pm.4Sp.4A.4bmi.uShniE.6dg.7O.8d.9z.9EA.1z.1p.9p.8EA.0z.0p.8iz.9p.8S.9EA.8A.9zfmi.0pA.9EA.1zfmi.!pA.7om.9zfmi.0pA.9EA.1zfmi.!pA.7rS.7aybA.6fmi.6me.7j.7i.8fmi.8pA.8yb.6pA.3umiwhdod.1g.1O.!d.@z.@EA.$z.$p.@p.!EA.#z.#p.!iz.@p.!S.@EA.!A.@zfmi.#pA.@EA.$zfmi.%pA.1fmi.1n.!e.@f.!fmi.!pA.1om.@zfmi.#pA.@EA.$zfmi.%pA.1p.!A.1rS.1yb.8So.0e.0j.0fmi.0m.1g.1O.!d.@z.@EA.$z.$p.@p.!EA.#z.#p.!iz.@p.!S.@EA.!A.@zfmi.#pA.@EA.$zfmi.%pA.1fmi.1om.@zfmi.#pA.@EA.$zfmi.%pA.1pA.1yb.1aybA.0pA.0SrS.@EA.2niE.5ta.5d.6sfta.8d.9fL.9pm.8ip.8Sp.9am.8Z.8A.6fL.6pm.6re.7d.7i.8lS.8n.8pZ.7m.8if.7A.8fL.8p.9m.5ip.5Sp.6am.5A.2NZwamirm.7Sre.9d.9i.0lS.0n.0pZ.9A.0fL.0p.1m.2umiwhSoe.9j.9irm.9m.0g.0O.1d.!z.!p.1iz.!p.1S.1A.!zfmi.@pA.0fmi.0om.!zfmi.@pA.0pA.0yb.9Sre.1d.1i.!lS.!n.!pZ.1A.!fL.!p.@m.uwbiniEdre.9d.9i.0lS.0n.0pZ.9A.0fL.0p.1m.4umiwhSoe.1j.1m.!g.!O.@d.#z.#EA.%z.%p.#p.@EA.$z.$p.@iz.#p.@S.#EA.@A.#zfmi.$pA.#EA.%zfmi.^pA.!fmi.!om.#zfmi.$pA.#EA.%zfmi.^pA.!pA.!yb.1SrS.#EA.3AumiwhSo.1e.1j.1fmi.1m.!g.!O.@d.#z.#EA.%z.%p.#p.@EA.$z.$p.@iz.#p.@S.#EA.@A.#zfmi.$pA.#EA.%zfmi.^pA.!fmi.!om.#zfmi.$pA.#EA.%zfmi.^pA.!pA.!yb.!aybA.1pA.1SrS.#EA.wSbniEdg.7O.8d.9z.9EA.1z.1p.9p.8EA.0z.0p.8iz.9p.8S.9EA.8A.9zfmi.0pA.9EA.1zfmi.!pA.7om.9zfmi.0pA.9EA.1zfmi.!pA.7re.8d.8i.9lS.9n.9pZ.8m.9d.9i.0p.9Z.8S.9EA.8A.9fL.9p.0m.7aybA.6fmi.6me.7j.7i.8fmi.8yb.yNZwamio.8d.9fL.9pm.8i.9p.8m.8Sp.9am.8Z.5AyAsyfA.0Ne.1d.1m.!fL.!i.@lS.@n.@pZ.!p.@m.0Xa.!d.@fL.@pm.!ip.!mi.!S.@p.!Z.8r.9ta.9d.0fL.0pm.9ip.9mi.9Sp.0am.9Z.yumiwhdod.9g.9O.0d.1z.1p.0iz.1p.0S.0A.1zfmi.!pA.9fmi.9n.0fmi.0pA.9pA.9yb.6So.8e.8j.8fmi.8m.9g.9O.0d.1z.1p.0iz.1p.0S.0A.1zfmi.!pA.9fmi.9om.1zfmi.!pA.9pA.9yb.8pA.8SrS.aniEdg.5O.6d.7z.7EA.9z.9p.7p.6EA.8z.8p.6iz.7p.6S.7EA.6A.7zfmi.8pA.7EA.9zfmi.0pA.5om.7zfmi.8pA.7EA.9zfmi.0pA.5rS.5aybA.4me.5j.5i.6fmi.6pA.6yb.aNZwam.6e.6g.6j.6O.7d.8z.8EA.0z.0p.8p.7EA.9z.9p.7iz.8p.7S.8EA.7A.8zfmi.9pA.8EAzfmi.1pA.6d.7g.7O.8d.9z.9EA.1z.1p.9p.8EA.0z.0p.8iz.9p.8S.9EA.8A.9zfmi.0pA.9EA.1zfmi.!pA.7fmi.7n.8e.9f.0e.0d.0i.1lS.1n.1pZ.0A.1fL.1p.!m.8fmi.8pA.7om.9zfmi.0pA.9EA.1zfmi.!pA.7p.8A.7rS.9EA.7yb.6fmi.6om.8zfmi.9pA.8EA.0zfmi.1pA.6pA.6SrS.6yb.aAniEdg.6O.7d.8z.8EA.0z.0p.8p.7EA.9z.9p.7iz.8p.7S.8EA.7A.8zfmi.9pA.8EA.6om.8zfmi.9pA.6rS.5fmi.5me.6j.6i.7fmi.7pA.7yb.5pA.2umiwhdod.0g.0O.1d.!z.!EA.!p.1EA.1iz.!p.1S.1A.!zfmi.@pA.0fmi.0n.1e.!f.1fmi.1pA.0om.!zfmi.@pA.0p.1A.0rS.0yb.7So.9e.9j.9fmi.9m.0g.0O.1d.!z.!EA.#z.#p.!p.1EA.@z.@p.1iz.!p.1S.!EA.1A.!zfmi.@pA.!EA.#zfmi.$pA.0fmi.0om.!zfmi.@pA.!EA.#zfmi.$pA.0pA.0yb.0aybA.9pA.9SrS.bdniE.5dg.6O.7eEAz.7d.8z.8EA.0p.8p.7EA.9z.9p.7iz.8p.7S.8EA.7A.8zfmi.9pA.8EA.0zfmi.1pA.6om.8zfmi.9pA.8EA.0zfmi.1pA.6rS.6aybA.5fmi.5me.6j.6i.7fmi.7pA.7yb.2NZwam.7e.7g.7j.7O.8d.9z.9EA.1z.1p.9p.8EA.0z.0p.8iz.9p.8S.9EA.8A.9zfmi.0pA.9EA.1zfmi.!pA.7fmi.7om.9zfmi.0pA.9EA.1zfmi.!pA.7pA.7SrS.7yb.7aybA.2umiwhdod.0g.0O.1d.!z.!EA.#z.#p.!p.1EA.@z.@p.1iz.!p.1S.!EA.1A.!zfmi.@pA.!EA.#zfmi.$pA.0fmi.0n.1e.!f.1fmi.1pA.0om.!zfmi.@pA.!EA.#zfmi.$pA.0p.1A.0rS.0yb.7Soe.9j.9fmi.9m.0g.0O.1d.!z.!EA.#z.#p.!p.1EA.@z.@p.1iz.!p.1S.!EA.1A.!zfmi.@pA.!EA.0fmi.0om.!zfmi.@pA.!EA.#zfmi.$pA.0pA.0yb.9SrS.!EA';
    wslowa = w.split('.');
    var c = '2345678901!@#$%^';
    for (var i=1; i<wslowa.length; i++) {
	var ind = c.indexOf(wslowa[i].charAt(0));
	if (ind>=0) {
	    ind += 2;
	    wslowa[i] = wslowa[i-1].substr(0, ind) + wslowa[i].substr(1);
	}
    }
}
function szyfruj(slowo){
    var alfabet1 = 'aąbcćdeęfghijklłmnńoóprsśtuwyzźż';
    var alfabet2 = 'deEfghijklLmnNoOprsStuwyzXZaAbcC';
    slowo = slowo.toLowerCase();
    var nslowo = '';
    litery = slowo.split('');
    for(var n=0; n<litery.length; n++){
	var i = alfabet1.indexOf(litery[n]);
	//if (i == -1) return false; //jak nie ma litery slowa w alfabecie
	if (i != -1){
	    nslowo += alfabet2.charAt(i);
	}
    }
    return nslowo;
}
function odchamiajNick(slowo){
    slowo = szyfruj(slowo);
    var ile = wslowa.length;
    var dlS = slowo.length;
    for(var n=0; n<ile; n++){
	if (slowo.indexOf(wslowa[n]) != -1) return 'nieOk';
    }
    return 'ok';

}
function odchamiajWpis(wpis){
    var alfabet = 'aąbcćdeęfghijklłmnńoóprsśtuwyzźż ';
    nwpis = '';
    litery = wpis.toLowerCase().split('');
    dlL = litery.length;
    for(var n=0; n<dlL; n++){
	var i = alfabet.indexOf(litery[n]);
	if (i != -1) nwpis += litery[n];
    }
    var slowa = nwpis.split(' ');
    var ile = wslowa.length;
    var saWulgaryzmy = false;
    for(var n=0; n<slowa.length; n++){
	var zaszyfrowane = szyfruj(slowa[n]);
	for(var k=0; k<ile; k++){
	    if ( zaszyfrowane == wslowa[k]){
		if (slowa[n].substr(0,2) == 'ch') {
		    slowa[n] = 'ch...';
		}else{
		    slowa[n] = slowa[n].substr(0,1) + '...';
		}
		saWulgaryzmy = true;
	    }
	}
    }
    if (saWulgaryzmy){
	return slowa.join(' ');
    }else{
	return wpis;
    }

}
/* ---- */

function wstawLinki(tekst){
    tekst = tekst + " "; //cholera nie wiem jak zrobić re gdy link jest na końcu tekstu                             
    var kawalki = new Array();
    var re = /http:\/\/.*?\s/;
    var n = 0;
    var gdzie;
    while ((gdzie=tekst.search(re)) >= 0) {
	kawalki.push( tekst.substr(0, gdzie) );
	var link = tekst.match(re)[0];
	var j = link.length-1;
	if (link.charAt(j-1) == '"'){
	    kawalki.push(link);
	}else{
	kawalki.push( '<a href="' + link.substr(0,j) + '" target="_blank">' + link.substr(0,j) + '</a>' + link.substr(j) );
	}
	tekst = tekst.substr(gdzie + j+1);
    }
    kawalki.push(tekst);
    return kawalki.join('');
}

/* ------------------ kulki ----------------------------------------------------- */
var jakaGra = '';  // bardzo wazne, zeby bylo jakos zainicjalizowane (inaczej wahadlo sie wysypie za 1. razem)
var dl = 45; 
var t;                  //tabela tabel w której jest info o zapełnieniu pól
var ai = -1, aj = -1;   //współrzędne aktywnej (kliknietej w danej chwili kropki)
var punkty = 0;
var ni = 0;
var skasowane;
var trzyKulki = new Array();
var rysowanieDrogi = true;
function menuKropkiKulki(jaka){
    jakaGra = jaka;
    if ((jakaGra == "kropki") || (jakaGra == "kropkiKulkiNieZaczete")){
	id("graWkropki").style.backgroundColor = "#bfe3cd";
	id("graWkropki").style.textDecoration = "none";
	id("graWkropki").onmouseover = null;
	id("graWkropki").style.cursor = "default";
	id("graWkropki").onclick = null;
	id("graWkulki").style.backgroundColor = "#f8f3e6";
	id("graWkulki").onmouseover = function(){ 
	    id("graWkulki").style.textDecoration = "underline";
	}
	id("graWkulki").onmouseout = function(){ 
	    id("graWkulki").style.textDecoration = "none";
	}
	id("graWkulki").style.cursor = "pointer";
	id("graWkulki").onclick = function(){
	    if (jakaGra == "kropki"){
		menuKropkiKulki("kulki");
	    }else{
		menuKropkiKulki("zacznijKulki");
	    }
	}
	id("tloObszaruGry").style.display = "block";
	id("planszaKropek").style.display = "block";
	id("xyRuchu").style.display = "block";
	id("zasadyGryMenu").style.visibility = "visible";
	id("zakonczGreRozmiarKropek").style.visibility = "visible";
	id("obszarGryWkulki").style.display = "none";

    }else{
	id("graWkropki").style.backgroundColor = "#f8f3e6";
	id("graWkropki").onmouseover = function(){ 
	    id("graWkropki").style.textDecoration = "underline";
	}
	id("graWkropki").onmouseout = function(){ 
	    id("graWkropki").style.textDecoration = "none";
	}
	id("graWkropki").style.cursor = "pointer";
	id("graWkropki").onclick = function(){ 
	    menuKropkiKulki("kropki");
	}
	id("graWkulki").style.backgroundColor = "#bfe3cd";
	id("graWkulki").style.textDecoration = "none";
	id("graWkulki").onmouseover = null;
	id("graWkulki").style.cursor = "default";
	id("graWkulki").onclick = null;
	id("tloObszaruGry").style.display = "none";
	id("planszaKropek").style.display = "none";
	id("xyRuchu").style.display = "none";
	id("zasadyGryMenu").style.visibility = "hidden";
	id("zakonczGreRozmiarKropek").style.visibility = "hidden";
	id("obszarGryWkulki").style.display = "block";
	if (jakaGra == "zacznijKulki"){
	    poczatekKulek();
	    id("usunDrogeRuchu").onclick = function(){
		rysowanieDrogi = false;
		id("usunDrogeRuchu").style.display = "none";
	    }
	}
	jakaGra = "kulki";
    }

}
function pole(i,j){
    var litery = new Array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i');
    return id( litery[parseInt(i)]+litery[parseInt(j)] ); //czesto argument funkcji to string dlatego parseInt

}
function rysujKreskiPlanszy(){
    //45*9=405 - długość boku kwadratu planszy
    var x, y, html = ""; 
    id("polaPlanszy").innerHTML = "";
    for(var i=0; i<=9; i++){
	y = i*45;
	html += '<div style="top:' + y + 'px; left:0px; width:405px; height:1px;"></div>';
    }
    for(var j=0; j<=9; j++){
	x = j*45;
	html += '<div style="top:0px; left:' + x + 'px; width:1px; height:405px"></div>';
    }
    id("polaPlanszy").innerHTML = html;

}
function polaPlanszy(){
    rysujKreskiPlanszy();
    for(var i=0; i<9; i++){
	for(var j=0; j<9; j++){
	    pole(i,j).style.width = dl-1+"px";  // -1potrzebne przy onmouseover i onmouseout
	    pole(i,j).style.height = dl-1+"px";
	    pole(i,j).style.top = i*dl+"px";
	    pole(i,j).style.left = j*dl+"px";
	    pole(i,j).innerHTML = ""; //dla nowej gry
	    pole(i,j).onmouseover = null;
	    pole(i,j).onmouseout = null;
	    pole(i,j).onclick = function(){ pomoc(); }
	    pole(i,j).style.backgroundColor = "";
	    pole(i,j).style.border = ""; 
	}
    }

}
function pomoc(){
    id("pokazInfoOzasadach").style.display = "block";
    setTimeout("id(\"pokazInfoOzasadach\").style.display = \"none\";",3000);
}
function linia(ip, jp, ik, jk){
    var odLewa=0, odGory=0, szerokosc=0, wysokosc=0;
    if (ip == ik){ //w poziomie
	if (jp<jk){
	    odLewa = 21 + jp*dl;
	    szerokosc = (jk-jp)*dl + 3;
	}else{
	    odLewa = 21 + jk*dl;
	    szerokosc = (jp-jk)*dl + 3;
	}
	odGory = 21 + ip*dl;
	wysokosc = 3;
    }else{
	if (jp==jk){ //w pionie
	    if (ip<ik){
		odGory = 21 + ip*dl;
		wysokosc = (ik-ip)*dl + 3
	    }else{
		odGory = 21 + ik*dl;
		wysokosc = (ip-ik)*dl + 3
	    }
	    odLewa = 21 + jp*dl;
	    szerokosc = 3;
	}
    }

    id("liniaLamana").innerHTML += '<div style="position: absolute; top:' + odGory + 
	'px; left:' + odLewa + 'px; ' + 'width:' + szerokosc + 'px; height:' + wysokosc + 
	'px; background-color:#fffaa9; z-index:10; border: none;"></div>';

}
function utworzCzystaTabele(){
    t = new Array();
    for(var i=0; i<9; i++){
	t[i] = new Array();
	for(var j=0; j<9; j++){
	    t[i][j] = new Object();
	    t[i][j].jestKulka = false;
	    t[i][j].kolor = false;
	    t[i][j].ileKrokow = 900;
	    t[i][j].gdzieNajblizej = false;
	}
    }

}
function wyczyscTabeleZkrokow(){
    for(var i=0; i<9; i++){
	for(var j=0; j<9; j++){
	    t[i][j].ileKrokow = 900;           //  g
	    t[i][j].gdzieNajblizej = false;    // l p   lewo, prawo, gora, dol
	}                                      //  d
    }

}
function wypelnijTabeleDanymiKrokow(i,j,skad,ileKrokow){
    if ( (i>=0) && (i<9) && (j>=0) && (j<9) ){
	if (t[i][j].jestKulka == false){
	    if (ileKrokow + 1 < t[i][j].ileKrokow){
//		pole(i,j).innerHTML = ileKrokow+1 + skad;
		t[i][j].ileKrokow = ileKrokow + 1;
		t[i][j].gdzieNajblizej = skad;
		wypelnijTabeleDanymiKrokow(i,j-1,'p', ileKrokow+1); //w lewo idzie wiec przychodzi z prawej
		wypelnijTabeleDanymiKrokow(i,j+1,'l', ileKrokow+1);
		wypelnijTabeleDanymiKrokow(i-1,j,'d', ileKrokow+1);
		wypelnijTabeleDanymiKrokow(i+1,j,'g', ileKrokow+1);
	    }
	}
    }

}
function zacznijWypelniacTabeleDanymiKrokow(i,j){
    t[i][j].jestKulka = true;
    wypelnijTabeleDanymiKrokow(i,j-1,'p', 0);
    wypelnijTabeleDanymiKrokow(i,j+1,'l', 0);
    wypelnijTabeleDanymiKrokow(i-1,j,'d', 0);
    wypelnijTabeleDanymiKrokow(i+1,j,'g', 0);

}
function rysujDroge(i, j, ik, jk){  //jk, jk - punkt koncowy drogi przesunięcia kulki !!!
    i = parseInt(i); j = parseInt(j); ik = parseInt(ik); jk = parseInt(jk);
    if ( (i == ik) && (j == jk) ) {
	return true; //koniec rysowania
    }else{
	if (t[i][j].gdzieNajblizej == 'p'){
	    linia(i, j, i, j+1);
	    rysujDroge(i, j+1, ik, jk);
	}else if (t[i][j].gdzieNajblizej == 'l'){
	    linia(i, j, i, j-1);
	    rysujDroge(i, j-1, ik, jk);	    
	}else if (t[i][j].gdzieNajblizej == 'g'){
	    linia(i, j, i-1, j);
	    rysujDroge(i-1, j, ik, jk);	    
	}else if (t[i][j].gdzieNajblizej == 'd'){
	    linia(i, j, i+1, j);
	    rysujDroge(i+1, j, ik, jk);	    
	}
    }

}
function przygotowaniePrzedNastepnymRuchem(){
    id("liniaLamana").innerHTML = "";
    if (rysowanieDrogi) setTimeout('skasowane = kasujPiecLubWiecejKulek()',200);
    else setTimeout('skasowane = kasujPiecLubWiecejKulek()',80);

    setTimeout('if (skasowane == false) rysujLosoweTrzyKulki()',400);

}
function przesunKulke(ip,jp,ik,jk){
    var kolor = skasujKulke(ip,jp);
    if (rysowanieDrogi) rysujDroge(ik,jk,ip,jp);
    if (rysowanieDrogi) setTimeout('przygotowaniePrzedNastepnymRuchem()',500);
    else setTimeout('przygotowaniePrzedNastepnymRuchem()',300);
    postawKulke(ik,jk,kolor);
    for(var i=0; i<9; i++){
	for(var j=0; j<9; j++){
	    if (t[i][j].jestKulka == false){
		pole(i,j).onmouseover = null;
		pole(i,j).onmouseout = null;
		pole(i,j).onclick = null;
	    }
	}
    }
    ai=-1; aj=-1;  //nie ma już aktywnej kulki
    pole(ip,jp).style.backgroundColor = "";
    pole(ip,jp).style.border = ""; 
    pole(ik,jk).onmouseover = null;
    pole(ik,jk).onmouseout = null;
    pole(ik,jk).style.backgroundColor = "";
    pole(ik,jk).style.border = ""; 
    
}
function postawKulke(i,j,kolor){
    t[i][j].jestKulka = true;
    t[i][j].kolor = kolor;
    //pole(i,j).innerHTML = '<img src="kulki/kulka' + kolor + '.png">';
    pole(i,j).innerHTML = '<img style="position:absolute; top:0px; left:0px;" src="kulki/kulka' + kolor + 
	'.png"><div style="position:absolute; top:0px; left:0px; width:45px; height:45px;"></div>';
    pole(i,j).onclick = new Function('aktywujKropke("' + i + '","' + j + '"); ');

}
function skasujKulke(i,j){
    t[i][j].jestKulka = false;
    pole(i,j).innerHTML = '';
    pole(i,j).onclick = null;
    return t[i][j].kolor;

}
function aktywujKropke(wi, wj){
    wi = parseInt(wi);
    wj = parseInt(wj);
    if ( (ai == wi) && (aj == wj) ) { return true; } //jak kliknie ponownie aktywną kropkę
    pole(wi, wj).style.backgroundColor = "#d9d48a"; 
    pole(wi, wj).style.border = "1px solid #b5b19e";
    if ( ai != -1 ){ //-1 jak nie ma aktywnej
	pole(ai,aj).style.backgroundColor = "";
	pole(ai,aj).style.border = "";
    }
    ai = wi;
    aj = wj;
    wyczyscTabeleZkrokow(); 
    zacznijWypelniacTabeleDanymiKrokow(wi,wj);

    for(var i=0; i<9; i++){
	for(var j=0; j<9; j++){
	    if ( (t[i][j].jestKulka == false) && (t[i][j].gdzieNajblizej) ){
		pole(i,j).onmouseover = function(){
		    this.style.backgroundColor = "#d9d48a"; this.style.border = "1px solid #b5b19e";}
		pole(i,j).onmouseout = function(){this.style.backgroundColor = ""; this.style.border = ""; }
		pole(i,j).onclick = new Function('przesunKulke(' + ai + ',' + aj + ',' + i + ',' + j + ')');
	    }
	}
    }

}
function losujTrzyKulki(co){
    //0 - Czerwona, 1 - Niebieska, 2 - Cyjan, 3 - Zielona, 4 - Fioletowa, 5 - Szara
    //kolory musza byc od dużych liter ze względu na nazwy np. kulkaCzerwona.png
    var kolory = ['Czerwona', 'Niebieska', 'Cyjan', 'Zielona', 'Fioletowa', 'Szara'];

    wolneMiejsca = new Array();
    for(var i=0; i<9; i++){
	for(var j=0; j<9; j++){
	    if (t[i][j].jestKulka == false){
		wolneMiejsca.push([i,j]);
	    }
	}
    }
    ileWolnych = wolneMiejsca.length;
    var ileLosuj = (ileWolnych >=3) ? 3 : ileWolnych;

    if ( (co == 'polozenie') || (co == 'polozenieKolory') ){
	var ileWylosowanych = 0;
	while(ileWylosowanych < ileLosuj){
	    var k = Math.floor( Math.random() * ileWolnych );
	    var wi = wolneMiejsca[k][0];
	    var wj = wolneMiejsca[k][1];
	    if ( t[wi][wj].jestKulka == false){ //moze byc juz zajete w poprzednim losowaniu (obrocie petli)
		t[wi][wj].jestKulka = true;
		trzyKulki[ileWylosowanych][0] = wi;
		trzyKulki[ileWylosowanych][1] = wj;
		ileWylosowanych++;
	    }
	}
	if (co != 'polozenieKolory'){ return ileLosuj; }
    }

    if ( (co == 'kolory') || (co == 'polozenieKolory') ){
	for(var n=0; n<ileLosuj; n++){
	    var nrKoloru = Math.floor( Math.random() * 6 ); //kolory kulki
	    trzyKulki[n][2] = kolory[nrKoloru];
	}
    }
    return ileLosuj;

}
function rysujLosoweTrzyKulki(){
    id("nastepneKulki").innerHTML = "";
    if (trzyKulki.length == 0){ //zachodzi kiedy plansza jest pusta (po wczytaniu strony)
	trzyKulki = [ ["","",""], ["","",""], ["","",""] ];
	losujTrzyKulki('polozenieKolory');
	var ileWylosowano = 3;

    }else{//kolory juz sa wylosowanie teraz tylko polozenie bo trzeba uwzglednic poprzednie przesuniecie
	var ileWylosowano = losujTrzyKulki('polozenie'); 
    }
    for(var n=0; n<ileWylosowano; n++){
	postawKulke(trzyKulki[n][0], trzyKulki[n][1], trzyKulki[n][2]);
    }
    var ileWylosowano = losujTrzyKulki('kolory');  //tylko kolory bo polozenie i tak bedzie losowane nastepnym razem
    for(var n=0; n<ileWylosowano; n++){
	id("nastepneKulki").innerHTML += '<img src="kulki/kulka' + trzyKulki[n][2] + '.png">';
    }

    setTimeout('kasujPiecLubWiecejKulek()',200); //gdyby trafiło w wolne miejsce pieciu lub wiecej kulek

}
function toSamo(i,j,kolor){
    if ( (i>=0) && (i<9) && (j>=0) && (j<9) ){
	if (t[i][j].jestKulka){
	    if (t[i][j].kolor == kolor){
		return true; 
	    }
	}
    }
    return false;

}
function zwiekszPunktyO(n){
    punkty += n; 
    id("punkty").innerHTML = punkty;

}
function kasujPiecLubWiecejKulek(){
    var skasowane = false;
    for(var i=0; i<9; i++){
	for(var j=0; j<9; j++){
	    if (t[i][j].jestKulka){
		var kolor = t[i][j].kolor;
		//poziomo
		for(var n=1; n<9; n++){ 
		    if (toSamo(i,j+n,kolor) == false){ break; } 
		}
		if (n>4){ 
		    zwiekszPunktyO(n);
		    for(var k=0; k<n; k++){ skasujKulke(i,j+k); }
		    skasowane = true;
		    continue;
		}
		//pionowo
		for(var n=1; n<9; n++){ 
		    if (toSamo(i+n,j,kolor) == false){ break; } 
		}
		if (n>4){ 
		    zwiekszPunktyO(n);
		    for(var k=0; k<n; k++){ skasujKulke(i+k,j); }
		    skasowane = true;
		    continue;
		}
		//pd-wsch
		for(var n=1; n<9; n++){ 
		    if (toSamo(i+n,j+n,kolor) == false){ break; } 
		}
		if (n>4){ 
		    zwiekszPunktyO(n);
		    for(var k=0; k<n; k++){ skasujKulke(i+k,j+k); }
		    skasowane = true;
		    continue;
		}
		//pd-zach
		for(var n=1; n<9; n++){ 
		    if (toSamo(i+n,j-n,kolor) == false){ break; } 
		}
		if (n>4){ 
		    zwiekszPunktyO(n);
		    for(var k=0; k<n; k++){ skasujKulke(i+k,j-k); }
		    skasowane = true;
		    continue;
		}
	    }
	}
    }
    return skasowane;

}
function aktywujNowaGra(){
    id("nowaGra").onmouseover = function(){ this.style.border = "2px solid #307fef" }
    id("nowaGra").onmouseout = function(){ this.style.border = "2px solid #b6cdef" }
    id("nowaGra").onclick = function(){  ai = -1; aj = -1; punkty = 0;  poczatekKulek(); }

}
function poczatekKulek(){
    polaPlanszy();
    utworzCzystaTabele();
    rysujLosoweTrzyKulki();
    id("punkty").innerHTML = punkty;
    aktywujNowaGra();

}

/* poczatek kolorkow */
// TODO: tło przycisków niewłączonej pauza i +60 po najechaniu na nie kursorem   (mało istotne)
//       tło przycisku włączonej pauzy po najechaniu na nią kursorem   (mało istotne)
// TODO: ekran logowania (?) -- chociaz to chyba nieistotne...

var koloryCzego = ['id:glowne|borderColor',
		   'body',
		   'id:glowne|menuGracza|menuGorne|background',
		   'css:div#menuGorne a|color;id:zmienOpisGracza|color',
		   'id:tloObszaruGry|background',

		   'css:div.wspolrzedne|div.wspolrzedne2|color',
		   'grid',
		   'coordBackground',
		   'id:xyRuchu|color',

		   'id:czat|graczPisze|background',
		   'id:nowyWpis|background',
		   'css:div#czat div|color',
		   'css:div#czat b|color',

		   'css:div#czat b.cG|color',
		   'css:div#czat b.cB|color',
		   'css:div#czat b.cW|color',
		   'id:wyborGracza|background',
		   'css:div#wyborGracza .tekst|div#wyborGracza .tekstt|color',

		   'css:div.wyborAktywny|color',
		   'css:div.wyborNieAktywny|color',
		   'css:div.wyborNieAktywny|backgroundColor',
		   'css:div.wyborNieAktywnyGracz|color',
		   'popUp|borderColor;css:div#przygotujZakonczGre hr|backgroundColor;css:div.znikajace|borderColor;id:dodajCzasB|pauzaB|dodajCzasW|pauzaW|borderColor',

		   'popUp|background;css:div.znikajace|backgroundColor',
		   'popUp|color;css:div.znikajace|color',
		   'id:wlacznikHistorii|ruchPlus|ruchMinus|podazajZaGra|historiaRuchow|background',
		   'id:wlacznikHistorii|ruchPlus|ruchMinus|podazajZaGra|historiaRuchow|color',
		   'id:jakieZasadyWynik|color',

		   'id:graczB|punktyB|dodajCzasB|czasB|color',
		   'id:graczW|punktyW|dodajCzasW|czasW|color',
		   'scoreNotOnMove',
		   'scoreOnMove',
		   'pauseOff',
		   'id:blokujKibica|translator|color;css:div#listaKibicow div|color',
		   'id:kibice|background',
		   'css:div#kibice span|color'
		   ];

var koloryStand = ['d97c85', '5b7580', 'f8f3e6', '184bde', 'ffffff',
		   '000000', '666666', '77ff77', '000000',
		   'f5f0e3', 'fafaf2', '000000', '111111',
		   '118011', '111188', 'aa0000', 'f8f3e6', '000000',
		   '184bde', '11359c', 'c6c396', '11359c', 'b2a36c',
		   'f2ef91', '000000', 'd8d3c0', '000000', '000000',
		   '2139e1', 'ec1313', scoreBackgroundColours[0].substring(1),
		   scoreBackgroundColours[1].substring(1), pauseOffBackgroundColours[0].substring(1),
		   '184bde', 'ff9494', '000000'];
var mojeKolory = new Array();

var koloryZSerwera ='.';
var wlasnieWczytalemKolory = false; // hack, zob. aktualizujPoWahnieciu...
var paletaMenu = 1;  // id aktywnego elementu menu (wczytajPalete)
var wyswietlamUstawienia = false;

function zmienKolor(nr, jakiKolor, wywolanieZhtml){
    var popUpWindowsId = [//"tekstPowitania",
			  "przygotujZaproszenie",
			  "zaproszenieInfo",
			  "zaproszenie",
			  "koniecInfo",
			  "okrazamOkno",
			  "ostrzezenieStop",
			  "przygotujZakonczGre",
			  "kolory"];
    var kol = '#' + jakiKolor;
    var co = koloryCzego[nr].split(';');
    for (var z=0; z<co.length; z++) {
	mojeKolory[nr] = '' + jakiKolor;
	if (co[z].substr(0,2) == 'id') {
	    // zmieniamy jeden lub wiecej elementow dany przez id
	    var idki = co[z].substr(3).split('|');
	    for (var i=0; i<idki.length-1; i++)
		id(idki[i]).style[ idki[idki.length-1] ] = kol;
	}else if (co[z].substr(0,4)=='body'){
	    document.body.style.background = kol;
	}else if (co[z].substr(0,5)=='popUp'){
	    for (var i=0; i<popUpWindowsId.length; i++) {
		id(popUpWindowsId[i]).style[co[z].substr(6)]  = kol;
	    }
	}else if (co[z].substr(0,3)=='css'){
	    var par = co[z].substr(4).split('|');
	    for (var i=0; i<par.length-1; i++)
		changecss(par[i], par[par.length-1], kol);
	}else if (co[z]=='grid'){
	    gridColour = kol;
	    tbls.changeGridsColours();
	}else if (co[z] == 'coordBackground') {
	    coordBackgroundColour = kol;
	    podswietlKropke(poprzednieXY);
	}else if (co[z] == 'scoreNotOnMove') {
	    scoreBackgroundColours[0] = kol;
	    changecss('td.punkty', 'backgroundColor', kol);
	    tbls.tables[uidStolu].showWhoMovesAndResult();
	}else if (co[z] == 'scoreOnMove') {
	    scoreBackgroundColours[1] = kol;
	    tbls.tables[uidStolu].showWhoMovesAndResult();
	    tbls.tables[uidStolu].showTimers();
	}else if (co[z] == 'pauseOff') {
	    pauseOffBackgroundColours[0] = kol;
	    tbls.tables[uidStolu].showTimers();
	    id("dodajCzasW").style.background = kol;
	    id("dodajCzasB").style.background = kol;
	}
    }
    if (wywolanieZhtml) { // funkcja wywolana przez klikniecie na inpucie
	czyZapisanaPaleta();
    }
}

function poczatekKolorow(){
    for (var i=0; i<koloryStand.length; i++) {
	mojeKolory[i] = koloryStand[i];
	id('kol' + i).value = koloryStand[i];
	var f = 'zmienKolor(' + i + ', this.color, true); ';
	id('kol' + i).onchange = new Function(f); 
    }
    id('dzwieki').onclick = function(){ pokazMenuKolorow(0); };
    id('ogolne').onclick = function(){ pokazMenuKolorow(1); };
    id('wygladK').onclick = function(){ pokazMenuKolorow(2); };
    id('wczytajPalete').onclick = function(){ pokazMenuKolorow(3); };
    id('edytujPalete').onclick = function(){ pokazMenuKolorow(4); };
    id('zapiszPalete').onclick = function(){ pokazMenuKolorow(5); };
    id('dzwiekiZapr').onclick = function(){ glosnikWlaczony = id('dzwiekiZapr').checked; };
    id('dzwiekiPocz').onclick = function(){ glosnikWlaczonyPocz = id('dzwiekiPocz').checked; };
    id('dzwiekiRuch').onclick = function(){ glosnikWlaczonyRuch = id('dzwiekiRuch').checked; };
    id('uwaga1').onclick = function(){ if (id('uwaga1').checked) ustawieniaAlertu |= 1; else ustawieniaAlertu &= ~1; };
    id('uwaga2').onclick = function(){ if (id('uwaga2').checked) ustawieniaAlertu |= 2; else ustawieniaAlertu &= ~2; };
    id('uwaga4').onclick = function(){ if (id('uwaga4').checked) ustawieniaAlertu |= 4; else ustawieniaAlertu &= ~4; };
    id('uwagaCzasZmien').onclick = zmienCzasUwagi;
}
function otworzKolory(){
    wyswietlamUstawienia = true;
    if (opisGracza.charAt(0)=='*'){  // gosc
	id('buttonTwojaPal').disabled = true;
	id('buttonZapiszPal').disabled = true;
	id('buttonZapiszDzw').disabled = true;
	id('buttonZapiszZapr').disabled = true;
	id('buttonZapiszUwaga').disabled = true;
	id('sposob2').style.fontStyle = 'italic';
	id('wczytajPaleteInfo').style.display = 'inline';
	id('zapiszPaleteInfo').style.display = 'inline';
	id('zapiszDzwiekiInfo').style.display = 'inline';
	id('zapiszZaprInfo').style.display = 'inline';
	id('zapiszUwagaInfo').style.display = 'inline';
    }else{
	id('buttonTwojaPal').disabled = false;
	id('buttonZapiszPal').disabled = false;
	id('buttonZapiszDzw').disabled = false;
	id('buttonZapiszZapr').disabled = false;
	id('buttonZapiszUwaga').disabled = false;
	odswiezDane();
	id('sposob2').style.fontStyle = 'normal';
	id('wczytajPaleteInfo').style.display = 'none';
	id('zapiszPaleteInfo').style.display = 'none';
	id('zapiszDzwiekiInfo').style.display = 'none';
	id('zapiszZaprInfo').style.display = 'none';
	id('zapiszUwagaInfo').style.display = 'none';
    }

    id('kolory').style.display = 'inline';
    pokazMenuKolorow(0);
}
function przywrocDomyslneKolory(){
    for (var i=0; i<koloryStand.length; i++) {
	zmienKolor(i, koloryStand[i], false);
	id('kol' + i).color.fromString(koloryStand[i]);
    }
    if (opisGracza.charAt(0)=='*'){
	pokazCzyZapisana(true);
    }else{
	czyZapisanaPaleta();
    }
}
function czyZapisanaPaleta(){
    // sprawdza czy akt. paleta == paleta na serwerze i odp. ustawia informacje
    if (koloryZSerwera == ''){
	pokazCzyZapisana(true);
	return;
    }
    var kzs = koloryZSerwera.split('.');
    var takieSame = true;
    if (kzs.length < koloryStand.length) {
	takieSame = false;
    }else{
	for (var i=0; i<koloryStand.length; i++) {
	    if (id('kol' + i).value != kzs[i]){
		takieSame = false;
		break;
	    }
	}
    }
    pokazCzyZapisana(takieSame);
}
function pokazCzyZapisana(tak){
    if (tak) {
	id('zapiszPalete').style.color = id('edytujPalete').style.color;
	//id('zapiszPalete').style.fontWeight = 'normal';
	id('infoOZmianach').style.display = 'none';
    }else{
	id('zapiszPalete').style.color = '#ff0000';    
	//id('zapiszPalete').style.fontWeight = 'bold';
	id('infoOZmianach').style.display = 'inline';
    }
}
function pokazMenuKolorow(nowe){
    paletaMenu = nowe;
    var elem = ['dzwieki', 'ogolne', 'wygladK', 'wczytajPalete', 'edytujPalete', 'zapiszPalete'];
    for (var i=0; i<elem.length; i++) {
	if (i == paletaMenu) {
	    id(elem[i]).style.background = scoreBackgroundColours[1];
	    id(elem[i] + 'Html').style.display = 'inline';
	}else{
	    id(elem[i]).style.background =  pauseOffBackgroundColours[0];
	    id(elem[i] + 'Html').style.display = 'none';
	}
    }
    if (paletaMenu == 5) { // =='zapiszPalete'
	id('koloryTxtZ').value = dajKolory();
	id('zapiszKoloryInfo').innerHTML = '';
    }else if (paletaMenu == 0) {  // =='dzwieki'
	id('dzwiekiZapr').checked = glosnikWlaczony;
	id('dzwiekiPocz').checked = glosnikWlaczonyPocz;
	id('dzwiekiRuch').checked = glosnikWlaczonyRuch;
	id('zapiszDzwiekiStatusInfo').innerHTML = '';
	wezAlerty(ustawieniaAlertu + '.' + czasAlertu);
	id('zapiszUwagaStatusInfo').innerHTML = '';
    }else if (paletaMenu == 1) { // =='ogolne'
	odswiezDane();
	id('zapiszZaprStatusInfo').innerHTML = '';
    }
}
function odswiezDane(){
    if (wyswietlamUstawienia) {
	var g = pobierzDaneZaproszenia();
	var rest = g.substr(9).split('.');
	var tekst = slownik('Plansza') + ': ' + g.substr(0,2) + 'x' + g.substr(2,2) + '. ' + gameRules2string(g.substr(4,2), g.substr(7,1), parseInt(rest[0]), parseInt(rest[1]), parseInt(rest[2]), g.substr(8,1));
	id('ustawieniaZapr').innerHTML = tekst.replace(/\. /g, '.<br>');
    }
}
function dajKolory(){
    var k = [];
    for (var i=0; i<koloryStand.length; i++) {
	k.push(id('kol' + i).value);
    }
    return k.join('.');
}
function czyPoprKolor(k){
    if (k.length!=6) return false;
    var dozw = '0123456789abcdef';
    k = k.toLowerCase();
    for (var i=0; i<6; i++)
	if (dozw.indexOf( k.charAt(i) ) == -1)
	    return false;
    return k;
}
function wczytajKolory(){
    wezKolory(id('koloryTxtW').value);
    czyZapisanaPaleta();
}
function wezKolory(s){
    var kk = s.split('.', koloryStand.length);
    for (var i=0; i<kk.length; i++) {
	var ps = czyPoprKolor( kk[i] );
	if (ps) {
	    zmienKolor(i, ps, false);
	    id('kol' + i).color.fromString(ps);
	}
    }
}
function changecss(myclass,element,value) {
    var CSSRules;
    if (document.all) {
	CSSRules = 'rules';
    }
    else if (document.getElementById) {
	CSSRules = 'cssRules';
    }
    for (var i = 0; i < document.styleSheets[0][CSSRules].length; i++) {
	/*
	  if (document.styleSheets[0][CSSRules][i].selectorText.indexOf('button')!=-1)
	  alert(document.styleSheets[0][CSSRules][i].selectorText);
	*/
	if (document.styleSheets[0][CSSRules][i].selectorText == myclass) {
	    document.styleSheets[0][CSSRules][i].style[element] = value;
	}
    }	
}

function zapiszKoloryNaSerwerze(){
    var kol = dajKolory();
    var prefStr = 'colours.' + kol;
    zapiszUstawieniaNaSerwerze(prefStr, 'zapiszKoloryInfo', 'nie udało się, użyj METODY 1');
}

function wczytajKoloryIdzwiekiZSerweraFun(){
    var xmlhttp = makexmlhttp();
    if(xmlhttp){
	var ajaxUrl = rootUrl + 'auth.py?co=dajPref&opisGracza=' + encodeURIComponent(opisGracza);
	xmlhttp.open('GET', ajaxUrl, true);
	xmlhttp.onreadystatechange = function(){ 
	    if ( (xmlhttp.readyState == 4) && (xmlhttp.status == 200) ){
		var ajax = xmlhttp.responseText;
		wlasnieWczytalemKolory = true;
		koloryZSerwera = '';   dzwiekiZSerwera = '';   zasadyZSerwera = '';  alertyZSerwera = '';
		if (ajax.substring(0,11) == 'ok.otoDane.'){
		    ajax = ajax.substring(11);
		    var i = ajax.indexOf('pref/');
		    if (i!=-1) {
			var dane = ajax.substring(i).split('/');
			if (dane[0] == 'pref' && dane[dane.length-1].substr(0,3)=='end') {
			    for (var d=1; d<dane.length-1; d++) {
				if (dane[d].substr(0,8) == 'colours=') {
				    koloryZSerwera = dane[d].substring(8);
				}
				if (dane[d].substr(0,7) == 'sounds=') {
				    dzwiekiZSerwera = dane[d].substring(7);
				}
				if (dane[d].substr(0,6) == 'rules=') {
				    zasadyZSerwera = dane[d].substring(6);
				}
				if (dane[d].substr(0,7) == 'alerts=') {
				    alertyZSerwera = dane[d].substring(7);
				}
			    }
			}
		    }
		}
	    }
	}
	xmlhttp.send(null);
    }
}

function wczytajKoloryZSerwera(){
    if (!koloryZSerwera){
	// sprobuj wczytac (trzeba po ctrl-r)
	wczytajKoloryIdzwiekiZSerweraFun();
    }
    if (koloryZSerwera) {
	wezKolory(koloryZSerwera);
    }else{
	przywrocDomyslneKolory();
    }
}


/* koniec kolorkow */

var zasadyZSerwera = '';

function zapiszZaprNaSerwerze(){
    var zas = pobierzDaneZaproszenia();
    var prefStr = 'rules.' + zas;
    zapiszUstawieniaNaSerwerze(prefStr, 'zapiszZaprStatusInfo', 'nie udało się');
}

function wezZasady(z){
    if (z.length < 10) return;
    try{
	id('rozmiarPlanszy' + z.substr(0,4)).checked = true;
    }catch(e){};
    try{
	var idki = {'stan':'zasadyGryZagram', 'terr':'zasadyGrySzkrab',
		    'noT1':'zasadyGryRosyjskie1', 'noT4':'zasadyGryRosyjskie4'};
	id( idki[z.substr(4,4)] ).checked = true;
    }catch(e){};
    try {
	var rest = z.substr(9).split('.');
	try{
	    var instantWin = parseInt(rest[0]);
	    var idkip = {15: "przewaga15", 30: "przewaga30", 0: "przewagaBO"};
	    id(idkip[instantWin]).checked = true;
	}catch(e){};
	try{
	    var time0 = parseInt(rest[1]) / 60;
	    var czdl = id('wyborCzas0');
	    for (var i = 0; i < czdl.options.length; i++) {
		if (czdl.options[i].value == time0) {
		    if (czdl.selectedIndex != i) {
			czdl.selectedIndex = i;
		    }
		    break;
		}
	    }
	}catch(e){};
	try{
	    var timeAdd    = parseInt(rest[2]);
	    var czdl = id('wyborCzasDod');
	    for (var i = 0; i < czdl.options.length; i++) {
		if (czdl.options[i].value == timeAdd) {
		    if (czdl.selectedIndex != i) {
			czdl.selectedIndex = i;
		    }
		    break;
		}
	    }
	}catch(e){};
    }catch(e){};
    try{
	var idkir = {'F': "towarzyska", 'R': "rankingowa", 'r': "rankingowaJa"};
	id( idkir[z.substr(8,1)] ).checked = true;
    }catch(e){};
}


/* zapisywanie dzwiekow */
var dzwiekiZSerwera = '';
function dajDzwieki(){
    var d = [];
    d.push(glosnikWlaczony ? 'alert' : '');
    d.push(glosnikWlaczonyPocz ? 'beeps16' : '');
    d.push(glosnikWlaczonyRuch ? 'HardBassDrum_mod' : '');
    return d.join('.');
}


function wezDzwieki(d){
    var dd = d.split('.', 3);
    if (dd.length < 3) return;
    glosnikWlaczony     = (dd[0] != '');
    glosnikWlaczonyPocz = (dd[1] != '');
    glosnikWlaczonyRuch = (dd[2] != '');
    id('dzwiekiZapr').checked = glosnikWlaczony;
    id('dzwiekiPocz').checked = glosnikWlaczonyPocz;
    id('dzwiekiRuch').checked = glosnikWlaczonyRuch;
}

function zapiszDzwiekiNaSerwerze(){
    var dzw = dajDzwieki();
    var prefStr = 'sounds.' + dzw;
    zapiszUstawieniaNaSerwerze(prefStr, 'zapiszDzwiekiStatusInfo', 'nie udało się');
}

/* koniec zapisywania dzwiekow */

/* inne ustawienia: teraz tylko ostrzezenia przed koncem czasu */
function dajAlerty(){
    var a = id('uwaga1').checked ? 1 : 0;
    if (id('uwaga2').checked) a|=2;
    if (id('uwaga4').checked) a|=4;
    return a + '.' + czasAlertu;
}
function wezAlerty(a){
    var aa = a.split('.');
    ustawieniaAlertu = parseInt(aa[0]);
    id('uwaga1').checked = (aa[0] & 1) != 0;
    id('uwaga2').checked = (aa[0] & 2) != 0;
    id('uwaga4').checked = (aa[0] & 4) != 0;
    if (aa.length == 1) return;
    czasAlertu = parseInt(aa[1]);
    id('uwagaCzas').innerHTML = czasAlertu + slownik('s');
}

function zapiszUwagaNaSerwerze(){
    var a = dajAlerty();
    var prefStr = 'alerts.' + a;
    zapiszUstawieniaNaSerwerze(prefStr, 'zapiszUwagaStatusInfo', 'nie udało się');
}

var tabelkaCz = [5, 10, 15, 20, 30, 60];
function zmienCzasUwagi(){
    var i = tabelkaCz.indeks(czasAlertu);
    czasAlertu = (i >= 0) ? (i+1 == tabelkaCz.length ? tabelkaCz[0] : tabelkaCz[i+1]) : tabelkaCz[2];
    id('uwagaCzas').innerHTML = czasAlertu + slownik('s');
}
/* koniec: inne ustawienia: teraz tylko ostrzezenia przed koncem czasu */

function zapiszUstawieniaNaSerwerze(prefString, idStatusu, strNieUdaloSie){
    // zwraca true jesli sie udalo, false jesli nie
    id(idStatusu).innerHTML = slownik('czekaj...');
    var xmlhttp = makexmlhttp();
    if(xmlhttp){
	var ajaxUrl = rootUrl + 'auth.py?co=ustawPref' + 
	    '&opisGracza=' + encodeURIComponent(opisGracza) +
	    '&idGracza=' + encodeURIComponent(idGracza) +
	    '&pref=' + encodeURIComponent(prefString);

	xmlhttp.open('GET', ajaxUrl, true);
	xmlhttp.onreadystatechange = function(){ 
	    if ( (xmlhttp.readyState == 4) && (xmlhttp.status == 200) ){
		var ajax = xmlhttp.responseText;
		if (ajax.substring(0,3) == 'ok.'){
		    ajax = ajax.substring(3);
		    if (ajax.substring(0,4) == 'done'){
			id(idStatusu).innerHTML = slownik('ustawienia zostały zapisane');
			switch (prefString.substr(0,5)) {
			case 'sound':  // sounds.
			    dzwiekiZSerwera = prefString.substr(7);
			    break;
			case 'rules':
			    zasadyZSerwera = prefString.substr(6);
			    break;
			case 'colou':
			    koloryZSerwera = prefString.substr(8);
			    pokazCzyZapisana(true);
			    break;
			case 'alert':
			    alertyZSerwera = prefString.substr(7);
			    break;
			}
			    
		    }else{
			id(idStatusu).innerHTML = slownik(strNieUdaloSie);
		    }
		}
	    }
	}
	xmlhttp.send(null);
    }
}

window.onload = poczatek;


