// uja 14.5.07: Spielelogik, variable Chipgröße, Hiscoreeinbindung, Loadsave, Levels 0-4
// uja 15.5.07: Joker, Fragezeichen, Farbbomben, Levels 5 - 23
// -------------------------------------------------------------------------------------------------------------------

var dx=24;
if (location.search) { dx=location.search.split('='); dx=parseInt(dx[1]); if (dx>64) dx=64; if (dx<16) dx=16; }

ddx=8;
xmax=13; ymax=13; zmax=xmax*ymax;
mitte_x=Math.floor(xmax/2); mitte_y=Math.floor(ymax/2);
// --------------------------------------------------------------------------------------

// Spielvariable:
var i,nx,ny,punkte,vorrat,level,nextfarbe,nfarben,punkte0;
var jflag,joker=16,bflag,frage=8,fragfarbe,mflag,rflag,xflag,wflag;

var aktiv=false;
var x0,xn,y0,yn;        // Feldgrenzen Belegung

var f=new Array();     // Brett
var fh=new Array();     // Farbhäufigkeit
var liste=new Array();  // Floodfill
var kstart=new Array(); // Kettenstart und -farbe der Vierergruppe, geht leichter zu belegen als eine Klasse

// Bilder:
var ima=new Array();
ima[0]=new Image(); ima[0].src='leer.gif';
for (i=1; i<24; i++) { ima[i]=new Image(); ima[i].src='s'+i+'.gif'; }

function zeige_feld()
{ var i,j,k=0; 
  for (j=0; j<ymax; j++) for (i=0; i<xmax; i++) { document.images['i_'+i+'_'+j].src=ima[f[k]].src; k++; }
}

// Hoveranzeigen:
function hili_w(nr) { if (aktiv) for (var i=x0; i<=xn; i++) document.images['w_'+i+'_'+nr].src=ima[nextfarbe].src; }
function normal_w(nr) { for (var i=0; i<xmax; i++) document.images['w_'+i+'_'+nr].src=ima[0].src; }
function hili_s(nr) { if (aktiv) for (var i=y0; i<=yn; i++) document.images['s_'+nr+'_'+i].src=ima[nextfarbe].src; }
function normal_s(nr){ for (var i=0; i<ymax; i++) document.images['s_'+nr+'_'+i].src=ima[0].src; }

// Feldaufbau:
// Block,Hover,Block,Hover,Block
// Hover,nix,  Hover,nix,  Hover
// Block,Hover,Block,Hover,Block
function tabelle()
{ var i,j,k=0,t='<table cellpadding=0 cellspacing=0><tr>';
  for (i=0; i<xmax; i++)
  { if (i>0) 
    { t=t+'<td><a href="javascript:klick_s('+(i-1)+')" ';
      t=t+'onmouseover="hili_s('+(i-1)+')" onmouseout="normal_s('+(i-1)+')">';
      t=t+'<img src="leer.gif" width='+ddx+' height='+dx+' name="s_'+(i-1)+'_0" border=0><\/a><\/td>';
    }
    t=t+'<td><img src="'+ima[i].src+'" name="i_'+i+'_0" width='+dx+' height='+dx+' alt="" border=0><\/td>';
  }
  t=t+'<\/tr>';
   for (j=1; j<ymax; j++) 
  {  t=t+'<tr>';
    for (i=0; i<xmax; i++) // Klickzeile
    { if (i>0) t=t+'<td><\/td>';
      t=t+'<td><a href="javascript:klick_w('+(j-1)+')" ';
      t=t+'onmouseover="hili_w('+(j-1)+')" onmouseout="normal_w('+(j-1)+')">';
      t=t+'<img src="leer.gif" width='+dx+' height='+ddx+' name="w_'+i+'_'+(j-1)+'" border=0><\/a><\/td>';
    }
    t=t+'<\/tr>';
    t=t+'<tr>';
    for (i=0; i<xmax; i++) // showzeile
    { if (i>0) 
      { t=t+'<td><a href="javascript:klick_s('+(i-1)+')" ';
        t=t+'onmouseover="hili_s('+(i-1)+')" onmouseout="normal_s('+(i-1)+')">';
        t=t+'<img src="leer.gif" width='+ddx+' height='+dx+' name="s_'+(i-1)+'_'+j+'" border=0><\/a><\/td>';
      }
      t=t+'<td><img src="'+ima[k%ima.length].src+'" name="i_'+i+'_'+j+'" width='+dx+' height='+dx;
      t=t+' alt="" border=0><\/td>';
      k++;
    }
    t=t+'<\/tr>';
  }
  t=t+'<\/table>';
  return t;
}

// Anzeige gewählte Chipgröße:
function show_select()
{ if (dx<24) document.form2.size.selectedIndex=0;
  else if (dx<32) document.form2.size.selectedIndex=1;
  else if (dx<48) document.form2.size.selectedIndex=2;
  else if (dx<64) document.form2.size.selectedIndex=3;
  else document.form2.size.selectedIndex=4;
}

// Anzeige message
function messi(t) { document.getElementById('messi').firstChild.nodeValue=t; }

// =====================================================================================================
// Farben generieren, korrigiert am 16.5.07 11:30:
function check_fh() 
{ fh[0]=0;
  for (var i=0; i<zmax; i++) if (f[i]==frage) add_liste(fragfarbe,fh); else if (f[i]%frage>0) add_liste(f[i]%frage,fh);
}
function unique_farbe() 
{ var k;
  check_fh();
  if (fh[0]>0)
  { k=Math.floor(fh[0]*Math.random())%fh[0]+1;
    k=fh[k];
  }
  else k=1;
  return k;
}

function neue_farbe()   { return Math.floor(nfarben*Math.random())%nfarben+1; }

// Spielfluss:
function neu(flag)
{ var i,j;
  aktiv=false;
  if (flag) { level=0; vorrat=0; punkte0=0; }
  get_level();
  document.form1.level.value=level;
  document.form1.vorrat.value=vorrat;
  document.form1.punkte.value=punkte;
  messi('---');
  for (i=0; i<zmax; i++) f[i]=0;
  for (i=0; i<nx; i++) for (j=0; j<ny; j++)
  { f[i+j*xmax]=neue_farbe();
    if (bflag) if (Math.random()<0.07) f[i+j*xmax]=f[i+j*xmax]+8;
    if (jflag) if (Math.random()<0.05) f[i+j*xmax]=joker;
    if (fragfarbe>0) if (Math.random()<0.05) f[i+j*xmax]=frage;
    if (wflag) if (f[i+j*xmax]%frage>0) if (Math.random()<0.05) f[i+j*xmax]=f[i+j*xmax]%frage+joker;
  }
  zur_mitte();
  if (mflag) for (i=mitte_x-1; i<=mitte_x+1; i++) for (j=mitte_y-1; j<=mitte_y+1; j++) f[i+j*xmax]=0;
  if (rflag) 
  { for (i=mitte_x-2; i<=mitte_x+2; i++) { f[i+(mitte_y-2)*xmax]=0;  f[i+(mitte_y+2)*xmax]=0; }
    for (j=mitte_y-2; j<=mitte_y+2; j++) { f[mitte_x-2+j*xmax]=0;    f[mitte_x+2+j*xmax]=0; }
  }
  if (xflag) for (i=0; i<xmax; i++) { f[i+i*xmax]=0; f[xmax-i-1+i*xmax]=0; }

  zeige_feld();
  nextfarbe=unique_farbe();
  document.images['nextfarbe'].src=ima[nextfarbe].src;
  aktiv=true;
}

function gameover()
{ aktiv=false;
  document.form1.punkte.value=punkte; 
  eintrag('form1');
}

function levelup() 
{ level++; punkte=punkte+vorrat*100; 
  document.form1.punkte.value=punkte; punkte0=punkte;
  messi(vorrat*100+' Bonuspunkte!');
  setTimeout('neu(false)',1500);
}

function get_level()
{ jflag=false; bflag=false; mflag=false; rflag=false; xflag=false; fragfarbe=-1; wflag=false;
  switch (level)
  { case 0: level=0; punkte=0; nfarben=4; nx=5; ny=5; vorrat=16; break;
    case 1:  nfarben=4; nx=7; ny=7; vorrat=16; break;
    case 2:  nfarben=4; nx=7; ny=7; vorrat=14; break;
    case 3:  nfarben=4; nx=9; ny=9; vorrat=20; break;
    case 4:  nfarben=5; nx=7; ny=7; vorrat=20; break;
// Joker
    case 5:  nfarben=5; nx=7; ny=7; vorrat=18; jflag=true; break;
    case 6:  nfarben=4; nx=7; ny=7; vorrat=16; mflag=true; break;
    case 7:  nfarben=4; nx=7; ny=7; vorrat=16; rflag=true; break;
    case 8:  nfarben=4; nx=7; ny=7; vorrat=16; mflag=true; rflag=true; break;
    case 9:  nfarben=5; nx=9; ny=9; vorrat=18; jflag=true; mflag=true; rflag=true; break;
// Farbbomben
    case 10:  nfarben=6; nx=7; ny=7; vorrat=20; jflag=true; bflag=true; break;
    case 11:  nfarben=6; nx=7; ny=7; vorrat=20; jflag=true; bflag=true; rflag=true; break;
    case 12:  nfarben=6; nx=9; ny=9; vorrat=20; jflag=true; bflag=true; mflag=true; rflag=true; break;
// Tarnfarbe
    case 13:  nfarben=6; nx=7; ny=7; vorrat=20; jflag=true; fragfarbe=Math.floor(6*Math.random())%6+1; break;
    case 14:  nfarben=6; nx=7; ny=7; vorrat=20; jflag=true; fragfarbe=Math.floor(6*Math.random())%6+1; rflag=true; break;
    case 15:  nfarben=6; nx=9; ny=9; vorrat=20; jflag=true; bflag=true; mflag=true;
              fragfarbe=Math.floor(6*Math.random())%6+1; break;
// die Farbe 7 (dank kkk's Durchmarsch
    case 16:  nfarben=7; nx=7; ny=7; vorrat=20; jflag=true; bflag=true; break;
    case 17:  nfarben=7; nx=7; ny=7; vorrat=20; jflag=true; bflag=true; rflag=true; break;
    case 18:  nfarben=7; nx=9; ny=9; vorrat=20; jflag=true; bflag=true; mflag=true; rflag=true; break;
    case 19:  nfarben=7; nx=7; ny=7; vorrat=20; jflag=true; fragfarbe=Math.floor(6*Math.random())%6+1; break;
    case 20:  nfarben=7; nx=7; ny=7; vorrat=20; jflag=true; fragfarbe=Math.floor(6*Math.random())%6+1; rflag=true; break;
    case 21:  nfarben=7; nx=9; ny=9; vorrat=20; jflag=true; bflag=true; mflag=true;
              fragfarbe=Math.floor(7*Math.random())%7+1; break;
    case 22:  nfarben=7; nx=7; ny=7; vorrat=18; jflag=true; fragfarbe=Math.floor(7*Math.random())%7+1; rflag=true; break;
    case 23:  nfarben=7; nx=9; ny=9; vorrat=16; jflag=true; bflag=true; mflag=true;
              fragfarbe=Math.floor(7*Math.random())%7+1; break;
// das X-Flag 15.5.07
    case 24:  nfarben=7; nx=7; ny=7; vorrat=20; jflag=true; xflag=true; break;
    case 25:  nfarben=7; nx=7; ny=7; vorrat=20; jflag=true; xflag=true; rflag=true; break;
    case 26:  nfarben=7; nx=9; ny=9; vorrat=20; jflag=true; xflag=true; bflag=true; mflag=true; rflag=true; break;
    case 27:  nfarben=7; nx=7; ny=7; vorrat=20; xflag=true; fragfarbe=Math.floor(6*Math.random())%6+1; break;
// Wechselbalg: 16.5.07
    case 28:  nfarben=7; nx=7; ny=7; vorrat=20; xflag=true; wflag=true; break;
    case 29:  nfarben=7; nx=9; ny=9; vorrat=35; xflag=true; mflag=true; wflag=true; break;
    case 30:  nfarben=7; nx=7; ny=7; vorrat=18; xflag=true; wflag=true; rflag=true; break;
    case 31:  nfarben=7; nx=9; ny=9; vorrat=20; xflag=true; jflag=true; bflag=true; mflag=true; wflag=true;
              fragfarbe=Math.floor(7*Math.random())%7+1; break;

    default: alert('mehr Levels hamma nich!'); punkte=2*punkte; document.form1.punkte.value=punkte; eintrag('form1');
             neu(true); 
  }
}

// === loadsave ==================================
function laden()
{ get_cookie('draengler');
  neu(false);
}

function speichern()
{ var ablauf = new Date();
  var dreimonate = ablauf.getTime() + (100 * 24 * 60 * 60 * 1000); ablauf.setTime(dreimonate);
  document.cookie='draengler='+level+','+punkte0+'; expires=' + ablauf.toGMTString();
  if (document.cookie) alert('Spielstand gespeichert');
}

function get_cookie(kennung)
{ var t='',paare,wert='';
  if (document.cookie) 
  { paare=document.cookie.split(';');
    anz=paare.length;
    for (i=0; i<anz; i++)
    { t=paare[i].split('\=');
      if (t[0]==kennung) wert=t[1];
    }
  }
  if (wert.length>0) 
  { wert=wert.split(','); 
    level=parseInt(wert[0]); punkte=parseInt(wert[1]);
  }
  else alert('kein Spiel gespeichert!');
}

// =======================================================================================================
// Spiel-Routinen:
// -------------------------------------------------------------------------------------
// loop: klick->[suche->get_kette->loeschen->drop_mitte->]->weiter_im_text
// -------------------------------------------------------------------------------------

// Interaktion: Klicks für waagerechten Einschub
function klick_w(nr)
{ var i,j;
  if (aktiv) if ((y0>0) || (yn<ymax-1))
  { aktiv=false;
    normal_w(nr);
    if (yn<(ymax-1))
    { for (j=ymax-1; j>=nr+1; j--) for (i=0; i<xmax; i++) f[j*xmax+i]=f[(j-1)*xmax+i];
      for (i=0; i<xmax; i++) f[(nr+1)*xmax+i]=0;
      for (j=x0; j<=xn; j++) f[(nr+1)*xmax+j]=nextfarbe;
    }
    else
    { for (j=0; j<nr; j++) for (i=0; i<xmax; i++) f[j*xmax+i]=f[(j+1)*xmax+i];
      for (i=0; i<xmax; i++) f[(nr+1)*xmax+i]=0;
    }
    for (j=x0; j<=xn; j++) f[(nr+1)*xmax+j]=nextfarbe;
    weiter_im_klick();
  }
}

// Interaktion: Klicks für senkrechten Einschub
function klick_s(nr)
{ var i,j;
  if (aktiv) if ((x0>0) || (xn<xmax-1))
  { aktiv=false;
    normal_s(nr);
    if (xn<(xmax-1))
    { for (i=xmax-1; i>=nr+1; i--) for (j=0; j<ymax; j++) f[j*xmax+i]=f[j*xmax+i-1];
      for (j=0; j<ymax; j++) f[j*xmax+nr+1]=0;
      for (j=y0; j<=yn; j++) f[j*xmax+nr+1]=nextfarbe;
    }
    else
    { for (i=0; i<nr; i++) for (j=0; j<ymax; j++) f[j*xmax+i]=f[j*xmax+i+1];
      for (j=0; j<ymax; j++) f[j*xmax+nr+1]=0;
    }
    for (j=y0; j<=yn; j++) f[j*xmax+nr+1]=nextfarbe;
    weiter_im_klick();
  }
}

// Ausgang für die beiden Klickroutinen
function weiter_im_klick()
{ zeige_feld();
  vorrat--; document.form1.vorrat.value=vorrat;
  suche_q();
  if (kstart[0]>=0) 
  { get_kette();
    setTimeout('loeschen()',50);
  }
  else weiter_im_text();
}
// -----------------------------------------
// nach vollendetem Zug neuen Stein generieren und endcheck
function weiter_im_text()
{ if (wflag) wechsel();
  nextfarbe=unique_farbe(); document.images['nextfarbe'].src=ima[nextfarbe].src;
  if (check_over()) gameover(); else { zur_mitte(); aktiv=true; }
}

// Check auf gameover: Vorrat leer oder kein Einsetzen mehr möglich:
function check_over()
{ var weiter=(vorrat>0);
  if (weiter) { get_dim(); weiter=((x0>0) || (xn<xmax-1) || (y0>0) || (yn<ymax-1)); }
  return (!weiter);
}

// Dimensionen des belegten Teil des Feldes in x0,xn,y0,yn:
function get_dim()
{ x0=xmax; y0=ymax; xn=0; yn=0;
  for (var i=0; i<xmax; i++) for (var j=0; j<ymax; j++) if (f[i+xmax*j]>0)
   { if (x0>i) x0=i; if (xn<i) xn=i; if (y0>j) y0=j; if (yn<j) yn=j; }
}

// Feld in die Mitte schieben:
function zur_mitte()
{ var i,j,mx,my;
  var f1=new Array();
  get_dim();
  mx=mitte_x-Math.floor((xn+x0)/2+0.5);
  my=mitte_y-Math.floor((yn+y0)/2+0.5);
  for (i=0; i<zmax; i++) f1[i]=0;
  for (i=0; i<xmax; i++) for (j=0; j<ymax; j++) if (f[i+xmax*j]>0) f1[(i+mx)+xmax*(j+my)]=f[i+xmax*j];
  for (i=0; i<zmax; i++) f[i]=f1[i]; // FF2 verhaspelt sich schon mal
  get_dim();
  zeige_feld();
}

 // Leere Zeilen und Spalten entfernen, aufrücken lassen
function drop_mitte()
{ var i,j,k;
  var h=new Array();
  get_dim();
  // in Längsrichtung stauchen: leere Zeilen löschen
  liste[0]=0;
  for (j=y0; j<=yn; j++)
  { k=0; for (i=x0; i<=xn; i++) if (f[i+j*xmax]>0) k++;
    if (k>0) add_liste(j,liste);
  }
  if (liste[0]>0)
  { for (j=1; j<=liste[0]; j++)
    { k=liste[j];
      for (i=0; i<xmax; i++) f[(j-1)*xmax+i]=f[k*xmax+i];
    }
    if (liste[0]<ymax) for (k=liste[0]; k<ymax; k++) for (i=0; i<xmax; i++) f[k*xmax+i]=0;
    zur_mitte();
  }
  // in Querrichtung stauchen: leere Spalten löschen
  get_dim();
  liste[0]=0;
  for (i=x0; i<=xn; i++)
  { k=0; for (j=y0; j<=yn; j++) if (f[i+j*xmax]>0) k++;
    if (k>0) add_liste(i,liste);
  }
  if (liste[0]>0)
  { for (i=1; i<=liste[0]; i++)
    { k=liste[i];
      for (j=0; j<ymax; j++) f[j*xmax+i-1]=f[j*xmax+k];
    }
    if (liste[0]<xmax) for (k=liste[0]; k<xmax; k++) for (j=0; j<ymax; j++) f[j*xmax+k]=0;
    zur_mitte();
    suche_q();
    if (kstart[0]>=0)
    { get_kette();
      setTimeout('loeschen()',50);
    }
    else weiter_im_text();
  }
  else levelup();
}

// Suche nach Farbquadrat mind. 2x2
function suche_q()
{ var b,i,j,k;
  kstart=Array(-1,-1);
  for (i=0; i<xmax-1; i++) for (j=0; j<ymax-1; j++) if (kstart[0]<0) // vierer-Quadrat auf Farbe suchen:
  { k=i+j*xmax;
    if (f[k]>0)
    { b=f[k]%frage;
      if (b<1) b=f[k+1]%frage;
      if (b<1) b=f[k+xmax]%frage;
      if (b<1) b=f[k+xmax+1]%frage;
    }
    if (b>0) if (passt(b,k)) if (passt(b,k+1)) if (passt(b,k+xmax)) if (passt(b,k+xmax+1)) kstart=Array(k,b);
  }
}

// Farbkette in Liste löschen:
function loeschen()
{ var i,k,xx,yy;
  punkte=punkte+liste[0]*liste[0];
  document.form1.punkte.value=punkte;
  for (i=1; i<=liste[0]; i++) 
  { k=liste[i];
    xx=k%xmax;
    yy=Math.floor(k/xmax);
    f[k]=0;
    document.images['i_'+xx+'_'+yy].src=ima[0].src;
  }
  setTimeout('drop_mitte()',50);
}

// Farbwechsler:
function wechsel() { for (var i=0; i<zmax; i++) if (f[i]>joker) { f[i]++; if (f[i]>=joker+8) f[i]=joker+1; } }

// Sammeln der Farbkette in liste: -----------------------------------
function get_kette()
{ var i,p1=0,p2=1;
  liste[0]=1; liste[1]=kstart[0];
  while(p2>p1) { for (i=p1+1; i<=p2; i++) get_nachbar(kstart[1],liste[i],liste); p1=p2; p2=liste[0]; }
  if (bflag) farbbombe();
}

function get_nachbar(b,nr,l)
{ var xx=nr%xmax;
  if (xx>0)      if (passt(b,nr-1)) add_liste(nr-1,liste);
  if (xx<xmax-1) if (passt(b,nr+1)) add_liste(nr+1,liste);
  if (nr>=xmax)     if (passt(b,nr-xmax)) add_liste(nr-xmax,liste);
  if (nr<zmax-xmax) if (passt(b,nr+xmax)) add_liste(nr+xmax,liste);
}

function passt(b,n2)
{ var ok=(b%frage==f[n2]%frage); // normal und Farbbomben 1-7
  if (!ok) ok=(f[n2]==joker);
  if (!ok) if (f[n2]==frage) ok=(b==fragfarbe);
  return ok;
}

function farbbombe()
{ var i,k=-1;
  if (liste[0]>0) for (i=1; i<=liste[0]; i++) if ((f[liste[i]]>frage) && (f[liste[i]]<joker)) k=f[liste[i]]%frage;
  if (k>0)
  { liste[0]=0;
    for (i=0; i<zmax; i++) if (f[i]%frage==k) add_liste(i,liste);
  }
}

