{"version":3,"file":"sf_register.min.js","mappings":"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","sources":["webpack://sf_register/./Sources/TypeScript/PasswordStrengthCalculator.ts","webpack://sf_register/./Sources/TypeScript/SfRegister.ts","webpack://sf_register/./Sources/TypeScript/sf_register.ts"],"sourcesContent":["export default class PasswordStrengthCalculator {\n /**\n * password length:\n * level 0 (0 point): less than 4 characters\n * level 1 (6 points): between 5 and 7 characters\n * level 2 (12 points): between 8 and 15 characters\n * level 3 (18 points): 16 or more characters\n */\n verdictLength(password) {\n const length = password.length;\n let score, log;\n switch (true) {\n case length > 0 && length < 5:\n log = '3 points for length (' + length + ')';\n score = 3;\n break;\n case length > 4 && length < 8:\n log = '6 points for length (' + length + ')';\n score = 6;\n break;\n case length > 7 && length < 16:\n log = '12 points for length (' + length + ')';\n score = 12;\n break;\n default:\n log = '18 points for length (' + length + ')';\n score = 18;\n break;\n }\n return { score: score, log: log };\n }\n /**\n * letters:\n * level 0 (0 points): no letters\n * level 1 (5 points): all letters are lower case\n * level 1 (5 points): all letters are upper case\n * level 2 (7 points): letters are mixed case\n */\n verdictLetter(password) {\n const matchLower = password.match(/[a-z]/), matchUpper = password.match(/[A-Z]/);\n let score = 0, log = '';\n if (matchLower) {\n if (matchUpper) {\n score = 7;\n log = '7 points for letters are mixed';\n }\n else {\n score = 5;\n log = '5 point for at least one lower case char';\n }\n }\n else if (matchUpper) {\n score = 5;\n log = '5 points for at least one upper case char';\n }\n return { score: score, log: log };\n }\n /**\n * numbers:\n * level 0 (0 points): no numbers exist\n * level 1 (5 points): one number exists\n * level 1 (7 points): 3 or more numbers exists\n */\n verdictNumbers(password) {\n const numbers = password.replace(/\\D/gi, '');\n let score = 0, log = '';\n if (numbers.length > 1) {\n score = 7;\n log = '7 points for at least three numbers';\n }\n else if (numbers.length > 0) {\n score = 5;\n log = '5 points for at least one number';\n }\n return { score: score, log: log };\n }\n /**\n * special characters:\n * level 0 (0 points): no special characters\n * level 1 (5 points): one special character exists\n * level 2 (10 points): more than one special character exists\n */\n verdictSpecialChars(password) {\n const specialCharacters = password.replace(/[\\w\\s]/gi, '');\n let score = 0, log = '';\n if (specialCharacters.length > 1) {\n score = 10;\n log = '10 points for at least two special chars';\n }\n else if (specialCharacters.length > 0) {\n score = 5;\n log = '5 points for at least one special char';\n }\n return { score: score, log: log };\n }\n /**\n * combinations:\n * level 0 (1 points): mixed case letters\n * level 0 (1 points): letters and numbers\n * level 1 (2 points): mixed case letters and numbers\n * level 3 (4 points): letters, numbers and special characters\n * level 4 (6 points): mixed case letters, numbers and special characters\n */\n verdictCombos(letter, number, special) {\n let score = 0, log = '';\n if (letter === 7 && number > 0 && special > 0) {\n score = 6;\n log = '6 combo points for letters, numbers and special characters';\n }\n else if (letter > 0 && number > 0 && special > 0) {\n score = 4;\n log = '4 combo points for letters, numbers and special characters';\n }\n else if (letter === 7 && number > 0) {\n score = 2;\n log = '2 combo points for mixed case letters and numbers';\n }\n else if (letter > 0 && number > 0) {\n score = 1;\n log = '1 combo points for letters and numbers';\n }\n else if (letter === 7) {\n score = 1;\n log = '1 combo points for mixed case letters';\n }\n return { score: score, log: log };\n }\n /**\n * final verdict base on final score\n */\n finalVerdict(finalScore) {\n let strVerdict;\n if (finalScore < 16) {\n strVerdict = 'very weak';\n }\n else if (finalScore > 15 && finalScore < 25) {\n strVerdict = 'weak';\n }\n else if (finalScore > 24 && finalScore < 35) {\n strVerdict = 'mediocre';\n }\n else if (finalScore > 34 && finalScore < 45) {\n strVerdict = 'strong';\n }\n else {\n strVerdict = 'stronger';\n }\n return strVerdict;\n }\n calculate(password) {\n const lengthVerdict = this.verdictLength(password), letterVerdict = this.verdictLetter(password), numberVerdict = this.verdictNumbers(password), specialVerdict = this.verdictSpecialChars(password), combosVerdict = this.verdictCombos(letterVerdict.score, numberVerdict.score, specialVerdict.score);\n const score = lengthVerdict.score\n + letterVerdict.score\n + numberVerdict.score\n + specialVerdict.score\n + combosVerdict.score, log = [\n lengthVerdict.log,\n letterVerdict.log,\n numberVerdict.log,\n specialVerdict.log,\n combosVerdict.log,\n score + ' points final score'\n ].join('\\n');\n return { score: score, verdict: this.finalVerdict(score), log: log };\n }\n}\n","import PasswordStrengthCalculator from './PasswordStrengthCalculator';\nconst document = window.document;\nexport default class SfRegister {\n constructor() {\n this.loading = false;\n this.ajaxRequest = null;\n this.barGraph = null;\n this.passwordStrengthCalculator = null;\n this.zone = null;\n this.zoneEmpty = null;\n this.zoneLoading = null;\n // Attach content loaded element with callback to document\n document.addEventListener('DOMContentLoaded', this.contentLoaded.bind(this));\n }\n /**\n * Callback after content was loaded\n */\n contentLoaded() {\n this.zone = document.getElementById('sfrZone');\n this.zoneEmpty = document.getElementById('sfrZone_empty');\n this.zoneLoading = document.getElementById('sfrZone_loading');\n this.barGraph = document.getElementById('bargraph');\n if (this.barGraph) {\n this.barGraph.classList.add('show');\n this.passwordStrengthCalculator = new PasswordStrengthCalculator();\n this.attachToElementById('sfrpassword', 'keyup', this.callTestPassword.bind(this));\n }\n this.attachToElementById('sfrCountry', 'change', this.countryChanged.bind(this));\n this.attachToElementById('sfrCountry', 'keyup', this.countryChanged.bind(this));\n this.attachToElementById('uploadButton', 'change', this.uploadFile.bind(this));\n this.attachToElementById('removeImageButton', 'click', this.removeFile.bind(this));\n }\n /**\n * Add class d-block remove class d-none\n */\n showElement(element) {\n element.classList.remove('d-none');\n element.classList.add('d-block');\n }\n /**\n * Add class d-none remove class d-block\n */\n hideElement(element) {\n element.classList.remove('d-block');\n element.classList.add('d-none');\n }\n attachToElementById(id, eventName, callback) {\n const element = document.getElementById(id);\n this.attachToElement(element, eventName, callback);\n }\n attachToElement(element, eventName, callback) {\n if (element) {\n element.addEventListener(eventName, callback);\n }\n }\n /**\n * Gets password meter element and sets the value with\n * the result of the calculate password strength function\n */\n callTestPassword(event) {\n const element = event.target, meterResult = this.passwordStrengthCalculator.calculate(element.value);\n if (this.barGraph.tagName.toLowerCase() === 'meter') {\n this.barGraph.value = meterResult.score;\n }\n else {\n const barGraph = this.barGraph, percentScore = Math.min((Math.floor(meterResult.score / 3.4)), 10), blinds = (barGraph.contentDocument || barGraph.contentWindow.document).getElementsByClassName('blind');\n for (let index = 0; index < blinds.length; index++) {\n const blind = blinds[index];\n if (index < percentScore) {\n this.hideElement(blind);\n }\n else {\n this.showElement(blind);\n }\n }\n }\n }\n /**\n * Change value of zone selectbox\n */\n countryChanged(event) {\n if ((event.type === 'change'\n || (event.type === 'keyup' && (event.keyCode === 40 || event.keyCode === 38)))\n && this.loading !== true) {\n if (this.zone) {\n const target = (event.target || event.srcElement), countrySelectedValue = target.options[target.selectedIndex].value;\n this.loading = true;\n this.zone.disabled = true;\n this.hideElement(this.zoneEmpty);\n this.showElement(this.zoneLoading);\n this.ajaxRequest = new XMLHttpRequest();\n this.ajaxRequest.onload = this.xhrReadyOnLoad.bind(this);\n this.ajaxRequest.open('POST', 'index.php?ajax=sf_register');\n this.ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');\n this.ajaxRequest.send('tx_sfregister[action]=zones&tx_sfregister[parent]=' + countrySelectedValue);\n }\n }\n }\n /**\n * Process ajax response and display error message or\n * hand data received to add zone option function\n */\n xhrReadyOnLoad(stateChanged) {\n const xhrResponse = stateChanged.target;\n if (xhrResponse.readyState === 4 && xhrResponse.status === 200) {\n const xhrResponseData = JSON.parse(xhrResponse.responseText);\n this.hideElement(this.zoneLoading);\n if (xhrResponseData.status === 'error' || xhrResponseData.data.length === 0) {\n this.showElement(this.zoneEmpty);\n }\n else {\n this.addZoneOptions(xhrResponseData.data);\n }\n }\n this.loading = false;\n }\n /**\n * Process data received with xhr response\n */\n addZoneOptions(options) {\n while (this.zone.length) {\n this.zone.removeChild(this.zone[0]);\n }\n options.forEach((option, index) => {\n this.zone.options[index] = new Option(option.label, option.value);\n });\n this.zone.disabled = false;\n }\n /**\n * Adds a preview information about file to upload in a label\n */\n uploadFile() {\n const information = document.getElementById('uploadFile');\n if (information) {\n information.value = this.value;\n }\n }\n /**\n * Handle remove image button clicked\n */\n removeFile() {\n const remove = document.getElementById('removeImage');\n if (remove) {\n remove.value = '1';\n }\n this.submitForm();\n }\n /**\n * Selects the form and triggers submit\n */\n submitForm() {\n const form = document.getElementById('sfrForm');\n if (form) {\n form.submit();\n }\n }\n}\n","/// \nimport SfRegister from './SfRegister';\nconst sfRegister = new SfRegister();\n/**\n * Global function needed for invisible recaptcha\n */\nwindow.sfRegister_submitForm = () => {\n return new Promise((resolve, reject) => {\n if (grecaptcha === undefined) {\n alert('Recaptcha ist nicht definiert');\n reject('recaptcha not found');\n }\n const captchaField = document.getElementById('captcha');\n captchaField.value = grecaptcha.getResponse();\n sfRegister.submitForm();\n resolve('recaptcha found');\n });\n};\n"],"names":["PasswordStrengthCalculator","verdictLength","password","length","score","log","verdictLetter","matchLower","match","matchUpper","verdictNumbers","numbers","replace","verdictSpecialChars","specialCharacters","verdictCombos","letter","number","special","finalVerdict","finalScore","strVerdict","calculate","lengthVerdict","this","letterVerdict","numberVerdict","specialVerdict","combosVerdict","join","verdict","window","document","sfRegister","constructor","loading","ajaxRequest","barGraph","passwordStrengthCalculator","zone","zoneEmpty","zoneLoading","addEventListener","contentLoaded","bind","getElementById","classList","add","attachToElementById","callTestPassword","countryChanged","uploadFile","removeFile","showElement","element","remove","hideElement","id","eventName","callback","attachToElement","event","target","meterResult","value","tagName","toLowerCase","percentScore","Math","min","floor","blinds","contentDocument","contentWindow","getElementsByClassName","index","blind","type","keyCode","srcElement","countrySelectedValue","options","selectedIndex","disabled","XMLHttpRequest","onload","xhrReadyOnLoad","open","setRequestHeader","send","stateChanged","xhrResponse","readyState","status","xhrResponseData","JSON","parse","responseText","data","addZoneOptions","removeChild","forEach","option","Option","label","information","submitForm","form","submit","sfRegister_submitForm","Promise","resolve","reject","undefined","grecaptcha","alert","getResponse"],"sourceRoot":""}