// -----------------------------------------------------------------------------------------------------------
// by uja - Version: V031219-1400 
// -----------------------------------------------
// schiesse Kugeln mit gleicher Farbe weg, dazu links am Rand auf einen der Pfeile klicken.
// zuerst gehts nach links, bei Auftreffen auf einen Block dann links um!
// wenn bei einer Kette Ende ist, bekommt die nächste nicht passende Kugel die Schussfarbe, die neue Schusskugel 
// bekommt die Fremdfarbe. ist damit kein Treffer möglich, gibt es einen Joker. Hat man keinen mehr, wars das.
// 17.12.03: erste spielbare Version
// 18.12.03: 12 Levels, testweise Frame-Variante
// 19.12.03: Hilfebildschirm, Loch, 24 Levels, Reset auf Nicht-Frame-Variante, Anpassen Farben
// -----------------------------------------------------------------------------------------------------------

var aktball,aktiv,ballri,ballkoo,flug,i,joker,punkte,palt,level,flugzeit=35,zeit,timrec1,timrec2;
var bild=new Array('leer','k1','k2','k3','k4','k5','k6','block','joker','loch','stern');
var ima=new Array(); for (i=0; i<bild.length; i++) { ima[i]=new Image(); ima[i].src=bild[i]+'.gif'; }

// ------------------------------------------------------------------------------------------------------------

function hilfe(nr)  { var win2=window.open('hilfe.htm','popup','width=592,height=376,scrollbars=yes'); }
// function show_hsc() { document.form1.modus.value=0; document.form1.submit(); }

function spielfeld()
{ var i,j,k=0,t='<table border=0 cellpadding=0 cellspacing=0 class="spielfeld">';
  for (j=0; j<ymax; j++)
  { t=t+'<tr>';
    for (i=0; i<xmax; i++)
    { if ((i+j)%2==0) t=t+'<td class="gerade">'; else t=t+'<td class="ungerade">';
      t=t+'<img src="leer.gif" width=24 height=24 border=0 alt="" name="i'+k+'"><\/td>';
      k++;
    }
    if (j%2==0) t=t+'<td class="links_g">'; else t=t+'<td class="links_u">';
    t=t+'<a href="javascript:klick('+j+')" onmouseover="if (aktiv) zeige_ball('+j+')" onmouseout="loesche_ball('+j+')">';
    t=t+'<img src="leer.gif" width=24 height=24 border=0 alt="" name="a'+j+'"><\/a><\/td>';
    t=t+'<\/tr>';
  }
  t=t+'<\/table>';
  return t;
}

function levelauswahl()
{ var i,t='<select name="level" onchange="get_level()"><option value="0" selected>Level 1<\/option>';
  for (i=1; i<maxlevels; i++) t=t+'<option value="'+i+'">Level '+(i+1)+'<\/option>';
  t=t+'<\/select>';
  return t;
}

function zeige_feld(nr)   { document.images['i'+nr].src=ima[f[nr]].src; }
function zeige_ball(nr)   { document.images['a'+nr].src=ima[aktball].src; }
function loesche_ball(nr) { document.images['a'+nr].src=ima[0].src; }

function neu(flag)
{ var i,j,k;
  if (timrec1) window.clearTimeout(timrec1);
  if (timrec2) window.clearTimeout(timrec2);
  if (flag)
  { punkte=0;
    level=0;
    joker=1;
  }
  palt=punkte;
  zeit=300;
  document.form1.rest.value=rest[level];
  document.form1.joker.value=joker;
  document.form1.punkte.value=punkte;
  document.form1.level.selectedIndex=level;
  lade_level(level);
  for (i=0; i<zmax; i++) zeige_feld(i);
  aktball=8;
  document.aball.src=ima[aktball].src;
  aktiv=true;
  timrec1=window.setTimeout('countdown()',1000);
}

function klick(nr)
{ if (aktiv)
  { aktiv=false;
    flug=false;
    ballri=3;
    loesche_ball(nr);
    ballkoo=nr*xmax+xmax-1;
    document.images['i'+ballkoo].src=ima[aktball].src;
    timrec2=window.setTimeout('moveball()',flugzeit);
  }
}

function moveball()
{ var neukoo,neueri=ballri,weg=false,aktneu;
  if (ballri==0) { neukoo=ballkoo-xmax; if (neukoo<0) weg=true; else if (f[neukoo]==7) neueri=3; }
  else if (ballri==1) { neukoo=ballkoo+1; if (neukoo%xmax==0) weg=true; else if (f[neukoo]==7) neueri=0; }
  else if (ballri==2) { neukoo=ballkoo+xmax; if (neukoo>zmax) weg=true; else if (f[neukoo]==7) neueri=1; }
  else { neukoo=ballkoo-1; if (neukoo%xmax==(xmax-1)) weg=true; else if (f[neukoo]==7) neueri=2; }
  f[i]=0;
  document.images['i'+ballkoo].src=ima[f[ballkoo]].src;
  
  if ((weg) || (f[neukoo]==9)) // ins Loch gefallen oder aus dem Feld geflogen
  { if (!flug) { punkte=punkte-5; document.form1.punkte.value=punkte; aktiv=true; }
    else fallenlassen();
  }
  else if (neueri!=ballri) // an Kreisel gestossen
  { ballri=neueri;
    moveball(); 
  }
  else if ((f[neukoo]==0) || (f[neukoo]>9))   // freier Flug
  { if (f[neukoo]==10)      { punkte=punkte+10; document.form1.punkte.value=punkte; } // Stern ueberflogen
    else if (f[neukoo]==11) { punkte=punkte-5;  document.form1.punkte.value=punkte; } // Teergrube ueberflogen
    ballkoo=neukoo; 
    document.images['i'+ballkoo].src=ima[aktball].src;
    timrec2=window.setTimeout('moveball()',flugzeit);
  }
  else if (f[neukoo]==aktball) // gleichen Ball getroffen
  { flug=true;
    punkte=punkte+5;
    document.form1.punkte.value=punkte;
    f[neukoo]=0;
    ballkoo=neukoo;
    document.images['i'+ballkoo].src=ima[aktball].src;
    timrec2=window.setTimeout('moveball()',flugzeit);
  }
  else if (flug)          // Weiterflug, nachdem gleicher ball getroffen wurde -> neuer Aktball
  { aktneu=f[neukoo];
    f[neukoo]=aktball;
    f[ballkoo]=0;
    aktball=aktneu;
    document.images['i'+ballkoo].src=ima[f[ballkoo]].src;
    document.images['i'+neukoo].src=ima[f[neukoo]].src;
    document.aball.src=ima[aktball].src;
    fallenlassen();
  }
  else if (aktball==8)    // Joker trifft auf 1.Ball und nimmt desssen Farbe an
  { aktball=f[neukoo];
    document.aball.src=ima[aktball].src;
    moveball();
  }
  else // falschen Ball getroffen, Punkteabzug
  { punkte=punkte-10; document.form1.punkte.value=punkte;
    document.images['i'+ballkoo].src=ima[f[ballkoo]].src;
    aktiv=true;
  }  
}


function fallenlassen()
{ var i,j,k,k2,lptr;
  var liste=new Array();
  for (i=0; i<xmax; i++)
  { for (j=0; j<ymax; j++) liste[j]=0;
    lptr=ymax-1;
    for (j=ymax-1; j>=0; j--)
    { k=j*xmax+i;
      if ((f[k]>0) && (f[k]<7)) { liste[lptr]=f[k]; lptr--; }
      else if (f[k]>6) 
      { if (lptr>j) for (k2=lptr; k2>j; k2--) liste[k2]=0;
        lptr=j;
        liste[lptr]=f[k];
        lptr--;
      }
    }
    for (j=0; j<ymax; j++) f[j*xmax+i]=liste[j]; 
  }
  k2=0;
  for (i=0; i<zmax; i++) 
  { document.images['i'+i].src=ima[f[i]].src;
    if ((f[i]>0) && (f[i]<7)) k2++;
  }
  if (k2<=rest[level]) levelup(); else check_joker();
}


function check_joker()
{ var i,passt=false;
  for (i=0; i<ymax; i++) if (checkpfad(i)==4) passt=true;
  if (!passt)
  { if (joker<1) gameover();
    else
    { joker--;
      document.form1.joker.value=joker;
      aktball=8;
      document.aball.src=ima[aktball].src;
    }
  }
  aktiv=true;
}

function checkpfad(nr)
{ var i,p,ri=3,temp;
  p=nr*xmax+xmax-1;
  while(p>=0)
  { temp=pfad(p,ri);
    temp=temp.split(',');
    p=temp[0];
    ri=temp[1];
  } 
  return Math.abs(p);
}

function pfad(posi,ri)
{ var ck;
  if (ri==0)      { ck=parseInt(posi)-xmax; if (ck<0) ck=-1; }
  else if (ri==1) { ck=parseInt(posi)+1; if (ck%xmax==0) ck=-1; }
  else if (ri==2) { ck=parseInt(posi)+xmax; if (ck>=zmax)  ck=-1; }
  else { ck=parseInt(posi)-1; if (ck%xmax==(xmax-1)) ck=-1; }

  if (ck>0)
  { if ((f[ck]==0) || (f[ck]>9)) posi=ck;
    else if (f[ck]==7) ri=(parseInt(ri)+3)%4; 
    else if (f[ck]==9) posi=-2;
    else if (f[ck]==aktball) posi=-4;
    else posi=-3;
  }
  else posi=ck;
  return posi+','+ri;
}


function gameover()
{ if (timrec1) window.clearTimeout(timrec1);
  if (timrec2) window.clearTimeout(timrec2);
  alert('Game over!');
//  if (punkte!=document.form1.punkte.value) alert('Njet!'); else  { document.form1.modus.value=1; document.form1.submit(); }
  eintrag('','form1');
}

function levelup()
{ punkte=punkte+zeit;
  document.form1.punkte.value=punkte;
  level++;
  if (level<maxlevels) { joker=joker+2; neu(false); }
  else 
  { punkte=punkte+punkte; 
    document.form1.punkte.value=punkte;
    alert('Mehr Levels hamma nich!\nPunkteverdopplung!');
    gameover();
  }
}


function get_level()
{ if (timrec1) window.clearTimeout(timrec1);
  if (timrec2) window.clearTimeout(timrec2);
  level=document.form1.level.selectedIndex;
  punkte=0;
  neu(false);
}


function countdown()
{ zeit--;
  document.form1.zeit.value=zeit;
  if (zeit<=0) gameover(); else timrec1=window.setTimeout('countdown()',1000);
}


function toggle_pause()
{ if (zeit>0)
  { var dom1=document.getElementById;
    if (dom1) my_obj=document.getElementById('toggle');
    if (aktiv) 
    { aktiv=false;
      if (timrec1) window.clearTimeout(timrec1);
      if (dom1) my_obj.firstChild.nodeValue='weiter';
      for (i=0; i<zmax; i++) document.images['i'+i].src=ima[0].src;
    }
    else
    { aktiv=true;
      if (dom1) my_obj.firstChild.nodeValue='Pause';
      for (i=0; i<zmax; i++) document.images['i'+i].src=ima[f[i]].src;

    }
  }
}


// =========================================================================================================================

