// Requires prototype.js

//========================================================================
// Even mighty prototype.js can't give me a simple way of finding the value of a radio button group
function getTerrainPct() {
    // Need parseInt() here because some values are not entirely numeric (e.g. "40ent")
    return parseInt($$("input.terrain").find(isChecked).value);
}

//========================================================================
function getTerrainLabel() {
    //    elt = $$("input.terrain").find(isChecked).nextSibling;
    //debugger;
    return $$("input.terrain").find(isChecked).nextSibling.nodeValue;
}

//========================================================================
function isChecked(elt) {
    return elt.checked;
}

//========================================================================
function isDefenderEntrenched() {
    return /ent$/.test($$("input.terrain").find(isChecked).value);
}

//========================================================================
function roll() {
    // Get variables
    var label =  $F("label");
    var attStr = parseInt($F("attModStr"));
    var defStr = parseInt($F("defModStr"));

    var attDice = parseInt($F("attNumDice"));
    var defDice = parseInt($F("defNumDice"));

    // Validation
    if (!attStr || !defStr) {
        alert("Please enter the attack and defense strengths (must be numbers > 0).");
        return;
    }
    if (!attDice || !defDice) {
        alert("Please enter the attack and defense # of dice to roll (must be numbers > 0).");
        return;
    }

    var attHits = rollDice(attDice);
    var defHits = rollDice(defDice);

    if (attHits > attStr)
        attHits = 0;
    if (defHits > defStr)
        defHits = 0;

    attHitsStr = "" + attHits;
    defHitsStr = "" + defHits;

    var adjDefHits = defHits;
    var winnerStr = "def";
    if (isDefenderEntrenched()) 
        adjDefHits *= 2;
    if (attHits > adjDefHits) {
        attHitsStr += " WINS!";
        winnerStr = "att";
    } else {
        defHitsStr += " WINS!";
    }

    $("attNumHits").value = attHitsStr;
    $("defNumHits").value = defHitsStr;

    label = label || " ";
    var fields = [ label ];
    fields.push($F("attStr"));
    fields.push(getTerrainLabel());
    fields.push(attStr);
    fields.push(attDice);
    fields.push(attHits);
    fields.push($F("defStr"));
    fields.push(defDice);
    fields.push(defHits);
    fields.push(winnerStr);
    $("log").update(fields.join("\t") + "<br>" + $("log").innerHTML);
}

//========================================================================
function rollDice(numDice) {
    var sum = 0;
    for (var i = 0; i < numDice; ++i) {
        sum += Math.floor(Math.random() * 6 + 1);
    }
    return sum;
}

//========================================================================
function recalc() {
    recalcFor("att");
    recalcFor("def");
    if ($F("attStr") && $F("defStr") && $F("attNumDice") && $F("defNumDice"))
        $("rollBtn").enable();
    else
        $("rollBtn").disable();
}

//========================================================================
function recalcFor(side) {   // side in ("att", "def")
    var str = parseInt($F(side + "Str"));

    if (str) {
        var modStr = str;
        modStr += 4; 
        if (side == "att") {
            modStr = Math.round(modStr - (modStr * (getTerrainPct() / 100)));
        }
        $(side + "ModStr" ).value = modStr;

        $(side + "ModStr" ).value = modStr;
        $(side + "Div3"   ).value = Math.floor(modStr / 3);
        $(side + "Div35"  ).value = Math.floor(modStr / 3.5);
        $(side + "Div4"   ).value = Math.floor(modStr / 4);
        // no need to erase numDice
    } else {
        $(side + "ModStr" ).value = "";
        $(side + "Div3"   ).value = "";
        $(side + "Div35"  ).value = "";
        $(side + "Div4"   ).value = "";
        $(side + "NumDice").value = "";
    }

    // delete hits no matter what
    $(side + "NumHits").value = "";
}

//========================================================================
function setDice(elt) {
    if (/^att/.test(elt.id)) {  // attacker?
        $("attNumDice").value = elt.value;
    } else { // defender
        $("defNumDice").value = elt.value;
    }
    recalc(); // apparently doesn't trigger xNumDice.onchange(), so handle it manually
}

