/* Stand 12.1.2010: Version 1.0 mit allem Gedöhns
60Grad-Drehung fiel flach wegen Rundungsfehler, die die Grafik verzerrten - eventuell später mit Transformationstabelle versuchen
Generieren lösbarer Bretter geschieht asynchron über ein Java-Programm (Algorithmus: ujas Mahjongg-Mixer),
 eine größere Anzahl jedes Brettes werden via Ajax bereitgestellt.
*/

// Spielparameter: URI dominant über Cookie ----------------------------------------
var size=64,hgr=4,steinset=0,level=0,loesbares_spiel=false; // Voreinstellungen

if (location.search)
{ size=parseInt(get_winparam('size'));
  steinset=parseInt(get_winparam('steine'));
  hgr=parseInt(get_winparam('hgr'));
  level=parseInt(get_winparam('level'));
  loesbares_spiel=(get_winparam('loesbar'));
}
else if (document.cookie) loadparms();

if (isNaN(size)) size=64;
if (isNaN(steinset)) steinset=0;
if (isNaN(hgr)) hgr=4;
if (isNaN(level)) level=0;

// ---------------------------------------------------------------------------------

var ofx=0.25*size,ofy=1.25*size, rand=size/8, tab=12*size;
var cmax=144,fmax=cmax/4;
var i,k,gewaehlt,rest;
var f=new Array();
var zliste=new Array();
var uliste=new Array();

var ima=new Array();
for (i=0; i<fmax; i++)
{ k=i+1; ima[i]=new Image(); ima[i].src='p0_'+k+'.gif';
  ima[i+fmax]=new Image(); ima[i+fmax].src='p1_'+k+'.gif';
  ima[i+2*fmax]=new Image(); ima[i+2*fmax].src='s0_'+k+'hi.gif';
  ima[i+3*fmax]=new Image(); ima[i+3*fmax].src='s1_'+k+'hi.gif';
}

var my_x,my_y,aktiv=true; function mauskoords(mx,my) { my_x=mx; my_y=my; }
var koo=new Array(); for (i=0; i<cmax; i++) koo[i]=new koords(i);

function koords(id)
{ this.id=id; this.x=0; this.y=0; this.z=id; this.ix=0; this.iy=0; this.inhalt=0; this.typ=0; this.ori=0; this.lay='l_'+id; this.bild='i'+id; this.prio=0;
  this.set_pic=function(nr) { this.typ=nr; this.set_lo(); }
  this.set_hi =function() { if (this.inhalt>=0) document.images[this.bild].src=ima[this.typ+2*fmax+fmax*this.ori].src; }
  this.set_lo =function() { if (this.typ>=0) { if (ima[this.typ+fmax*this.ori]) document.images[this.bild].src=ima[this.typ+fmax*this.ori].src; } else this.off(); }
  this.off=function() { this.inhalt=-1; document.getElementById(this.lay).style.visibility="hidden"; }  
  this.in_rechteck=function(xx,yy) { return ((this.inhalt>=0) && (this.ix<=xx) && ((this.ix+size)>=xx) && (this.iy<=yy) && ((this.iy+size)>=yy)); }

  this.set_koords=function(xx,yy,zz,ori)
  { this.ori=ori; this.x=xx; this.y=yy; this.z=zz;
    this.prio=this.y*2+cmax*zz; if (ori>0) this.prio++;
    this.ix=parseInt(size*xx/2+ofx); this.iy=parseInt(yy*size/3-zz*size/4)+ofy;
    if (this.inhalt>=0) this.on();
    // Stoßmaske der Platte initialisieren:
    this.p=new Array(this.ix,this.iy, this.ix+size,this.iy, this.ix+size/2,this.iy); 
    if (this.ori>0) { this.p[1]+=2*size/3; this.p[3]+=2*size/3; } else this.p[5]+=2*size/3;
  }
  this.on=function()
  { this.set_lo();
    this.inhalt=this.typ;
    document.getElementById(this.lay).style.left=this.ix;
    document.getElementById(this.lay).style.top=this.iy;
    document.getElementById(this.lay).style.zIndex=this.prio;
    document.getElementById(this.lay).style.visibility="visible";
  }
  this.getroffen=function(xx,yy) 
  { var drin=this.in_rechteck(xx,yy);
    if (drin)
    { var i,i1,x0,y0,x1,y1,sum=0,npoly=3;
      var p=new Array();
      for (i=0; i<npoly; i++) { p[2*i]=this.p[2*i]-xx; p[2*i+1]=this.p[2*i+1]-yy; } // Mauskoordinaten sind Ursprung des Polygon-Systems
      for (i=0; i<npoly; i++) { x0=p[2*i]; y0=p[2*i+1]; i1=(i+1)%npoly; x1=p[2*i1]; y1=p[2*i1+1]; sum=sum+Math.atan2(y1*x0-x1*y0,x1*x0+y1*y0); }
      drin=(Math.abs(sum)>0.000001);
    }
    return drin;     
  }
}
// --- DOM ----------------------------------------------------------------------------------------------------------------------------------------------------------
function mach_layers()
{ var i,j,k,t='';
  for (i=0; i<cmax; i++)
  { t=t+'<div id="'+koo[i].lay+'" style="position:absolute; left:'+(i%12)*size+'px; top:'+size*Math.floor(i/12)+'px; z-index:0; width:'+size+'px; height:'+size+'px">';
    t=t+'<a href="javascript:klick()" onclick="this.blur()"><img src="'+ima[i].src+'" name="'+koo[i].bild+'" width='+size+' height='+size+' alt="" border=0><\/a><\/div>';
  }
  document.writeln(t);
}

function updat_rest() { document.getElementById('rest').firstChild.nodeValue=rest; }
function levelladen() { level=document.form1.level.selectedIndex;  neu(true); }

function werte_einstellen()
{ document.form1.level.selectedIndex=level;
  document.form1.steine.selectedIndex=steinset;
  document.form1.hgr.selectedIndex=hgr;
  if (size==64) document.form1.size.selectedIndex=0;
  else if (size==80) document.form1.size.selectedIndex=1;
  else if (size==96) document.form1.size.selectedIndex=2;
  document.form1.loesbar.checked=loesbares_spiel;  
}

function init_all()
{ init_mouse();
  werte_einstellen();
  steineladen();
  hintergrund();
  levelladen();
}

// -------------------------------------------------------------------------------------------------------------------------------------------------------------
// --- Spielfluss ----------------------------------------------------------------------------------------------------------------------------------------------

function mischen()
{ var i,j,k;
  for (i=0; i<cmax; i++) f[i]=Math.floor(i/4);
  for (i=0; i<cmax; i++) { k=Math.floor(cmax*Math.random())%cmax; j=f[i]; f[i]=f[k]; f[k]=j; }
}

function neu(flag)
{ aktiv=false;
  get_level(level);
  if (flag)
  { if (document.form1.loesbar.checked) get_loesbar(); // hier Timingfehler abfangen!
    else 
    { mischen();
      document.getElementById('brett').firstChild.nodeValue="Zufallsbrett";
      mach_hinne();
    }
  }
  else mach_hinne();
}  

function mach_hinne()
{ for (var i=0; i<cmax; i++) { koo[i].set_pic(f[i]); koo[i].on(); } 
  uliste=Array(0,0);
  gewaehlt=-1;
  rest=cmax; updat_rest();
  aktiv=true;
}

function klick()
{ var i,j,k=-1;
  for (i=0; i<cmax; i++) with(koo[i]) if (inhalt>=0) if (getroffen(my_x,my_y)) { if (k<0) k=i; else if (koo[k].prio<koo[i].prio) k=i; }
  if ((k>=0) && (stein_ist_frei(k)))
  { if (gewaehlt<0) gewaehlt=k; else
    { if ((koo[k].typ==koo[gewaehlt].typ) && (k!=gewaehlt))
      { koo[k].off(); koo[gewaehlt].off();
        add_liste(k,uliste); add_liste(gewaehlt,uliste);
        gewaehlt=-1; rest=rest-2; updat_rest();
        // zugliste(); Reaktion war zu lahm 
      }
      else { koo[gewaehlt].set_lo(); gewaehlt=k; }
    }
  }
  if (rest==0) setTimeout('gameover()',200);
  else if (gewaehlt>=0) koo[gewaehlt].set_hi();
  else if (!ist_zug())
  { if (loesbares_spiel) alert('Du hast ein lösbares Spiel gewählt,\n dich aber wohl vergaloppiert.'); 
    else setTimeout('teilmischen()',400);
  }
}

function stein_ist_frei(nr)
{ var i,j,k=-1,xx=koo[nr].x,yy=koo[nr].y,zz=koo[nr].z,ok=true;
  var re0=false,li0=false,o0=false;
 // Tests auf gleicher Ebene:
  for (i=0; i<cmax; i++) if (i!=nr) with(koo[i]) if (inhalt>=0) if (koo[nr].z==z)
  { if (koo[nr].y==y) // rechts und links checken:
    { if (koo[nr].x-1==x) li0=true; 
      if (koo[nr].x+1==x) re0=true;
    }
    if (koo[nr].x==x) // oben oder unten checken, wenns zu leicht wird, weglassen:
    { if ((koo[nr].y-2==y) && (koo[nr].ori==0)) o0=true; // oben, falls ori=0
      if ((koo[nr].y+2==y) && (koo[nr].ori==1)) o0=true; // unten, falls ori=1
    }
  }
  ok=!(re0 && li0 && o0);  
  // checken, ob oben frei ist:
  if (ok) for (i=0; i<cmax; i++) if (i!=nr) with(koo[i]) if (inhalt>=0) if (koo[nr].z==z-1)
  { if (koo[nr].x==x) if (Math.abs(koo[nr].y-y)<2) ok=false;
    if (Math.abs(koo[nr].x-x)==1)
    { if (koo[nr].ori==ori)    { if (Math.abs(koo[nr].y-y)<2) ok=false; } //  Stein wird von allen Steinen mit gleichem Pattern blockiert
      else if (koo[nr].ori==0) { if (koo[nr].y-y==1) ok=false; }          // Stein wird von y-1 blockiert
      else if (koo[nr].ori==1) { if (koo[nr].y-y==-1) ok=false; }         // Stein wird von y+1 blockiert
    } 
  }
  return ok;
}

// ==============================================================================================================
// Jingles and bells:
// --------------------------------------------------------------------------------------------------------------
function gameover() { aktiv=false; aufbau(0); }

function hilfe()
{ var t='Dies ist ein MahJongg mit 144 dreieckigen Steinen zu 36 Mustern.\nGleiche Steine müssen paarweise abgeräumt werden, indem man sie nacheinander anklickt.\nMan kann sie nur entfernen, wenn sie auf mindestens einer Seite frei sind und kein anderer Stein die Platte berührt.'
  alert(t);
}

function undo() { if (uliste[0]<2) alert('Dies ist bereits die Ausgangsposition!'); else if (aktiv) for (var i=0; i<2; i++) { koo[uliste[uliste[0]]].on(); uliste[0]--; rest++; } updat_rest(); }

function zugliste()
{ var i,j;
  zliste[0]=0;
  for (i=0; i<cmax-1; i++) if (koo[i].inhalt>=0) if (stein_ist_frei(i))
   for (j=i+1; j<cmax; j++) if (koo[j].inhalt>0) if (koo[j].typ==koo[i].typ) if (stein_ist_frei(j))
   { add_liste(i,zliste);
     add_liste(j,zliste);
   }  
  if (zliste[0]==0) if (confirm('Kein Zug mehr möglich!\n Rest neu mischen?')) teilmischen();
}

function ist_zug() // Kurzversion
{ var i,j,ok=false;
  for (i=0; i<cmax-1; i++) if (!ok) if (koo[i].inhalt>=0) if (stein_ist_frei(i))
   for (j=i+1; j<cmax; j++) if (koo[j].inhalt>0) if (koo[j].typ==koo[i].typ) if (stein_ist_frei(j)) ok=true;
  return ok;
}

function zeige_zuege() { zugliste(); if (gewaehlt>=0) koo[gewaehlt].set_lo(); hili_zliste(3); }
function hili_zliste(cnt)   { if (zliste[0]>0) for (var i=1; i<=zliste[0]; i++) koo[zliste[i]].set_hi(); setTimeout('normal_zliste('+cnt+')',200); }

function normal_zliste(cnt)
{ if (zliste[0]>0) for (var i=1; i<=zliste[0]; i++) koo[zliste[i]].set_lo();
   cnt--; if (cnt>0) setTimeout('hili_zliste('+cnt+')',200); else if (gewaehlt>=0) koo[gewaehlt].set_hi();
}

function reststeine()
{ var i,k=0,t='<html><head><link rel="stylesheet" type="text/css" href="my_style.css"><\/head><body>';
  var ind=stein_sort();
  for (i=0; i<cmax; i++) with(koo[ind[i]]) if (inhalt>=0)
  { t=t+'<img src="'+ima[typ+fmax].src+'" alt="'+id+'" width=48>';
    k++; if (k%12==0) t=t+'<br clear=all>';
  }
  t=t+'<br clear=all><a href="javascript:this.close()" style="font-size:10pt">Fenster schliessen<\/a><\/body><\/html>';
  var win2=window.open('_popup');
  win2.document.open()
  win2.document.writeln(t);  
  win2.document.close();
}
function stein_sort()
{ var i,k,delta;
  var ind=new Array();
  for (i=0; i<cmax; i++) ind[i]=i;
  var getauscht,delta;
  delta=Math.floor(cmax/2);
  while (delta>0) 
  { getauscht=false;
    for (i=0; i<(cmax-delta); i++)
    { if (koo[ind[i]].typ>koo[ind[i+delta]].typ) 
      { k=ind[i];               
        ind[i]=ind[i+delta];
        ind[i+delta]=k;
        getauscht=true;
      }
    }
    if (!getauscht) delta=Math.floor(delta/2);
  }
  return ind;
}

function teilmischen()
{ var i,j,k;
  zliste[0]=0;
  for (i=0; i<cmax; i++) if (koo[i].inhalt>=0) add_liste(i,zliste);
  if (zliste[0]>0)
  { for (i=1; i<=zliste[0]; i++)
    { k=Math.floor(zliste[0]*Math.random())%zliste[0]+1;
      j=koo[zliste[i]].typ;
      koo[zliste[i]].typ=koo[zliste[k]].typ;
      koo[zliste[k]].typ=j;
    }
    for (i=1; i<=zliste[0]; i++) koo[zliste[i]].set_lo();
  }
  zugliste();
}

// ein paar visuelle Effekte:
// -----------------------------------------------------------------------------------------------
function brett_drehen()
{ var i,x0=0,y0=0;
  for (i=0; i<cmax; i++) with(koo[i]) { if (x>x0) x0=x; if (y>y0) y0=y; } 
  for (i=0; i<cmax; i++) with(koo[i])  { set_koords(x0-x,y0-y,z,(ori+1)%2); if (inhalt>=0) on(); }
  if (gewaehlt>=0) koo[gewaehlt].set_hi();
}
// gameover-Schnickschnack:
function aufbau(nr)
{ var yold,weiter=(nr<cmax);
  if (weiter) 
  { yold=koo[nr].y;
    while (weiter) { koo[nr].on(); nr++; weiter=(nr<cmax); if (weiter) weiter=(koo[nr].y==yold); }
    if (nr<cmax) setTimeout('aufbau('+nr+')',50); else setTimeout('neu(true)',500);
  }
}


function steineladen()
{ var i,k,t1;
  steinset=document.form1.steine.selectedIndex;
  switch(steinset)
  { case 1: t1='p'; break;
    case 2: t1='r'; break;
    case 3: t1='z'; break;
    case 4: t1='si'; break;
    default: t1='s';
  }
  for (i=0; i<fmax; i++)
  { k=i+1; ima[i].src=t1+'0_'+k+'.gif';
    ima[i+fmax].src=t1+'1_'+k+'.gif';
    ima[i+2*fmax].src=t1+'0_'+k+'hi.gif';
    ima[i+3*fmax].src=t1+'1_'+k+'hi.gif';
  }
  for (i=0; i<cmax; i++) with(koo[i]) if (inhalt>=0) set_lo();
  if (gewaehlt>=0) koo[gewaehlt].set_hi();
}

function hintergrund()
{  var t='.jpg';
   hgr=document.form1.hgr.selectedIndex;
   switch(hgr)
   { case 0: t='verlauf_rot'+t; break;
     case 1: t='verlauf_gold'+t; break;
     case 2: t='verlauf_gruen'+t; break;
     case 3: t='orion-nebula-hubble_unten'+t; break;
     default: t='verlauf'+t; 
   }
   document.getElementsByTagName("body")[0].style.backgroundImage='url('+t+')';
}

function check_loesbar() { loesbares_spiel=document.form1.loesbar.checked; neu(true); }

// ======================================================================================================
// Parameter des Zockers als Cookie laden/speichern, csv-Liste
// ------------------------------------------------------------------------------------------------------
function saveparms()
{ var t;
  if (loesbares_spiel) t='1'; else t='0';
  t=t+','+level;
  t=t+','+steinset;
  t=t+','+hgr;
  t=t+','+size; 
  set_cookie('trijongg',t);
  if (document.cookie) alert('Parameter gespeichert'); else ('Parameter konnten nicht gespeichert werden');
}

function check_cookie() { return document.cookie; }

function set_cookie(kennung,parliste)
{ var ablauf = new Date(); 
  var dreimonate = ablauf.getTime() + (100 * 24 * 60 * 60 * 1000); ablauf.setTime(dreimonate);
  document.cookie=kennung+'='+parliste+'; expires=' + ablauf.toGMTString();
}

function loadparms()
{ var parliste=get_cookie('trijongg');
  parliste=parliste.split(',');
  loesbares_spiel=(parliste[0]>0);
  level=parseInt(parliste[1]);
  steinset=parseInt(parliste[2]);
  hgr=parseInt(parliste[3]);
  size=parseInt(parliste[4]);
}

function get_cookie(kennung)
{ var t='',paare='',wert='';
  if (document.cookie) 
  { paare=document.cookie.split(';');
    anz=paare.length;
    for (i=0; i<anz; i++)
    { t=paare[i].replace(/^\s+/,''); t=t.replace(/\s+$/,''); // trim
      t=paare[i].split('\=');
      if (t[0]==kennung) wert=t[1];
    }
  }
  return wert;  
}

// ======================================================================================================
// ajax: Abrufen lösbarer Muster, die mit Java generiert wurden
// ------------------------------------------------------------------------------------------------------
function get_loesbar()
{ var t="id="+level;
  var req=new create_httprequest();
  if (req) ajax(req,'loesbar.php',t);
  document.getElementById('brett').firstChild.nodeValue='bitte warten!';
}

function auswerten(my_text) 
{ my_text=unescape(my_text);
  daten=my_text.split('=',3);
  if (daten[0]=='trijongg')
  { wert=daten[2].split(',',144);
    for (var i=0; i<cmax; i++) f[i]=parseInt(wert[i]);
    loesbares_spiel=true;
    document.getElementById('brett').firstChild.nodeValue=daten[1];
    mach_hinne();
  }
  else alert(my_text);
}
// ======================================================================================================


