// Abfangen des Klick-Events für Netscape

if(navigator.appName == "Netscape")
  {
    window.document.captureEvents(Event.MOUSEDOWN);
    window.document.onMouseDown = MausClick;
  }
// Weiss der &*#@$ warum onCLICK im NS für Linux geht,
// unter Win aber nur MouseDown...

var aktuellesX = 0;
var aktuellesY = 0;
var FehlendeFelder = 144;

// Aufbau der HTML-Tabelle

function TabelleBauen()
  {
   for (var y = 1 ; y <= 12 ; y++)
     {
      window.document.writeln('<tr>');
      for (var x = 1 ; x <= 12 ; x++)
        {
          if (navigator.appName == "Netscape")
            {
              window.document.writeln('<td> <a href=\"javascript:nix()\" onMouseOver=\"MausDrauf(' + x + ','+ y + ')\" onMouseOut=\"MausRaus(' + x + ','+ y + ')\"> <img src=\"verdeckt.gif\" border=0 height=16 width=16> </a> </td>');
            }
          else
            {
              window.document.writeln('<td> <a onMouseOver=\"MausDrauf(' + x + ','+ y + ')\" onMouseOut=\"MausRaus(' + x + ','+ y + ')\"> <img src=\"verdeckt.gif\" border=0 height=16 width=16> </a> </td>');
            }
        }
      window.document.writeln('</tr>');
     }
  }

// etwas abenteuerlich: eine Funktion ohne Funktion...
// onMouseOver funzt aber anscheinend nur in einem Link,
// und ein Link ohne HREF geht im Netscape auch nicht...
// deshlab auch beim Tabellenbau schon die Unterscheidung ob NS oder IE...
// deshalb ein HREF="javascript:nix();

function nix()
{}

// Definition der beiden Arrays:

Oberschicht = new Array(144);
Unterschicht = new Array(144);

// Oberschicht:  0   - offen
//               1   - verdeckt
//               2   - markiert
// Unterschicht: 0   - leer
//               1-8 - Benachbarte Bomben
//               9   - Bombe

// Umrechnungsfunktionen vom 1- auf ein zweidimensionales Array
// mit wirklichen 2-dimensionalen Arrays hatte ich nur Troubles...

function FeldNr(x,y)
 {
   return x+(y-1)*12;
 }

function OberschichtFeld(x,y)
  {
    return Oberschicht[FeldNr(x,y)];
  }

function UnterschichtFeld(x,y)
  {
    return Unterschicht[FeldNr(x,y)];
  }

// Spielstart

function Spielstart()
  {
    FehlendeFelder=144;
    var Xrandom = 0;
    var Yrandom = 0;
    for (var y = 1 ; y <= 12 ; y++)
      {
        for (var x = 1 ; x <= 12 ; x++)
          {
            //document.writeln(x + ',' + y);
            Oberschicht[FeldNr(x,y)] = 1;           // Oberschicht verdecken
            Unterschicht[FeldNr(x,y)] = 0;          // Unterschict entleeren
            RichtigesBildZeigen(x,y);     // Spielfeld neu aufbauen
          }
      }
    for (var i = 1 ; i <= 20 ; i++)               // Bomben verteilen
      {
         Xrandom = Math.floor((Math.random()*12)+1);
         Yrandom = Math.floor((Math.random()*12)+1);
         if (Unterschicht[FeldNr(Xrandom,Yrandom)] == 9) i--;        // wenn schon Bombe da, dann Schleife einmal öfter durchlaufen
         else
           {
             Unterschicht[FeldNr(Xrandom,Yrandom)] = 9;              // Bombe setzen
             if ((Xrandom > 1)  &&                   (Unterschicht[FeldNr(Xrandom-1,Yrandom)] != 9)  ) Unterschicht[FeldNr(Xrandom-1,Yrandom)]++;     // Feldwerte rundherum erhöhen, ausser es ist eine Bombe d'rin
             if ((Xrandom < 12) &&                   (Unterschicht[FeldNr(Xrandom+1,Yrandom)] != 9)  ) Unterschicht[FeldNr(Xrandom+1,Yrandom)]++;
             if (                  (Yrandom > 1)  && (Unterschicht[FeldNr(Xrandom,Yrandom-1)] != 9)  ) Unterschicht[FeldNr(Xrandom,Yrandom-1)]++;
             if (                  (Yrandom < 12) && (Unterschicht[FeldNr(Xrandom,Yrandom+1)] != 9)  ) Unterschicht[FeldNr(Xrandom,Yrandom+1)]++;
             if ((Xrandom > 1)  && (Yrandom > 1)  && (Unterschicht[FeldNr(Xrandom-1,Yrandom-1)] != 9)) Unterschicht[FeldNr(Xrandom-1,Yrandom-1)]++;
             if ((Xrandom > 1)  && (Yrandom < 12) && (Unterschicht[FeldNr(Xrandom-1,Yrandom+1)] != 9)) Unterschicht[FeldNr(Xrandom-1,Yrandom+1)]++;
             if ((Xrandom < 12) && (Yrandom > 1)  && (Unterschicht[FeldNr(Xrandom+1,Yrandom-1)] != 9)) Unterschicht[FeldNr(Xrandom+1,Yrandom-1)]++;
             if ((Xrandom < 12) && (Yrandom < 12) && (Unterschicht[FeldNr(Xrandom+1,Yrandom+1)] != 9)) Unterschicht[FeldNr(Xrandom+1,Yrandom+1)]++;
             FehlendeFelder--;
           }
      }
  }

// Benötigte Bilder laden

Animated = new Image;
Animated.src = 'Was_nur2.gif';
Verdeckt = new Image;
Verdeckt.src = 'verdeckt.gif';
Bombe = new Image;
Bombe.src = 'Bomb.gif';
Leer = new Image;
Leer.src = 'leer.gif'
leer1 = new Image;
leer1.src = '1.gif'
leer2 = new Image;
leer2.src = '2.gif'
leer3 = new Image;
leer3.src = '3.gif'
leer4 = new Image;
leer4.src = '4.gif'
leer5 = new Image;
leer5.src = '5.gif'
leer6 = new Image;
leer6.src = '6.gif'
leer7 = new Image;
leer7.src = '7.gif'
leer8 = new Image;
leer8.src = '8.gif'
Markierung = new Image;
Markierung.src = 'Marker.gif';


function BilderWechsel(BildName,BildObjekt)
 {
  window.document.images[BildName].src = BildObjekt.src;
 }

// onMoveOver und -Out -funktionen

function MausDrauf(x,y)
  {
    if (OberschichtFeld(x,y) == 1)
      BilderWechsel(FeldNr(x,y)-1,Animated);
    aktuellesX = x;
    aktuellesY = y;
  }

function MausRaus(x,y)
  {
    RichtigesBildZeigen(x,y);
    aktuellesX = 0;
    aktuellesY = 0;
  }


// immer das richtige Bild in's richtige Feld..

function RichtigesBildZeigen(x,y)
  {
    switch (OberschichtFeld(x,y))
      {
        case 1: BilderWechsel(FeldNr(x,y)-1,Verdeckt); break;
        case 2: BilderWechsel(FeldNr(x,y)-1,Markierung); break;
        case 0: switch (UnterschichtFeld(x,y))
                  {
                    case 0: BilderWechsel(FeldNr(x,y)-1,Leer); break;
                    case 1: BilderWechsel(FeldNr(x,y)-1,leer1); break;
                    case 2: BilderWechsel(FeldNr(x,y)-1,leer2); break;
                    case 3: BilderWechsel(FeldNr(x,y)-1,leer3); break;
                    case 4: BilderWechsel(FeldNr(x,y)-1,leer4); break;
                    case 5: BilderWechsel(FeldNr(x,y)-1,leer5); break;
                    case 6: BilderWechsel(FeldNr(x,y)-1,leer6); break;
                    case 7: BilderWechsel(FeldNr(x,y)-1,leer7); break;
                    case 8: BilderWechsel(FeldNr(x,y)-1,leer8); break;
                    case 9: BilderWechsel(FeldNr(x,y)-1,Bombe); break;
                    default: break;
                  }
        default: break;
      }
  }


// ein Feld markieren ist einfach...

function Markieren(x,y)
  {
    switch (OberschichtFeld(x,y))
      {
        case 0: break;
        case 1: Oberschicht[FeldNr(x,y)] = 2; break;
        case 2: Oberschicht[FeldNr(x,y)] = 1; break;
        default: break;
      }
    RichtigesBildZeigen(x,y);
  }

// bei'm Öffnen tut sich schon mehr...

function Oeffnen(x,y)
  {
    switch (OberschichtFeld(x,y))
      {
        case 0: break;
        case 1: Oberschicht[FeldNr(x,y)] = 0;
                RichtigesBildZeigen(x,y);
                FehlendeFelder--
                if (UnterschichtFeld(x,y) == 0)   // bei ganz leerem Feld alle 8 umliegenden öffnen
                  {
                    if ((x > 1)  && (y > 1)  && (OberschichtFeld(x-1,y-1) == 1)) Oeffnen(x-1,y-1);
                    if ((x > 1)  &&             (OberschichtFeld(x-1,y)   == 1)) Oeffnen(x-1,y);
                    if ((x > 1)  && (y < 12) && (OberschichtFeld(x-1,y+1) == 1)) Oeffnen(x-1,y+1);
                    if (            (y > 1)  && (OberschichtFeld(x,y-1)   == 1)) Oeffnen(x,y-1);
                    if (            (y < 12) && (OberschichtFeld(x,y+1)   == 1)) Oeffnen(x,y+1);
                    if ((x < 12) && (y > 1)  && (OberschichtFeld(x+1,y-1) == 1)) Oeffnen(x+1,y-1);
                    if ((x < 12) &&             (OberschichtFeld(x+1,y)   == 1)) Oeffnen(x+1,y);
                    if ((x < 12) && (y < 12) && (OberschichtFeld(x+1,y+1) == 1)) Oeffnen(x+1,y+1);
                  }
                if (Unterschicht[FeldNr(x,y)] == 9)           // dann ist's Spiel natürlich aus!
                  {
                    alert('BOOM!! - ein Tritt daneben!');
                    Spielstart();
                  }
                if (FehlendeFelder == 0)                      // dann heisst's gewonnen!
                  {
                    alert('And the Winner is ...');
                    Spielstart();
                  }
                break;
        case 2: break;
        default: break;
      }
  }


//die Ereignisfunktion für den Klick...

function MausClick(ereignis)
  {
    if (aktuellesX != 0)   // nichts machen wenn Maus nicht über einem Spielfeld ist
      {
        if (ereignis.modifiers & Event.SHIFT_MASK) Oeffnen(aktuellesX,aktuellesY);
        else Markieren(aktuellesX,aktuellesY);
      }
    return false;
  }
