xmax=8; ymax=8; fmax=12; fstart=4; zeit0=10; zmax=xmax*ymax;

bild=new Array('stern','krone','diamant','vogel','spinne','schnee','muenze','drache','chrysantheme','herz','pik','klee','karo');
ima=new Array();
for (i=0; i<bild.length; i++) { ima[i]=new Image(); ima[i].src=bild[i]+'.gif'; }
voll=new Image(); voll.src='voll.gif';
weg =new Image(); weg.src='weg.gif';


var i,j,k,t,lev,punkte,zeit,pause,loopcount,timrec1,timrec2,aktiv=false;

var liste_h=new Array();
var liste_v=new Array();
var temp=new Array();

function in_liste(e,l)   { var drin=-1; if (l[0]>0) for (var i=1; i<=l[0]; i++) if (l[i]==e) drin=i; return drin; }
function add_liste(e,l)  { var k=in_liste(e,l)>0; if (k<1) { l[0]++; l[l[0]]=e; } }
function add2_liste(e,l) { l[0]++; l[l[0]]=e; }

var f=new Array(); 

function hilfe() { var win2=window.open("hilfe.htm","Hilfe","width=592,height=376,scrollbars=yes,resizable=yes"); }
function zeige_feld(nr) { document.images['i'+nr].src=ima[f[nr]].src; }

function neu()
{ var i,j,k;
  aktiv=false;
  if (timrec1) clearTimeout(timrec1);
  if (timrec2) clearTimeout(timrec2);
  lev=0; punkte=0; 
  for (i=0; i<zmax; i++) f[i]=Math.floor((lev+fstart)*Math.random())+1;
  loopcount=0;
  drop3(false);
  for (i=0; i<zmax; i++) zeige_feld(i);
  document.form1.punkte.value=punkte;
  document.form1.level.value=lev;
  pause=true;
  toggle_pause();
}


// --- 
function drop3(anzeige)
{ var i,j,k,gedroppt=false;
  if (timrec1) clearTimeout(timrec1);
  loopcount++;
  checkfeld();
  // >=3-er Reihen loeschen:
  k=liste_h[0]+liste_v[0];
  if (k>0)
  { gedroppt=true;
    if (liste_h[0]>0) for (i=1; i<=liste_h[0]; i++) f[liste_h[i]]=0;
    if (liste_v[0]>0) for (i=1; i<=liste_v[0]; i++) f[liste_v[i]]=0;
    if (anzeige) punkte_holen(k);
  }
  if (anzeige)
  { if (!pause) for (i=0; i<zmax; i++) zeige_feld(i);
    if (gedroppt) timrec2=setTimeout('nachrutschen(true)',500);
    else
    { aktiv=true;
      zeit=zeit0;
      if (!pause) timrec1=setTimeout('stoppuhr()',1000);
    }
  }
  else if (gedroppt) nachrutschen(false);
}

function punkte_holen(gain)
{ var i,multi1,multi2=0,bonus;
  multi1=gain-3;
  if (multi1>8) { multi2=multi1-8; multi1=8; }
  bonus=1;
  bonus=bonus<<multi1;
  bonus=bonus+50*multi2;
  punkte=punkte+2+bonus;  
  lev=Math.floor(punkte/1000);
  if (lev>8) enderoutine();
  document.form1.punkte.value=punkte;
  document.form1.level.value=lev;
}


function nachrutschen(anzeige)
{ var i,j,k;
  for (i=0; i<xmax; i++)  
  { temp[0]=0;
    for (j=0; j<ymax; j++)
    { k=j*xmax+i;
      if (f[k]>0) add2_liste(f[k],temp);
    }
    if (temp[0]<ymax)
    { k=ymax-temp[0];
      for (j=0; j<k; j++) f[i+j*xmax]=Math.floor((lev+fstart)*Math.random())+1;
      for (j=k; j<ymax; j++) f[i+j*xmax]=temp[j-k+1];
      if ((anzeige) && (!pause)) for (j=0; j<ymax; j++) zeige_feld(i+j*xmax);
    }
  }
  if (anzeige) timrec2=setTimeout('drop3(true)',500);
  else { if (loopcount<256) drop3(false); else timrec2=setTimeout('neu()',50); } 
}

function checkfeld()
{ var i,k,count;
  liste_h[0]=0;
  liste_v[0]=0;
  for (i=0; i<zmax; i++) if (in_liste(i,liste_h)<1)
  { count=1;
    while (((i+count)%xmax>0) && (f[i+count]==f[i])) count++;
    if (count>2) { for (k=0; k<count; k++) add_liste(i+k,liste_h); }
  }
  for (i=0; i<zmax-2*xmax; i++) if (in_liste(i,liste_v)<1)
  { count=1;
    while (((i+count*xmax)<zmax) && (f[i+count*xmax]==f[i])) count++;
    if (count>2) { for (k=0; k<count; k++) add_liste((i+k*xmax),liste_v); }
  }
}


// ---------------------------------------------------------------------------------------------------------

function klick(ri,nr)
{ if (aktiv)
  { aktiv=false;
    if (ri==0) oben(nr);
    if (ri==1) rechts(nr);
    if (ri==2) unten(nr);
    if (ri==3) links(nr);
  }
  document.form1.punkte.value=punkte;
}

function oben(spalte)
{ var i,k;
  k=f[spalte];
  for (i=0; i<ymax; i++) temp[i]=f[i*xmax+spalte];
  for (i=0; i<ymax-1; i++) f[i*xmax+spalte]=f[(i+1)*xmax+spalte];
  f[(ymax-1)*xmax+spalte]=k;
  checkfeld();
  k=liste_v[0]+liste_h[0];
  if (k<3) { for (i=0; i<ymax; i++) f[i*xmax+spalte]=temp[i]; aktiv=true; punkte--; }
  else timrec2=setTimeout('drop3(true)',500);
  for (i=0; i<ymax; i++) zeige_feld(i*xmax+spalte);
}

function unten(spalte)
{ var i,k;
  for (i=0; i<ymax; i++) temp[i]=f[i*xmax+spalte];
  k=f[(ymax-1)*xmax+spalte];
  for (i=ymax-1; i>0; i--) f[i*xmax+spalte]=f[(i-1)*xmax+spalte];
  f[spalte]=k;
  checkfeld();
  k=liste_v[0]+liste_h[0];
  if (k<3) { for (i=0; i<ymax; i++) f[i*xmax+spalte]=temp[i]; aktiv=true; punkte--; }
  else timrec2=setTimeout('drop3(true)',500);
  for (i=0; i<ymax; i++) zeige_feld(i*xmax+spalte);
}

function rechts(zeile)
{ var i,k;
  k=f[(zeile+1)*xmax-1];
  for (i=0; i<xmax; i++) temp[i]=f[zeile*xmax+i];
  for (i=xmax-1; i>0; i--)  f[zeile*xmax+i]=f[zeile*xmax+i-1];
  f[zeile*xmax]=k;
  checkfeld();
  k=liste_v[0]+liste_h[0];
  if (k<3) { for (i=0; i<xmax; i++) f[zeile*xmax+i]=temp[i]; aktiv=true; punkte--; }
  else timrec2=setTimeout('drop3(true)',500);
  for (i=0; i<ymax; i++) zeige_feld(zeile*xmax+i);
}

function links(zeile)
{ var i,k;
  k=f[zeile*xmax];
  for (i=0; i<xmax; i++) temp[i]=f[zeile*xmax+i];
  for (i=0; i<xmax-1; i++) f[zeile*xmax+i]=f[zeile*xmax+i+1];
  f[(zeile+1)*xmax-1]=k;
  checkfeld();
  k=liste_v[0]+liste_h[0];
  if (k<3) { for (i=0; i<xmax; i++) f[zeile*xmax+i]=temp[i]; aktiv=true; punkte--; }
  else timrec2=setTimeout('drop3(true)',500);
  for (i=0; i<ymax; i++) zeige_feld(zeile*xmax+i);
}
 

function enderoutine()
{ if (lev>8) alert('mehr Levels hamma noch nicht!\nBei Bedarf bei Kommentaren einen Hinweis hinterlassen!');
  aktiv=false;
  if (timrec1) clearTimeout(timrec1);
  if (timrec2) clearTimeout(timrec2);
  eintrag('','form1'); 
}

function toggle_pause()
{ var i,dom1=document.getElementById;
  if (dom1) my_obj=document.getElementById('toggle');
  if (!pause) 
  { if (timrec1) clearTimeout(timrec1);
    pause=true;
    aktiv=false;
    for (i=0; i<zmax; i++) document.images['i'+i].src=ima[0].src; // Feld verdunkeln
    if (dom1) my_obj.firstChild.nodeValue='weiter';
  }
  else
  { pause=false;
    if (dom1) my_obj.firstChild.nodeValue='Pause';
    for (i=0; i<zmax; i++) zeige_feld(i);
    zeit=zeit0;
    timrec1=setTimeout('stoppuhr()',1000);
    aktiv=true;
  }
}

function stoppuhr()
{ zeit--;
  if (zeit<0) enderoutine();
  else 
  { for (i=0; i<zeit0; i++) 
    { if (i>=zeit) document.images['s'+i].src=weg.src; else document.images['s'+i].src=voll.src; }
    timrec1=setTimeout('stoppuhr()',1000);
  }
}


