//***** Linetrix-Subroutinen **********************************************************************************

function genchip(bild,dreh,flip,hor,vert) 
{ this.bild=bild; this.dreh=dreh; this.flip=flip; this.hor=hor; this.vert=vert; return this; }

function anzeigen(nr) { document.nextstein.src=ima[chip[nr].bild].src; }
function zeige_stein(nr,x,y) { var k=x+y*xmax; document.images['c'+k].src=ima[chip[nr].bild].src; }
function loesche_stein(x,y) { var k=x+y*xmax; document.images['c'+k].src='leer.gif'; }
function zeige_punkte() { document.anzeige.punkte.value=punkte; }
function zeige_laenge() { document.anzeige.laenge.value=(delta+2); }

function hilfe() 
{ var win2=window.open("hilfe.htm","Hilfe","width=592,height=376,scrollbars=yes,resizable=yes"); }

function enderoutine(x)
{ anhalten(); ende=true; zeige_punkte();
  eintrag('','anzeige');
  punkte=0;
}

function zeige_feld(x,y) 
{ var k=x+xmax*y; 
  if (f[k]==0) document.images['c'+k].src='leer.gif'; else document.images['c'+k].src=ima[chip[f[k]].bild].src;
}

function toggle_pause()
{ if (pflag) { document.pause.src='leer.gif'; pflag=false; starten(); }
  else { document.pause.src='pause.gif'; pflag=true; anhalten(); }
}

// ------- Ende Bildanzeigen-----------------------------------

function drehen()   { aktuell=chip[aktuell].dreh; zeige_stein(aktuell,x,y); }
function spiegeln() { aktuell=chip[aktuell].flip; zeige_stein(aktuell,x,y); }
function rechts()   { if (x<(xmax-1)) if (f[x+y*xmax+1]==0) { loesche_stein(x,y); x=x+1; zeige_stein(aktuell,x,y); } }
function links()    { if (x>0) if (f[x+y*xmax-1]==0) { loesche_stein(x,y); x=x-1; zeige_stein(aktuell,x,y); } }

function neuer_stein()
{ if (naechster<1) naechster=Math.floor(cmax*Math.random());
  aktuell=naechster; y=0; x=Math.floor(xmax*Math.random()); naechster=Math.floor((cmax-3)*Math.random())+1; 
  anzeigen(naechster); 
  zeige_stein(aktuell,x,y);
  if (f[x]>0) enderoutine(x);
  else
  { punkte=punkte+5; speed=speed-10; 
    if (speed<100) 
    {  punkte=punkte+delta*100; delta++; 
       alert('Bonus: '+100*(delta-1)+',\n ab jetzt Mindestlaenge '+(delta+2)); speed=speed0;
       zeige_laenge();
    }
    zeige_punkte(); 
    starten();
  }
} 

function drop()     
{ if ((y<(ymax-1)) && (f[x+y*xmax+xmax]==0)) 
  { loesche_stein(x,y); y=y+1; zeige_stein(aktuell,x,y); } 
  else { anhalten(); f[x+y*xmax]=aktuell; auswerten(); if (!ende) neuer_stein(); }
}


function fastdrop()     
{ anhalten();
  if ((y<(ymax-1)) && (f[x+y*xmax+xmax]==0)) 
  { loesche_stein(x,y); y=y+1; zeige_stein(aktuell,x,y); window.setTimeout("fastdrop()",10); } 
  else { f[x+y*xmax]=aktuell; auswerten(); if (!ende) neuer_stein(); }
}

function auswerten()
{ var i,j,k,k1,k2,tu_es,joker=false; tod=false; 
  for (k=0; k<zmax; k++) if (f[k]>0)
  { if (chip[f[k]].hor%2>0)      // Start obere Horizontale
    { k1=k; k2=k; tu_es=true;     
      while(tu_es) 
      { k1++; 
        tu_es=((k1%xmax)>0);
        if (tu_es) tu_es=(chip[f[k1]].hor%2>0); 
        if (tu_es) k2++; 
      }
      if ((k2-k)>0) 
      { for (k1=k; k1<=k2; k1++) 
        { if (f[k1]==16) tod=true; 
          if ((f[k1]>15) && (f[k]<19)) joker=true;
        }
        if ((joker) || ((k2-k)>delta)) for (k1=k; k1<=k2; k1++) { mutiere(k1,1); punkte=punkte+10*delta; }
      }
    }
    if (chip[f[k]].hor>1)     // Start untere Horizontale
    { k1=k; k2=k; tu_es=true; joker=false;   
      while(tu_es) 
      { k1++; 
        tu_es=((k1%xmax)>0);
        if (tu_es) tu_es=(chip[f[k1]].hor>1); 
        if (tu_es) k2++; 
      }
      if ((k2-k)>0) 
      { for (k1=k; k1<=k2; k1++) 
        { if (f[k1]==16)  tod=true; 
          if ((f[k1]>15) && (f[k]<19)) joker=true;
        }
        if ((joker) || ((k2-k)>delta)) for (k1=k; k1<=k2; k1++) { mutiere(k1,2); punkte=punkte+10*delta; }
      }
    }

    if (chip[f[k]].vert%2>0) // Start linke Vertkale
    { k1=0; k2=k1; tu_es=true; joker=false;         
      while(tu_es) 
      { k1++; 
        tu_es=((k1*xmax+k)<zmax); 
        if (tu_es) tu_es=(chip[f[k1*xmax+k]].vert%2>0); 
        if (tu_es)  k2++;
      }
      if (k2>0) 
      { for (k1=0; k1<=k2; k1++) 
        { if (f[k1*xmax+k]==16)  tod=true;
          if ((f[k1*xmax+k]>15) && (f[k1*xmax+k]<19)) joker=true;
        }
        if ((joker) || (k2>delta)) for (k1=0; k1<=k2; k1++) { mutiere(k1*xmax+k,3); punkte=punkte+10*delta; }
      }
    }
    if (chip[f[k]].vert>1)   // Start linke Vertkale
    { k1=0; k2=k1; tu_es=true; joker=false; 
      while(tu_es) 
      { k1++; 
        tu_es=((k1*xmax+k)<zmax); 
        if (tu_es) tu_es=(chip[f[k1*xmax+k]].vert>1); 
        if (tu_es) k2++; 
      }
      if (k2>0) 
      { for (k1=0; k1<=k2; k1++) 
        { if (f[k1*xmax+k]==16) tod=true;
          if ((f[k1*xmax+k]>15) && (f[k1*xmax+k]<19)) joker=true;
        }
        if ((joker) || (k2>delta)) for (k1=0; k1<=k2; k1++) { mutiere(k1*xmax+k,4); punkte=punkte+10*delta; }
      }
    }
  }
  if (tod) enderoutine(-1); else  window.setTimeout("blancs_weg()",50);
}

function blancs_weg()
{ var i,j,k,l,flag=false;
  for (i=0; i<xmax; i++) for (j=ymax-1; j>=0; j--)
  { k=j*xmax+i; 
    if (f[k]>17) 
    { flag=true;
      for (l=j; l>0; l--) { f[l*xmax+i]=f[l*xmax+i-xmax]; zeige_feld(i,l); }
      f[i]=0; zeige_feld(i,0);
    }  
  }
  if (flag) auswerten(); else
  { for (i=0; i<xmax; i++) for (j=ymax-1; j>=0; j--)
    { k=j*xmax+i; 
      if (f[k]>15) 
      { flag=true;
        for (l=j; l>0; l--) { f[l*xmax+i]=f[l*xmax+i-xmax]; zeige_feld(i,l); }
        f[i]=0; zeige_feld(i,0);
      }  
    }
  }
  if (flag) auswerten();
}

function neu()
{ var i; 
  cflag=0; anhalten();
  for (i=0; i<zmax; i++) { f[i]=0; document.images['c'+i].src='leer.gif'; }
  speed=speed0; ende=false; pflag=false; document.pause.src='leer.gif';
  neuer_stein();  punkte=0; zeige_punkte(); delta=1; zeige_laenge();
}


function mutiere(nr,modus)
{ var x1=nr%xmax,y1=Math.floor(nr/xmax);
  if (modus==1)
  { if (f[nr]==1) f[nr]=19;
    if (f[nr]==5) f[nr]=3;
    if (f[nr]==7) f[nr]=4;
    if (f[nr]==8) f[nr]=2;
    if (f[nr]==11) f[nr]=10;
    if (f[nr]==12) f[nr]=6;
    if (f[nr]==13) f[nr]=9;
    if (f[nr]==15) f[nr]=14;
  }
  else if (modus==2)
  { if (f[nr]==3) f[nr]=19;
    if (f[nr]==5) f[nr]=1;
    if (f[nr]==9) f[nr]=2;
    if (f[nr]==10) f[nr]=4;
    if (f[nr]==11) f[nr]=7;
    if (f[nr]==13) f[nr]=8;
    if (f[nr]==14) f[nr]=6;
    if (f[nr]==15) f[nr]=12;
  }
  else if (modus==3)
  { if (f[nr]==4) f[nr]=19;
    if (f[nr]==6) f[nr]=2;
    if (f[nr]==7) f[nr]=1;
    if (f[nr]==10) f[nr]=3;
    if (f[nr]==11) f[nr]=5;
    if (f[nr]==12) f[nr]=8;
    if (f[nr]==14) f[nr]=9;
    if (f[nr]==15) f[nr]=13;
  }
  else if (modus==4)
  { if (f[nr]==2) f[nr]=19;
    if (f[nr]==6) f[nr]=4;
    if (f[nr]==8) f[nr]=1;
    if (f[nr]==9) f[nr]=3;
    if (f[nr]==12) f[nr]=7;
    if (f[nr]==13) f[nr]=5;
    if (f[nr]==14) f[nr]=10;
    if (f[nr]==15) f[nr]=11;
  }
  zeige_feld(x1,y1);
}


// ---------------------------------------------------------------------------------------------------


// Tastaturauswertung
function abmarsch(code)
{ // IE5: 2=98; 4=100; 6=102; 8=104; cs: 40,37,39,38  NS: 2=50; 4=52; 6=54; 8=56;
 code=code%48;  // IE auf NS-Patch und NumLock
 if ((code==40) || (code==2)) fastdrop();
 if ((code==37) || (code==4)) links();
 if ((code==39) || (code==6)) rechts();
 if ((code==38) || (code==8)) drehen();
 if ((code==32) || (code==5)) spiegeln();
}
// --------------------------------------------------------------------------------------------------



function starten() { timrec1=window.setInterval("drop()",speed); aktiv=true; }
function anhalten() { if (timrec1) window.clearInterval(timrec1); aktiv=false; }
//***************************************************************************************************
