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

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

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

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

var a=24; // bok kwadratu (w pikselach)
var imax=19; //liczba kwadratow w pozomie
var jmax=19; //liczba kwadratow w pionie
var kropki = new Object();
//kropki["ac"] = 0; nie ma kropki na polu o współrzędnych (a,c)
//kropki["aa"] = 1; kropka niebieska na polu (a,a)  -- gracz B (rozpoczynajacy)
//kropki["de"] = 2; kropka czerwona na polu (d,e)   -- gracz W
//kropki["cd"] = 4; pole niedostępne (wewnątrz stopu) (c,d)
//kropki["cd"] = 5; kropka gracza 1 wewnatrz panstwa gracza 2
//kropki["cd"] = 6; kropka gracza 2 wewnatrz panstwa gracza 1
// (czyli, jak widac, wewnatrz panstwa bit &4 jest ustawiony, choc nie na wlasnych kropkach)

var litera = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'];    

var jakaGra; // nowa lub kontynuacja
var sgf; // nazwa pliku z historią gry np. apjfo.30.11.19.40.23.sgf
var insgf; //zawartosc pliku sgf

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

var punktacja = new Array(0,0);  // punkty gracza 1, gracza 2

var debug_wiersz = 0;   // dla testu, mozna wywalic, jak bedzie dzialalo

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

var idGracza;  // np. mstws
var opisGracza;      // opis gracza, ten który sam wprowadzi

var zKimGra = "zCzlowiekiem"; //info co jest aktualnie wyswietlane (gra z komputerem czy czlowiekiem)


var url = 'http://localhost/kropki/';
//var url = 'http://kropki.matematyka.pisz.pl/';


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

//przelozenie polozenia na planszy np. "c" na polozenie w pikselach
function px(l){
    var chr=l.charAt(0);
    return (chr.charCodeAt(chr) - 97)*a - 4;
}

//przelozenie polozenia na planszy np. "c" na polozenie w pikselach
function pxn(l,nr_znaku){
    if (rK == 1){
	cofnij = 4;
    }else if (rK == 2){
	cofnij = 6;
    }else if (rK == 3){
	cofnij = 9;
    }
    var chr=l.charAt(nr_znaku);
    return (chr.charCodeAt(chr) - 97)*a - cofnij;
}


function nrLitery(l){
    var chr=l.charAt(0);
    return chr.charCodeAt(chr) - 97;
}

function ustawRozmiarKropki(rozmiarKropki){
    rK = rozmiarKropki;
    if (rK == 0){
	rK = znajdzCiastko("rK");
	if (rK == 'brak'){
	    rK=1;
	    upieczCiacho("rK",rK);
	}
    }else{
	upieczCiacho("rK",rK);
	wyswietlPlikSgf(insgf);
    }
}

function wyswietlKropke(xy,kolor){
    var x = pxn(xy,0);
    var y = pxn(xy,1);
    if (kolor == 2){
        id("kropki").innerHTML += '<img style="position:absolute; top:' + y + 'px; left:'+ x +'px;" src="kropkaRed'+rK+'.gif">';
    }else{
        id("kropki").innerHTML += '<img style="position:absolute; top:' + y + 'px; left:'+ x +'px;" src="kropkaBlue'+rK+'.gif">';
    }
}

function wyswietlKropkeStr(xy,kolor,ostatniaKropka){
    var x = pxn(xy,0);
    var y = pxn(xy,1);
    if (xy != ostatniaKropka){
	if (kolor == 2){
	    return '<img style="position:absolute; top:' + y + 'px; left:'+ x +'px;" src="kropkaRed'+rK+'.gif">';
	}else{
	    return '<img style="position:absolute; top:' + y + 'px; left:'+ x +'px;" src="kropkaBlue'+rK+'.gif">';
	}
    }else{
	if (kolor == 2){
	    return '<img style="position:absolute; top:' + y + 'px; left:'+ x +'px;" src="kropkaRedOst'+rK+'.gif">';
	}else{
	    return '<img style="position:absolute; top:' + y + 'px; left:'+ x +'px;" src="kropkaBlueOst'+rK+'.gif">';
	}
    }
}

function wyswietlKropkejg(jg,xy,kolor){
// kolor ==1 lub 2
    var x = pxn(xy,0);
    var y = pxn(xy,1);
    if (kolor == 2){
	jg.setColor("red");
    }else{
	jg.setColor("blue");
    }
    jg.fillOval(x,y, 9,9);
}


function wyswietlKropkeDlaTestu(xy){
// wyswietla zielona kropke
    var x = pxn(xy,0);
    var y = pxn(xy,1);
    id("kropki").innerHTML += '<img style="position:absolute; top:' + y + 'px; left:'+ x +'px;" src="kropkaGreen.gif">';
}

function dolaczDoSgfKropkeGracza(xy){
    var kk = insgf.lastIndexOf(')');
    var bezOstatniegoNawiasu = insgf.substring(0,kk);    
    return bezOstatniegoNawiasu + ';B[' + xy + '])';
}


var moznaGraczStawiaKropke = true;
function graczStawiaKropke(co,xy){
    if (co == "wyslij"){
	if ( (moznaGraczStawiaKropke) && (kropki[xy] == 0)){
	    var nowesgf = dolaczDoSgfKropkeGracza(xy);
	    var parametry = 'co=nowyruch&sgf='+ encodeURIComponent(sgf) + '&insgf=' + encodeURIComponent(nowesgf) + 
		'&idgracza=' + idGracza;
	    ajaxWyslijPost(url+'kropki.py', parametry, 'graczStawiaKropke');
	    id("kropkiTymczas").innerHTML += 
	    '<img style="position:absolute; top:' + pxn(xy,1) + 'px; left:'+ pxn(xy,0) +'px;" src="kropkaBlueOst'+rK+'.gif">';

	    moznaGraczStawiaKropke = false;
	}
    }else{
	var ajaxKropka = decodeURIComponent(xy);
	if (ajaxKropka.substring(0,1) == '('){
	    insgf = ajaxKropka;
	    czyszczenieKropkiTymczasDiv();
	    wyswietlPlikSgf(insgf);
	    if (znajdzCiastko("sgf") == 'brak'){
		upieczCiacho("sgf",sgf);
	    }
	    moznaGraczStawiaKropke = true;
	}
    }
}



function podswietlKropke(xy){
    if ((czekajNaOdp == 0) && (kropki[xy] == 0)){
	id("tymczas").innerHTML =
	    '<img style="position:absolute; top:' + pxn(xy,1) + 'px; left:' + pxn(xy,0) +'px;" src="kropkaAlfaBlue'+rK+'.gif">';
	id("xyRuchu").innerHTML = xy.substring(0,1) +  (jmax + 1 - nrLitery(xy.substr(1,1)));
    }
}

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

function czyszczenieKropkiTymczasDiv(){
    id("kropkiTymczas").innerHTML = "";
}

function wsp(i,j)
// przelicza wspolrzedne
// tablicy ,,dwuwymiarowej'' indeksowanej [-1,...,imax+1] x [-1,...,jmax+1]
// na wspolrzedna jednowymiarowa,
// ten margines ulatwia sprawdzanie, czy nie wyszlismy poza plansze
{
  return (i+1)*(jmax+3)+j+1;
}

function ZaznaczWnetrzeStopu(tab, kolor)
// zaznacza na 4/5/6 w kropki[] wnetrze stopu o brzegu podanym w tab
// kolor (=1 lub 2) to kolor gracza, ktory zamyka dany stop
{
  var na_stosie = 0;
  var stos = new Array();
  // zaznacz gorna i dolna krawedz bandy na 4 i dodaj na stos, 
  // jesli nie jest na brzegu stopu; oznacz tez na 4 marginesy
  for (var i=-1; i<=imax+1; i++) {
    tab[wsp(i,-1)]=4;   tab[wsp(i,jmax+1)]=4;
    if (i>=0 && i<=imax) {
      var pole = wsp(i,0);
      if (tab[pole]==0) {  // nie na brzegu stopu
        tab[pole]=4;
        stos[na_stosie++] = pole;
      }
      pole = wsp(i,jmax);
      if (tab[pole]==0) {  // nie na brzegu stopu
        tab[pole]=4;
        stos[na_stosie++] = pole;
      }
    }
    else {
      tab[wsp(i,0)]=4;   tab[wsp(i,jmax)]=4;   // jestesmy na lewym/prawym marginesie
    }
  }
  // i jeszcze lewa i prawa strona
  for (var j=1; j<jmax; j++) {
    tab[wsp(-1,j)]=4;   tab[wsp(imax+1,j)]=4;
    var pole = wsp(0,j);
    if (tab[pole]==0) {  // nie na brzegu stopu
      tab[pole]=4;
      stos[na_stosie++] = pole;
    }
    pole = wsp(imax,j);
    if (tab[pole]==0) {  // nie na brzegu stopu
      tab[pole]=4;
      stos[na_stosie++] = pole;
    }
  }  
  // to teraz trzeba odwiedzac sasiadow
  var dp = [-1, 1, jmax+3, -jmax-3];    // przesuniecia o 1 w pionie/poziomie
  while (na_stosie) {
    var pole = stos[--na_stosie];
    for (var k=0; k<4; k++)
      if (tab[pole+dp[k]]==0) {
        tab[pole+dp[k]]=4;
        stos[na_stosie++] = pole+dp[k];
      }
  }
  // zewnetrze stopu zaznaczone na 4, wiec wnetrze jest = 0
  var przec = 3-kolor;   // przeciwnik
  var nasze_w_stopie = kolor | 4;   // nasze kropki wewn. wrogiego panstwa zostaja odbite

  for (var i=1; i<imax; i++)
   for (var j=1; j<jmax; j++)
     if (tab[wsp(i,j)]==0) {
	if (kropki[ litera[i] + litera[j] ]==0)
          kropki[ litera[i] + litera[j] ]=4;   // puste pole
	else if (kropki[ litera[i]+litera[j] ] == przec) {
          kropki[ litera[i] + litera[j] ] |= 4;   // zamykamy kropke przeciwnika
	  punktacja[kolor-1]++;
        }
        else if (kropki[ litera[i]+litera[j] ] == nasze_w_stopie) {
          kropki[ litera[i] + litera[j] ] = kolor;   // odbijamy nasza kropke
          punktacja[przec-1]--;
      }
    }
}

function Stop(jg,stop,kolor){
// kolor ==1 albo 2
    var x = new Array();
    var y = new Array();

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

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

    // to dopiero teraz, bo teraz dopiero wiadomo na pewno, jaki kolor stopu
    if (kolor == 1){
	jg.setColor("#b0b7f4");
    }else{
	jg.setColor("#eaa297");
    }

    ZaznaczWnetrzeStopu(tab, kolor);

    jg.fillPolygon(x,y);
    if (kolor == 1){
	jg.setColor("#0000ff");
    }else{
	jg.setColor("#ff0000");
    }
//    jg.drawPolygon(x,y);
}

function Krata(jg){
    jg.setColor("#000000");
    for(var j=0; j<=jmax; j++){ //rysowanie poziomych linii
	jg.drawLine(0, j*a, a*imax, j*a);
    }

    for(var i=0; i<=imax; i++){ //rysowanie pionowych linii
	jg.drawLine(i*a, 0, i*a, a*jmax);	
    }
}

function rysowaniePlanszy(){
    var jg = new jsGraphics("plansza");
//    Stop(jg,"cabbccdb","red");
    Krata(jg);
    jg.paint();


    var html = "";
    for(var i=0; i<=imax; i+=1){
	for(var j=0; j<=jmax; j+=1){
	    if (rK == 1){
		var pj = pxn(litera[j],0);
		var pi = pxn(litera[i],0);
	    }else if (rK == 2){
		var pj = pxn(litera[j],0)+2;
		var pi = pxn(litera[i],0)+2;
	    }else if (rK == 3){
		var pj = pxn(litera[j],0)+5;
		var pi = pxn(litera[i],0)+5;		
	    }

	    html += '<div style="position:absolute; top:' + pj + 'px; left:' + pi + 'px; ' +
		'background-color:black; color:black; filter:alpha(opacity=0); -moz-opacity:0; opacity:0; '+
		'width:9px; height:9px; padding:0px; margin:0px; font-size:0px;"'+
		'onmouseover=\'podswietlKropke("'+ litera[i] + litera[j] +'")\' '+
		'onmouseout=\'czyszczenieTymczasDiv()\' '+
		'onclick=\'graczStawiaKropke("wyslij","'+ litera[i] + litera[j] +'")\' ' +
		'></div>';
	}
    }
    id("aktywneNaKursor").innerHTML = html;
}

//treść funkcji się radykalnie zmieni, to jest tymaczasowe
function zobaczGre(){
    var tr = document.getElementsByTagName("tr");
    for (var n=0; n<tr.length; n++){
	tr[n].onmouseover = function(){
	    var td = this.getElementsByTagName("td");
	    for(var k=0; k<td.length; k++){
		td[k].style.backgroundColor = "#819fe0";
	    }
	}
	tr[n].onmouseout = function(){
	    var td = this.getElementsByTagName("td");
	    for(var k=0; k<td.length; k++){
		td[k].style.backgroundColor = "#e9e1cb" ;
	    }
	}
	tr[n].onclick = function(){
	    alert("Będzie można oglądnąć przebieg tej gry.");
	}
    }
}

var moznaJuzWyslacKomentarz = true;
function dodajKomentarz(co,ajax){
    function wUri(x){ return encodeURIComponent(x); }
    if (co == "wyslij"){
	if (moznaJuzWyslacKomentarz){
	    var trescKomentarza = id("trescKomentarza").value;
	    ajaxWyslijPost(url+"kropki.py","co=dodajkomentarz&idgracza=" + wUri(idGracza) +  
			   "&opisgracza=" + wUri(opisGracza) + "&komentarz=" + wUri(trescKomentarza),
			   'dodajKomentarz');

	    moznaJuzWyslacKomentarz = false;                    //blokuj ponowne wysylanie (dla niecierpliwych)
	    setTimeout("moznaJuzWyslacKomentarz=true",8000);    //ale po 8s odblokuj, bo moze co sie zgubilo po drodze	
	}
    }else{
	ajax = decodeURIComponent(ajax);
	if (ajax == "ok\n"){
	    id("komentarzWyslany").style.visibility = "visible";
	    id("trescKomentarza").value = "";
	    setTimeout( function(){
		id("napiszKomentarz").onclick = napiszKomentarz;
		id("napiszKomentarz").style.color = "blue";
		id("napiszKomentarz").style.cursor = "pointer";
		id("trescKomentarza").style.display = "none";
		id("wyslijKomentarz").onclick = null;
		id("wyslijKomentarz").style.display = "none";
		id("komentarzWyslany").style.display = "none";
	    },3000);
	}
    }
}

function napiszKomentarz(){
    id("napiszKomentarz").onclick = null;
    id("napiszKomentarz").style.color = "gray";
    id("napiszKomentarz").style.cursor = "default";
    id("komentarzWyslany").style.display = "block";
    id("komentarzWyslany").style.visibility = "hidden";
    id("trescKomentarza").style.display = "block";
    id("trescKomentarza").value = "";
    id("trescKomentarza").focus();
    id("wyslijKomentarz").style.display = "block";
    id("wyslijKomentarz").onclick = function(){ dodajKomentarz("wyslij",""); }
}

function data(){
    var d, miesiac, dzien;
    d = new Date();
    miesiac = d.getMonth() + 1;
    miesiac = miesiac.toString();
    miesiac = (miesiac.length == 1) ? '0' + miesiac : miesiac;
    dzien = d.getDate().toString();
    dzien = (dzien.length == 1) ? '0' + dzien : dzien;
    return d.getFullYear() + '-' + miesiac + '-' + dzien;
}

function poczatekKropekZkomputerem(){
    poczatkowaTablicaKropek();
    ustawRozmiarKropki(0);
    rysowaniePlanszy();
    czyMySieZnamy();
    if ( jakaGra == "kontynuacja" ){
	wczytajPlikSgf("wyslij","");
    }else{
	insgf = "(;GM[40]FF[4]\n" +
	    "SZ[" + (imax+1) + "]\n" +
	    "DT[" + data() + "]\n" +
	    "PB[]PW[kropki8347.2/0T]\n" +
	    "RU[1]AP[Kropki:0083.47]\n" + 
	    ")";
    }

//    alert(insgf);
//    pokazHistorieZciacha();
    id("zakonczGre").onclick = zakonczGre;
    id("opisGracza").onchange = nowyOpisGracza;
    id("napiszKomentarz").onclick = napiszKomentarz;
//    zobaczGre();

//    wczytajRanking('wyslij','tylko');

//    poczatekShoutbox();
}

function dajGreZkomputerem(){
    if (zKimGra == "zCzlowiekiem"){
	id("graZczlowiekiem").style.display = "none";
	id("graZkomputerem").style.display = "block";

	id("graZkomputeremLink").style.textDecoration = "underline";
	id("graZczlowiekiemLink").style.textDecoration = "";
	zKimGra = "zKomputerem";
//	    poczatekKropekZkomputerem();
    }        
}

function dajGreZczlowiekiem(){
    if ((opisGracza == idGracza) || (opisGracza == "")){
	wpiszNick('graZczlowiekiem');
	return true;
    }
    if (zKimGra == "zKomputerem"){
	id("graZkomputerem").style.display = "none";
	id("graZczlowiekiem").style.display = "block";

	id("graZczlowiekiemLink").style.textDecoration = "underline";
	id("graZkomputeremLink").style.textDecoration = "";
	zKimGra = "zCzlowiekiem";
	if (ostatniAjax == ""){ //jak user już był na stronie z grą z człowiekiem ostatniAjax jest wciaz uaktualniany
	    poczatekKropekNaDwoch();
	}else{
	    aktualizujSytuacjeNaStronie(ostatniAjax);
	}
    }	    
}


function poczatek(){

/*    zKimGra = "zCzlowiekiem";
    id("graZczlowiekiem").style.display="block";
    id("graZczlowiekiemLink").style.textDecoration = "underline";
    poczatekKropekNaDwoch();
*/

    zKimGra = "zKomputerem";
//    id("graZkomputeremLink").style.textDecoration = "underline";
    poczatekKropekZkomputerem();


/*    id("graZkomputeremLink").onclick = dajGreZkomputerem;
    id("graZczlowiekiemLink").onclick = dajGreZczlowiekiem;
*/    

//    id("graZczlowiekiem").style.display="block";
//    poczatekKropekNaDwoch();
/*    var url = document.location.toString();
    if (url.indexOf('kropkiNaDwoch.html') > 0){
	poczatekKropekNaDwoch();
    }else{
	poczatekKropekZkomputerem();
    }
*/
}


window.onload = poczatek;

