{"version":3,"file":"captcheck.js","mappings":"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","sources":["webpack://a4-meinberlin/./meinberlin/apps/captcha/assets/captcheck.js"],"sourcesContent":["/* based on https://source.netsyms.com/Netsyms/Captcheck/src/branch/master/captcheck.js */\n/* Copyright (C) 2017-2019 Netsyms Technologies.\n/* Copyright (C) 2020 Liquid Democracy e.V.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n the Software, and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nNETSYMS TECHNOLOGIES BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nExcept as contained in this notice, the name and other identifying marks of\nNetsyms Technologies shall not be used in advertising or otherwise to promote\nthe sale, use or other dealings in this Software without prior written\nauthorization from Netsyms Technologies.\n*/\n\n/* global django */\nconst ariaLabelImage = django.gettext('Click for image-based question')\nconst ariaLabelText = django.gettext('Click for text-based question')\nconst textImageMode = '&gt; ' + django.gettext('Image mode')\nconst textTextMode = '&gt; ' + django.gettext('Text mode')\nconst captchaImageAlt = django.gettext('Captcha image')\n\nfunction initializeCaptcha () {\n  function chooseAnswer (idp, ans, session, combinedAnswerId) {\n    const inputField = document.getElementById(combinedAnswerId)\n    inputField.value = ans + ':' + session\n\n    const box = document.getElementById('captcheck_' + idp + '_answer_' + ans)\n    if (box) {\n      box.checked = true\n    }\n  }\n\n  function clearAnswer (idp, combinedAnswerId) {\n    const inputField = document.getElementById(combinedAnswerId)\n    inputField.value = ''\n\n    const imgA = document.getElementById('captcheck_' + idp + '_answer_images')\n    imgA.childNodes.forEach(e => {\n      e.firstElementChild.checked = false\n    })\n  }\n\n  function switchMode (idp, session, combinedAnswerId) {\n    const switchLabel = document.getElementById('captcheck_' + idp + '_alt_question_button')\n    const imgQ = document.getElementById('captcheck_' + idp + '_question_image')\n    const accQ = document.getElementById('captcheck_' + idp + '_question_access')\n    const imgA = document.getElementById('captcheck_' + idp + '_answer_images')\n    const accA = document.getElementById('captcheck_' + idp + '_answer_access')\n\n    clearAnswer(idp, combinedAnswerId)\n\n    if (switchLabel.innerHTML === textTextMode) {\n      switchLabel.setAttribute('aria-label', ariaLabelImage)\n      switchLabel.innerHTML = textImageMode\n      imgQ.style.display = 'none'\n      accQ.style.display = 'initial'\n      imgA.style.display = 'none'\n      accA.style.display = 'initial'\n\n      accA.innerHTML = \"<input id='captcheck_\" + idp + \"_question_access-answer' type='text' name='captcheck_selected_answer' aria-labelledby='captcheck_\" + idp + \"_question_access' autocomplete='off' autofill='off'/>\"\n      accA.firstElementChild.addEventListener('input', function (ev) {\n        ev.preventDefault()\n        chooseAnswer(idp, this.value, session, combinedAnswerId)\n      })\n    } else {\n      switchLabel.innerHTML = textTextMode\n      imgQ.style.display = 'initial'\n      accQ.style.display = 'none'\n      imgA.style.display = 'initial'\n      accA.style.display = 'none'\n      accA.innerHTML = ''\n    }\n  }\n\n  /* Loop over all the CAPTCHA containers on the page, setting up a different CAPTCHA in each */\n  Array.prototype.forEach.call(document.getElementsByClassName('captcheck_container'), function (container) {\n    const apiUrl = container.getAttribute('data-api_url')\n    const combinedAnswerId =\n      container.dataset.combinedAnswerId || container.getAttribute('combined_answer_id')\n    const xhr = new XMLHttpRequest()\n    xhr.open('GET', apiUrl + '?action=new', true)\n    xhr.onreadystatechange = function () {\n      if (this.readyState === 4) {\n        const status = this.status\n        const json = this.responseText\n        /* Prevent rare bug where two CAPTCHAs appear in one container */\n        if (container.innerHTML.trim() !== '') {\n          return\n        }\n        /* Create captcha div */\n        const captcha = document.createElement('div')\n        captcha.setAttribute('class', 'captcheck_box')\n        container.appendChild(captcha)\n\n        if (status === 200) {\n          const data = JSON.parse(json)\n          // ID prefix to use for this instance\n          const idp = data.id_prefix\n          /* Create answer buttons */\n          let answers = \"<div class='captcheck_answer_images' id='captcheck_\" + idp + \"_answer_images'>\"\n          for (let i = 0, len = data.answers.length; i < len; i++) {\n            const src = apiUrl + '?action=img&s=' + data.session + '&c=' + data.answers[i]\n            answers +=\n              \"<label class='captcheck_answer_label' tabindex='0' data-prefix='\" + idp + \"' data-answer='\" + data.answers[i] + \"'>\" +\n              \"<input id='captcheck_\" + idp + '_answer_' + data.answers[i] + \"' aria-labelledby='captcheck_\" + idp + \"_question_image' type='radio' name='captcheck_selected_answer' value='\" + data.answers[i] + \"' data-prefix='\" + idp + \"' data-answer='\" + data.answers[i] + \"' />\" +\n              \"<img src='\" + src + \"' alt='\" + captchaImageAlt + \"' data-prefix='\" + idp + \"' data-answer='\" + data.answers[i] + \"'/></label>\"\n          }\n          answers += '</div>'\n          const answerDiv = document.createElement('div')\n          answerDiv.innerHTML = answers + \"<div class='captcheck_answer_access' id='captcheck_\" + idp + \"_answer_access'></div>\"\n          /* Create question */\n          const questionDiv = document.createElement('div')\n          questionDiv.setAttribute('class', 'captcheck_label_message')\n          questionDiv.setAttribute('id', 'captcheck_' + idp + '_label_message')\n          questionDiv.innerHTML =\n          \"<label class='captcheck_question_image' id='captcheck_\" + idp + \"_question_image'>\" + data.question_i + '</label>' +\n          \"<label class='captcheck_question_access' id='captcheck_\" + idp + \"_question_access'>\" + data.question_a + '</label>' +\n          \"<a href='' class='captcheck_alt_question_button' data-prefix='\" + idp + \"' id='captcheck_\" + idp + \"_alt_question_button' aria-role='button' tabindex='0' aria-label='\" + ariaLabelText + \"'>\" + textTextMode + '</a>'\n\n          /* Add question and answers */\n          captcha.appendChild(questionDiv)\n          captcha.appendChild(answerDiv)\n\n          /* Add hidden session ID element */\n          const skeyInput = document.createElement('span')\n          skeyInput.innerHTML = \"<input type='hidden' name='captcheck_session_code' value='\" + data.session + \"' />\"\n          captcha.appendChild(skeyInput)\n\n          const answerLabels = document.querySelectorAll('.captcheck_answer_label[data-prefix=\"' + idp + '\"]')\n          for (let k = 0; k < answerLabels.length; k++) {\n            answerLabels[k].addEventListener('click', function (ev) {\n              const prefix = this.getAttribute('data-prefix')\n              const answer = this.getAttribute('data-answer')\n              chooseAnswer(prefix, answer, data.session, combinedAnswerId)\n              ev.preventDefault()\n            })\n            answerLabels[k].addEventListener('keydown', function (ev) {\n              if (ev.key === 'Enter' || ev.key === ' ') {\n                const prefix = this.getAttribute('data-prefix')\n                const answer = this.getAttribute('data-answer')\n                chooseAnswer(prefix, answer, data.session, combinedAnswerId)\n                ev.preventDefault()\n              }\n            })\n          }\n          document.querySelector('.captcheck_alt_question_button[data-prefix=\"' + idp + '\"]').addEventListener('click', function (ev) {\n            ev.preventDefault()\n            switchMode(ev.target.getAttribute('data-prefix'), data.session, combinedAnswerId)\n          })\n          document.querySelector('.captcheck_alt_question_button[data-prefix=\"' + idp + '\"]').addEventListener('keydown', function (ev) {\n            if (ev.key === 'Enter' || ev.which === 13 || ev.keyCode === 13 || ev.key === ' ' || ev.which === 32 || ev.keyCode === 32) {\n              ev.preventDefault()\n              switchMode(ev.target.getAttribute('data-prefix'), data.session, combinedAnswerId)\n            }\n          })\n        } else {\n          /* Add error message */\n          captcha.innerHTML = \"<span class='captcheck_error_message'>There was a problem loading the CAPTCHA.</span>\"\n        }\n      }\n    }\n    xhr.send()\n  })\n}\n\ndocument.addEventListener('DOMContentLoaded', initializeCaptcha, false)\ndocument.addEventListener('a4.embed.ready', initializeCaptcha, false)\n"],"names":["ariaLabelImage","django","gettext","ariaLabelText","textImageMode","textTextMode","captchaImageAlt","initializeCaptcha","chooseAnswer","idp","ans","session","combinedAnswerId","document","getElementById","value","box","checked","switchMode","switchLabel","imgQ","accQ","imgA","accA","childNodes","forEach","e","firstElementChild","clearAnswer","innerHTML","setAttribute","style","display","addEventListener","ev","preventDefault","this","Array","prototype","call","getElementsByClassName","container","apiUrl","getAttribute","dataset","xhr","XMLHttpRequest","open","onreadystatechange","readyState","status","json","responseText","trim","captcha","createElement","appendChild","data","JSON","parse","id_prefix","answers","i","len","length","src","answerDiv","questionDiv","question_i","question_a","skeyInput","answerLabels","querySelectorAll","k","key","querySelector","target","which","keyCode","send"],"ignoreList":[],"sourceRoot":""}