(function () { var take = function () { //DDP console.log("DDP initialize") const chatform = localStorage.getItem("chatform") let pathname = window.location.pathname if (chatform) { switch (pathname) { case '/cart/regi.html': if (chatform) { if (!localStorage.getItem('loginUser') && !localStorage.getItem('directlogin')) { let param12 = { event: "chatform_page_transition", message: "order start", totalProcess: 7, pageIndex: 1 } window.parent.postMessage(param12, "*") document.addEventListener("DOMContentLoaded", () => { sessionStorage.removeItem('redirected') document.querySelector('[value="会員情報入力へ"]').click() }) } else if(localStorage.getItem('loginUser') && !localStorage.getItem('directlogin')) { var loginExec=()=>{ var confirmInterval = setInterval(function () { const mailaddress = document.querySelector('[name="mailaddress"]'); const member_password = document.querySelector('[name="member_password"]'); if(mailaddress && member_password){ clearInterval(confirmInterval); let userData = localStorage.getItem('loginData') userData = userData ? JSON.parse(userData) : {} const userName = document.querySelector('[name="mailaddress"]'); userName.value = userData.username const Password = document.querySelector('[name="member_password"]'); Password.value = userData.password localStorage.removeItem('loginData') localStorage.removeItem('loginUser') localStorage.removeItem('basket') localStorage.removeItem('regist') localStorage.removeItem('chatform') document.querySelector('[value="ログイン"]').click() } }, 100); } loginExec() } else if(localStorage.getItem('directlogin')){ localStorage.removeItem('directlogin') } } break case '/member/regist-form.html': if (chatform) { let param13 = { event: "chatform_page_transition", message: "order start", totalProcess: 7, pageIndex: 3 } window.parent.postMessage(param13, "*") document.addEventListener("DOMContentLoaded", async () => { let error = await checkError() if (!error.length > 0) { await Regit(); } }) } break; case '/member/regist-confirm.html': if (chatform) { let param14 = { event: "chatform_page_transition", message: "order start", totalProcess: 7, pageIndex: 4 } window.parent.postMessage(param14, "*") const regConfirmSubmit = async () => { await waitForElement(['[value="登録する"]']) document.querySelector('[value="登録する"]').click() } setTimeout(regConfirmSubmit, 1000) } break; case '/member/regist-thanks.html': if (chatform) { let param15 = { event: "chatform_page_transition", message: "order start", totalProcess: 7, pageIndex: 5 } window.parent.postMessage(param15, "*") const goToBuy = () => { const isNextButton = document.querySelector('[value="購入を続ける"]') if (isNextButton) isNextButton.click() else window.location.href = 'https://fusanoeki.dev.rep-aispr.xyz/cart/newOpcConfirm.html' } setTimeout(goToBuy, 1000) } break; case '/cart/newOpcConfirm.html': if (chatform) { let param16 = { event: "chatform_page_transition", message: "order start", totalProcess: 7, pageIndex: 6 } window.parent.postMessage(param16, "*") const addressPage = async () => { await waitForElement(['[value="一つの住所に送る"]']) document.querySelector('[value="一つの住所に送る"]').click() let userDataEnc = localStorage.getItem('encData') let userData = await decryptData(JSON.parse(userDataEnc), 'fek@qur') userData = JSON.parse(userData) await new Promise(resolve => setTimeout(resolve, 1000)); await fillInput('input#deliveryAddressName1', findValue(userData, "lastname") + " " + findValue(userData, "firstname")) await fillInput('input.opcDeliveryAddress_nameKana_edit', findValue(userData, "furigana_firstname") + " " + findValue(userData, "furigana_mei")) await fillInput('input.opcDeliveryAddress_zipCode_edit', findValue(userData, "zip")) await new Promise(resolve => setTimeout(resolve, 1000)); await chooseSelectBox('select.opcDeliveryAddress_prefState_edit', findValue(userData, "area"), { useInnerText: true }) await fillInput('input.opcDeliveryAddress_addressAddress1_edit', findValue(userData, 'city')) await fillInput('input.opcDeliveryAddress_addressAddress2_edit', findValue(userData, 'street') + findValue(userData, "building")) await fillInput('input.opcDeliveryAddress_tel_edit', findValue(userData, "phone")) document.querySelector('input.opcDeliveryAddress_completeButton_edit').click() await new Promise(resolve => setTimeout(resolve, 1500)); let deliDate = await findOption(userData, "ShippingDate") if(deliDate != 'Undefind' && deliDate != '指定無し' && deliDate != "指定なし") { await chooseSelectBox('select.opcDeliveryMethod_hopeDeliveryDate_edit', deliDate) } let deliTime = await findOptionLabelByCustomID(userData, "delivery_time") if (deliTime != 'Undefind' && deliTime != '指定無し' && deliTime != "指定なし") { await chooseSelectBox('select.opcDeliveryMethod_hopeDeliveryTime_edit', deliTime) } document.querySelector('input.opcDeliveryMethod_completeButton_edit').click() await new Promise(resolve => setTimeout(resolve, 1500)); let paymentMethod = await findOptionLabelByCustomID(userData, "payment") if (/代金引換/.test(paymentMethod)) { document.querySelector('.opcPaymentMethod_paymentMethod_edit[value="3"]').click() await new Promise(resolve => setTimeout(resolve, 1000)); document.querySelector('.opcPaymentMethod_completeButton_edit').click() } else if (/クレジットカード/.test(paymentMethod)) { document.querySelector('.opcPaymentMethod_paymentMethod_edit[value="51"]').click() await new Promise(resolve => setTimeout(resolve, 500)); await fillInput('input.opcPaymentMethod_webCollectCardNo_edit', findValue(userData, "dwfrm_billing_paymentMethods_creditCard_number")) let ccYear = findValue(userData, "dwfrm_billing_paymentMethods_creditCard_year") let ccMonth = findValue(userData, "dwfrm_billing_paymentMethods_creditCard_month") await chooseSelectBox('select.opcPaymentMethod_webCollectExpiryDateSelectMonth_edit', ccMonth > 10 ? ccMonth : '0' + ccMonth) await chooseSelectBox('select.opcPaymentMethod_webCollectExpiryDateSelectYear_edit', ccYear) await fillInput('input.opcPaymentMethod_webCollectSecurityCode_edit', findValue(userData, "dwfrm_billing_paymentMethods_creditCard_cvn")) await fillInput('input.opcPaymentMethod_webCollectUserName_edit', findValue(userData, "CardHolderName")) } else if (/PayPay/.test(paymentMethod)) { document.querySelector('.opcPaymentMethod_paymentMethod_edit[value="34"]').click() await new Promise(resolve => setTimeout(resolve, 1000)); document.querySelector('.opcPaymentMethod_completeButton_edit').click() } else if (/コンビニ・郵便局後払い/.test(paymentMethod)) { document.querySelector('.opcPaymentMethod_paymentMethod_edit[value="72"]').click() await new Promise(resolve => setTimeout(resolve, 1000)); document.querySelector('.opcPaymentMethod_completeButton_edit').click() } let checkComplete = () => { var url = "https://pr.aqur.com/track"; function track(trackingData) { fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: trackingData }) .then(response => response.json()) .then(data => { console.log("Conversion Tracked!!") var param={ event: "redirect_thankPage", url : window.location.href } window.parent.postMessage(param, "*") if (!/クレジットカード/.test(paymentMethod)) { localStorage.removeItem("chatform"); localStorage.removeItem("encData"); } }) } track(chatform) } let redirected = sessionStorage.getItem('redirected') if (redirected != 'true') { sessionStorage.setItem('redirected', true) setTimeout(checkComplete, 3000) } //document.querySelector('input.opcPaymentMethod_completeButton_edit').click() //await new Promise(resolve => setTimeout(resolve, 1500)); //document.querySelector('input[value="注文を確定する"]').click() } let redirected = sessionStorage.getItem('redirected') if(redirected != 'true') { setTimeout(addressPage, 2500) } else { const refillCC = async () => { let userDataEnc = localStorage.getItem('encData') let userData = await decryptData(JSON.parse(userDataEnc), 'fek@qur') userData = JSON.parse(userData) let paymentMethod = await findOptionLabelByCustomID(userData, "payment") if (/クレジットカード/.test(paymentMethod)) { document.querySelector('.opcPaymentMethod_paymentMethod_edit[value="51"]').click() await new Promise(resolve => setTimeout(resolve, 500)); await fillInput('input.opcPaymentMethod_webCollectCardNo_edit', findValue(userData, "dwfrm_billing_paymentMethods_creditCard_number")) let ccYear = findValue(userData, "dwfrm_billing_paymentMethods_creditCard_year") let ccMonth = findValue(userData, "dwfrm_billing_paymentMethods_creditCard_month") await chooseSelectBox('select.opcPaymentMethod_webCollectExpiryDateSelectMonth_edit', ccMonth > 10 ? ccMonth : '0' + ccMonth) await chooseSelectBox('select.opcPaymentMethod_webCollectExpiryDateSelectYear_edit', ccYear) await fillInput('input.opcPaymentMethod_webCollectSecurityCode_edit', findValue(userData, "dwfrm_billing_paymentMethods_creditCard_cvn")) await fillInput('input.opcPaymentMethod_webCollectUserName_edit', findValue(userData, "CardHolderName")) localStorage.removeItem("chatform"); localStorage.removeItem("encData"); } } setTimeout(refillCC, 1000) } } break; default: console.log('do nothing'); } } else { console.log("No Chatform") } document.addEventListener("DOMContentLoaded", () => { //console.log("DOMContentLoaded") var param = { event: "chatform_DOMContentLoaded" } window.parent.postMessage(param, '*'); }) window.addEventListener("message", async (event) => { //console.log("window message") if (event.data.event == "chatform_vframe_debug") { //console.log("chatform_vframe_debug") } if (event.data.event == "chatform_bindForm") { //console.log("1 chatform_bindForm",event.data.data) var project = event.data.data; var arr = project.data; var chatform = { pid: project.pid, sid: project.sid, uuId: project.uuId, id: arr[arr.length - 1].id } localStorage.setItem('chatform', JSON.stringify(chatform)); let encData = await encryptData(JSON.stringify(arr), 'fek@qur') localStorage.setItem('encData', JSON.stringify(encData)) } if (event.data.event == "chatform_bindFormSubmit") { let param11 = { event: "chatform_page_transition", message: "order start", totalProcess: 7, pageIndex: 0 } window.parent.postMessage(param11, "*") console.log("chatform_bindFormSubmit") goToForm(arr) } }) const fillInput = (selector, value) => { return new Promise((resolve, reject) => { let inputEvent = new InputEvent('change', { bubbles: true, cancelable: false }); const inputElement = document.querySelector(selector); if (inputElement) { inputElement.value = value; inputElement.dispatchEvent(inputEvent); resolve(`Input with name "${selector}" filled and event dispatched`); } else { reject(`Element with name "${selector}" not found.`); } }); }; const chooseRadioButton = (radioSelector, value) => { return new Promise((resolve, reject) => { const radioButton = document.querySelector(`${radioSelector}[value='${value}']`); if (radioButton) { radioButton.checked = true; let event = new Event('change', { bubbles: true, composed: true }) radioButton.dispatchEvent(event); resolve(`Radio button with name '${radioSelector}' and value '${value}' selected and event dispatched.`); } else { reject(new Error(`Radio button with name '${radioSelector}' and value '${value}' not found.`)); } }); }; const toggleCheckbox = (checkboxSelector, checked) => { return new Promise((resolve, reject) => { const checkbox = document.querySelector(checkboxSelector); if (checkbox) { checkbox.checked = checked; let event = new Event('change', { bubbles: true, composed: true }); checkbox.dispatchEvent(event); resolve(`Checkbox with selector '${checkboxSelector}' set to ${checked} and event dispatched.`); } else { reject(new Error(`Checkbox with selector '${checkboxSelector}' not found.`)); } }); }; const chooseSelectBox = (selectBoxSelector, value, options = { useOptionVal: true, useInnerText: false }) => { return new Promise((resolve, reject) => { let option = ""; if (options.useInnerText) { option = Array.from(document.querySelectorAll(`${selectBoxSelector} option`)).find(opt => opt.innerText.trim() === value); } else if (options.useOptionVal) { option = document.querySelector(`${selectBoxSelector} option[value='${value}']`); } else { option = document.querySelector(`${selectBoxSelector} option[label='${value}']`); } const selectElement = document.querySelector(`${selectBoxSelector}`); if (option && selectElement) { option.selected = true; const event = new Event('change', { bubbles: true, composed: true }); selectElement.dispatchEvent(event); resolve(`Select box with name '${selectBoxSelector}' set to option with ${options.useInnerText ? 'text' : 'value'} '${value}' and event dispatched.`); } else { reject(new Error(`Select box with name '${selectBoxSelector}' and option with ${options.useInnerText ? 'text' : 'value'} '${value}' not found.`)); } }); }; async function goToForm(d) { if (pathname == "/cart/basket.html") { document.querySelector('[name="submit"]').click() } else if (pathname == "/member/regist-form.html") { window.location.reload() } } async function Regit(d) { let userDataEnc = localStorage.getItem('encData') let userData = await decryptData(JSON.parse(userDataEnc), 'fek@qur') userData = JSON.parse(userData) // Default checkbox is off and checked true false doesn't work for checkbox document.querySelector('[name="member_agreement_check_done"]').click() await fillInput('[name="name"]', findValue(userData, "lastname") + " " + findValue(userData, "firstname")) await fillInput('[name="name_kana"]', findValue(userData, "furigana_firstname") + " " + findValue(userData, "furigana_mei")) await fillInput('[name="zipcode"]', findValue(userData, "zip")) await new Promise(resolve => setTimeout(resolve, 1000)); await chooseSelectBox('select[name="pref_state_id"]', findValue(userData, "area"), { useInnerText: true }) await fillInput('input[name="address1"]', findValue(userData, 'city')) await fillInput('input[name="address2"]', findValue(userData, 'street') + findValue(userData, "building")) await fillInput('[name="tel"]', findValue(userData, "phone")) await fillInput('[name="mailaddress"]', findValue(userData, "email")) await fillInput('[name="member_password"]', findValue(userData, "dwfrm_formlp_profile_login_password_")) await fillInput('[name="member_password_confirm"]', findValue(userData, "dwfrm_formlp_profile_login_passwordconfirm_")) let genderM = findOptionLabel(userData, "6004b77_2") let genderF = findOptionLabel(userData, "6004b77_1") let genderV = "" if (/男性/.test(genderM)) { genderV = 1 } else if (/女性/.test(genderF)) { genderV = 2 } if (genderV) { await chooseRadioButton('[name="gender"]', genderV) } let year = findValueByCustomID(userData, "birthday", "Year") var Month = findValueByCustomID(userData, "birthday", "Month"); let Day = findValueByCustomID(userData, "birthday", "Day"); if (year && year !== 'Undefind' && Month && Month !== 'Undefind' && Day && Day !== 'Undefind') { await fillInput('[name="birth_year"]', year) await fillInput('[name="birth_month"]', Month) await fillInput('[name="birth_day"]', Day) } let MailMagazine = await findOption(userData, "f9beae_1") // Default checkbox is on and checked true false doesn't work for checkbox if (MailMagazine && MailMagazine != "Undefind") { } else { document.querySelector('[name="accept_mailmagazine"]').click() } const submit = () => { document.querySelector('[value="登録内容を確認する"]').click() } setTimeout(submit, 1000) } async function checkError() { var resultArr = [] //Find error then tell to Chatbot if (document.querySelectorAll('.errorMessage li').length > 0) { let errrorElements = document.querySelectorAll('.errorMessage li') errrorElements.forEach(errElem => { if (errElem.innerText.length > 0) { resultArr.push(errElem.innerText.trim()) errElem.innerHTML = "" errElem.innerText = "" } }) } var errorTxt = "" if (resultArr.length > 0) { errorTxt = resultArr.join("
") } //console.log("errorTxt=>", errorTxt) if (errorTxt) { var param = { event: "chatform_bindFormErrorFound", text: errorTxt, } errorTxt = "" localStorage.removeItem("chatform"); window.parent.postMessage(param, '*'); let transitionEndParam = { event: "chatform_page_transition", message: "order start", totalProcess: 7, pageIndex: 9 } window.parent.postMessage(transitionEndParam, "*") } return resultArr } const waitForElement = (selectors, timeout = 5000) => { return new Promise((resolve, reject) => { const interval = 100; let elapsedTime = 0; const checkExistence = () => { for (const selector of selectors) { const element = document.querySelector(selector); if (element) { resolve(element); return; } } elapsedTime += interval; if (elapsedTime >= timeout) { reject(new Error(`None of the elements with selectors "${selectors.join(', ')}" were found within the timeout`)); } else { setTimeout(checkExistence, interval); } }; checkExistence(); }); }; function findValue(d, n) { //console.log(d,n) let value = "Undefind"; rtn = value; for (var i = 0; i < d.length; i++) { var item = d[i]; if (item.values) { item.values.forEach(function (v) { //console.log(v.name, n) if (v.name == n) { //console.log(n, v.name) rtn = v.value } }) } } //console.log(n,rtn) return rtn } //d= all Data, t=customerID, n=name function findValueByCustomID(d, t, n) { //console.log(d,n) let value = "Undefind"; rtn = value; for (var i = 0; i < d.length; i++) { var item = d[i]; if (item.customId == t) { //console.log("item", item) item.values.forEach(function (v) { //console.log(v.name, n) if (v.name == n) { rtn = v.value } }) } } //console.log(n,rtn) return rtn } function findOptionLabelByCustomID(d, t) { //console.log(d,n) let value = "Undefind"; rtn = value; for (var i = 0; i < d.length; i++) { var item = d[i]; if (item.customId == t) { //console.log("item", item) item.options.forEach(function (v) { //console.log(v.name, n) if (v.checked) { rtn = v.label } }) } } //console.log(n,rtn) return rtn } //radio return single value function findOption(d, n) { //console.log(n) let value = "Undefind"; rtn = value; for (var i = 0; i < d.length; i++) { var item = d[i]; //console.log(item) if (item.options) { item.options.forEach(function (v) { if (v.name == n && v.checked) { //console.log(v) rtn = v.value } }) } } return rtn } function findOptionLabel(d, n) { //console.log(n) let value = "Undefind"; rtn = value; for (var i = 0; i < d.length; i++) { var item = d[i]; //console.log(item) if (item.options) { item.options.forEach(function (v) { if (v.name == n && v.checked) { //console.log(v) rtn = v.label } }) } } return rtn } //radio return single value function findOptionByCustomId(d, id) { //console.log(n) let value = "Undefind"; rtn = value; for (var i = 0; i < d.length; i++) { var item = d[i]; //console.log(item) if (item.options && item.id == id) { item.options.forEach(function (v) { if (v.checked) { //console.log(v) rtn = v.label } }) } } return rtn } //checkbox return array function findOptions(d, n) { rtn = []; for (var i = 0; i < d.length; i++) { var item = d[i]; if (item.options) { item.options.forEach(function (v) { var reg = new RegExp(n) if (reg.test(v.name) && v.checked) { rtn.push(v.value) } }) } } return rtn } async function getFormatPhone($INPUT, $STRICT) { $STRICT = $STRICT || false; // 市外局番のグループ定義 // データは http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html より入手後、整形 var group = { 5: { "01267": 1, "01372": 1, "01374": 1, "01377": 1, "01392": 1, "01397": 1, "01398": 1, "01456": 1, "01457": 1, "01466": 1, "01547": 1, "01558": 1, "01564": 1, "01586": 1, "01587": 1, "01632": 1, "01634": 1, "01635": 1, "01648": 1, "01654": 1, "01655": 1, "01656": 1, "01658": 1, "04992": 1, "04994": 1, "04996": 1, "04998": 1, "05769": 1, "05979": 1, "07468": 1, "08387": 1, "08388": 1, "08396": 1, "08477": 1, "08512": 1, "08514": 1, "09496": 1, "09802": 1, "09912": 1, "09913": 1, "09969": 1, }, 4: { "0123": 2, "0124": 2, "0125": 2, "0126": 2, "0133": 2, "0134": 2, "0135": 2, "0136": 2, "0137": 2, "0138": 2, "0139": 2, "0142": 2, "0143": 2, "0144": 2, "0145": 2, "0146": 2, "0152": 2, "0153": 2, "0154": 2, "0155": 2, "0156": 2, "0157": 2, "0158": 2, "0162": 2, "0163": 2, "0164": 2, "0165": 2, "0166": 2, "0167": 2, "0172": 2, "0173": 2, "0174": 2, "0175": 2, "0176": 2, "0178": 2, "0179": 2, "0182": 2, "0183": 2, "0184": 2, "0185": 2, "0186": 2, "0187": 2, "0191": 2, "0192": 2, "0193": 2, "0194": 2, "0195": 2, "0197": 2, "0198": 2, "0220": 2, "0223": 2, "0224": 2, "0225": 2, "0226": 2, "0228": 2, "0229": 2, "0233": 2, "0234": 2, "0235": 2, "0237": 2, "0238": 2, "0240": 2, "0241": 2, "0242": 2, "0243": 2, "0244": 2, "0246": 2, "0247": 2, "0248": 2, "0250": 2, "0254": 2, "0255": 2, "0256": 2, "0257": 2, "0258": 2, "0259": 2, "0260": 2, "0261": 2, "0263": 2, "0264": 2, "0265": 2, "0266": 2, "0267": 2, "0268": 2, "0269": 2, "0270": 2, "0274": 2, "0276": 2, "0277": 2, "0278": 2, "0279": 2, "0280": 2, "0282": 2, "0283": 2, "0284": 2, "0285": 2, "0287": 2, "0288": 2, "0289": 2, "0291": 2, "0293": 2, "0294": 2, "0295": 2, "0296": 2, "0297": 2, "0299": 2, "0422": 2, "0428": 2, "0436": 2, "0438": 2, "0439": 2, "0460": 2, "0463": 2, "0465": 2, "0466": 2, "0467": 2, "0470": 2, "0475": 2, "0476": 2, "0478": 2, "0479": 2, "0480": 2, "0493": 2, "0494": 2, "0495": 2, "0531": 2, "0532": 2, "0533": 2, "0536": 2, "0537": 2, "0538": 2, "0539": 2, "0544": 2, "0545": 2, "0547": 2, "0548": 2, "0550": 2, "0551": 2, "0553": 2, "0554": 2, "0555": 2, "0556": 2, "0557": 2, "0558": 2, "0561": 2, "0562": 2, "0563": 2, "0564": 2, "0565": 2, "0566": 2, "0567": 2, "0568": 2, "0569": 2, "0572": 2, "0573": 2, "0574": 2, "0575": 2, "0576": 2, "0577": 2, "0578": 2, "0581": 2, "0584": 2, "0585": 2, "0586": 2, "0587": 2, "0594": 2, "0595": 2, "0596": 2, "0597": 2, "0598": 2, "0599": 2, "0721": 2, "0725": 2, "0735": 2, "0736": 2, "0737": 2, "0738": 2, "0739": 2, "0740": 2, "0742": 2, "0743": 2, "0744": 2, "0745": 2, "0746": 2, "0747": 2, "0748": 2, "0749": 2, "0761": 2, "0763": 2, "0765": 2, "0766": 2, "0767": 2, "0768": 2, "0770": 2, "0771": 2, "0772": 2, "0773": 2, "0774": 2, "0776": 2, "0778": 2, "0779": 2, "0790": 2, "0791": 2, "0794": 2, "0795": 2, "0796": 2, "0797": 2, "0798": 2, "0799": 2, "0820": 2, "0823": 2, "0824": 2, "0826": 2, "0827": 2, "0829": 2, "0833": 2, "0834": 2, "0835": 2, "0836": 2, "0837": 2, "0838": 2, "0845": 2, "0846": 2, "0847": 2, "0848": 2, "0852": 2, "0853": 2, "0854": 2, "0855": 2, "0856": 2, "0857": 2, "0858": 2, "0859": 2, "0863": 2, "0865": 2, "0866": 2, "0867": 2, "0868": 2, "0869": 2, "0875": 2, "0877": 2, "0879": 2, "0880": 2, "0883": 2, "0884": 2, "0885": 2, "0887": 2, "0889": 2, "0892": 2, "0893": 2, "0894": 2, "0895": 2, "0896": 2, "0897": 2, "0898": 2, "0920": 2, "0930": 2, "0940": 2, "0942": 2, "0943": 2, "0944": 2, "0946": 2, "0947": 2, "0948": 2, "0949": 2, "0950": 2, "0952": 2, "0954": 2, "0955": 2, "0956": 2, "0957": 2, "0959": 2, "0964": 2, "0965": 2, "0966": 2, "0967": 2, "0968": 2, "0969": 2, "0972": 2, "0973": 2, "0974": 2, "0977": 2, "0978": 2, "0979": 2, "0980": 2, "0982": 2, "0983": 2, "0984": 2, "0985": 2, "0986": 2, "0987": 2, "0993": 2, "0994": 2, "0995": 2, "0996": 2, "0997": 2, "0180": 3, "0570": 3, "0800": 3, "0990": 3, "0120": 3, }, 3: { "011": 3, "015": 3, "017": 3, "018": 3, "019": 3, "022": 3, "023": 3, "024": 3, "025": 3, "026": 3, "027": 3, "028": 3, "029": 3, "042": 3, "043": 3, "044": 3, "045": 3, "046": 3, "047": 3, "048": 3, "049": 3, "052": 3, "053": 3, "054": 3, "055": 3, "058": 3, "059": 3, "072": 3, "073": 3, "075": 3, "076": 3, "077": 3, "078": 3, "079": 3, "082": 3, "083": 3, "084": 3, "086": 3, "087": 3, "088": 3, "089": 3, "092": 3, "093": 3, "095": 3, "096": 3, "097": 3, "098": 3, "099": 3, "050": 4, "020": $STRICT ? 3 : 4, "070": $STRICT ? 3 : 4, "080": $STRICT ? 3 : 4, "090": $STRICT ? 3 : 4, "060": $STRICT ? 3 : 4, }, 2: { "03": 4, "04": 4, "06": 4, } }; // 市外局番の桁数を取得して降順に並べ替える var code = []; for (num in group) { code.push(num * 1); } code.sort(function ($a, $b) { return ($b - $a); }); // 入力文字から数字以外を削除してnumber変数に格納する var number = String($INPUT).replace(/[0-9]/g, function ($s) { return String.fromCharCode($s.charCodeAt(0) - 65248); }).replace(/\D/g, ""); // 電話番号が10~11桁じゃなかったらfalseを返して終了する if (number.length < 10 || number.length > 11) { return false; } // 市外局番がどのグループに属するか確認していく for (var i = 0, n = code.length; i < n; i++) { var leng = code[i]; var area = number.substring(0, leng); var city = group[leng][area]; // 一致する市外局番を見付けたら整形して整形後の電話番号を返す if (city) { var first = area; var middle = number.substring(first.length, first.length + city); var last = number.substring(first.length + city, number.length); return [first, middle, last] } } }; async function encryptData(data, password) { const enc = new TextEncoder(); const encodedPassword = enc.encode(password); const key = await crypto.subtle.importKey( "raw", encodedPassword, { name: "PBKDF2" }, false, ["deriveKey"] ); const salt = crypto.getRandomValues(new Uint8Array(16)); const derivedKey = await crypto.subtle.deriveKey( { name: "PBKDF2", salt: salt, iterations: 100000, hash: "SHA-256" }, key, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"] ); const iv = crypto.getRandomValues(new Uint8Array(12)); const encryptedData = await crypto.subtle.encrypt( { name: "AES-GCM", iv: iv }, derivedKey, enc.encode(data) ); return { salt: Array.from(salt), iv: Array.from(iv), data: Array.from(new Uint8Array(encryptedData)) }; } async function decryptData(encrypted, password) { const enc = new TextEncoder(); const encodedPassword = enc.encode(password); const key = await crypto.subtle.importKey( "raw", encodedPassword, { name: "PBKDF2" }, false, ["deriveKey"] ); const salt = new Uint8Array(encrypted.salt); const iv = new Uint8Array(encrypted.iv); const derivedKey = await crypto.subtle.deriveKey( { name: "PBKDF2", salt: salt, iterations: 100000, hash: "SHA-256" }, key, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"] ); const decryptedData = await crypto.subtle.decrypt( { name: "AES-GCM", iv: iv }, derivedKey, new Uint8Array(encrypted.data) ); const dec = new TextDecoder(); return dec.decode(decryptedData); } } setTimeout(take, 0); }())