var diceWhite  = ['white',  ['10', '20', '30', '40', '50', '60']];
var diceRed    = ['red',    ['00', '10', '10', '20', '20', '30']];
var diceGreen  = ['green',  ['0', '0', '1', '1', '1', '2']];
var diceYellow = ['yellowD', ['0', '0', '1', '1', '1', '2']];

var putGreen   = [diceGreen,  diceGreen];
var putYellow  = [diceYellow, diceYellow];

var max_field = 380;

var dots = [
  [0, 'start',   265, 100],
  [50, 'semi',   212, 141],
  [60, 'semi',   245, 190],
  [70, 'semi',   218, 230],
  [80, 'rough',  226, 320],
  [90, 'water',  167, 224, 187, 177],
  [100, 'fair',  160, 321],
  [110, 'fair',  101, 328],
  [120, 'fair',  87, 383],
  [130, 'rough', 179, 424],
  [140, 'rough', 25, 422],
  [150, 'fair',  57, 451],
  [160, 'fair',  90, 485],
  [170, 'fair',  42, 509],
  [180, 'fair',  86, 531],
  [190, 'fair',  51, 571],
  [200, 'sand',  26, 614],
  [210, 'na',    103, 590],
  [220, 'na2',   192, 624, 157, 618],
  [230, 'fair',  129, 641],
  [240, 'rough', 9, 663],
  [250, 'fair',  85, 658],
  [260, 'fair',  65, 687],
  [270, 'sand',  144, 679],
  [280, 'sand',  117, 699],
  [290, 'rough', 40, 723],
  [300, 'green', 113, 749],
  [310, 'green', 184, 711],
  [320, 'green2', 155, 735],
  [330, 'green2', 156, 781],
  [340, 'green', 179, 802],
  [350, 'semi',  225, 784],
  [360, 'fair',  202, 822],
  [370, 'rough',  259, 784],
  [380, 'rough', 233, 845]    
];

var bats = [
  ['Driver',  [diceWhite, diceWhite, diceWhite, diceWhite, diceWhite, diceWhite]],
  ['Holz 3',  [diceRed,   diceWhite, diceWhite, diceWhite, diceWhite, diceWhite]],
  ['Holz 5',  [diceWhite, diceWhite, diceWhite, diceWhite, diceWhite]],
  ['Eisen 5', [diceRed,   diceWhite, diceWhite, diceWhite, diceWhite]],
  ['Eisen 6', [diceWhite, diceWhite, diceWhite, diceWhite]],
  ['Eisen 7', [diceRed,   diceWhite, diceWhite, diceWhite]],
  ['Eisen 8', [diceWhite, diceWhite, diceWhite]],
  ['Eisen 9', [diceRed,   diceWhite, diceWhite]],
  ['P-Wedge', [diceWhite, diceWhite]],
  ['S-Wedge', [diceRed,   diceWhite]],
  ['L-Wedge', [diceRed,   diceRed]],
  ['Chipper', [diceRed]]
];

function getObject(id) {
  return document.layers ? document.layers[id] : document.all? document.all[id] : document.getElementById ? document.getElementById(id) : null;
}

function slideIt(obj, x, y){
  slideIt.obj = obj.style; 
  if(slideIt.obj){
    slideIt.running = true;
    slideIt.x = parseInt(slideIt.obj.left);
    slideIt.y = parseInt(slideIt.obj.top);
    var diffX = x-slideIt.x;
    var diffY = y-slideIt.y;
    if (Math.abs(diffX) > Math.abs(diffY)) {
      slideIt.addX = Math.abs(diffX)/diffX;
      slideIt.addY = diffY/diffX;
    }
    else {
      slideIt.addX = diffX/diffY;
      slideIt.addY = Math.abs(diffY)/diffY;
    }
    if (slideIt.x > x && slideIt.addX > 0) slideIt.addX = slideIt.addX * -1;
    if (x > slideIt.x && slideIt.addX < 0) slideIt.addX = slideIt.addX * -1;
    if (slideIt.y > y && slideIt.addY > 0) slideIt.addY = slideIt.addY * -1;
    if (y > slideIt.y && slideIt.addY < 0) slideIt.addY = slideIt.addY * -1;
    slideIt.targetX = x;
    slideIt.targetY = y;
    slideIt.speed = 2;
    slideIt.doit();
  }
}

slideIt.px = document.layers ? '' : 'px';

slideIt.doit = function() {
  slideIt.x = slideIt.x + slideIt.addX*slideIt.speed;
  slideIt.y = slideIt.y + slideIt.addY*slideIt.speed;
  slideIt.obj.left = slideIt.x + slideIt.px;
  slideIt.obj.top  = slideIt.y + slideIt.px;

  var cont = false;
  if (slideIt.addX > 0 && slideIt.x < slideIt.targetX) cont = true;
  if (slideIt.addX < 0 && slideIt.x > slideIt.targetX) cont = true;
  if (cont && slideIt.addY > 0 && slideIt.y < slideIt.targetY) cont = true;
  if (cont && slideIt.addY < 0 && slideIt.y > slideIt.targetY) cont = true;
  if(cont) {      
    setTimeout("slideIt.doit()", 5);
  }
  else {
    slideIt.running = false;
    slideIt.obj.left = slideIt.targetX;
    slideIt.obj.top = slideIt.targetY;
    batCallBack();
  }
}

function moveIt(id, x, y, anim, absol) {
  var obj = getObject(id);    
  if (obj != null) {
    var oldTop = parseInt(obj.style.top);
    var oldLeft = parseInt(obj.style.left);
    if (!anim) {
      if (absol) {
        obj.style.top = y + slideIt.px;
        obj.style.left = x + slideIt.px;
      }
      else {
        obj.style.top = (oldTop + y) + slideIt.px;
        obj.style.left = (oldLeft + x) + slideIt.px;
      }
    }
    else {
      if (absol) {
        slideIt(obj, x, y);
      }
      else {
        slideIt(obj, x - oldLeft, y - oldTop);
      }        
    }
  }
  else {
    alert('mIt: null');
  }
}

function showIt(id) {
  var obj = getObject(id);    
  if (obj != null) {
    obj.style.display = 'block';
  }
  else {
    alert('sIt: null');
  }
}

function hideIt(id) {
  var obj = getObject(id);
  if (obj != null) {
    obj.style.display = 'none';
  }
  else {
    alert('hIt: null');
  }
}

function enableIt(id) {
  var obj = getObject(id);
  if (obj != null) {
    obj.disabled = false;
  }
  else {
    alert('eIt: null');
  }
}

function disableIt(id) {      
  var obj = getObject(id);
  if (obj != null) {
    obj.disabled = true;
  }
  else {
    alert('dIt: null');
  }
}

function dice(possibilities) {
  var max = possibilities.length;
  var r = Math.floor(Math.random()*max);
  return possibilities[r];
}

function fillBatBox() {
  var obj = getObject('batbox');
  if (obj != null) {
    for (var i=0; i<bats.length; i++) {
      var doAdd = true;
      if (bats[i][0] == 'Driver') {
          doAdd = dots[currentDot][0] == 0;
      }
      if (dots[currentDot][1] == 'sand') {
          doAdd = bats[i][1].length < 4;
      }
      if (roughPoints > -1) {
          doAdd = bats[i][1].length <= roughPoints;
      }
      if (doAdd) {
          var elOptNew = document.createElement('option');
          elOptNew.text = bats[i][0];
          elOptNew.value = i;
          try {
            obj.add(elOptNew, null);
          }
          catch(ex) {
            obj.add(elOptNew); // IE only
          }
       }
    }
  }
  roughPoints = -1;
}

function clearSelect(id) {
  var obj = getObject(id);
  if (obj != null) obj.length = 0;
}

function currentX() {
    return parseInt(slideIt.obj.left);
}

function currentY() {
    return parseInt(slideIt.obj.top);
}

function autoRunCallback() {
  var cd = dots[autoRunIndex];
  if (cd[1] == 'water' || cd[1] == 'na2') {
    if (currentX() == cd[5] && currentY() == cd[4]) {
      autoRunIndex++;
      autoRun();
    }
    else {
      moveIt('figure1', cd[5], cd[4], true, true);
    }
  }
  else {
    autoRunIndex++;
    autoRun();
  }
}

var autoRunIndex = 1;
var autoRunEnd = dots.length;

function autoRun() {
  if (autoRunIndex<autoRunEnd) {
    moveIt('figure1', dots[autoRunIndex][3], dots[autoRunIndex][2], true, true);
  }
}


var currentDot = 0;
var batsDone = 0;
var roughPoints = -1;
var lastDot = null;
var roughBack = false;
var putDices = null;
var movedback = false;

  function startGame() {
      putDices = null;
      roughBack = false;
      lastDot = null;
      roughPoints = -1;
      currentDot = 0;
      batsDone = 0;
      hideIt('startButton');
      showIt('figure1');
      moveIt('figure1', dots[0][3], dots[0][2], false, true);
      showIt('restartButton');
      clearSelect('batbox');
      fillBatBox();
      showIt('batsdiv');
      showIt('scorediv');
      var div = getObject('dicediv');
      div.innerHTML = '';
      showIt('dicediv');
      enableIt('batbtn');
      enableIt('batbox');
      hideIt('roughdice');
      hideIt('putdice');
      updateScore();
  }

  function restartGame() {
      alert('Alles wird zurückgesetzt und das Spiel beginnt von vorne!');
      startGame();
  }

  function userDoBat() {
      disableIt('batbtn');
      disableIt('batbox');
      batsDone++;
      updateScore();
      var div = getObject('dicediv');
      div.innerHTML = '';
      var points = 0;
      var sel = getObject('batbox');
      if (sel != null) {
        if (sel.selectedIndex > -1) {
          var bat = bats[sel.options[sel.selectedIndex].value][1];
          for (var i=0; i<bat.length; i++) {
            var dpoint = parseInt(dice(bat[i][1]));
            points = points + dpoint;
            div.innerHTML = div.innerHTML + '<div class="dice ' + bat[i][0] + '">' + dpoint + '</div>';
          };
          div.innerHTML = div.innerHTML + '<div class="points">= ' + points + ' m!</div>';
        }
      }
      var newDot = findDot(points);
      if (newDot < 0) {
          alert('Leider ist ihr Ball im AUS gelandet - Sie erhalten einen Strafschlag!\n\nSie dürfen nochmal von der jetztigen Position abschlagen.');
          updateScore();
          alert('Bitte ihr nächster Schlag!');
          enableIt('batbtn');
          enableIt('batbox');
      }
      else {
          lastDot = currentDot;
          currentDot = newDot;
          alert('Sie haben ' + points + ' Meter gewürfelt! Schauen Sie wo sie jetzt stehen...');
          moveIt('figure1', dots[currentDot][3], dots[currentDot][2], true, true);
      }
  }

  function batCallBack() {
      if (roughBack) {
          roughBack = false;
          currentDot = lastDot;
          clearSelect('batbox');
          fillBatBox();
          alert('Bitte ihr nächster Schlag!');
          enableIt('batbtn');
          enableIt('batbox');
          showIt('batsdiv');
      }
      else {
          var dt = dots[currentDot];
          var cd = dt[1];
          var cont = true;
          if (cd == 'semi' || cd == 'fair') {
              alert('Das war ein guter Schlag. Sie können ungehindert weiterspielen!');
          }
          if (cd == 'sand') {
              alert('Leider ist ihr Ball im Bunker gelandet!\n\nFür ihren nächsten Schlag dürfen Sie nur Schläger wählen,\ndie aus max. 3 Würfeln bestehen.');
          }
          if (cd == 'water') {
              if (!movedback) {
                  alert('Leider ist ihr Ball im Wasser gelandet - Sie erhalten einen Strafschlag!');
                  moveIt('figure1', dt[5], dt[4], true, true);
                  cont = false;
                  batsDone++;
                  movedback = true;
              }
          }
          if (cd == 'na') {
              alert('Leider ist ihr Ball unspielbar - Sie erhalten einen Strafschlag!');
              batsDone++;
              updateScore();
          }
          if (cd == 'na2') {
              if (!movedback) {
                  alert('Leider ist ihr Ball unspielbar - Sie erhalten einen Strafschlag!');
                  moveIt('figure1', dt[5], dt[4], true, true);
                  cont = false;
                  batsDone++;
                  updateScore();
                  movedback = true;
              }
          }
          if (cd == 'green' || cd == 'green2') {
              doPutting();
              cont = false;
          }
          if (cd == 'rough') {
              hideIt('batsdiv');
              showIt('roughdice');
              alert('Leider ist ihr Ball im Rough gelandet!\n\nSie müssen ihren Ball suchen. Würfeln Sie dazu\nbitte mit einem weißen Würfel.');
          }
          else {
              hideIt('dicediv');
              if (cont) {
                  clearSelect('batbox');
                  fillBatBox();
                  alert('Bitte ihr nächster Schlag!');
                  enableIt('batbtn');
                  enableIt('batbox');
                  movedback = false;
              }
          }
      }
  }

  function findDot(p) {
      var cPoints = dots[currentDot][0];
      var sum = cPoints < 330 ? 1 : -1;
      sum = sum * p + cPoints;
      for (var i=0; i<dots.length; i++) {
          if (dots[i][0] == sum) return i;
      }
      return -1;
  }

  function updateScore() {
      var sDiv = getObject('scorediv');
      if (sDiv != null) {
          sDiv.innerHTML = '<hr/><div id="scoretxt">Aktueller Score: ' + batsDone + '</div>';
      }
      else {
          alert('sdiv: null');
      }
  }

  function doRoughTest() {
      alert('Leider ist ihr Ball im Rough gelandet!\n\nSie müssen ihren Ball suchen. Würfeln Sie dazu\nbitte mit einem weißen Würfel.');
      hideIt('batsdiv');
      showIt('roughdice');
  }

  function userDoRoughDice() {
      var div = getObject('roughdicediv');
      div.innerHTML = '&nbsp;';
      var points = parseInt(dice(diceWhite[1]));
      div.innerHTML = div.innerHTML + '<div class="dice ' + diceWhite[0] + '">' + points + '</div>';
      if (points == 10) {
          alert('Leider haben Sie ihren Ball nicht gefunden!\n\nSie erhalten einen Strafschlag und müssen nochmal\nvon der ursprünglichen Stelle spielen!');
          batsDone++;
          updateScore();
          div.innerHTML = ' ';
          hideIt('roughdice');
          roughBack = true;
          moveIt('figure1', dots[lastDot][3], dots[lastDot][2], true, true);
      }
      else {
          roughPoints = (points/10);
          alert('Glückwunsch! Sie haben ihren Ball gefunden!\n\nSie dürfen mit ' + roughPoints + ' Würfeln weiterspielen.');
          div.innerHTML = '&nbsp;';
          clearSelect('batbox');
          fillBatBox();
          alert('Bitte ihr nächster Schlag!');
          enableIt('batbtn');
          enableIt('batbox');
          hideIt('roughdice');
          showIt('batsdiv');
          
      }
  }

  function userDoPutDice() {
      var div = getObject('putdicediv');
      div.innerHTML = '';
      var points = 0;
      for (var i=0; i<putDices.length; i++) {
        var dpoint = parseInt(dice(putDices[i][1]));
        points = points + dpoint;
        div.innerHTML = div.innerHTML + '<div class="dice ' + putDices[i][0] + '">' + dpoint + '</div>';
      };
      div.innerHTML = div.innerHTML + '<div class="points smallFont">= ' + points + ' Schläge benötigt zum einlochen!</div>';
      batsDone = batsDone + points;
      updateScore();
      alert('Herzlichen Glückwunsch!\n\nSie haben das Spiel mit ' + batsDone + ' Schlägen erfolgreich beendet!\n\nZum Neustart bitte Button anklicken.');
      hideIt('batsdiv');
      hideIt('roughdice');
      hideIt('putdice');
  }

  function doPutting() {
      var div = getObject('putdicediv');
      div.innerHTML = '';
      var dt = dots[currentDot];
      var cd = dt[1];
      if (cd == 'green') {
          alert('Sie befinden sich im äußeren Green Bereich!\n\nBitte putten Sie mit 2 grünen Würfeln.');
          putDices = putGreen;
      }
      if (cd == 'green2') {
          alert('Sie befinden sich im inneren Green Bereich!\n\nBitte putten Sie mit 2 gelben Würfeln.');
          putDices = putYellow;
      }
      hideIt('batsdiv');
      showIt('putdice');
  }

