bc100-autofill/options/script.js

144 lines
4.3 KiB
JavaScript
Raw Normal View History

"use strict;"
2023-10-14 16:28:19 +02:00
function luhnValidate(cardNumber) {
cardNumber = String(cardNumber).replace(/[\s]/g, "");
let odd = false;
let total = 0;
let position, doubledPos;
if (!/^[0-9]+$/.test(cardNumber)) {
return false;
}
for (var i = cardNumber.length; i > 0; i--) {
position = parseInt(cardNumber[i - 1]);
if (!odd) {
total += position;
} else {
doubledPos = position * 2;
if (doubledPos > 9) {
doubledPos -= 9;
}
total += doubledPos;
}
odd = !odd;
}
return (total !== 0 && (total % 10) === 0);
}
2023-11-13 20:28:02 +01:00
function ibanLatinCharId(chr){
c = chr.charCodeAt(0);
if (c > 0x40 && c <= 0x5a) {
return chr.charCodeAt(0) - 0x40 + 9;
} else if (c > 0x60 && c <= 0x7a) {
return chr.charCodeAt(0) - 0x60 + 9;
}
return false;
}
function ibanValidate(iban){
iban = iban.toUpperCase();
countryId = iban.slice(0, 2);
checksum = iban.slice(2, 4);
countryDigits = countryId.split('').map(ibanLatinCharId).join('');
body = iban.substring(4);
processing = `${body}${countryDigits}${checksum}`;
resultingNumber = BigInt(processing, 10);
mod = resultingNumber % 97n;
return mod == 1;
}
2023-10-14 16:28:19 +02:00
function putError(s){
document.querySelector('#errors').textContent += s;
}
function clearError(){
document.querySelector('#errors').textContent = "";
}
2023-11-13 20:28:02 +01:00
async function saveValueIfNotEmpty(k, v){
if (v!==""){
return browser.storage.sync.set({k:v})
}
return false
}
2023-10-14 16:28:19 +02:00
async function saveOptions(ev) {
clearError();
ev.preventDefault();
let bcNum = this.querySelector("#bcnum").value;
if (bcNum.length !== 16 || !bcNum.startsWith("70814") || !luhnValidate(bcNum)) {
2023-10-14 16:28:19 +02:00
putError("Your BahnCard number is not valid. Please make sure you haven't made any typos.");
return;
}
let bDay = this.querySelector('#birthday').value;
if (bDay == ""){
putError("Please enter a birthday.");
return;
}
let autoContinue = this.querySelector('#autocontinue').checked;
2023-10-17 18:56:19 +02:00
let enable = this.querySelector('#enable').checked;
2023-11-13 20:28:02 +01:00
let title = this.querySelector('#title').value;
let firstName = this.querySelector('#firstname').value;
let surName = this.querySelector('#surname').value;
let emailAddress = this.querySelector('#email').value;
let streetAddr = this.querySelector('#addr1').value;
let postCode = this.querySelector('#postcode').value;
let placeName = this.querySelector('#placename').value;
let iban = this.querySelector('#iban').value;
if (iban != "" && !ibanValidate(iban)){
putError("Please check your IBAN for typing errors.");
return;
}
let bic = this.querySelector('#bic').value;
2023-10-13 20:48:11 +02:00
let options = {
bcnum: bcNum,
bday: bDay,
2023-11-13 20:28:02 +01:00
autocontinue: autoContinue,
enable: enable,
addr__appellation: title,
addr__firstName: firstName,
addr__surName: surName,
addr__email: emailAddress,
addr__street: streetAddr,
addr__postcode: postCode,
addr__placename: placeName,
pymt__iban: iban,
pymt__bic: bic
2023-10-13 20:48:11 +02:00
};
2023-11-13 20:28:02 +01:00
options = Object.fromEntries(Object.entries(options).filter(([k, v]) => v !== ""))
2023-10-14 20:14:55 +02:00
console.log("saving", options);
2023-11-13 20:28:02 +01:00
2023-10-14 16:28:19 +02:00
browser.storage.sync.set(options).then(() => {
document.querySelector('#success').textContent = "✔";
setTimeout(() => {
document.querySelector('#success').textContent = '';
}, 5000);
})
2023-11-13 20:28:02 +01:00
2023-10-13 20:48:11 +02:00
}
async function restoreOptions() {
// We do not save user data in managed storage.
// let res = await browser.storage.managed.get('colour');
// document.querySelector("#managed-colour").innerText = res.colour;
2023-10-14 16:28:19 +02:00
let settings = await browser.storage.sync.get();
2023-10-14 20:14:55 +02:00
console.log("restoring", settings);
2023-10-17 18:56:19 +02:00
document.querySelector('#enable').checked = settings.enable || true;
2023-10-13 20:48:11 +02:00
document.querySelector("#bcnum").value = settings.bcnum || "";
document.querySelector("#birthday").value = settings.bday || "";
document.querySelector("#autocontinue").checked = settings.autocontinue || false;
}
function startBcnumAcquisition(ev) {
browser.storage.sync.set({"acquireBahncard":true}).then(() => {
win = window.open("https://www.bahn.de/buchung/kundenkonto/bahncard", "_blank", "popup")
if (win instanceof Window){
win.postMessage("__WINDOW_OPENED_FOR_BC_ACQUISITION__");
}
})
}
2023-10-13 20:48:11 +02:00
document.addEventListener('DOMContentLoaded', restoreOptions);
document.querySelector("form").addEventListener("submit", saveOptions);
document.querySelector("#bcnum-get-from-profile").addEventListener("click", startBcnumAcquisition)