document.addEventListener('DOMContentLoaded', function(){ var buttons = document.querySelectorAll('[data-rsfp-hashcash]'); if (buttons.length > 0) { for (var i = 0; i < buttons.length; i++) { var button = buttons[i]; (function (button) { button.addEventListener('click', function(){ var iterations = Math.pow(100, parseInt(this.getAttribute('data-hashcash-level'))); var text = this.getAttribute('data-hashcash-text'); var name = this.getAttribute('data-hashcash-name'); var count = 0; var pattern = new RegExp('^0{' + parseInt(this.getAttribute('data-hashcash-level')) + '}'); var container = this.querySelector('.hashcash'); if (!container) { return; } // Prevent multiple clicks if (container.classList.contains('hashcash__working') || container.classList.contains('hashcash__done')) { return; } var input = document.createElement('input'); input.type = 'hidden'; input.name = name; this.parentNode.appendChild(input); container.classList.remove('hashcash__pending'); container.classList.add('hashcash__working'); window.setTimeout(function(){ while (iterations > 0) { var hash = CryptoJS.SHA256(text + count).toString(CryptoJS.enc.Hex); if (hash.match(pattern)) { input.value = count; container.classList.remove('hashcash__working'); container.classList.add('hashcash__done'); break; } count++; iterations--; } }, 300); }); }(button)); } } });