// skript pro Pexeso

var sirka=4;
var vyska=4;
var policek;
var profil;
var karty=new Array;
var ve_hre=new Array;
var vahy=new Array;
var pamet_cisla=new Array;
var pamet_pozice=new Array;
var pamet_pocet=0;
var prpst_spr_dvojice=new Array;
var prpst_spr_skupina1=new Array; //prpst vyberu ze spravne skupiny bez konkretniho cisla
var prpst_spr_skupina2=new Array; //prpst vyberu ze spravne skupiny s konkretnim cislem
var prpst_nespr_skupina=new Array; //prpst vyberu z nespravne skupiny
var prpst_nalez_dvojice=new Array; //prpst vyberu z tech, ktere maji dvojici
//profil Clovek prumer
prpst_spr_dvojice[0]=0.95; 
prpst_spr_skupina1[0]=0.9;
prpst_spr_skupina2[0]=0.1;
prpst_nespr_skupina[0]=0.05;
prpst_nalez_dvojice[0]=0.95;
//profil Pocitac
prpst_spr_dvojice[1]=1;
prpst_spr_skupina1[1]=1;
prpst_spr_skupina2[1]=0;
prpst_nespr_skupina[1]=0;
prpst_nalez_dvojice[1]=1;
//profil Opice
prpst_spr_dvojice[2]=0.5; 
prpst_spr_skupina1[2]=0.5;
prpst_spr_skupina2[2]=0.5;
prpst_nespr_skupina[2]=0.5;
prpst_nalez_dvojice[2]=0.5;
//profil Dite
prpst_spr_dvojice[3]=0.95; 
prpst_spr_skupina1[3]=0.95;
prpst_spr_skupina2[3]=0.05;
prpst_nespr_skupina[3]=0.02;
prpst_nalez_dvojice[3]=0.95;
//profil Senior
prpst_spr_dvojice[4]=0.75; 
prpst_spr_skupina1[4]=0.75;
prpst_spr_skupina2[4]=0.2;
prpst_nespr_skupina[4]=0.2;
prpst_nalez_dvojice[4]=0.8;

var volba1,volba2;
var pokuscislo=0;
var skore=0,skore_pc=0;
var otoceno=0;
var hraje_pc,pokr_pc;

function get_element(eid)
{
  var obj = new Object;
  if (document.all)
    obj = eval("document.all."+eid);
  else
    obj = document.getElementById(eid);
  return obj;
}

function michej_karty()
{
  var pom=new Array;
  var nahindex;
  for (i=0;i<policek;i++)
    pom[i] = Math.floor(i/2) + 1;
  for (i=policek-1;i>=0;i--)
  {
    nahindex = Math.floor(Math.random()*(i+1));
	karty[i] = pom[nahindex];
	pom[nahindex] = pom[i];
    ve_hre[i] = true;
  }
}  

function hraj()
{
  var i,j;
  var pomretez;
  
  sirka=document.forms.vstup.psloupcu.value;
  vyska=document.forms.vstup.pradku.value;
  profil=document.forms.vstup.cprofilu.value;
  hraje_pc = !document.forms.vstup.zacinat.checked;
  pokuscislo=0;
  skore=0;
  pamet_pocet=0;
  skore_pc=0;
  policek = sirka*vyska;
  michej_karty();
  pomretez = "<table><tbody>";
  for (i=0;i<vyska;i++)
  {
    pomretez += "<tr>";
	for (j=0;j<sirka;j++)
	  pomretez += "<td class='hra_pex' id='pole_"+(i*sirka+j)+"' onClick='if (!hraje_pc) otoc("+(i*sirka+j)+");'><img src='../img_games/pex_rub.gif'></td>";
	pomretez += "</tr>";
  }
  pomretez += "</tbody></table>";
  get_element("plocha").innerHTML=pomretez;
  get_element("skore").innerHTML = skore;
  get_element("skore_pc").innerHTML = skore_pc;
  get_element("hraje").innerHTML = (hraje_pc ? "soupeř" : "hráč");
  if (hraje_pc)
    pc_akce();
}

function otoc(pos)
{
  var pom;
  if (otoceno<2 && ve_hre[pos])
  {
    ve_hre[pos] = false;
    pamet_cisla[pamet_pocet] = karty[pos];
    pamet_pozice[pamet_pocet] = pos;
    pamet_pocet++;
    (otoceno==0 ? volba1=pos : volba2=pos);
    otoceno++;
    get_element("pole_"+pos).innerHTML = "<b>"+karty[pos]+"</b>";
	if (otoceno==2)
	{
      pokuscislo++;
      setTimeout("vyhodnot();",1000);
	}  
  }	
}

function vyhodnot()
{
  if (karty[volba1] == karty[volba2])
  {
    (hraje_pc ? skore_pc++ : skore++);
    get_element("pole_"+volba1).innerHTML = "<img src='../img_games/pex_prazdny.gif'>";
    get_element("pole_"+volba2).innerHTML = "<img src='../img_games/pex_prazdny.gif'>";

    //pamet se sesune o vypadle karty
    sesun_pamet(volba1);
    sesun_pamet(volba2);
	pokr_pc = hraje_pc;
	if (pokr_pc)
	{
      get_element("tlac_zpet").value = "Otoč zpět, pokračuje soupeř";
      get_element("tlac_zpet").style.visibility="visible"; 
	}
  }
  else
  {
    get_element("tlac_zpet").value = (hraje_pc ? "Otoč zpět, hraje hráč" : "Otoč zpět, hraje soupeř");
    get_element("tlac_zpet").style.visibility="visible";
    ve_hre[volba1] = true;
    ve_hre[volba2] = true;
	pokr_pc = false;
	hraje_pc = !hraje_pc;
  }
  otoceno = 0;
  get_element("skore").innerHTML = skore;
  get_element("skore_pc").innerHTML = skore_pc;
  get_element("hraje").innerHTML = (hraje_pc ? "soupeř" : "hráč");
}

function vratit()
{
  get_element("tlac_zpet").style.visibility="hidden";
  if (!pokr_pc)
  {
   get_element("pole_"+volba1).innerHTML = "<img src='../img_games/pex_rub.gif'>";
   get_element("pole_"+volba2).innerHTML = "<img src='../img_games/pex_rub.gif'>";
  } 
  if (hraje_pc && skore+skore_pc<Math.floor(policek/2))
    pc_akce();
}

function sesun_pamet(pos)
//vyhodi z pameti vsechny polozky odpovidajici pozici
{
 var i=0,j;  
 while (i<pamet_pocet)
 {
   if (pamet_pozice[i]==pos)
   {
    j=i;
    while(j<pamet_pocet-1)
    {
      pamet_cisla[j]=pamet_cisla[j+1];
      pamet_pozice[j]=pamet_pozice[j+1];
      j++;
    }
    pamet_pocet--;
   }
   else
    i++;
 }
}

function napln_vahy(vaha)
{
  for(i=0;i<policek;i++)
    vahy[i] = (ve_hre[i] ? vaha : 0);
}

function vyber_podle_vah()
{
var soucet=0;
var nahcislo;
  for (i=0;i<policek;i++)
    soucet += vahy[i];
  nahcislo = Math.random()*soucet;
  i=policek;
  while (nahcislo < soucet)
  {
    i--;
    soucet -= vahy[i];
  }
  otoc(i);
}

function je_dvojice()
{
 var i=0,j,cis1,pos1;
 var nalezeno=false;
 while (i<pamet_pocet-1 && !nalezeno)
 {
   cis1 = pamet_cisla[i];
   pos1 = pamet_pozice[i];
   j=i+1;
   while(j<pamet_pocet && !nalezeno)
   {
     if (cis1 == pamet_cisla[j] && pos1 != pamet_pozice[j])
       nalezeno=true;
     j++;
   }
   i++;
 }
 return nalezeno;
}

function doparu(pos)
//zjistuje, zda ke karte na pozici pos existuje v pameti druha do paru
{
 var i=0,cis1,pos1;
 var nalezeno = -1;
 while (i<pamet_pocet && nalezeno==-1)
 {
     if (karty[pos] == pamet_cisla[i] && pos != pamet_pozice[i])
     {
       nalezeno=pamet_pozice[i];
     }
   i++;
 }
 return nalezeno;
}

function najdi_dvojice_do_vah()
{
 var cis1,pos1;
 for (i=0;i<pamet_pocet-1;i++)
 {
   cis1 = pamet_cisla[i];
   pos1 = pamet_pozice[i];
   for (j=i+1;j<pamet_pocet;j++)
     if (cis1 == pamet_cisla[j] && pos1 != pamet_pozice[j])
     {
       vahy[pamet_pozice[i]] = prpst_nalez_dvojice[profil];
       vahy[pamet_pozice[j]] = prpst_nalez_dvojice[profil];
     }
 }
}

function pc_akce()
{
var druha;
  //vyber prvni karty
  if (je_dvojice())
    if (Math.random()<prpst_spr_dvojice[profil])
	//Ví, že existuje dvojice
    {
	  napln_vahy(prpst_nespr_skupina[profil]);
	  for (i=0;i<pamet_pocet;i++)
	    vahy[pamet_pozice[i]] = prpst_spr_skupina2[profil];
	  najdi_dvojice_do_vah();
	  vyber_podle_vah();
	}
    else
	//Neví, že existuje dvojice
    {
	  napln_vahy(prpst_spr_skupina1[profil]);
	  for (i=0;i<pamet_pocet;i++)
	    vahy[pamet_pozice[i]] = prpst_nespr_skupina[profil];
	  vyber_podle_vah();
	}
  else
    if (Math.random()<prpst_spr_dvojice[profil])
	//Ví, že neexistuje dvojice
    {
	  napln_vahy(prpst_spr_skupina1[profil]);
	  for (i=0;i<pamet_pocet;i++)
	    vahy[pamet_pozice[i]] = prpst_nespr_skupina[profil];
	  vyber_podle_vah();
	}
    else
	//Myslí si, že existuje dvojice
    {
	  napln_vahy(prpst_nespr_skupina[profil]);
	  for (i=0;i<pamet_pocet;i++)
	    vahy[pamet_pozice[i]] = prpst_spr_skupina1[profil];
	  vyber_podle_vah();
	}
	
	//vyber druhe karty
	druha = doparu(volba1);
	if (druha==-1)
	// neexistuje druha do paru
    {
	  napln_vahy(prpst_spr_skupina1[profil]);
	  for (i=0;i<pamet_pocet;i++)
	    vahy[pamet_pozice[i]] = prpst_nespr_skupina[profil];
	  vyber_podle_vah();
	}
	else
	// existuje druha do paru
    {
	  napln_vahy(prpst_nespr_skupina[profil]);
	  for (i=0;i<pamet_pocet;i++)
	    vahy[pamet_pozice[i]] = prpst_spr_skupina2[profil];
	  vahy[volba1]=0;
      vahy[druha] = prpst_nalez_dvojice[profil];
	  vyber_podle_vah();
	}
	 
}

