function winmessage() {
     if( gewonnen != 0 ) return;
     myIdx = document.tform.typ.options.selectedIndex;
     settings = document.tform.typ.options[myIdx].value + ": ";
     for(setptr=0; setptr < (unDoPtr*4); setptr+=4) {
        settings+=unDo[setptr]+","+unDo[setptr+1]+"-";
        settings+=unDo[setptr+2]+","+unDo[setptr+3]+" / ";
     }

     // Das semaphorFormular füllen und dann das Win Fenster aufrufen.
     text1 = "steckhalma";
     text2 = "";
     text3 = "";
     text4 = 'loesung: ' + settings;
     // Nun den Namen erfragen un bei OK das Formular abschicken lassen
     oeffneListenFenster();

     gewonnen = 1;
}

function undone() {
         if( unDoPtr <= 0 ) return;
         unDoPtr--;  Ptr = unDoPtr * 4;
         if( mark_x != -1 && mark_y != -1 ) setxy(mark_x, mark_y, pin);
         x = unDo[Ptr+2]; y=unDo[Ptr+3]
         mark_x = unDo[Ptr]; mark_y=unDo[Ptr+1]
         setxy(x,y,hole); /* loch wieder herstellen */
         setxy(mark_x , mark_y, pinmark);
         delete_x = x + ( mark_x - x ) / 2;
         delete_y = y + ( mark_y - y ) / 2;
         setxy(delete_x,delete_y,pin);
}

function redone() {
         if( unDoPtr * 4 >= unDo.length ) return;
         Ptr = unDoPtr * 4; unDoPtr++;
         x = unDo[Ptr+2]; y=unDo[Ptr+3]
         mark_x = unDo[Ptr]; mark_y=unDo[Ptr+1]
         setxy(x,y,pin);
         setxy(mark_x , mark_y, hole);
         delete_x = x + ( mark_x - x ) / 2;
         delete_y = y + ( mark_y - y ) / 2;
         setxy(delete_x,delete_y,hole);
         mark_x=-1; mark_y=-1;
}

function init() {
        mark_x=-1; mark_y=-1;
        unDo = new Array; unDoPtr=0;
        gewonnen = 0;
        myIdx=document.tform.typ.options.selectedIndex;
        marktype=document.tform.typ.options[myIdx].value;
        if(marktype == "standard") muster=m_standard;
        if(marktype == "viereck") muster=m_viereck;
        if(marktype == "dreieck") muster=m_dreieck;
        if(marktype == "pfeil") muster=m_pfeil;
        if(marktype == "karo") muster=m_karo;
        for(zeile=0; zeile<C_ROW; zeile++){
           for(spalte=0; spalte<C_COL; spalte++){
              c = muster.charAt(zeile + spalte * C_COL);
              if( c == '0' ) setxy(spalte,zeile,empty);
              if( c == '1' ) setxy(spalte,zeile,hole);
              if( c == '2' ) setxy(spalte,zeile,pin);
           }
        }
}

function setxy(x,y,image) {
         document.images[firstfield+(x*C_COL)+y].src=image.src;
}

function hoverin(x,y) {
         if( status(x,y) == 1 && mark_x == -1 && mark_y == -1 ) {
                  setxy(x,y,pinhover);
         }
         if( status(x,y) == 0 && mark_x != -1 && mark_y != -1 ) {
                  setxy(x,y,holehover);
         }
         return 0;
}

function hoverout(x,y) {
         if( status(x,y) == 1 ) {
                  setxy(x,y,pin);
         }
         if( status(x,y) == 0 ) {
                  setxy(x,y,hole);
         }
         return 0;
}

function test_end() {
         /* return = 0 == noch kein Ende */
         /* return > 0 == ende mit der entsprechenden anzahl steine */
        anz=0;
        for(zeile=0; zeile<C_ROW; zeile++){
           for(spalte=0; spalte<C_COL; spalte++){
             if( spalte>=2 && spalte<5 || zeile>=2 && zeile<5 ) {
                 /* test ob dieser noch was taugt */
                 stat=status(zeile, spalte);
                 if( stat != 1 && stat != 2 ) continue;
                 if( status(zeile-1,spalte)==1 && status(zeile-2,spalte)==0  ) return -1;
                 if( status(zeile+1,spalte)==1 && status(zeile+2,spalte)==0  ) return -1;
                 if( status(zeile,spalte-1)==1 && status(zeile,spalte-2)==0  ) return -1;
                 if( status(zeile,spalte+1)==1 && status(zeile,spalte+2)==0  ) return -1;
                 anz++;
             }
           }
        }
        return anz;
}

function mark(x,y) {
         //alert(x+","+y);
         stat = status(x,y);
         if( stat == 1 ) {
                  setxy(x,y,pinmark);
                  if( mark_x != -1 && mark_y != -1 ) setxy(mark_x, mark_y,pin);
                  mark_x=x;
                  mark_y=y;
                  return;
         }
         if( stat == 2 ) {
                  setxy(x,y,pin);
                  mark_x=-1;
                  mark_y=-1;
                  return;
         }
         if( stat == 0 && mark_x!=-1 && mark_y!=-1 ) {
                  diff_x = Math.abs( mark_x - x );
                  diff_y = Math.abs( mark_y - y );
                  if( (diff_x == 2 && diff_y == 0) || (diff_x == 0 && diff_y == 2) ) {
                      delete_x = x + ( mark_x - x ) / 2
                      delete_y = y + ( mark_y - y ) / 2
                      if( status(delete_x,delete_y) == 1 ) {
                          setxy(x,y,pin);
                          setxy(mark_x,mark_y,hole);
                          setxy(delete_x,delete_y,hole);
                          if( unDoPtr*4 < unDo.length ) unDo = unDo.slice(0,unDoPtr*4);
                          unDo = unDo.concat(new Array(mark_x,mark_y,x,y));
                          unDoPtr++;
                          mark_x=-1; mark_y=-1;
                          if( (anz=test_end()) != -1 ) {
                              if( anz == 1 ) {
                                       winmessage(settings);
                              } else {
                                alert("das spiel ist zu ende. es sind " +
                                       anz + " stecker übrig geblieben");
                              }
                          }
                      }
                  }
                  return;
         }
}

function status(x,y) {
         /* gibt den Status des Feldes x,y wieder */
         /* -1 = fehler */
         /* 0 = loch */
         /* 1 = normaler pin */
         /* 2 = markierter pin */
         if( x < 0 || x >= C_COL || y < 0 || y > C_ROW ) return -1;
         if( document.images[firstfield+(x*C_COL)+y].src.indexOf(holeimg) != -1 ) return 0;
         if( document.images[firstfield+(x*C_COL)+y].src.indexOf(holehoverimg) != -1 ) return 0;
         if( document.images[firstfield+(x*C_COL)+y].src.indexOf(pinimg) != -1 ) return 1;
         if( document.images[firstfield+(x*C_COL)+y].src.indexOf(pinhoverimg) != -1 ) return 1;
         if( document.images[firstfield+(x*C_COL)+y].src.indexOf(pinmarkimg) != -1 ) return 2;
         return -1;
}

function solution(s_pat,s_pat_idx,s_arr) {
         if( !confirm("schauen sie sich die lösung für das\n muster '"+s_pat+"' mit 'zug vor' und 'zug zurück' an.") ) return;
         document.tform.typ.options[s_pat_idx].selected = true;
         init();
         unDoPtr = 0; unDo = s_arr;
         gewonnen = 1; //damit bei lösungsweganzeige keine winmessage kommt
}

