function getHighestRow() {
    var i = 1;
    while (document.getElementById('row' + i) !== null) {
        ++i;
    }
    return i - 1;
}
function deleteARow() {
    let row = parseInt(this.id.substring(6));
    document.getElementById('row' + row).remove();
    // Adjust row numbers
    let allRows = document.querySelectorAll('#dataTable tr');
    let rowIndex = 1;
    let firstTime = true;
    for (let row of allRows) {
        if (firstTime) {
            firstTime = false;
            continue;
        }
        row.id = 'row' + rowIndex;
        row.querySelector('.expected').id = 'expected' + rowIndex;
        row.querySelector('.actual').id = 'actual' + rowIndex;
        row.querySelector('.delete').id = 'delete' + rowIndex;
        ++rowIndex;
    };
    // Hide delete buttons if necessary
    if (getHighestRow() <= 2) {
        for (let deleteButtons of document.querySelectorAll('.delete')) {
            deleteButtons.style.display = 'none';
        }
    }
}
document.addEventListener('DOMContentLoaded', event => {
    document.getElementById('addRowButton').onclick = function() {
        var i = getHighestRow() + 1;
        var row = document.createElement('tr');
        row.id = 'row' + i;
        var expected = document.createElement('td');
        expected.innerHTML = '';
        row.appendChild(expected);
        var actual = document.createElement('td');
        actual.innerHTML = '';
        row.appendChild(actual);
        var deleteButton = document.createElement('td');
        deleteButton.innerHTML = '';
        deleteButton.querySelector('.delete').onclick = deleteARow;
        row.appendChild(deleteButton);
        document.getElementById('dataTable').appendChild(row);
        for (let deleteButton of document.querySelectorAll('.delete')) {
            deleteButton.style.display = 'inline';
        }
    };
    for (let deleteButton of document.querySelectorAll('.delete')) {
        deleteButton.onclick = deleteARow;
    }
    document.getElementById('doBinomial').onclick = function() {
        let percentages = [];
        let nums = [];
        let i = 1;
        while (document.getElementById('expected' + i) !== null) {
            percentages.push(parseFloat(document.getElementById('expected' + i).value));
            nums.push(parseFloat(document.getElementById('actual' + i).value));
            ++i;
        }
        var total = 0.0;
        for (let p of percentages) {
            total += p;
        }
        var factor = 100.0/total;
        percentages = percentages.map(p => factor * p);
        fetch(statScriptName + '?percentages=' + percentages.join(',') + '&nums=' + nums.join(','))
            .then(response => response.json())
            .then(doBinomialSuccess)
            .catch(doBinomialError);
    }
});
function doBinomialSuccess(data) {
    let prob = parseFloat(data['prob']);
    let html, dataClass;
    if (prob < 0.05) {
        html = 'Yes';
        dataClass = 'sig';
    } else {
        html = 'No';
        dataClass = 'notSig';
    }
    html += ' (chi-squared p=' + prob.toFixed(3) + ' ' + (prob < 0.05 ? '<' : '>') + ' 0.05)';
    const binomialResult = document.getElementById('binomialResult');
    const binomialAuxData = document.getElementById('binomialAuxData');
    binomialResult.innerHTML = html;
    binomialResult.classList.remove('sig');
    binomialResult.classList.remove('notSig');
    binomialResult.classList.add(dataClass);
    binomialAuxData.innerHTML = '(variance is ' + data['variance'].toFixed(3) + ' with ' + data['degreesOfFreedom'] + ' degree' + (data['degreesOfFreedom'] == 1 ? '' : 's') + ' of freedom)';
}
function doBinomialError(data) {
    const binomialResult = document.getElementById('binomialResult');
    const binomialAuxData = document.getElementById('binomialAuxData');
    binomialResult.innerHTML = 'Error!';
    binomialAuxData.innerHTML = '';
}