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 = ''; }