// ========================================================================================================================
// Javascript-Teil Memodrop - uja V.040302:
// -----------------------------------------------------
// 10.02.2004: Grafiken komplett
// 27.02.2004: HTML-Teil und CSS, Formular, Memory-Teil 
// 01.03.2004: Combo und Timerroutinen, Highscoreanbindung
// 02.03.2004: Pausenmodul, Joker, Bombe, View, Blocker
// 03.03.2004: erweitert auf 12 Muster, Goodies feingetunt, neues Goodie Uhr: 10s kein neuer Stein
// ========================================================================================================================

// zugehoerige Module: index.htm (User-Interface), _crossbr.js (Highscoreanbindung)

// verwendete DOM-Objekte aus User-Interface: 
// ------------------------------------------
// Bilder: i0-inn, v0-vnn, imuster0-imusternn, icombo
// Form-Elemente: form1.combo, form1.punkte, (form1.modus, form1.sheet, form1.spiel fuer Highscore-Anbindung)
// Textblock: pause  
// ========================================================================================================================


// --- Globale und Strukturen: ----------------------------------------------------------------------------------

xmax=10; ymax=15;
bild=new Array('leer',
               'herz','pik','kreuz','karo','eichel','hasel','kugel','katze','fisch','schimmel','schmetterling','blatt','uhr',
               'deckblatt','deck2','joker','bombe','view','blocker','jokera','bombea','viewa','blocker');
uhr=13; 
deckblattstart=uhr+1; joker=3; bombe=joker+1; viewer=bombe+1; blocker=viewer+1;
deltamarke=blocker-joker+1;

speed0=250; deltaspeed=5;

// - Laufvar, erster geklickter Stein, Anzahl Muster fuer neuen Stein,Backup geoeffnene Steine,
// - letztes Muster,Multiplikator, Punkte, Pausenflag,  
// - Timer fuer droppenden Stein, Timer fuer Animation, derzeitige Dropgeschwindigkeit:

var i,gewaehlt,anz_muster,zuold1,zuold2,combo,combocount,punkte,pause,gestoppt,timrec1,timrec2,timrec3,speed;

var f=new Array();                // 0: nix,  1: Bild1, 2.Bild2, ...
var zustand=new Array();          // 0:offen, 1:deck, 2=joker, 3=bombe, 4=view
var ima=new Array();     for (i=0; i<bild.length; i++) { ima[i]=new Image(); ima[i].src=bild[i]+'.gif'; }
var dropper=new stein(); function stein() { this.muster=1; this.zustand=1; this.x=-1; this.y=-1; }

// ---------------------------------------------------------------------------------------------------------------


// --- DOM-Interface: --------------------------------------------------------------------------------------------

function spielfeld()
{ var i,j,k=0,t='<table border=0 cellpadding=0 cellspacing=0 style="border:4px outset #cccc99">';
  t=t+'<tr><td>';
  for (i=0; i<xmax; i++) t=t+'<img src="'+ima[0].src+'" width=32 height=24 alt="" name="v'+i+'">';
  t=t+'<br clear=all><hr></td></tr>';
  for (j=0; j<ymax; j++)
  { t=t+'<tr><td>';
    for (i=0; i<xmax; i++)
    { t=t+'<img src="'+ima[0].src+'" width=32 height=24 alt="" name="i'+k+'" onclick="klick('+k+')">';
      k++;
    }
    t=t+'</td></tr>';
  }
  t=t+'</table>';
  return t;
}

function zeige_stein(nr)
{ if (f[nr]==0) document.images['i'+nr].src=ima[0].src;
  else if (zustand[nr]>0) document.images['i'+nr].src=ima[deckblattstart+zustand[nr]-1].src;
  else document.images['i'+nr].src=ima[f[nr]].src;
}

function zeige_dropper()
{ with (dropper)
  { if (y<0) document.images['v'+x].src=ima[deckblattstart+zustand-1].src;
    else document.images['i'+(x+y*xmax)].src=ima[deckblattstart+zustand-1].src;
  }
}

function loesche_dropper()
{ with (dropper) 
  { if (y<0) document.images['v'+x].src=ima[0].src; 
    else document.images['i'+(x+y*xmax)].src=ima[0].src;
  }
}

function zeige_muster(anz) 
{ var i,k; 
  for (i=1; i<deckblattstart; i++) 
  { if (i<=anz) k=i; else k=0;
    document.images['imuster'+i].src=ima[k].src;
  }
}

function toggle_pause()
{ var dom1=document.getElementById;
  if (dom1) my_obj=document.getElementById('pause');
  pause=(!pause);
  if (pause) 
  { if (timrec1) window.clearTimeout(timrec1);
    if (timrec3) window.clearTimeout(timrec3); 
    if (dom1) my_obj.firstChild.nodeValue='weiter';
    if (gewaehlt>0) { zustand[gewaehlt]=zuold1; zeige_stein(gewaehlt); gewaehlt=-1; }
  }
  else
  { if (dom1) my_obj.firstChild.nodeValue='Pause';
    if (dropper.y<-1) neuer_stein(); else droppen();
  }
}

function zeige_combo(muster,anz) { document.form1.combo.value='x'+(anz+1); document.form1.icombo.src=ima[muster].src; }
function zeige_punkte(punkte)    { document.form1.punkte.value=punkte; }
function hilfe()                 { var win2=window.open("hilfe.htm","Hilfe","width=560,height=400,scrollbars=yes"); }
            
// ---------------------------------------------------------------------------------------------------------------------


// --- Knoeppe, soweit nicht im DOM- oer HTML-Abschnitt erlegt: --------------------------------------------------------

function neu()
{ var i,j,k;
  if (timrec1) window.clearTimeout(timrec1);
  if (timrec2) window.clearTimeout(timrec2);
  k=0;
  for (j=0; j<10; j++) for (i=0; i<xmax; i++) { f[k]=0; k++; }
  for (j=10; j<ymax; j++) for (i=0; i<xmax; i++) { f[k]=Math.floor(3*Math.random())%3+1; k++; }
  for (i=0; i<xmax*ymax; i++) { zustand[i]=Math.floor(2*Math.random())%2+1; ; zeige_stein(i); }
  dropper.y=-2; for (i=0; i<xmax; i++) { dropper.x=i; loesche_dropper(); }
  gewaehlt=-1;
  combo=0;
  punkte=0;
  speed=speed0;
  anz_muster=3;
  gestoppt=false;
  pause=true; toggle_pause();
  zeige_combo(combo,0);
  zeige_muster(anz_muster);
  zeige_punkte(punkte,0);
  timrec1=window.setTimeout('neuer_stein()',2500);
}

function klick(nr)
{ if ((!pause) && (f[nr]>0))
  { if (gewaehlt<0) 
    { if (zustand[nr]==blocker) alert('geblockt!'); else
      { gewaehlt=nr;
        zuold1=zustand[gewaehlt];
        if (zuold1<3) zustand[gewaehlt]=0; else zustand[gewaehlt]=zustand[gewaehlt]+deltamarke;
        zeige_stein(gewaehlt);
      }
    }
    else if (gewaehlt!=nr) 
    { zuold2=zustand[nr];
      if (zuold2<3) zustand[nr]=0; else zustand[gewaehlt]=zustand[gewaehlt]+deltamarke;
      zeige_stein(nr);
      if (zuold2==blocker)
      { if (zuold1==joker) timrec2=window.setTimeout('weg_damit('+gewaehlt+','+nr+')',100); 
        else if (zuold1==bombe) timrec2=window.setTimeout('putzen('+gewaehlt+','+nr+')',100); 
        else 
        { zustand[nr]=zuold2; zustand[gewaehlt]=zuold1; 
          zeige_stein(nr); zeige_stein(gewaehlt); 
          alert('Dieser Stein kann nur mit einem Joker\n oder einer Bombe aufgelöst werden!');
        }
      }
      else if (f[gewaehlt]==f[nr]) timrec2=window.setTimeout('weg_damit('+gewaehlt+','+nr+')',100);  
      else if ((zuold1==joker) || (zuold2==joker)) timrec2=window.setTimeout('weg_damit('+gewaehlt+','+nr+')',100); 
      else if ((zuold1==bombe) || (zuold2==bombe)) timrec2=window.setTimeout('putzen('+gewaehlt+','+nr+')',100); 
      else if ((zuold1==viewer) || (zuold2==viewer)) timrec2=window.setTimeout('oeffnen('+gewaehlt+','+nr+')',100); 
      else 
      { zustand[gewaehlt]=zuold1;
        zustand[nr]=zuold2; 
        timrec2=window.setTimeout('zeige_stein('+gewaehlt+')',500);
        timrec2=window.setTimeout('zeige_stein('+nr+')',500);
      } 
      gewaehlt=-1;
    }
  }
}

// --- Auswerten: -------------------------------------------------------------------------------------------------------

// --- einfaches Paar oder Paar mit Joker: ---

function weg_damit(n1,n2)
{ if ((f[n1]==combo) || (f[n2]==combo)) combocount++; 
  else { combocount=1; if (f[n1]<deckblattstart) combo=f[n1]; else combo=f[n2]; }
  zeige_combo(combo,combocount);
  punkte=punkte+10*combocount; 
  if (combo==uhr) timer1_stoppen();
  zeige_punkte(punkte);
  f[n1]=0; f[n2]=0; zeige_stein(n1); zeige_stein(n2);
  timrec2=window.setTimeout('weg_damit1('+n1+','+n2+')',100);
}

function weg_damit1(n1,n2)
{ var i,x1=n1%xmax,x2=n2%xmax,y1=Math.floor(n1/xmax),y2=Math.floor(n2/xmax);
  if (x1==x2) if (y2<y1) { i=y2; y2=y1; y1=i; }  
  for (i=y1; i>0; i--)   { f[x1+i*xmax]=f[x1+i*xmax-xmax]; zustand[x1+i*xmax]=zustand[x1+i*xmax-xmax]; }   
  f[x1]=0; 
  zustand[x1]=1;
  for (i=y2; i>0; i--)   { f[x2+i*xmax]=f[x2+i*xmax-xmax]; zustand[x2+i*xmax]=zustand[x2+i*xmax-xmax]; }   
  f[x2]=0;
  zustand[x2]=1;
  for (i=0; i<ymax; i++) { zeige_stein(i*xmax+x1); zeige_stein(i*xmax+x2); }
}

// --- Bombe: ------------------------------

function putzen(n1,n2)
{ var i,k=f[n1];
  if (f[n1]>=deckblattstart) k=f[n2];
  f[n1]=0; zustand[n1]=0;
  f[n2]=0; zustand[n2]=0;
  zeige_stein(n1);
  zeige_stein(n2);
  punkte=punkte+10*combocount; 
  zeige_punkte(punkte); 
  for (i=0; i<xmax*ymax; i++) if (f[i]==k) { f[i]=0; zeige_stein(i); }
  timrec2=window.setTimeout('bereinigen()',100);
}

function bereinigen()
{ var i,j,k,z; var vecf=new Array(),vecz=new Array();
  for (i=0; i<xmax; i++)
  { k=ymax-1; 
    for (j=ymax-1; j>=0; j--) 
    { z=j*xmax+i;
      if (f[z]>0) { vecf[k]=f[z]; vecz[k]=zustand[z]; k--; }
    }
    if (k>=0) for (j=0; j<=k; j++) { vecf[j]=0; vecz[j]=1; }
    for (j=0; j<ymax; j++) { z=j*xmax+i; f[z]=vecf[j]; zustand[z]=vecz[j]; zeige_stein(z); }
  }
}

// --- Viewer: -----------------------------

function oeffnen(n1,n2)
{ var i,k=f[n1];
  if (f[n1]>=deckblattstart) k=f[n2];
  for (i=0; i<xmax*ymax; i++) if (f[i]==k) { zustand[i]=0; zeige_stein(i); }
  weg_damit(n1,n2);
}

// ---- Ende: ------------------------------

function gameover()
{ pause=false;
  toggle_pause();
  alert('G a m e _ O v e r !');
  eintrag('','form1');
}

// --------  timergesteuerter Krams: ---------------------------------------------------------------------------------

function neuer_stein()
{ if (timrec1) window.clearTimeout(timrec1);
  if (!gestoppt) with (dropper)
  { y=-1;
    x=Math.floor(xmax*Math.random())%xmax; 
    muster=Math.floor(anz_muster*Math.random())%anz_muster+1; 
    zustand=Math.floor(2*Math.random())%2+1;      
    if (anz_muster>3) 
    { if (Math.random()<0.05) zustand=joker;   
      if (Math.random()<0.05) zustand=blocker; 
    }
    if (anz_muster>4)
    { if (Math.random()<0.05) zustand=blocker; 
      if (Math.random()<0.02) zustand=bombe;  
    }
    if (anz_muster>5) if (Math.random()<0.02) zustand=viewer;  // zeigt alle Steine gleicher Farbe
    if (anz_muster>6) if (Math.random()<0.05) muster=uhr;      // Zeit anhalten
    if (zustand>=joker) muster=zustand+deckblattstart-1;   
  }
  zeige_dropper();
  if (f[dropper.x]>0) gameover(); else if (!pause) timrec1=window.setTimeout('droppen()',speed);
}

function droppen()
{ if (timrec1) window.clearTimeout(timrec1);
  k=xmax*dropper.y+dropper.x;
  if (k>=(xmax*ymax-xmax)) festsetzen(k);
  else if (f[k+xmax]>0) festsetzen(k);
  else
  { loesche_dropper();
    dropper.y++;
    zeige_dropper();
    timrec1=window.setTimeout('droppen()',speed);
  }
}

function festsetzen(k)
{ if (timrec1) window.clearTimeout(timrec1);
  f[k]=dropper.muster; 
  zustand[k]=dropper.zustand;
  dropper.y=-2; 
  zeige_stein[k]; 
  speed=speed-deltaspeed;
  if (speed<25) { anz_muster++; if (anz_muster<uhr) speed=speed0; else anz_muster=uhr-1; zeige_muster(anz_muster); }
  if (speed<5) speed=5;
  if ((!pause) && (!gestoppt)) timrec1=window.setTimeout('neuer_stein()',speed);
}


function timer1_stoppen() 
{ gestoppt=true;
  
  if (timrec3) window.clearTimeout(timrec3);
  timrec3=window.setTimeout('timer1_starten()',10000); 
}

function timer1_starten() { if (timrec3) window.clearTimeout(timrec3); gestoppt=false; neuer_stein(); }

// ========================================================================================================================

