// Halloween-Fleur-Variante uja 10/2009
// V1.1: Windows-Patch: alle Listen-Vektoren global (Stack entlasten), da freemem weder bei Mozilla noch IE hinhaut
/*
Fleur hexagonal: 90 Steine, davon meist 4er, 1x2er, nur 1 Knick erlaubt
Validierung:
Steine müssen gleich sein, Pfad muss frei sein,
linear: Chips können mit einer der Geraden verbunden werden
ein_knick: Stützpunkte sind die Schnittpunkte der Geraden durch die beiden Punkte
*/

var parm=(get_winparam('size'));
if (parm=='') parm=get_cookie('hexafleursize');
var size=parseInt(parm); if (isNaN(size)) size=48; else if (size>96) size=96; else if (size<24) size=24; 

var parm=(get_winparam('stein'));
if (parm=='') parm=get_cookie('hexafleurstein'); 
var stein=parseInt(parm); if (isNaN(stein)) stein=0;

// -----------------------------------------------------------------------------------------------------------
function save_parms()
{ set_cookie('hexafleursize',size);
  set_cookie('hexafleurstein',stein);
  if (document.cookie) alert('Größe und Steinset sind gespeichert!'); else alert('Cookie konnte nicht gesetzt werden!');
}

function set_cookie(kennung,wert)
{ var ablauf = new Date(); 
  var dreimonate = ablauf.getTime() + (100 * 24 * 60 * 60 * 1000); ablauf.setTime(dreimonate);
  document.cookie=kennung+'='+wert+'; expires='+ablauf.toGMTString();
} 

function get_cookie(kennung)
{ var t='',paare='',wert='';
  if (document.cookie) 
  { paare=document.cookie.split(';');
    for (i=0; i<paare.length; i++)
    { t=paare[i].split('\=');
      t[0]=t[0].replace(/\s/g,"");
      if (t[0]==kennung) wert=t[1];
    }
  }
  return wert;
}
// =============================================================================================================
var numpics=24,xoff=8,yoff=8,spritesize=96,dx=40,dy=60,dzx=-8,dzy=-8;
var teiler=size/spritesize;
spritesize=spritesize*teiler;
dx=dx*teiler;
dy=dy*teiler;
dzx=dzx*teiler;
dzy=dzy*teiler;

var i,j,k;

var leer=new Image(); leer.src="leer.gif";
var pfad=new Image(); pfad.src='kuerbisblatt_0.gif';
var rand=new Image(); rand.src='rand.gif';
var ima=new Array();
var ima_hi=new Array();
for (i=0; i<numpics; i++) { ima[i]=new Image(); ima_hi[i]=new Image(); } 

// ===========================================================================================================
var koo=new Array();
var liste=new Array(); // temporäre Liste, in die die Subs reinspucken
var liste0=new Array(); mach_level(0); // Koordinatenliste, während Spiel konstant
var liste1=new Array(); // Pfad-und Hiliteliste
var liste2=new Array(); // Zugliste
var liste1a=new Array(); // Hilfsliste für Knick
var liste1b=new Array(); // Hilfsliste für Knick

function copy_liste(l1) { for (i=0; i<=liste[0]; i++) l1[i]=liste[i]; }

function steinset(nr)
{ var i;
  stein=nr;
  switch(nr)
  { case 1: for (i=0; i<numpics; i++)  { ima[i].src='ka_'+i+'.gif'; ima_hi[i].src='ka_'+i+'hi.gif'; } break;
    default: for (i=0; i<numpics; i++) { ima[i].src='k_'+i+'0.gif'; ima_hi[i].src='k_'+i+'1.gif'; }
  }
  for (i=0; i<kuerbis.length; i++) kuerbis[i].normal();
} 

// Level 0: Kordinatensystem Hex5, sortiert nach (z),y,x:
function mach_level(nr)
{ var i,j=0,k=0,klen=5;
  liste[0]=0;
  for (j=0; j<klen; j++) { for (i=0; i<j+1; i++) { koo[k]=new point(3*klen+2*i-j,j,0); k++; } }
  for (j=0; j<klen; j++) { for (i=0; i<3*klen+1-j; i++) { koo[k]=new point(2*i+j,klen+j,0,k); if (i>klen-j-1) if (i<2*klen+1) add_liste(k,liste); k++; } }
  for (i=0; i<2*klen+1; i++) { koo[k]=new point(2*i+klen,2*klen,0,k); if (i!=klen) add_liste(k,liste); k++; } j++;
  for (j=0; j<klen; j++) { for (i=0; i<2*klen+j+2; i++) { koo[k]=new point(2*i+klen-j-1,2*klen+j+1,0,k); if (i>j) if (i<2*klen+1) add_liste(k,liste); k++; } }
  for (j=0; j<klen; j++) { for (i=0; i<klen-j; i++) { koo[k]=new point(2*klen+1+2*i+j,3*klen+j+1,0); k++; } }
  copy_liste(liste0);
}
// ---------------------------------------------------------------------------------------------------------------------------------
var kuerbis=new Array(); for (i=0; i<koo.length; i++) kuerbis[i]=new sprite(i);
function sprite(id)
{ this.id=id;
  this.prio=id+1;
  this.posi=id;
  this.breite=spritesize;
  this.hoehe=spritesize;
  this.typ=-1;
  this.phase=0;
  this.lay='l_'+id;
  this.bild='i_'+id;
  this.set_koo=function(nr)
  { this.posi=nr; var xx=koo[nr].x,yy=koo[nr].y,zz=0;
    document.getElementById(this.lay).style.zIndex=this.prio;
    document.getElementById(this.lay).style.left=xx*dx+zz*dzx+xoff;
    document.getElementById(this.lay).style.top=yy*dy+zz*dzy+yoff;
  }
  this.set_bild=function(nr) { this.typ=nr; this.normal(); }
  this.hilite=function() { phase=1; if (this.typ>=0) document.images[this.bild].src=ima_hi[this.typ].src; else document.images[this.bild].src=pfad.src;  }
  this.normal=function() { this.phase=0; if (this.typ>=0) document.images[this.bild].src=ima[this.typ].src; else document.images[this.bild].src=rand.src; }
  this.on=function()  { document.getElementById(this.lay).style.visibility="visible"; }
  this.off=function() { this.typ=-1; document.getElementById(this.lay).style.visibility="hidden"; }
  this.shrink=function() { with(document.images[this.bild]) if (width>4) { width=0.8*width; height=0.8*height; } else { this.set_bild(-1); this.reset_size(); } }
  this.reset_size=function() { document.images[this.bild].width=spritesize; document.images[this.bild].height=spritesize; }
}

function mach_layers(nr)
{ var t;
  with (kuerbis[nr])
  { t='<div id="'+lay+'" style="position:absolute; width:'+spritesize+'px; height:'+spritesize+'px; z-Index:'+prio+'; ';
    t=t+'top:0px; left:0px; z-index:1"><a href="javascript:klick('+nr+')">';
    t=t+'<img src="'+ima[0].src+'" width='+spritesize+' height='+spritesize+' alt="" ';
    t=t+'name="'+bild+'" border=0></a></div>';
  }
  return t;
}

function point(x,y,z,inh) { this.x=x; this.y=y; this.z=z; this.inhalt=inh; }
function get_kooindex(x,y,z) { var i,k=-1; for (i=0; i<koo.length; i++) if (k<0) if (x==koo[i].x) if (y==koo[i].y) if (z==koo[i].z) k=i; return k; }

// ========================================================================================================
// das Spiel: 
// --------------------------------------------------------------------------------------------------------
var count,gewaehlt,zeit,punkte,timrec1,timrec2,aktiv,pausiert;

function neu()
{ if (timrec1) clearTimeout(timrec1);
  if (timrec2) clearTimeout(timrec2);
  pausiert=true;
  aktiv=false;
  punkte=0; gewaehlt=-1; zeit=1000;
  steinset(stein);
  mach_level(0);
  for (i=0; i<koo.length; i++) with(kuerbis[i]) { set_koo(i); set_bild(-1); reset_size(); on(); }
  for (i=1; i<=liste[0]; i++) { k=Math.floor((i-1)/4); kuerbis[liste[i]].set_bild(k%numpics); }
  count=liste0[0];
  mischen();
  zeige_level(liste0[0]); 
  zeige_zeit(zeit);
  zeige_punkte(punkte);
  toggle_pause();
  countdown();
}

// ================================================================================================================
// Kürbis Klick
// ----------------------------------------------------------------------------------------------------------------
function klick(nr)
{ if (aktiv) if (kuerbis[nr].typ>=0)
  { aktiv=false;
    kuerbis[nr].hilite();
    if (gewaehlt<0) { gewaehlt=nr; aktiv=true; }
    else if (checkmove(nr,gewaehlt,liste1)) 
    { hilite_liste(liste1);
      gewaehlt=-1;
      count=count-2; zeige_level(count);
      timrec2=setTimeout('weg_damit()',100);
      punkte=punkte+20;
      zeige_punkte(punkte);
    }
    else if (!is_move()) shuffle();
    else // falsch geklickt
    { hili_weg(nr,gewaehlt);
      kuerbis[nr].hilite();
      gewaehlt=nr; aktiv=true;
    }
  }
  if (count<1) { punkte=punkte+1000; gameover(); }
}

function mischen()
{ var i,j,k;
  liste[0]=0;
  if (zeit<1000) zeit=zeit-100;
  for (i=0; i<koo.length; i++) if (kuerbis[i].typ>=0) add_liste(i,liste);
  for (i=1; i<=liste[0]; i++)
  { j=Math.floor(liste[0]*Math.random())%liste[0]+1; 
    k=kuerbis[liste[i]].typ;
    kuerbis[liste[i]].set_bild(kuerbis[liste[j]].typ);
    kuerbis[liste[j]].set_bild(k);
  }
}

// ======================================================================================================================
// Fleur-Berechnung: freie Linie oder 2 sich kreuzende freie Linien

function checkmove(n1,n2,l)
{ var ok=(n1!=n2);
  l[0]=0; l[1]=0;
  if (ok) ok=(kuerbis[n1].typ>=0) && (kuerbis[n1].typ==kuerbis[n2].typ);
  if (ok) { if (!linear(n1,n2,l)) if (!eineck(n1,n2,l)) ok=false; }
  return ok;
}

function is_move()
{ var i,j,n1=-1,n2=-1;
  liste[0]=0;
  for (i=0; i<koo.length-1; i++) if (n1<0) if (kuerbis[i].typ>=0) for (j=i+1; j<koo.length; j++) if (n1<0) if (kuerbis[j].typ>=0) if (checkmove(i,j,liste2)) { n1=i; n2=j; }
  if (n1>=0) { liste[0]=0; add_liste(n1,liste); add_liste(n2,liste); }
  return (n1>=0);
}

function linear(n1,n2,oliste) // 3 Geraden checken
{ var i,j,k,ok=true;
  oliste[0]=0; add_liste(n1,oliste); add_liste(n2,oliste);
  if (n1>n2) { k=n1; n1=n2; n2=k; }        // sortieren nach position
  if (koo[n1].y==koo[n2].y)                               // Gerade 1
  { if (koo[n2].x-koo[n1].x!=2) for (i=koo[n1].x+1; i<koo[n2].x; i++)
    { k=get_kooindex(i,koo[n1].y,0);
      if (k>=0) if (kuerbis[k].typ>=0) ok=false; else add_liste(k,oliste);
    }
  }
  else if ((koo[n2].x-koo[n1].x)==(koo[n2].y-koo[n1].y))  // Gerade 2
  { k=koo[n2].x-koo[n1].x;
    if (k!=1) for (i=1; i<k; i++)
    { j=get_kooindex(i+koo[n1].x,i+koo[n1].y,0);
      if (j>=0) if (kuerbis[j].typ>=0) ok=false; else add_liste(j,oliste);
    }
  }
  else if ((koo[n1].x-koo[n2].x)==(koo[n2].y-koo[n1].y))  // Gerade 3
  { k=koo[n1].x-koo[n2].x;
    if (k!=1) for (i=1; i<k; i++)
    { j=get_kooindex(koo[n1].x-i,i+koo[n1].y,0);
      if (j>=0) if (kuerbis[j].typ>=0) ok=false; else add_liste(j,oliste);
    }
  }
  else ok=false;
  if (!ok) oliste[0]=0;
  return ok;
}


// 6 Stützpunkte möglich, Schnittpunkte der durch die gewählten Koordinaten verlaufenden Geraden y=c, y=x+c, y=-x+c:
function eineck(n1,n2,oliste)
{ var i,j,k,xp,yp,ok=false;
  oliste[0]=0;
  if (!ok) // P1: G11 x G22
  { yp=koo[n1].y;
    xp=koo[n1].y-koo[n2].y+koo[n2].x;
    k=get_kooindex(xp,yp,0);
    if (kuerbis[k].typ<0) ok=(linear(k,n1,liste1a)) && (linear(k,n2,liste1b));
  }
  if (!ok) // P2: G11 x G32
  { yp=koo[n1].y;
    xp=koo[n2].y-koo[n1].y+koo[n2].x;
    k=get_kooindex(xp,yp,0);
    if (kuerbis[k].typ<0) ok=(linear(k,n1,liste1a)) && (linear(k,n2,liste1b));
  }
  if (!ok) // P3: G21 x G12
  { yp=koo[n2].y;
    xp=koo[n2].y-koo[n1].y+koo[n1].x;
    k=get_kooindex(xp,yp,0);
   if (kuerbis[k].typ<0) ok=(linear(k,n1,liste1a)) && (linear(k,n2,liste1b));
  }
  if (!ok) // P4: G31 x G12
  { yp=koo[n2].y;
    xp=koo[n1].y-koo[n2].y+koo[n1].x;
    k=get_kooindex(xp,yp,0);
    if (kuerbis[k].typ<0) ok=(linear(k,n1,liste1a)) && (linear(k,n2,liste1b));
  }
  if (!ok) // P5: G21 x G32
  { xp=(koo[n2].y-koo[n1].y+koo[n1].x+koo[n2].x)/2;
    yp=xp+koo[n1].y-koo[n1].x;
    k=get_kooindex(xp,yp,0);
    if (kuerbis[k].typ<0) ok=(linear(k,n1,liste1a)) && (linear(k,n2,liste1b));
  }
  if (!ok) // P6: G31 x G22
  { xp=(koo[n1].y-koo[n2].y+koo[n1].x+koo[n2].x)/2;
    yp=xp+koo[n2].y-koo[n2].x;
    k=get_kooindex(xp,yp,0);
    if (kuerbis[k].typ<0) ok=(linear(k,n1,liste1a)) && (linear(k,n2,liste1b));
  }
  if (ok) { join_liste(liste1a,oliste); join_liste(liste1b,oliste); }
  return ok;
}



// ======================================================================================================================
// Animationen:

// Pfad
function hilite_liste(l) { for (var i=1; i<=l[0]; i++) kuerbis[l[i]].hilite(); } 
function normal_liste(l) { for (var i=1; i<=l[0]; i++) kuerbis[l[i]].normal(); }

function weg_damit() // liste1
{ var i,weiter=false;
  for (i=1; i<=liste1[0]; i++) with(kuerbis[liste1[i]])
  { shrink();
    if (typ>=0) weiter=true;
  }
  if (weiter) timrec2=setTimeout('weg_damit()',35);
  else 
  { if (!is_move()) mischen();
    aktiv=true;
  }
}

function zeige_zug() { if (is_move()) { zeit=zeit-100; kuerbis[liste[1]].hilite(); kuerbis[liste[2]].hilite(); setTimeout('hili_weg('+liste[1]+','+liste[2]+')',1500); } } 
function hili_weg(n1,n2) { kuerbis[n1].normal(); kuerbis[n2].normal(); }

// ===========================================================================================================0
// DOM - Kleinkram
// ------------------------------------------------------------------------------------------------------------

function hilfe() { var win2=window.open('hilfe.htm','popup','width=592,height=376,scrollbars=yes'); }

function zeige_level(p)   { document.form1.level.value=p;   } // -> Reststeine
function zeige_zeit(p)    { document.form1.zeit.value=p;    }
function zeige_punkte(p)  { document.form1.punkte.value=p;  }

function toggle_pause()
{ pausiert=!pausiert;
  if (pausiert)
  { document.getElementById('pause').firstChild.nodeValue='weiter';
    aktiv=false;
    for (i=0; i<koo.length; i++) document.getElementById(kuerbis[i].lay).style.visibility="hidden";
  }
  else
  { document.getElementById('pause').firstChild.nodeValue='Pause';
    aktiv=true;
    for (i=0; i<koo.length; i++) document.getElementById(kuerbis[i].lay).style.visibility="visible";
  }
}


function countdown()
{ if (aktiv) zeit--;
  if (zeit<0) gameover(); else  { zeige_zeit(zeit); timrec1=setTimeout('countdown()',1000); }
}

function gameover()
{ if (timrec1) clearTimeout(timrec1);
  if (timrec2) clearTimeout(timrec2);
  aktiv=false;
  if (zeit>0) punkte=punkte+zeit;
  zeige_punkte(punkte);
  if (punkte<3400) eintrag('form1'); else { punkte=0; alert("wohl übergeschnappt!"); }
}

