
    /////////////////////////////////////////////////////////////////////////
    ///      _       __       __        __  __                         __
    ///     | |     / /___   / /_       \ \/ /____ _ ____ ___   _____ / /
    ///     | | /| / // _ \ / __ \ ______\  // __ `// __ `__ \ / ___// /
    ///     | |/ |/ //  __// /_/ //_____// // /_/ // / / / / /(__  )/_/
    ///     |__/|__/ \___//_.___/       /_/ \__,_//_/ /_/ /_//____/(_)
    ///
    ///
    ///   Programmierung: Volker Gringmuth <vgringmuth@gmx.net>
    ///
    ///   Alle Rechte vorbehalten
    ///
    ///   Version 2.7  12.05.2008
    ///
    /////////////////////////////////////////////////////////////////////////

//  globale Konstanten

var rotfeld        = document.createElement('td'); rotfeld.style.backgroundColor = 'red';
var gelbfeld       = document.createElement('td'); gelbfeld.style.backgroundColor = '#ffeeb3';
var farblosfeld    = document.createElement('td'); farblosfeld.style.backgroundColor = '';
var schwarzwuerfel = new Image(); schwarzwuerfel.style.borderColor = 'black';
var rotwuerfel     = new Image(); rotwuerfel.style.borderColor = 'red';
var spalten        = 'nduo';
var felder         = '12345689abc';

var test = 0;                                  // 1 -> sofortiges Spielende; !1 -> Normaler Betrieb

//  globale Variablen

var obligefeld = '';                           // speichert die ID des angesagten Feldes;

function laeuft() {
//  gibt 'true' zurueck, wenn ein Wuerfelvorgang laeuft
  var test = false; 
  var testbild = new Image(); testbild.src = 'images/w.png';
  for ( var i=1 ; i <= 5 ; i++ ) { if ( document.getElementById('w'+i).src == testbild.src ) { test = true; break; } }
  return(test);
}

function farbwechsel(was,wie) {
//  aendert die Hintergrundfarbe von Tabellenzellen anhand der ID
  document.getElementById(was).style.backgroundColor = wie;
}

function wurfanzahl(aktion) {
//  aktion=0 : gibt die aktuelle Wurfanzahl zurueck (nur auslesen)
//  aktion=1 : erhoeht die Wurfanzahl um 1
//  aktion=2 : setzt Wurfanzahl auf 0
  with ( document.getElementById('wurfanzahl').firstChild ) {
    var anzahlpruefen = parseInt ( nodeValue );
    if ( aktion == 1 ) { nodeValue = anzahlpruefen+1; }
    if ( aktion == 2 ) { nodeValue = 0; }
  }
  return(anzahlpruefen);
}

function wuerfeln() {
//  Pruefen, ob noch ein Wuerfelvorgang laeuft
  if ( laeuft() ) { return(0); }
//  Pruefen, ob nur noch Oblige-Spalte frei;
//  wenn ja, nach dem 1. Wurf Warnung ausgeben
  if ( wurfanzahl(0) == 1 ) {
    var voll = true;
    if ( document.getElementById('n1').style.backgroundColor != gelbfeld.style.backgroundColor ) { voll = false; }
    if ( document.getElementById('d1').style.backgroundColor != gelbfeld.style.backgroundColor ) { voll = false; }
    if ( document.getElementById('u1').style.backgroundColor != gelbfeld.style.backgroundColor ) { voll = false; }
    if ( voll && document.getElementById('ansage').style.backgroundColor != rotfeld.style.backgroundColor ) {
      alert ( 'Achtung: Nur noch Oblige-Felder frei!\nDieser Wurf muss jetzt angesagt werden!' );
      return(0);
    }
  }
//  Feststellen, ob noch ein Wurf erlaubt ist
//  anschliessend neue Anzahl eintragen
  if ( wurfanzahl(0) == 3 ) {
    alert ( 'Das war schon der dritte Wurf.\nJetzt muss etwas eingetragen werden!' );
    return(0);
  }
//  Wurfanzahl heraufsetzen
  wurfanzahl(1);
//  Wuerfelvorgang
  wuerfelunscharf();
  setTimeout('neuwuerfeln()',500);
}

function wuerfelunscharf() {
  for ( var i=1 ; i <= 5 ; i++ ) {
    with ( document.getElementById('w'+i) ) {
      if ( style.borderColor == schwarzwuerfel.style.borderColor ) { src = 'images/w.png'; }
    }
  }
}

function neuwuerfeln() {
  var zufall;
  for ( var i=1 ; i <= 5 ; i++ ) {
    with ( document.getElementById('w'+i) ) {
      if ( style.borderColor == schwarzwuerfel.style.borderColor ) {
        do { zufall = (Math.floor(Math.random()*6)) + 1; } while ( zufall < 1 || zufall > 6 );  // nur so zur Sicherheit :)
        src = 'images/'+zufall+'.png';
      }
    }
  }
  
// Oblige sofort eintragen, sofern dies der 3. Wurf war
  if ( wurfanzahl(0) == 3 && obligefeld != '' ) { 
    eintragen(obligefeld); return(0);
  }
}

function augenzahl(wuerfelid) {
//  Augenzahl eines bestimmten Wuerfels feststellen
//  ID des Wuerfels wird als Parameter uebergeben (w1, w2 ...)
  var dateiname = document.getElementById(wuerfelid).src;
  return(parseInt(dateiname.charAt(dateiname.length-5)));
}

function fixieren(wuerfel) {
//  Pruefen, ob schon gewuerfelt wurde
  if ( document.getElementById('wurfanzahl').firstChild.nodeValue == '0' ) { 
    alert( 'Bitte erst mal w\u00fcrfeln ...' ); return(0); 
  }
//  Pruefen, ob noch ein Wuerfelvorgang laeuft
  if ( laeuft() ) { return(0); }
//  Rahmenfarbe aendern
  var bildneu = new Image();
  with ( document.getElementById(wuerfel).style ) {
    if ( borderColor ==     rotwuerfel.style.borderColor ) { bildneu.style.borderColor = schwarzwuerfel.style.borderColor; }
    if ( borderColor == schwarzwuerfel.style.borderColor ) { bildneu.style.borderColor =     rotwuerfel.style.borderColor; }
    borderColor = bildneu.style.borderColor;
  }
}

function eintragen(feld) {
//  Pruefen, ob schon gewuerfelt wurde
  if ( wurfanzahl(0) == 0 ) { alert ( 'Bitte erst mal w\u00fcrfeln ...' ); return(0); }
//  Pruefen, ob gerade gewuerfelt wird
  if ( laeuft() ) { return(0); }
//  Pruefen, ob bei angesagtem Oblige das richtige Feld angeklickt wurde
  if ( obligefeld != '' && obligefeld != feld ) { 
    alert ( 'Achtung: Oblige ist angesagt!\nErgebnis wird im angesagten Feld eingetragen' ); 
    feld = obligefeld;
  }
//  Feldinhalt auslesen
  var feldinhalt = document.getElementById(feld).firstChild.nodeValue;
//  Feld schon besetzt?
  if ( feldinhalt != '~' ) { alert ( 'Feld schon besetzt!' ); return(0); }

//  A B W AE R T S  ///////////////////////////////////////////////////////

  if ( feld.charAt(0) == 'd' && feld.charAt(1) > '1' ) {
// Pruefen, ob das darueberliegende Feld schon ausgefuellt ist
    var felddrueber = 'd' + felder.charAt ( felder.indexOf(feld.charAt(1)) - 1 );
    if ( document.getElementById(felddrueber).firstChild.nodeValue == '~' ) {
      alert ( 'Dieses Feld ist noch nicht an der Reihe!' );
      return(0);
    }
  }

//  A U F W AE R T S  /////////////////////////////////////////////////////

  if ( feld.charAt(0) == 'u' && feld.charAt(1) < 'c' ) {
// Pruefen, ob das darunterliegende Feld schon ausgefuellt ist
    var felddrunter = 'u' + felder.charAt ( felder.indexOf(feld.charAt(1)) + 1 );
    if ( document.getElementById(felddrunter).firstChild.nodeValue == '~' ) {
      alert ( 'Dieses Feld ist noch nicht an der Reihe!' );
      return(0);
    }
  }

//  O B L I G E  /////////////////////////////////////////////////////////

  if ( feld.charAt(0) == 'o' ) {
    if ( document.getElementById('ansage').style.backgroundColor != rotfeld.style.backgroundColor ) {
      // noch nichts angesagt
      if ( wurfanzahl(0) == 1 ) {
        // Erster Wurf - Ansage eintragen
        farbwechsel('ansage',rotfeld.style.backgroundColor);
        farbwechsel(feld,rotfeld.style.backgroundColor);
        obligefeld = feld;
        return(0);
      }
      else { alert ( 'Zu sp\u00e4t \u2013 Oblige muss nach dem 1. Wurf angesagt werden!' ); return(0); }
    }
    else {
      // Feldfarben zuruecksetzen
      farbwechsel('ansage',farblosfeld.style.backgroundColor);
      farbwechsel(feld,farblosfeld.style.backgroundColor);
      obligefeld = '';
    }
  }
//  Wurf auswerten und eintragen
  var erfolg = 0;
  switch ( feld.charAt(1)) {
    case '1': erfolg = augen(1);break;
    case '2': erfolg = augen(2);break;
    case '3': erfolg = augen(3);break;
    case '4': erfolg = augen(4);break;
    case '5': erfolg = augen(5);break;
    case '6': erfolg = augen(6);break;
    case '8': erfolg = full();break;
    case '9': erfolg = strasse();break;
    case 'a': erfolg = minimum(feld.charAt(0));break;
    case 'b': erfolg = maximum(feld.charAt(0));break;
    case 'c': erfolg = yams();break;
  }
  document.getElementById(feld).firstChild.nodeValue = erfolg;
// Im Testbetrieb jetzt abbrechen
  if ( test == 1 ) { spielende(); }
//  Pruefen, ob Spalte voll ist
  spaltevoll(feld.charAt(0));
//  Alle Wuerfel wieder loesen
  for ( var i = 1 ; i <= 5 ; i++ ) { document.getElementById('w'+i).style.borderColor = schwarzwuerfel.style.borderColor; }
//  Wurfanzahl zuruecksetzen
  wurfanzahl(2);
}

function spaltevoll(spalte) {
//  Spalte voll?
  var voll = true; var feldaktuell;
  for ( var i=0 ; i <= 10; i++ ) {
    feldaktuell = spalte + felder.charAt(i);
    if ( document.getElementById(feldaktuell).firstChild.nodeValue == '~' ) { voll = false; break; }
  }
  if ( voll ) {
//  Spalte gelb machen und Summe berechnen
    for ( var i=0 ; i <= 10; i++ ) {
      feldaktuell = spalte + felder.charAt(i);
      farbwechsel(feldaktuell,gelbfeld.style.backgroundColor);
    }
    summe(spalte);
  }
  else { return(0) }
//  Alle Spalten voll?
  voll = true;
  for ( var i=0 ; i <= 3 ; i++ ) {
//  Oberstes Feld jeder Spalte pruefen
    if ( document.getElementById(spalten.charAt(i)+'1').style.backgroundColor != gelbfeld.style.backgroundColor ) { voll = false; break; }
  }
  if ( voll ) { spielende(); }
}

function augen(zahl) {
//  Ermittelt den Wert in den Zeilen 1-6
  var wertung = parseInt(ergebnisfeststellen().charAt(zahl)) * zahl;
  return (wertung);
}

function full() {
  var ergebnis = ergebnisfeststellen();
  if ( ergebnis.match(/[145]/) ) { var wertung = 0; } // kein Full
  else { var wertung = ergebnis.indexOf('2')*2 + ergebnis.indexOf('3')*3 + 20; }
  return(wertung);
}

function strasse() {
  var wertung = 0;
  switch ( ergebnisfeststellen() ) {
    case '9111110' : wertung = 45;break;
    case '9011111' : wertung = 50;break;
  }
  return(wertung);
}

function minimum(spalte) {
  var ergebnis = ergebnisfeststellen(); var wertung = 0;
  for ( var i=1 ; i<=6 ; i++ ) { wertung += ergebnis.charAt(i)*i; }
  var maximum = document.getElementById(spalte+'b').firstChild.nodeValue;
  if ( maximum != '~' && parseInt(maximum) <= wertung ) { wertung = 0; } // Maximum gleich oder kleiner
  return(wertung);
}

function maximum(spalte) {
  var ergebnis = ergebnisfeststellen(); var wertung = 0;
  for ( var i=1 ; i<=6 ; i++ ) { wertung += ergebnis.charAt(i)*i; }
  var minimum = document.getElementById(spalte+'a').firstChild.nodeValue;
  if ( minimum != '~' && parseInt(minimum) >= wertung ) { wertung = 0; } // Minimum gleich oder groesser
  return(wertung);
}

function yams() {
  var wertung = 0;
  var stelle = ergebnisfeststellen().indexOf('5');
  if ( stelle != -1 ) { wertung = 5*stelle + 40; }
  return(wertung);
}

function ergebnisfeststellen() {
//  Das Wuerfelergebnis wird in einer siebenstelligen Dezimalzahl gespeichert.
//  Stelle 0 (die vorderste) ist immer 9, um fuehrende Nullen zu verhindern, und wird nicht beachtet.
//  Stellen 1..6 stehen fuer die Anzahl der jeweiligen Augenzahl im Wurf.
//  Die Zahl wird als siebenstelliger String zurueckgegeben.
  var ergebnis = 9000000;
  for ( var i=1 ; i <= 5 ; i++ ) { ergebnis += Math.pow(10,6-augenzahl('w'+i)); }
  return(String(ergebnis));
}

function zwsumme(spalte) {
//  Ermittelt die Zwischensumme von 1..6 und addiert ggfs. den Bonus
  var summe = 0; var feldinhalt;
  for ( var i=1 ; i <= 6 ; i++ ) {
    feldinhalt = document.getElementById(spalte+i).firstChild.nodeValue;
    if ( feldinhalt == '~' ) { feldinhalt = '0'; }
    summe += parseInt(feldinhalt);
  }
  if ( summe >= 60 ) { summe += 20; } // Bonus
  document.getElementById(spalte+'7').firstChild.nodeValue = summe;
}

function summe(spalte) {
//  Ermittelt die Spaltensumme von der Zwischensumme an
//  Sicherheitshalber wird erst die Zwischensumme ermittelt
//  Das Ergebnis wird sowohl ins Spielfeld geschrieben als auch zurueckgegeben
  var summe = 0; var feldinhalt;
  zwsumme(spalte); // erst Zwischensumme berechnen
  for ( var i=7 ; i <= 12 ; i++ ) {
    feldinhalt = document.getElementById(spalte+i.toString(16)).firstChild.nodeValue;
    if ( feldinhalt == '~' ) { feldinhalt = '0'; }
    summe += parseInt(feldinhalt);
  }
  document.getElementById(spalte+'d').firstChild.nodeValue = summe;
  return(summe);
}

function gesamtsumme() {
//  Ermittelt die gesamte Punktzahl. Dafuer werden die Spaltensummen
//  nacheinander aufgerufen (dabei auch neu berechnet) und addiert.
//  Das Ergebnis wird ins Spielfeld geschrieben und zurueckgegeben.
  var gesamt = 0;
  for ( var i=0 ; i <= 3 ; i++ ) { gesamt += summe(spalten.charAt(i)); }
  document.getElementById('gesamtsumme').firstChild.nodeValue = gesamt;
  document.getElementById('gesamtsummenfeld').value = gesamt;
  return(gesamt);
}

function ansagezuruecknehmen() {
  if ( document.getElementById('ansage').style.backgroundColor == farblosfeld.style.backgroundColor ) { return(0); }
  var wurfzahl = wurfanzahl(0);
  if ( wurfzahl == 0 ) { return(0); }
  if ( wurfzahl > 1 ) { alert ( 'Die Oblige-Ansage kann nicht mehr zur\u00fcckgenommen werden!' ); return(0); }
  farbwechsel('ansage',farblosfeld.style.backgroundColor);
  farbwechsel(obligefeld,farblosfeld.style.backgroundColor);
  obligefeld = '';
}

function spielereintragen() {
  if ( document.getElementById('spielername').firstChild.nodeValue == "~" ) { 
    var name;
    var fehler;
    do {
      fehler = 0;
      name = '' + prompt('Spielername eingeben:','');
      if ( name.match (/^\s*$/) ) { fehler += 1; }
      if ( name.match(/%/) ) { alert ( 'Das Zeichen % ist im Namen nicht erlaubt!' ); fehler += 2; }
      if ( name.length > 25 ) { alert ( "Name zu lang (25 Zeichen sollten reichen)!" ); fehler += 4; }
    } while ( fehler > 0 );
    document.title = 'Yams! - '+name;
    document.getElementById('spielername').firstChild.nodeValue = name;
  }
  document.getElementById('spielernamenfeld').value = document.getElementById('spielername').firstChild.nodeValue;
}

function spielende() {
  var ergebnis = gesamtsumme();
  var mitteilung = 'Spiel mit glorreichen '+ergebnis+' Punkten abgeschlossen.\nIn die Bestenliste eintragen?';
  document.getElementById('spiel').style.display = 'none';
  document.getElementById('ende' ).style.display = 'block';
  if ( confirm ( mitteilung ) ) {
//  In Bestenliste eintragen
    var felder  = '123456789abcd';
    var transferstring = '%'+document.getElementById('gesamtsumme').firstChild.nodeValue+'%z%';
    for ( var i = 0 ; i <= 12 ; i++ ) {
      for ( var j = 0 ; j <= 3 ; j++ ) {
        var position = spalten.charAt(j)+felder.charAt(i);
        transferstring = transferstring + document.getElementById(position).firstChild.nodeValue + '%';
      }
      transferstring += 'z%';
    }
    document.getElementById('feldertransfer').value = transferstring;
    document.eintragformular.submit();
  }
}

function neustart() {
//  Felder zuruecksetzen
  var felder = '123456789abcd';
  for ( var i=0 ; i <= 3 ; i++ ) {
    for ( var j=0 ; j <= 12 ; j++ ) {
      with ( document.getElementById(spalten.charAt(i)+felder.charAt(j)) ) {
        firstChild.nodeValue = '~';
        if ( j != 6 && j != 12 ) { style.backgroundColor = farblosfeld.style.backgroundColor; }
      }
    }
  }
  document.getElementById('gesamtsumme').firstChild.nodeValue = '0';
//  Wuerfel auf Startbild
  for ( var i=1 ; i <= 5 ; i++ ) { document.getElementById('w'+i).src = 'images/0.png'; }
  wurfanzahl(2);
  document.getElementById('spiel').style.display = 'block';
  document.getElementById('ende' ).style.display = 'none';
  document.getElementById('eintragbutton').style.visibility = 'visible';
}

